-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
+/*
+ * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
*
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
*/
+
/* ====================================================================
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
*
# include OPENSSL_UNISTD
#endif
-#ifndef OPENSSL_SYS_NETWARE
-# include <signal.h>
-#endif
-
#if defined(_WIN32)
# include <windows.h>
#endif
-#if defined(OPENSSL_SYS_UNIX) && defined(OPENSSL_THREADS)
-# include <unistd.h>
-#endif
-
-#if !defined(OPENSSL_NO_ASYNC)
-# if defined(OPENSSL_SYS_UNIX) && defined(OPENSSL_THREADS)
-# if _POSIX_VERSION >= 200112L
-# define ASYNC_POSIX
-# endif
-# elif defined(_WIN32) || defined(__CYGWIN__)
-# define ASYNC_WIN
-# endif
-#endif
-
-#if !defined(ASYNC_POSIX) && !defined(ASYNC_WIN)
-# define ASYNC_NULL
-#endif
-
#include <openssl/bn.h>
#ifndef OPENSSL_NO_DES
# include <openssl/des.h>
#endif
-#ifndef OPENSSL_NO_AES
-# include <openssl/aes.h>
-#endif
+#include <openssl/aes.h>
#ifndef OPENSSL_NO_CAMELLIA
# include <openssl/camellia.h>
#endif
#include <openssl/modes.h>
#ifndef HAVE_FORK
-# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
+# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
# define HAVE_FORK 0
# else
# define HAVE_FORK 1
#define BUFSIZE (1024*16+1)
#define MAX_MISALIGNMENT 63
+#define ALGOR_NUM 30
+#define SIZE_NUM 6
+#define PRIME_NUM 3
+#define RSA_NUM 7
+#define DSA_NUM 3
+
+#define EC_NUM 17
+#define MAX_ECDH_SIZE 256
+#define MISALIGN 64
+
static volatile int run = 0;
static int mr = 0;
typedef struct loopargs_st {
ASYNC_JOB *inprogress_job;
+ ASYNC_WAIT_CTX *wait_ctx;
unsigned char *buf;
unsigned char *buf2;
unsigned char *buf_malloc;
unsigned char *buf2_malloc;
+ unsigned int *siglen;
+#ifndef OPENSSL_NO_RSA
+ RSA *rsa_key[RSA_NUM];
+#endif
+#ifndef OPENSSL_NO_DSA
+ DSA *dsa_key[DSA_NUM];
+#endif
+#ifndef OPENSSL_NO_EC
+ EC_KEY *ecdsa[EC_NUM];
+ EC_KEY *ecdh_a[EC_NUM];
+ EC_KEY *ecdh_b[EC_NUM];
+ unsigned char *secret_a;
+ unsigned char *secret_b;
+#endif
EVP_CIPHER_CTX *ctx;
HMAC_CTX *hctx;
GCM128_CONTEXT *gcm_ctx;
- unsigned char ecdsasig[256];
- unsigned int siglen;
} loopargs_t;
#ifndef OPENSSL_NO_MD2
static int DES_ncbc_encrypt_loop(void *args);
static int DES_ede3_cbc_encrypt_loop(void *args);
#endif
-#ifndef OPENSSL_NO_AES
static int AES_cbc_128_encrypt_loop(void *args);
static int AES_cbc_192_encrypt_loop(void *args);
static int AES_ige_128_encrypt_loop(void *args);
static int AES_ige_192_encrypt_loop(void *args);
static int AES_ige_256_encrypt_loop(void *args);
static int CRYPTO_gcm128_aad_loop(void *args);
-#endif
static int EVP_Update_loop(void *args);
static int EVP_Digest_loop(void *args);
#ifndef OPENSSL_NO_RSA
static int do_multi(int multi);
#endif
-#define ALGOR_NUM 30
-#define SIZE_NUM 6
-#define PRIME_NUM 3
-#define RSA_NUM 7
-#define DSA_NUM 3
-
-#define EC_NUM 17
-#define MAX_ECDH_SIZE 256
-#define MISALIGN 64
-
static const char *names[ALGOR_NUM] = {
"md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
"des cbc", "des ede3", "idea cbc", "seed cbc",
static double ecdh_results[EC_NUM][1];
#endif
-#if defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_EC)
+#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
static const char rnd_seed[] =
"string to make the random number generator think it has entropy";
-static int rnd_fake = 0;
#endif
#ifdef SIGALRM
#ifndef NO_FORK
{"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
#endif
-#ifndef ASYNC_NULL
+#ifndef OPENSSL_NO_ASYNC
{"async_jobs", OPT_ASYNCJOBS, 'p', "Enable async mode and start pnum jobs"},
#endif
#ifndef OPENSSL_NO_ENGINE
{"des-cbc", D_CBC_DES},
{"des-ede3", D_EDE3_DES},
#endif
-#ifndef OPENSSL_NO_AES
{"aes-128-cbc", D_CBC_128_AES},
{"aes-192-cbc", D_CBC_192_AES},
{"aes-256-cbc", D_CBC_256_AES},
{"aes-128-ige", D_IGE_128_AES},
{"aes-192-ige", D_IGE_192_AES},
{"aes-256-ige", D_IGE_256_AES},
-#endif
#ifndef OPENSSL_NO_RC2
{"rc2-cbc", D_CBC_RC2},
{"rc2", D_CBC_RC2},
{NULL}
};
-#define R_DSA_512 0
-#define R_DSA_1024 1
-#define R_DSA_2048 2
+#ifndef OPENSSL_NO_DSA
+# define R_DSA_512 0
+# define R_DSA_1024 1
+# define R_DSA_2048 2
static OPT_PAIR dsa_choices[] = {
{"dsa512", R_DSA_512},
{"dsa1024", R_DSA_1024},
{"dsa2048", R_DSA_2048},
{NULL},
};
+#endif
#define R_RSA_512 0
#define R_RSA_1024 1
unsigned char *buf = tempargs->buf;
unsigned char md2[MD2_DIGEST_LENGTH];
int count;
- for (count = 0; COND(c[D_MD2][testnum]); count++)
- EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL,
- EVP_md2(), NULL);
+ for (count = 0; COND(c[D_MD2][testnum]); count++) {
+ if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL,
+ EVP_md2(), NULL))
+ return -1;
+ }
return count;
}
#endif
unsigned char *buf = tempargs->buf;
unsigned char mdc2[MDC2_DIGEST_LENGTH];
int count;
- for (count = 0; COND(c[D_MDC2][testnum]); count++)
- EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL,
- EVP_mdc2(), NULL);
+ for (count = 0; COND(c[D_MDC2][testnum]); count++) {
+ if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL,
+ EVP_mdc2(), NULL))
+ return -1;
+ }
return count;
}
#endif
unsigned char *buf = tempargs->buf;
unsigned char md4[MD4_DIGEST_LENGTH];
int count;
- for (count = 0; COND(c[D_MD4][testnum]); count++)
- EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]),
- NULL, EVP_md4(), NULL);
+ for (count = 0; COND(c[D_MD4][testnum]); count++) {
+ if (!EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]),
+ NULL, EVP_md4(), NULL))
+ return -1;
+ }
return count;
}
#endif
unsigned char *buf = tempargs->buf;
unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
int count;
- for (count = 0; COND(c[D_RMD160][testnum]); count++)
- EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]), NULL,
- EVP_ripemd160(), NULL);
+ for (count = 0; COND(c[D_RMD160][testnum]); count++) {
+ if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]),
+ NULL, EVP_ripemd160(), NULL))
+ return -1;
+ }
return count;
}
#endif
}
#endif
-#ifndef OPENSSL_NO_AES
-# define MAX_BLOCK_SIZE 128
-#else
-# define MAX_BLOCK_SIZE 64
-#endif
+#define MAX_BLOCK_SIZE 128
static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
-#ifndef OPENSSL_NO_AES
static AES_KEY aes_ks1, aes_ks2, aes_ks3;
static int AES_cbc_128_encrypt_loop(void *args)
{
return count;
}
-#endif
-
static int decrypt = 0;
static int EVP_Update_loop(void *args)
{
unsigned char md[EVP_MAX_MD_SIZE];
int count;
for (count = 0;
- COND(save_count * 4 * lengths[0] / lengths[testnum]); count++)
- EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL);
-
+ COND(save_count * 4 * lengths[0] / lengths[testnum]); count++) {
+ if (!EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL))
+ return -1;
+ }
return count;
}
#ifndef OPENSSL_NO_RSA
-static unsigned rsa_num;
-static RSA *rsa_key[RSA_NUM];
static long rsa_c[RSA_NUM][2];
static int RSA_sign_loop(void *args)
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
unsigned char *buf2 = tempargs->buf2;
+ unsigned int *rsa_num = tempargs->siglen;
+ RSA **rsa_key = tempargs->rsa_key;
int ret, count;
for (count = 0; COND(rsa_c[testnum][0]); count++) {
- ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, &rsa_num, rsa_key[testnum]);
+ ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
if (ret == 0) {
BIO_printf(bio_err, "RSA sign failure\n");
ERR_print_errors(bio_err);
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
unsigned char *buf2 = tempargs->buf2;
+ unsigned int rsa_num = *(tempargs->siglen);
+ RSA **rsa_key = tempargs->rsa_key;
int ret, count;
for (count = 0; COND(rsa_c[testnum][1]); count++) {
ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
#endif
#ifndef OPENSSL_NO_DSA
-static DSA *dsa_key[DSA_NUM];
static long dsa_c[DSA_NUM][2];
static int DSA_sign_loop(void *args)
{
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
unsigned char *buf2 = tempargs->buf2;
- unsigned int *siglen = &(tempargs->siglen);
+ DSA **dsa_key = tempargs->dsa_key;
+ unsigned int *siglen = tempargs->siglen;
int ret, count;
for (count = 0; COND(dsa_c[testnum][0]); count++) {
ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
if (ret == 0) {
BIO_printf(bio_err, "DSA sign failure\n");
ERR_print_errors(bio_err);
- count = 1;
+ count = -1;
break;
}
}
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
unsigned char *buf2 = tempargs->buf2;
- unsigned int siglen = tempargs->siglen;
+ DSA **dsa_key = tempargs->dsa_key;
+ unsigned int siglen = *(tempargs->siglen);
int ret, count;
for (count = 0; COND(dsa_c[testnum][1]); count++) {
ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
if (ret <= 0) {
BIO_printf(bio_err, "DSA verify failure\n");
ERR_print_errors(bio_err);
- count = 1;
+ count = -1;
break;
}
}
#endif
#ifndef OPENSSL_NO_EC
-static EC_KEY *ecdsa[EC_NUM];
static long ecdsa_c[EC_NUM][2];
static int ECDSA_sign_loop(void *args)
{
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
- unsigned char *ecdsasig = tempargs->ecdsasig;
- unsigned int *ecdsasiglen = &(tempargs->siglen);
+ EC_KEY **ecdsa = tempargs->ecdsa;
+ unsigned char *ecdsasig = tempargs->buf2;
+ unsigned int *ecdsasiglen = tempargs->siglen;
int ret, count;
for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
ret = ECDSA_sign(0, buf, 20,
if (ret == 0) {
BIO_printf(bio_err, "ECDSA sign failure\n");
ERR_print_errors(bio_err);
- count = 1;
+ count = -1;
break;
}
}
{
loopargs_t *tempargs = (loopargs_t *)args;
unsigned char *buf = tempargs->buf;
- unsigned char *ecdsasig = tempargs->ecdsasig;
- unsigned int ecdsasiglen = tempargs->siglen;
+ EC_KEY **ecdsa = tempargs->ecdsa;
+ unsigned char *ecdsasig = tempargs->buf2;
+ unsigned int ecdsasiglen = *(tempargs->siglen);
int ret, count;
for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen,
if (ret != 1) {
BIO_printf(bio_err, "ECDSA verify failure\n");
ERR_print_errors(bio_err);
- count = 1;
+ count = -1;
break;
}
}
return count;
}
-static unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
-static EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
static int outlen;
static void *(*kdf) (const void *in, size_t inlen, void *out,
size_t *xoutlen);
static int ECDH_compute_key_loop(void *args)
{
+ loopargs_t *tempargs = (loopargs_t *)args;
+ EC_KEY **ecdh_a = tempargs->ecdh_a;
+ EC_KEY **ecdh_b = tempargs->ecdh_b;
+ unsigned char *secret_a = tempargs->secret_a;
int count;
for (count = 0; COND(ecdh_c[testnum][0]); count++) {
ECDH_compute_key(secret_a, outlen,
int num_inprogress = 0;
int error = 0;
int i = 0;
+ OSSL_ASYNC_FD job_fd = 0;
+ size_t num_job_fds = 0;
run = 1;
- if (0 == async_jobs) {
+ if (async_jobs == 0) {
return loop_function((void *)loopargs);
}
+
for (i = 0; i < async_jobs && !error; i++) {
- switch (ASYNC_start_job(&(loopargs[i].inprogress_job), &job_op_count,
- loop_function, (void *)(loopargs + i), sizeof(loopargs_t))) {
+ switch (ASYNC_start_job(&(loopargs[i].inprogress_job), loopargs[i].wait_ctx,
+ &job_op_count, loop_function,
+ (void *)(loopargs + i), sizeof(loopargs_t))) {
case ASYNC_PAUSE:
++num_inprogress;
break;
}
while (num_inprogress > 0) {
- OSSL_ASYNC_FD job_fd = 0;
-#if defined(ASYNC_POSIX)
- OSSL_ASYNC_FD max_fd = 0;
+#if defined(OPENSSL_SYS_WINDOWS)
+ DWORD avail = 0;
+#elif defined(OPENSSL_SYS_UNIX)
int select_result = 0;
+ OSSL_ASYNC_FD max_fd = 0;
fd_set waitfdset;
- struct timeval select_timeout;
+
FD_ZERO(&waitfdset);
- select_timeout.tv_sec=0;
- select_timeout.tv_usec=0;
- for (i = 0; i < async_jobs; i++) {
- if (loopargs[i].inprogress_job != NULL) {
- job_fd = ASYNC_get_wait_fd(loopargs[i].inprogress_job);
- FD_SET(job_fd, &waitfdset);
- if (job_fd > max_fd)
- max_fd = job_fd;
+ for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
+ if (loopargs[i].inprogress_job == NULL)
+ continue;
+
+ if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
+ || num_job_fds > 1) {
+ BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
+ ERR_print_errors(bio_err);
+ error = 1;
+ break;
}
+ ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
+ FD_SET(job_fd, &waitfdset);
+ if (job_fd > max_fd)
+ max_fd = job_fd;
}
- select_result = select(max_fd + 1, &waitfdset, NULL, NULL, &select_timeout);
+ if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
+ BIO_printf(bio_err,
+ "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
+ "Decrease the value of async_jobs\n",
+ max_fd, FD_SETSIZE);
+ ERR_print_errors(bio_err);
+ error = 1;
+ break;
+ }
+
+ select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
if (select_result == -1 && errno == EINTR)
continue;
if (select_result == -1) {
- BIO_printf(bio_err, "Failure in the select\n");
- ERR_print_errors(bio_err);
- error = 1;
- break;
+ BIO_printf(bio_err, "Failure in the select\n");
+ ERR_print_errors(bio_err);
+ error = 1;
+ break;
}
if (select_result == 0)
continue;
-
-#elif defined(ASYNC_WIN)
- DWORD avail = 0;
#endif
for (i = 0; i < async_jobs; i++) {
if (loopargs[i].inprogress_job == NULL)
continue;
- job_fd = ASYNC_get_wait_fd(loopargs[i].inprogress_job);
+ if (!ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, NULL, &num_job_fds)
+ || num_job_fds > 1) {
+ BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
+ ERR_print_errors(bio_err);
+ error = 1;
+ break;
+ }
+ ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
-#if defined(ASYNC_POSIX)
- if (!FD_ISSET(job_fd, &waitfdset))
+#if defined(OPENSSL_SYS_UNIX)
+ if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
continue;
-#elif defined(ASYNC_WIN)
- if (!PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL) && avail > 0)
+#elif defined(OPENSSL_SYS_WINDOWS)
+ if (num_job_fds == 1 &&
+ !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL) && avail > 0)
continue;
#endif
- switch (ASYNC_start_job(&(loopargs[i].inprogress_job),
+ switch (ASYNC_start_job(&(loopargs[i].inprogress_job), loopargs[i].wait_ctx,
&job_op_count, loop_function, (void *)(loopargs + i),
sizeof(loopargs_t))) {
case ASYNC_PAUSE:
int speed_main(int argc, char **argv)
{
loopargs_t *loopargs = NULL;
+ int async_init = 0;
int loopargs_len = 0;
char *prog;
const EVP_CIPHER *evp_cipher = NULL;
double d = 0.0;
OPTION_CHOICE o;
int multiblock = 0, doit[ALGOR_NUM], pr_header = 0;
- int dsa_doit[DSA_NUM], rsa_doit[RSA_NUM];
+#ifndef OPENSSL_NO_DSA
+ int dsa_doit[DSA_NUM];
+#endif
+ int rsa_doit[RSA_NUM];
int ret = 1, i, k, misalign = 0;
long c[ALGOR_NUM][SIZE_NUM], count = 0, save_count = 0;
#ifndef NO_FORK
int async_jobs = 0;
/* What follows are the buffers and key material. */
#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
- long rsa_count;
+ long rsa_count = 1;
#endif
#ifndef OPENSSL_NO_RC5
RC5_32_KEY rc5_ks;
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
};
-#ifndef OPENSSL_NO_AES
static const unsigned char key24[24] = {
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
};
-#endif
#ifndef OPENSSL_NO_CAMELLIA
static const unsigned char ckey24[24] = {
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
#ifndef OPENSSL_NO_EC
int ecdsa_doit[EC_NUM];
int secret_size_a, secret_size_b;
- int ecdh_checks = 0;
+ int ecdh_checks = 1;
int secret_idx = 0;
long ecdh_c[EC_NUM][2];
int ecdh_doit[EC_NUM];
#endif
memset(results, 0, sizeof(results));
-#ifndef OPENSSL_NO_DSA
- memset(dsa_key, 0, sizeof(dsa_key));
-#endif
-#ifndef OPENSSL_NO_EC
- for (i = 0; i < EC_NUM; i++)
- ecdsa[i] = NULL;
- for (i = 0; i < EC_NUM; i++)
- ecdh_a[i] = ecdh_b[i] = NULL;
-#endif
-#ifndef OPENSSL_NO_RSA
- memset(rsa_key, 0, sizeof(rsa_key));
- for (i = 0; i < RSA_NUM; i++)
- rsa_key[i] = NULL;
-#endif
memset(c, 0, sizeof(c));
+#ifndef OPENSSL_NO_DES
memset(DES_iv, 0, sizeof(DES_iv));
+#endif
memset(iv, 0, sizeof(iv));
for (i = 0; i < ALGOR_NUM; i++)
doit[i] = 0;
for (i = 0; i < RSA_NUM; i++)
rsa_doit[i] = 0;
+#ifndef OPENSSL_NO_DSA
for (i = 0; i < DSA_NUM; i++)
dsa_doit[i] = 0;
+#endif
#ifndef OPENSSL_NO_EC
for (i = 0; i < EC_NUM; i++)
ecdsa_doit[i] = 0;
#endif
break;
case OPT_ASYNCJOBS:
-#ifndef ASYNC_NULL
+#ifndef OPENSSL_NO_ASYNC
async_jobs = atoi(opt_arg());
+ if (!ASYNC_is_capable()) {
+ BIO_printf(bio_err,
+ "%s: async_jobs specified but async not supported\n",
+ prog);
+ goto opterr;
+ }
#endif
break;
case OPT_MISALIGN:
continue;
}
#endif
-#ifndef OPENSSL_NO_AES
if (strcmp(*argv, "aes") == 0) {
doit[D_CBC_128_AES] = doit[D_CBC_192_AES] =
doit[D_CBC_256_AES] = 1;
continue;
}
-#endif
#ifndef OPENSSL_NO_CAMELLIA
if (strcmp(*argv, "camellia") == 0) {
doit[D_CBC_128_CML] = doit[D_CBC_192_CML] =
/* Initialize the job pool if async mode is enabled */
if (async_jobs > 0) {
- if (!ASYNC_init_thread(async_jobs, async_jobs)) {
+ async_init = ASYNC_init_thread(async_jobs, async_jobs);
+ if (!async_init) {
BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
goto end;
}
loopargs = app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
- for (i = 0; i < loopargs_len; ++i) {
+ for (i = 0; i < loopargs_len; i++) {
+ if (async_jobs > 0) {
+ loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
+ if (loopargs[i].wait_ctx == NULL) {
+ BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
+ goto end;
+ }
+ }
+
loopargs[i].buf_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
loopargs[i].buf2_malloc = app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
/* Align the start of buffers on a 64 byte boundary */
loopargs[i].buf = loopargs[i].buf_malloc + misalign;
loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
+ loopargs[i].siglen = app_malloc(sizeof(unsigned int), "signature length");
+#ifndef OPENSSL_NO_EC
+ loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
+ loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
+#endif
}
#ifndef NO_FORK
doit[i] = 1;
for (i = 0; i < RSA_NUM; i++)
rsa_doit[i] = 1;
+#ifndef OPENSSL_NO_DSA
for (i = 0; i < DSA_NUM; i++)
dsa_doit[i] = 1;
+#endif
#ifndef OPENSSL_NO_EC
for (i = 0; i < EC_NUM; i++)
ecdsa_doit[i] = 1;
"instead of user CPU time.\n");
#ifndef OPENSSL_NO_RSA
- for (i = 0; i < RSA_NUM; i++) {
- const unsigned char *p;
-
- p = rsa_data[i];
- rsa_key[i] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[i]);
- if (rsa_key[i] == NULL) {
- BIO_printf(bio_err, "internal error loading RSA key number %d\n",
- i);
- goto end;
+ for (i = 0; i < loopargs_len; i++) {
+ for (k = 0; k < RSA_NUM; k++) {
+ const unsigned char *p;
+
+ p = rsa_data[k];
+ loopargs[i].rsa_key[k] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
+ if (loopargs[i].rsa_key[k] == NULL) {
+ BIO_printf(bio_err, "internal error loading RSA key number %d\n",
+ k);
+ goto end;
+ }
}
}
#endif
-
#ifndef OPENSSL_NO_DSA
- dsa_key[0] = get_dsa512();
- dsa_key[1] = get_dsa1024();
- dsa_key[2] = get_dsa2048();
+ for (i = 0; i < loopargs_len; i++) {
+ loopargs[i].dsa_key[0] = get_dsa512();
+ loopargs[i].dsa_key[1] = get_dsa1024();
+ loopargs[i].dsa_key[2] = get_dsa2048();
+ }
#endif
-
#ifndef OPENSSL_NO_DES
DES_set_key_unchecked(&key, &sch);
DES_set_key_unchecked(&key2, &sch2);
DES_set_key_unchecked(&key3, &sch3);
#endif
-#ifndef OPENSSL_NO_AES
AES_set_encrypt_key(key16, 128, &aes_ks1);
AES_set_encrypt_key(key24, 192, &aes_ks2);
AES_set_encrypt_key(key32, 256, &aes_ks3);
-#endif
#ifndef OPENSSL_NO_CAMELLIA
Camellia_set_key(key16, 128, &camellia_ks1);
Camellia_set_key(ckey24, 192, &camellia_ks2);
Camellia_set_key(ckey32, 256, &camellia_ks3);
#endif
#ifndef OPENSSL_NO_IDEA
- idea_set_encrypt_key(key16, &idea_ks);
+ IDEA_set_encrypt_key(key16, &idea_ks);
#endif
#ifndef OPENSSL_NO_SEED
SEED_set_key(key16, &seed_ks);
#ifndef OPENSSL_NO_MD5
if (doit[D_HMAC]) {
- for (i = 0; i < loopargs_len; ++i) {
+ for (i = 0; i < loopargs_len; i++) {
loopargs[i].hctx = HMAC_CTX_new();
if (loopargs[i].hctx == NULL) {
BIO_printf(bio_err, "HMAC malloc failure, exiting...");
d = Time_F(STOP);
print_result(D_HMAC, testnum, count, d);
}
- for (i = 0; i < loopargs_len; ++i) {
+ for (i = 0; i < loopargs_len; i++) {
HMAC_CTX_free(loopargs[i].hctx);
}
}
}
}
#endif
-#ifndef OPENSSL_NO_AES
+
if (doit[D_CBC_128_AES]) {
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
}
}
if (doit[D_GHASH]) {
- for (i = 0; i < loopargs_len; ++i) {
+ for (i = 0; i < loopargs_len; i++) {
loopargs[i].gcm_ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx, (unsigned char *)"0123456789ab", 12);
}
d = Time_F(STOP);
print_result(D_GHASH, testnum, count, d);
}
- for (i = 0; i < loopargs_len; ++i)
+ for (i = 0; i < loopargs_len; i++)
CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
}
-#endif
+
#ifndef OPENSSL_NO_CAMELLIA
if (doit[D_CBC_128_CML]) {
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
}
Time_F(START);
for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
- idea_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
+ IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
(unsigned long)lengths[testnum], &idea_ks,
iv, IDEA_ENCRYPT);
d = Time_F(STOP);
}
}
- for (i = 0; i < loopargs_len; ++i)
+ for (i = 0; i < loopargs_len; i++)
RAND_bytes(loopargs[i].buf, 36);
#ifndef OPENSSL_NO_RSA
int st = 0;
if (!rsa_doit[testnum])
continue;
- for (i = 0; i < loopargs_len; ++i) {
- st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2, &rsa_num, rsa_key[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
+ loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
if (st == 0)
break;
}
rsa_count = count;
}
- for (i = 0; i < loopargs_len; ++i) {
- st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2, rsa_num, rsa_key[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
+ *(loopargs[i].siglen), loopargs[i].rsa_key[testnum]);
if (st <= 0)
break;
}
}
#endif
- for (i = 0; i < loopargs_len; ++i)
+ for (i = 0; i < loopargs_len; i++)
RAND_bytes(loopargs[i].buf, 36);
#ifndef OPENSSL_NO_DSA
if (RAND_status() != 1) {
RAND_seed(rnd_seed, sizeof rnd_seed);
- rnd_fake = 1;
}
for (testnum = 0; testnum < DSA_NUM; testnum++) {
int st = 0;
/* DSA_generate_key(dsa_key[testnum]); */
/* DSA_sign_setup(dsa_key[testnum],NULL); */
- for (i = 0; i < loopargs_len; ++i) {
- st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2, &(loopargs[i].siglen), dsa_key[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
+ loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
if (st == 0)
break;
}
rsa_count = count;
}
- for (i = 0; i < loopargs_len; ++i) {
- st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2, loopargs[i].siglen, dsa_key[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
+ *(loopargs[i].siglen), loopargs[i].dsa_key[testnum]);
if (st <= 0)
break;
}
dsa_doit[testnum] = 0;
}
}
- if (rnd_fake)
- RAND_cleanup();
#endif
#ifndef OPENSSL_NO_EC
if (RAND_status() != 1) {
RAND_seed(rnd_seed, sizeof rnd_seed);
- rnd_fake = 1;
}
for (testnum = 0; testnum < EC_NUM; testnum++) {
- int st = 0;
+ int st = 1;
if (!ecdsa_doit[testnum])
continue; /* Ignore Curve */
- ecdsa[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
- if (ecdsa[testnum] == NULL) {
+ for (i = 0; i < loopargs_len; i++) {
+ loopargs[i].ecdsa[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
+ if (loopargs[i].ecdsa[testnum] == NULL) {
+ st = 0;
+ break;
+ }
+ }
+ if (st == 0) {
BIO_printf(bio_err, "ECDSA failure.\n");
ERR_print_errors(bio_err);
rsa_count = 1;
} else {
- EC_KEY_precompute_mult(ecdsa[testnum], NULL);
- /* Perform ECDSA signature test */
- EC_KEY_generate_key(ecdsa[testnum]);
- for (i = 0; i < loopargs_len; ++i) {
- st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].ecdsasig, &(loopargs[i].siglen), ecdsa[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
+ /* Perform ECDSA signature test */
+ EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
+ st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
+ loopargs[i].siglen, loopargs[i].ecdsa[testnum]);
if (st == 0)
break;
}
}
/* Perform ECDSA verification test */
- for (i = 0; i < loopargs_len; ++i) {
- st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].ecdsasig, loopargs[i].siglen, ecdsa[testnum]);
+ for (i = 0; i < loopargs_len; i++) {
+ st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
+ *(loopargs[i].siglen), loopargs[i].ecdsa[testnum]);
if (st != 1)
break;
}
}
}
}
- if (rnd_fake)
- RAND_cleanup();
#endif
#ifndef OPENSSL_NO_EC
if (RAND_status() != 1) {
RAND_seed(rnd_seed, sizeof rnd_seed);
- rnd_fake = 1;
}
for (testnum = 0; testnum < EC_NUM; testnum++) {
if (!ecdh_doit[testnum])
continue;
- ecdh_a[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
- ecdh_b[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
- if ((ecdh_a[testnum] == NULL) || (ecdh_b[testnum] == NULL)) {
+ for (i = 0; i < loopargs_len; i++) {
+ loopargs[i].ecdh_a[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
+ loopargs[i].ecdh_b[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
+ if (loopargs[i].ecdh_a[testnum] == NULL ||
+ loopargs[i].ecdh_b[testnum] == NULL) {
+ ecdh_checks = 0;
+ break;
+ }
+ }
+ if (ecdh_checks == 0) {
BIO_printf(bio_err, "ECDH failure.\n");
ERR_print_errors(bio_err);
rsa_count = 1;
} else {
- /* generate two ECDH key pairs */
- if (!EC_KEY_generate_key(ecdh_a[testnum]) ||
- !EC_KEY_generate_key(ecdh_b[testnum])) {
- BIO_printf(bio_err, "ECDH key generation failure.\n");
- ERR_print_errors(bio_err);
- rsa_count = 1;
- } else {
- /*
- * If field size is not more than 24 octets, then use SHA-1
- * hash of result; otherwise, use result (see section 4.8 of
- * draft-ietf-tls-ecc-03.txt).
- */
- int field_size;
- field_size =
- EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[testnum]));
- if (field_size <= 24 * 8) {
- outlen = KDF1_SHA1_len;
- kdf = KDF1_SHA1;
- } else {
- outlen = (field_size + 7) / 8;
- kdf = NULL;
- }
- secret_size_a =
- ECDH_compute_key(secret_a, outlen,
- EC_KEY_get0_public_key(ecdh_b[testnum]),
- ecdh_a[testnum], kdf);
- secret_size_b =
- ECDH_compute_key(secret_b, outlen,
- EC_KEY_get0_public_key(ecdh_a[testnum]),
- ecdh_b[testnum], kdf);
- if (secret_size_a != secret_size_b)
+ for (i = 0; i < loopargs_len; i++) {
+ /* generate two ECDH key pairs */
+ if (!EC_KEY_generate_key(loopargs[i].ecdh_a[testnum]) ||
+ !EC_KEY_generate_key(loopargs[i].ecdh_b[testnum])) {
+ BIO_printf(bio_err, "ECDH key generation failure.\n");
+ ERR_print_errors(bio_err);
ecdh_checks = 0;
- else
- ecdh_checks = 1;
-
- for (secret_idx = 0; (secret_idx < secret_size_a)
- && (ecdh_checks == 1); secret_idx++) {
- if (secret_a[secret_idx] != secret_b[secret_idx])
+ rsa_count = 1;
+ } else {
+ /*
+ * If field size is not more than 24 octets, then use SHA-1
+ * hash of result; otherwise, use result (see section 4.8 of
+ * draft-ietf-tls-ecc-03.txt).
+ */
+ int field_size;
+ field_size =
+ EC_GROUP_get_degree(EC_KEY_get0_group(loopargs[i].ecdh_a[testnum]));
+ if (field_size <= 24 * 8) {
+ outlen = KDF1_SHA1_len;
+ kdf = KDF1_SHA1;
+ } else {
+ outlen = (field_size + 7) / 8;
+ kdf = NULL;
+ }
+ secret_size_a =
+ ECDH_compute_key(loopargs[i].secret_a, outlen,
+ EC_KEY_get0_public_key(loopargs[i].ecdh_b[testnum]),
+ loopargs[i].ecdh_a[testnum], kdf);
+ secret_size_b =
+ ECDH_compute_key(loopargs[i].secret_b, outlen,
+ EC_KEY_get0_public_key(loopargs[i].ecdh_a[testnum]),
+ loopargs[i].ecdh_b[testnum], kdf);
+ if (secret_size_a != secret_size_b)
ecdh_checks = 0;
- }
+ else
+ ecdh_checks = 1;
- if (ecdh_checks == 0) {
- BIO_printf(bio_err, "ECDH computations don't match.\n");
- ERR_print_errors(bio_err);
- rsa_count = 1;
- }
+ for (secret_idx = 0; (secret_idx < secret_size_a)
+ && (ecdh_checks == 1); secret_idx++) {
+ if (loopargs[i].secret_a[secret_idx] != loopargs[i].secret_b[secret_idx])
+ ecdh_checks = 0;
+ }
+ if (ecdh_checks == 0) {
+ BIO_printf(bio_err, "ECDH computations don't match.\n");
+ ERR_print_errors(bio_err);
+ rsa_count = 1;
+ break;
+ }
+ }
+ }
+ if (ecdh_checks != 0) {
pkey_print_message("", "ecdh",
- ecdh_c[testnum][0],
- test_curves_bits[testnum], ECDH_SECONDS);
+ ecdh_c[testnum][0],
+ test_curves_bits[testnum], ECDH_SECONDS);
Time_F(START);
count = run_benchmark(async_jobs, ECDH_compute_key_loop, loopargs);
d = Time_F(STOP);
BIO_printf(bio_err,
- mr ? "+R7:%ld:%d:%.2f\n" :
- "%ld %d-bit ECDH ops in %.2fs\n", count,
- test_curves_bits[testnum], d);
+ mr ? "+R7:%ld:%d:%.2f\n" :
+ "%ld %d-bit ECDH ops in %.2fs\n", count,
+ test_curves_bits[testnum], d);
ecdh_results[testnum][0] = d / (double)count;
rsa_count = count;
}
ecdh_doit[testnum] = 0;
}
}
- if (rnd_fake)
- RAND_cleanup();
#endif
#ifndef NO_FORK
show_res:
#ifndef OPENSSL_NO_DES
printf("%s ", DES_options());
#endif
-#ifndef OPENSSL_NO_AES
printf("%s ", AES_options());
-#endif
#ifndef OPENSSL_NO_IDEA
- printf("%s ", idea_options());
+ printf("%s ", IDEA_options());
#endif
#ifndef OPENSSL_NO_BF
printf("%s ", BF_options());
end:
ERR_print_errors(bio_err);
- for (i = 0; i < loopargs_len; ++i) {
- if (loopargs[i].buf_malloc != NULL)
- OPENSSL_free(loopargs[i].buf_malloc);
- if (loopargs[i].buf2_malloc != NULL)
- OPENSSL_free(loopargs[i].buf2_malloc);
- }
- if (loopargs != NULL)
- OPENSSL_free(loopargs);
+ for (i = 0; i < loopargs_len; i++) {
+ OPENSSL_free(loopargs[i].buf_malloc);
+ OPENSSL_free(loopargs[i].buf2_malloc);
+ OPENSSL_free(loopargs[i].siglen);
+ }
#ifndef OPENSSL_NO_RSA
- for (i = 0; i < RSA_NUM; i++)
- RSA_free(rsa_key[i]);
+ for (i = 0; i < loopargs_len; i++) {
+ for (k = 0; k < RSA_NUM; k++)
+ RSA_free(loopargs[i].rsa_key[k]);
+ }
#endif
#ifndef OPENSSL_NO_DSA
- for (i = 0; i < DSA_NUM; i++)
- DSA_free(dsa_key[i]);
+ for (i = 0; i < loopargs_len; i++) {
+ for (k = 0; k < DSA_NUM; k++)
+ DSA_free(loopargs[i].dsa_key[k]);
+ }
#endif
#ifndef OPENSSL_NO_EC
- for (i = 0; i < EC_NUM; i++) {
- EC_KEY_free(ecdsa[i]);
- EC_KEY_free(ecdh_a[i]);
- EC_KEY_free(ecdh_b[i]);
+ for (i = 0; i < loopargs_len; i++) {
+ for (k = 0; k < EC_NUM; k++) {
+ EC_KEY_free(loopargs[i].ecdsa[k]);
+ EC_KEY_free(loopargs[i].ecdh_a[k]);
+ EC_KEY_free(loopargs[i].ecdh_b[k]);
+ }
+ OPENSSL_free(loopargs[i].secret_a);
+ OPENSSL_free(loopargs[i].secret_b);
}
#endif
- if (async_jobs > 0)
+ if (async_jobs > 0) {
+ for (i = 0; i < loopargs_len; i++)
+ ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
+ }
+
+ if (async_init) {
ASYNC_cleanup_thread();
+ }
+ OPENSSL_free(loopargs);
return (ret);
}
static void print_result(int alg, int run_no, int count, double time_used)
{
+ if (count == -1) {
+ BIO_puts(bio_err, "EVP error!\n");
+ exit(1);
+ }
BIO_printf(bio_err,
mr ? "+R:%d:%s:%f\n"
: "%d %s's in %.2fs\n", count, names[alg], time_used);