OpenSSL 1.1.1-pre2
This commit is contained in:
+607
-398
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -7,23 +8,8 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
*
|
||||
* Portions of the attached software ("Contribution") are developed by
|
||||
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
|
||||
*
|
||||
* The Contribution is licensed pursuant to the OpenSSL open source
|
||||
* license provided above.
|
||||
*
|
||||
* The ECDH and ECDSA speed test software is originally written by
|
||||
* Sumit Gupta of Sun Microsystems Laboratories.
|
||||
*
|
||||
*/
|
||||
|
||||
#undef SECONDS
|
||||
#define SECONDS 3
|
||||
#define PRIME_SECONDS 10
|
||||
#define RSA_SECONDS 10
|
||||
#define DSA_SECONDS 10
|
||||
#define ECDSA_SECONDS 10
|
||||
@@ -34,6 +20,7 @@
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "apps.h"
|
||||
#include "progs.h"
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/err.h>
|
||||
@@ -125,13 +112,9 @@
|
||||
# define NO_FORK
|
||||
#endif
|
||||
|
||||
#undef BUFSIZE
|
||||
#define BUFSIZE (1024*16+1)
|
||||
#define MAX_MISALIGNMENT 63
|
||||
|
||||
#define ALGOR_NUM 30
|
||||
#define SIZE_NUM 6
|
||||
#define PRIME_NUM 3
|
||||
#define ALGOR_NUM 31
|
||||
#define RSA_NUM 7
|
||||
#define DSA_NUM 3
|
||||
|
||||
@@ -139,14 +122,19 @@
|
||||
#define MAX_ECDH_SIZE 256
|
||||
#define MISALIGN 64
|
||||
|
||||
typedef struct openssl_speed_sec_st {
|
||||
int sym;
|
||||
int rsa;
|
||||
int dsa;
|
||||
int ecdsa;
|
||||
int ecdh;
|
||||
} openssl_speed_sec_t;
|
||||
|
||||
static volatile int run = 0;
|
||||
|
||||
static int mr = 0;
|
||||
static int usertime = 1;
|
||||
|
||||
typedef void *(*kdf_fn) (
|
||||
const void *in, size_t inlen, void *out, size_t *xoutlen);
|
||||
|
||||
typedef struct loopargs_st {
|
||||
ASYNC_JOB *inprogress_job;
|
||||
ASYNC_WAIT_CTX *wait_ctx;
|
||||
@@ -154,6 +142,7 @@ typedef struct loopargs_st {
|
||||
unsigned char *buf2;
|
||||
unsigned char *buf_malloc;
|
||||
unsigned char *buf2_malloc;
|
||||
unsigned char *key;
|
||||
unsigned int siglen;
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
RSA *rsa_key[RSA_NUM];
|
||||
@@ -163,12 +152,10 @@ typedef struct loopargs_st {
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_EC
|
||||
EC_KEY *ecdsa[EC_NUM];
|
||||
EC_KEY *ecdh_a[EC_NUM];
|
||||
EC_KEY *ecdh_b[EC_NUM];
|
||||
EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
|
||||
unsigned char *secret_a;
|
||||
unsigned char *secret_b;
|
||||
size_t outlen;
|
||||
kdf_fn kdf;
|
||||
size_t outlen[EC_NUM];
|
||||
#endif
|
||||
EVP_CIPHER_CTX *ctx;
|
||||
HMAC_CTX *hctx;
|
||||
@@ -212,7 +199,9 @@ static int AES_cbc_256_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);
|
||||
static int RAND_bytes_loop(void *args);
|
||||
static int EVP_Update_loop(void *args);
|
||||
static int EVP_Update_loop_ccm(void *args);
|
||||
static int EVP_Digest_loop(void *args);
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
static int RSA_sign_loop(void *args);
|
||||
@@ -225,19 +214,26 @@ static int DSA_verify_loop(void *args);
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static int ECDSA_sign_loop(void *args);
|
||||
static int ECDSA_verify_loop(void *args);
|
||||
static int ECDH_compute_key_loop(void *args);
|
||||
#endif
|
||||
static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_t *loopargs);
|
||||
static int run_benchmark(int async_jobs, int (*loop_function) (void *),
|
||||
loopargs_t * loopargs);
|
||||
|
||||
static double Time_F(int s);
|
||||
static void print_message(const char *s, long num, int length);
|
||||
static void print_message(const char *s, long num, int length, int tm);
|
||||
static void pkey_print_message(const char *str, const char *str2,
|
||||
long num, int bits, int sec);
|
||||
static void print_result(int alg, int run_no, int count, double time_used);
|
||||
#ifndef NO_FORK
|
||||
static int do_multi(int multi);
|
||||
static int do_multi(int multi, int size_num);
|
||||
#endif
|
||||
|
||||
static const int lengths_list[] = {
|
||||
16, 64, 256, 1024, 8 * 1024, 16 * 1024
|
||||
};
|
||||
static int lengths_single = 0;
|
||||
|
||||
static const int *lengths = lengths_list;
|
||||
|
||||
static const char *names[ALGOR_NUM] = {
|
||||
"md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
|
||||
"des cbc", "des ede3", "idea cbc", "seed cbc",
|
||||
@@ -245,14 +241,11 @@ static const char *names[ALGOR_NUM] = {
|
||||
"aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
|
||||
"camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
|
||||
"evp", "sha256", "sha512", "whirlpool",
|
||||
"aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
|
||||
"aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
|
||||
"rand"
|
||||
};
|
||||
|
||||
static double results[ALGOR_NUM][SIZE_NUM];
|
||||
|
||||
static const int lengths[SIZE_NUM] = {
|
||||
16, 64, 256, 1024, 8 * 1024, 16 * 1024
|
||||
};
|
||||
static double results[ALGOR_NUM][OSSL_NELEM(lengths_list)];
|
||||
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
static double rsa_results[RSA_NUM][2];
|
||||
@@ -265,11 +258,6 @@ static double ecdsa_results[EC_NUM][2];
|
||||
static double ecdh_results[EC_NUM][1];
|
||||
#endif
|
||||
|
||||
#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";
|
||||
#endif
|
||||
|
||||
#ifdef SIGALRM
|
||||
# if defined(__STDC__) || defined(sgi) || defined(_AIX)
|
||||
# define SIGRETTYPE void
|
||||
@@ -346,7 +334,8 @@ static double Time_F(int s)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void multiblock_speed(const EVP_CIPHER *evp_cipher);
|
||||
static void multiblock_speed(const EVP_CIPHER *evp_cipher,
|
||||
const openssl_speed_sec_t *seconds);
|
||||
|
||||
static int found(const char *name, const OPT_PAIR *pairs, int *result)
|
||||
{
|
||||
@@ -361,10 +350,11 @@ static int found(const char *name, const OPT_PAIR *pairs, int *result)
|
||||
typedef enum OPTION_choice {
|
||||
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
|
||||
OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
|
||||
OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS
|
||||
OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM,
|
||||
OPT_PRIMES, OPT_SECONDS, OPT_BYTES
|
||||
} OPTION_CHOICE;
|
||||
|
||||
OPTIONS speed_options[] = {
|
||||
const OPTIONS speed_options[] = {
|
||||
{OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
|
||||
{OPT_HELP_STR, 1, '-', "Valid options are:\n"},
|
||||
{"help", OPT_HELP, '-', "Display this summary"},
|
||||
@@ -384,9 +374,15 @@ OPTIONS speed_options[] = {
|
||||
{"async_jobs", OPT_ASYNCJOBS, 'p',
|
||||
"Enable async mode and start pnum jobs"},
|
||||
#endif
|
||||
OPT_R_OPTIONS,
|
||||
#ifndef OPENSSL_NO_ENGINE
|
||||
{"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
|
||||
#endif
|
||||
{"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
|
||||
{"seconds", OPT_SECONDS, 'p',
|
||||
"Run benchmarks for pnum seconds"},
|
||||
{"bytes", OPT_BYTES, 'p',
|
||||
"Run cipher, digest and rand benchmarks on pnum bytes"},
|
||||
{NULL},
|
||||
};
|
||||
|
||||
@@ -420,6 +416,7 @@ OPTIONS speed_options[] = {
|
||||
#define D_IGE_192_AES 27
|
||||
#define D_IGE_256_AES 28
|
||||
#define D_GHASH 29
|
||||
#define D_RAND 30
|
||||
static OPT_PAIR doit_choices[] = {
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
{"md2", D_MD2},
|
||||
@@ -485,6 +482,7 @@ static OPT_PAIR doit_choices[] = {
|
||||
{"cast5", D_CBC_CAST},
|
||||
#endif
|
||||
{"ghash", D_GHASH},
|
||||
{"rand", D_RAND},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@@ -584,24 +582,24 @@ static OPT_PAIR ecdh_choices[] = {
|
||||
#else
|
||||
# define COND(unused_cond) (run && count<0x7fffffff)
|
||||
# define COUNT(d) (count)
|
||||
#endif /* SIGALRM */
|
||||
#endif /* SIGALRM */
|
||||
|
||||
static int testnum;
|
||||
|
||||
/* Nb of iterations to do per algorithm and key-size */
|
||||
static long c[ALGOR_NUM][SIZE_NUM];
|
||||
static long c[ALGOR_NUM][OSSL_NELEM(lengths_list)];
|
||||
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
static int EVP_Digest_MD2_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char md2[MD2_DIGEST_LENGTH];
|
||||
int count;
|
||||
|
||||
for (count = 0; COND(c[D_MD2][testnum]); count++) {
|
||||
if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
|
||||
NULL))
|
||||
NULL))
|
||||
return -1;
|
||||
}
|
||||
return count;
|
||||
@@ -611,14 +609,14 @@ static int EVP_Digest_MD2_loop(void *args)
|
||||
#ifndef OPENSSL_NO_MDC2
|
||||
static int EVP_Digest_MDC2_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char mdc2[MDC2_DIGEST_LENGTH];
|
||||
int count;
|
||||
|
||||
for (count = 0; COND(c[D_MDC2][testnum]); count++) {
|
||||
if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
|
||||
NULL))
|
||||
NULL))
|
||||
return -1;
|
||||
}
|
||||
return count;
|
||||
@@ -628,14 +626,14 @@ static int EVP_Digest_MDC2_loop(void *args)
|
||||
#ifndef OPENSSL_NO_MD4
|
||||
static int EVP_Digest_MD4_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char md4[MD4_DIGEST_LENGTH];
|
||||
int count;
|
||||
|
||||
for (count = 0; COND(c[D_MD4][testnum]); count++) {
|
||||
if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
|
||||
NULL))
|
||||
NULL))
|
||||
return -1;
|
||||
}
|
||||
return count;
|
||||
@@ -645,7 +643,7 @@ static int EVP_Digest_MD4_loop(void *args)
|
||||
#ifndef OPENSSL_NO_MD5
|
||||
static int MD5_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char md5[MD5_DIGEST_LENGTH];
|
||||
int count;
|
||||
@@ -656,7 +654,7 @@ static int MD5_loop(void *args)
|
||||
|
||||
static int HMAC_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
HMAC_CTX *hctx = tempargs->hctx;
|
||||
unsigned char hmac[MD5_DIGEST_LENGTH];
|
||||
@@ -673,7 +671,7 @@ static int HMAC_loop(void *args)
|
||||
|
||||
static int SHA1_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char sha[SHA_DIGEST_LENGTH];
|
||||
int count;
|
||||
@@ -684,7 +682,7 @@ static int SHA1_loop(void *args)
|
||||
|
||||
static int SHA256_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char sha256[SHA256_DIGEST_LENGTH];
|
||||
int count;
|
||||
@@ -695,7 +693,7 @@ static int SHA256_loop(void *args)
|
||||
|
||||
static int SHA512_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char sha512[SHA512_DIGEST_LENGTH];
|
||||
int count;
|
||||
@@ -707,7 +705,7 @@ static int SHA512_loop(void *args)
|
||||
#ifndef OPENSSL_NO_WHIRLPOOL
|
||||
static int WHIRLPOOL_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
|
||||
int count;
|
||||
@@ -720,13 +718,13 @@ static int WHIRLPOOL_loop(void *args)
|
||||
#ifndef OPENSSL_NO_RMD160
|
||||
static int EVP_Digest_RMD160_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
|
||||
int count;
|
||||
for (count = 0; COND(c[D_RMD160][testnum]); count++) {
|
||||
if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
|
||||
NULL, EVP_ripemd160(), NULL))
|
||||
NULL, EVP_ripemd160(), NULL))
|
||||
return -1;
|
||||
}
|
||||
return count;
|
||||
@@ -737,7 +735,7 @@ static int EVP_Digest_RMD160_loop(void *args)
|
||||
static RC4_KEY rc4_ks;
|
||||
static int RC4_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_RC4][testnum]); count++)
|
||||
@@ -753,24 +751,23 @@ static DES_key_schedule sch2;
|
||||
static DES_key_schedule sch3;
|
||||
static int DES_ncbc_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
|
||||
DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
|
||||
&DES_iv, DES_ENCRYPT);
|
||||
&DES_iv, DES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int DES_ede3_cbc_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
|
||||
DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
|
||||
&sch, &sch2, &sch3,
|
||||
&DES_iv, DES_ENCRYPT);
|
||||
&sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
@@ -781,82 +778,76 @@ static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
|
||||
static AES_KEY aes_ks1, aes_ks2, aes_ks3;
|
||||
static int AES_cbc_128_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
|
||||
AES_cbc_encrypt(buf, buf,
|
||||
(size_t)lengths[testnum], &aes_ks1,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int AES_cbc_192_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
|
||||
AES_cbc_encrypt(buf, buf,
|
||||
(size_t)lengths[testnum], &aes_ks2,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int AES_cbc_256_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
|
||||
AES_cbc_encrypt(buf, buf,
|
||||
(size_t)lengths[testnum], &aes_ks3,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int AES_ige_128_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
|
||||
AES_ige_encrypt(buf, buf2,
|
||||
(size_t)lengths[testnum], &aes_ks1,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int AES_ige_192_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
|
||||
AES_ige_encrypt(buf, buf2,
|
||||
(size_t)lengths[testnum], &aes_ks2,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int AES_ige_256_encrypt_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
int count;
|
||||
for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
|
||||
AES_ige_encrypt(buf, buf2,
|
||||
(size_t)lengths[testnum], &aes_ks3,
|
||||
iv, AES_ENCRYPT);
|
||||
(size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int CRYPTO_gcm128_aad_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
|
||||
int count;
|
||||
@@ -865,34 +856,85 @@ static int CRYPTO_gcm128_aad_loop(void *args)
|
||||
return count;
|
||||
}
|
||||
|
||||
static int RAND_bytes_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
int count;
|
||||
|
||||
for (count = 0; COND(c[D_RAND][testnum]); count++)
|
||||
RAND_bytes(buf, lengths[testnum]);
|
||||
return count;
|
||||
}
|
||||
|
||||
static long save_count = 0;
|
||||
static int decrypt = 0;
|
||||
static int EVP_Update_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
EVP_CIPHER_CTX *ctx = tempargs->ctx;
|
||||
int outl, count;
|
||||
int outl, count, rc;
|
||||
#ifndef SIGALRM
|
||||
int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
|
||||
#endif
|
||||
if (decrypt)
|
||||
for (count = 0; COND(nb_iter); count++)
|
||||
EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
else
|
||||
for (count = 0; COND(nb_iter); count++)
|
||||
EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
if (decrypt) {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
if (rc != 1)
|
||||
EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
|
||||
}
|
||||
} else {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
if (rc != 1)
|
||||
EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1);
|
||||
}
|
||||
}
|
||||
if (decrypt)
|
||||
EVP_DecryptFinal_ex(ctx, buf, &outl);
|
||||
else
|
||||
EVP_EncryptFinal_ex(ctx, buf, &outl);
|
||||
return count;
|
||||
}
|
||||
/*
|
||||
* CCM does not support streaming. For the purpose of performance measurement,
|
||||
* each message is encrypted using the same (key,iv)-pair. Do not use this
|
||||
* code in your application.
|
||||
*/
|
||||
static int EVP_Update_loop_ccm(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
EVP_CIPHER_CTX *ctx = tempargs->ctx;
|
||||
int outl, count;
|
||||
unsigned char tag[12];
|
||||
#ifndef SIGALRM
|
||||
int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
|
||||
#endif
|
||||
if (decrypt) {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
|
||||
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag);
|
||||
EVP_DecryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
|
||||
EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
EVP_DecryptFinal_ex(ctx, buf, &outl);
|
||||
}
|
||||
} else {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
|
||||
EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]);
|
||||
EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
EVP_EncryptFinal_ex(ctx, buf, &outl);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static const EVP_MD *evp_md = NULL;
|
||||
static int EVP_Digest_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char md[EVP_MAX_MD_SIZE];
|
||||
int count;
|
||||
@@ -912,7 +954,7 @@ static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
|
||||
|
||||
static int RSA_sign_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
unsigned int *rsa_num = &tempargs->siglen;
|
||||
@@ -932,14 +974,15 @@ static int RSA_sign_loop(void *args)
|
||||
|
||||
static int RSA_verify_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)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][1]); count++) {
|
||||
ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
|
||||
ret =
|
||||
RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
|
||||
if (ret <= 0) {
|
||||
BIO_printf(bio_err, "RSA verify failure\n");
|
||||
ERR_print_errors(bio_err);
|
||||
@@ -955,7 +998,7 @@ static int RSA_verify_loop(void *args)
|
||||
static long dsa_c[DSA_NUM][2];
|
||||
static int DSA_sign_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
DSA **dsa_key = tempargs->dsa_key;
|
||||
@@ -975,7 +1018,7 @@ static int DSA_sign_loop(void *args)
|
||||
|
||||
static int DSA_verify_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
unsigned char *buf2 = tempargs->buf2;
|
||||
DSA **dsa_key = tempargs->dsa_key;
|
||||
@@ -998,15 +1041,14 @@ static int DSA_verify_loop(void *args)
|
||||
static long ecdsa_c[EC_NUM][2];
|
||||
static int ECDSA_sign_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
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,
|
||||
ecdsasig, ecdsasiglen, ecdsa[testnum]);
|
||||
ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
|
||||
if (ret == 0) {
|
||||
BIO_printf(bio_err, "ECDSA sign failure\n");
|
||||
ERR_print_errors(bio_err);
|
||||
@@ -1019,15 +1061,14 @@ static int ECDSA_sign_loop(void *args)
|
||||
|
||||
static int ECDSA_verify_loop(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **)args;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
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,
|
||||
ecdsa[testnum]);
|
||||
ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
|
||||
if (ret != 1) {
|
||||
BIO_printf(bio_err, "ECDSA verify failure\n");
|
||||
ERR_print_errors(bio_err);
|
||||
@@ -1041,37 +1082,24 @@ static int ECDSA_verify_loop(void *args)
|
||||
/* ******************************************************************** */
|
||||
static long ecdh_c[EC_NUM][1];
|
||||
|
||||
static int ECDH_compute_key_loop(void *args)
|
||||
static int ECDH_EVP_derive_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;
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
|
||||
unsigned char *derived_secret = tempargs->secret_a;
|
||||
int count;
|
||||
size_t outlen = tempargs->outlen;
|
||||
kdf_fn kdf = tempargs->kdf;
|
||||
size_t *outlen = &(tempargs->outlen[testnum]);
|
||||
|
||||
for (count = 0; COND(ecdh_c[testnum][0]); count++)
|
||||
EVP_PKEY_derive(ctx, derived_secret, outlen);
|
||||
|
||||
for (count = 0; COND(ecdh_c[testnum][0]); count++) {
|
||||
ECDH_compute_key(secret_a, outlen,
|
||||
EC_KEY_get0_public_key(ecdh_b[testnum]),
|
||||
ecdh_a[testnum], kdf);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static const size_t KDF1_SHA1_len = 20;
|
||||
static void *KDF1_SHA1(const void *in, size_t inlen, void *out,
|
||||
size_t *outlen)
|
||||
{
|
||||
if (*outlen < SHA_DIGEST_LENGTH)
|
||||
return NULL;
|
||||
*outlen = SHA_DIGEST_LENGTH;
|
||||
return SHA1(in, inlen, out);
|
||||
}
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
|
||||
static int run_benchmark(int async_jobs,
|
||||
int (*loop_function)(void *), loopargs_t *loopargs)
|
||||
int (*loop_function) (void *), loopargs_t * loopargs)
|
||||
{
|
||||
int job_op_count = 0;
|
||||
int total_op_count = 0;
|
||||
@@ -1127,14 +1155,16 @@ static int run_benchmark(int async_jobs,
|
||||
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) {
|
||||
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);
|
||||
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;
|
||||
@@ -1142,9 +1172,9 @@ static int run_benchmark(int async_jobs,
|
||||
|
||||
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);
|
||||
"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;
|
||||
@@ -1169,14 +1199,16 @@ static int run_benchmark(int async_jobs,
|
||||
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) {
|
||||
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);
|
||||
ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
|
||||
&num_job_fds);
|
||||
|
||||
#if defined(OPENSSL_SYS_UNIX)
|
||||
if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
|
||||
@@ -1188,9 +1220,10 @@ static int run_benchmark(int async_jobs,
|
||||
continue;
|
||||
#endif
|
||||
|
||||
ret = ASYNC_start_job(&loopargs[i].inprogress_job,
|
||||
loopargs[i].wait_ctx, &job_op_count, loop_function,
|
||||
(void *)(loopargs + i), sizeof(loopargs_t));
|
||||
ret = ASYNC_start_job(&loopargs[i].inprogress_job,
|
||||
loopargs[i].wait_ctx, &job_op_count,
|
||||
loop_function, (void *)(loopargs + i),
|
||||
sizeof(loopargs_t));
|
||||
switch (ret) {
|
||||
case ASYNC_PAUSE:
|
||||
break;
|
||||
@@ -1221,6 +1254,7 @@ static int run_benchmark(int async_jobs,
|
||||
int speed_main(int argc, char **argv)
|
||||
{
|
||||
ENGINE *e = NULL;
|
||||
int (*loopfunc)(void *args);
|
||||
loopargs_t *loopargs = NULL;
|
||||
int async_init = 0;
|
||||
int loopargs_len = 0;
|
||||
@@ -1233,6 +1267,9 @@ int speed_main(int argc, char **argv)
|
||||
int doit[ALGOR_NUM] = { 0 };
|
||||
int ret = 1, i, k, misalign = 0;
|
||||
long count = 0;
|
||||
int size_num = OSSL_NELEM(lengths_list);
|
||||
int keylen;
|
||||
int buflen;
|
||||
#ifndef NO_FORK
|
||||
int multi = 0;
|
||||
#endif
|
||||
@@ -1241,7 +1278,9 @@ int speed_main(int argc, char **argv)
|
||||
|| !defined(OPENSSL_NO_EC)
|
||||
long rsa_count = 1;
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_EC
|
||||
size_t loop;
|
||||
#endif
|
||||
|
||||
/* What follows are the buffers and key material. */
|
||||
#ifndef OPENSSL_NO_RC5
|
||||
@@ -1316,6 +1355,7 @@ int speed_main(int argc, char **argv)
|
||||
sizeof(test15360)
|
||||
};
|
||||
int rsa_doit[RSA_NUM] = { 0 };
|
||||
int primes = RSA_DEFAULT_PRIME_NUM;
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
|
||||
@@ -1357,13 +1397,16 @@ int speed_main(int argc, char **argv)
|
||||
163, 233, 283,
|
||||
409, 571, 163,
|
||||
233, 283, 409,
|
||||
571, 253 /* X25519 */
|
||||
571, 253 /* X25519 */
|
||||
};
|
||||
|
||||
int ecdsa_doit[EC_NUM] = { 0 };
|
||||
int ecdh_doit[EC_NUM] = { 0 };
|
||||
#endif /* ndef OPENSSL_NO_EC */
|
||||
|
||||
openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS,
|
||||
ECDSA_SECONDS, ECDH_SECONDS };
|
||||
|
||||
prog = opt_init(argc, argv, speed_options);
|
||||
while ((o = opt_next()) != OPT_EOF) {
|
||||
switch (o) {
|
||||
@@ -1446,13 +1489,30 @@ int speed_main(int argc, char **argv)
|
||||
goto end;
|
||||
#endif
|
||||
break;
|
||||
case OPT_R_CASES:
|
||||
if (!opt_rand(o))
|
||||
goto end;
|
||||
break;
|
||||
case OPT_PRIMES:
|
||||
if (!opt_int(opt_arg(), &primes))
|
||||
goto end;
|
||||
break;
|
||||
case OPT_SECONDS:
|
||||
seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa
|
||||
= seconds.ecdh = atoi(opt_arg());
|
||||
break;
|
||||
case OPT_BYTES:
|
||||
lengths_single = atoi(opt_arg());
|
||||
lengths = &lengths_single;
|
||||
size_num = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
argc = opt_num_rest();
|
||||
argv = opt_rest();
|
||||
|
||||
/* Remaining arguments are algorithms. */
|
||||
for ( ; *argv; argv++) {
|
||||
for (; *argv; argv++) {
|
||||
if (found(*argv, doit_choices, &i)) {
|
||||
doit[i] = 1;
|
||||
continue;
|
||||
@@ -1494,14 +1554,12 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
if (strcmp(*argv, "aes") == 0) {
|
||||
doit[D_CBC_128_AES] = doit[D_CBC_192_AES] =
|
||||
doit[D_CBC_256_AES] = 1;
|
||||
doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
|
||||
continue;
|
||||
}
|
||||
#ifndef OPENSSL_NO_CAMELLIA
|
||||
if (strcmp(*argv, "camellia") == 0) {
|
||||
doit[D_CBC_128_CML] = doit[D_CBC_192_CML] =
|
||||
doit[D_CBC_256_CML] = 1;
|
||||
doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
@@ -1539,7 +1597,8 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
|
||||
loopargs = app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
|
||||
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++) {
|
||||
@@ -1551,8 +1610,12 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
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");
|
||||
buflen = lengths[size_num - 1] + MAX_MISALIGNMENT + 1;
|
||||
loopargs[i].buf_malloc = app_malloc(buflen, "input buffer");
|
||||
loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer");
|
||||
memset(loopargs[i].buf_malloc, 0, buflen);
|
||||
memset(loopargs[i].buf2_malloc, 0, buflen);
|
||||
|
||||
/* 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;
|
||||
@@ -1563,7 +1626,7 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
#ifndef NO_FORK
|
||||
if (multi && do_multi(multi))
|
||||
if (multi && do_multi(multi, size_num))
|
||||
goto show_res;
|
||||
#endif
|
||||
|
||||
@@ -1601,14 +1664,19 @@ int speed_main(int argc, char **argv)
|
||||
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
for (i = 0; i < loopargs_len; i++) {
|
||||
if (primes > RSA_DEFAULT_PRIME_NUM) {
|
||||
/* for multi-prime RSA, skip this */
|
||||
break;
|
||||
}
|
||||
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]);
|
||||
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);
|
||||
BIO_printf(bio_err,
|
||||
"internal error loading RSA key number %d\n", k);
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
@@ -1616,9 +1684,9 @@ int speed_main(int argc, char **argv)
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
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();
|
||||
loopargs[i].dsa_key[0] = get_dsa(512);
|
||||
loopargs[i].dsa_key[1] = get_dsa(1024);
|
||||
loopargs[i].dsa_key[2] = get_dsa(2048);
|
||||
}
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DES
|
||||
@@ -1698,8 +1766,9 @@ int speed_main(int argc, char **argv)
|
||||
c[D_IGE_192_AES][0] = count;
|
||||
c[D_IGE_256_AES][0] = count;
|
||||
c[D_GHASH][0] = count;
|
||||
c[D_RAND][0] = count;
|
||||
|
||||
for (i = 1; i < SIZE_NUM; i++) {
|
||||
for (i = 1; i < size_num; i++) {
|
||||
long l0, l1;
|
||||
|
||||
l0 = (long)lengths[0];
|
||||
@@ -1716,6 +1785,7 @@ int speed_main(int argc, char **argv)
|
||||
c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
|
||||
c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
|
||||
c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
|
||||
c[D_RAND][i] = c[D_RAND][0] * 4 * l0 / l1;
|
||||
|
||||
l0 = (long)lengths[i - 1];
|
||||
|
||||
@@ -1749,7 +1819,7 @@ int speed_main(int argc, char **argv)
|
||||
rsa_doit[i] = 0;
|
||||
else {
|
||||
if (rsa_c[i][0] == 0) {
|
||||
rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
|
||||
rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
|
||||
rsa_c[i][1] = 20;
|
||||
}
|
||||
}
|
||||
@@ -1766,7 +1836,7 @@ int speed_main(int argc, char **argv)
|
||||
dsa_doit[i] = 0;
|
||||
else {
|
||||
if (dsa_c[i][0] == 0) {
|
||||
dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
|
||||
dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
|
||||
dsa_c[i][1] = 1;
|
||||
}
|
||||
}
|
||||
@@ -1855,17 +1925,18 @@ int speed_main(int argc, char **argv)
|
||||
# else
|
||||
/* not worth fixing */
|
||||
# error "You cannot disable DES on systems without SIGALRM."
|
||||
# endif /* OPENSSL_NO_DES */
|
||||
# endif /* OPENSSL_NO_DES */
|
||||
#else
|
||||
# ifndef _WIN32
|
||||
signal(SIGALRM, sig_done);
|
||||
# endif
|
||||
#endif /* SIGALRM */
|
||||
#endif /* SIGALRM */
|
||||
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
if (doit[D_MD2]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1875,8 +1946,9 @@ int speed_main(int argc, char **argv)
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_MDC2
|
||||
if (doit[D_MDC2]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1887,8 +1959,9 @@ int speed_main(int argc, char **argv)
|
||||
|
||||
#ifndef OPENSSL_NO_MD4
|
||||
if (doit[D_MD4]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1899,8 +1972,9 @@ int speed_main(int argc, char **argv)
|
||||
|
||||
#ifndef OPENSSL_NO_MD5
|
||||
if (doit[D_MD5]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, MD5_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1921,8 +1995,9 @@ int speed_main(int argc, char **argv)
|
||||
|
||||
HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, HMAC_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1934,8 +2009,9 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
if (doit[D_SHA1]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, SHA1_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1943,8 +2019,9 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
if (doit[D_SHA256]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_SHA256], c[D_SHA256][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_SHA256], c[D_SHA256][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, SHA256_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1952,19 +2029,20 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
if (doit[D_SHA512]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_SHA512], c[D_SHA512][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_SHA512], c[D_SHA512][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, SHA512_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_SHA512, testnum, count, d);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_WHIRLPOOL
|
||||
if (doit[D_WHIRLPOOL]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1975,8 +2053,9 @@ int speed_main(int argc, char **argv)
|
||||
|
||||
#ifndef OPENSSL_NO_RMD160
|
||||
if (doit[D_RMD160]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_RMD160], c[D_RMD160][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_RMD160], c[D_RMD160][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1986,8 +2065,9 @@ int speed_main(int argc, char **argv)
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_RC4
|
||||
if (doit[D_RC4]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, RC4_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -1997,8 +2077,9 @@ int speed_main(int argc, char **argv)
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DES
|
||||
if (doit[D_CBC_DES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_CBC_DES], c[D_CBC_DES][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2007,10 +2088,12 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (doit[D_EDE3_DES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_EDE3_DES, testnum, count, d);
|
||||
}
|
||||
@@ -2018,74 +2101,83 @@ int speed_main(int argc, char **argv)
|
||||
#endif
|
||||
|
||||
if (doit[D_CBC_128_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_CBC_128_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
if (doit[D_CBC_192_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_CBC_192_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
if (doit[D_CBC_256_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_CBC_256_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
|
||||
if (doit[D_IGE_128_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_IGE_128_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
if (doit[D_IGE_192_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_IGE_192_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
if (doit[D_IGE_256_AES]) {
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
|
||||
count =
|
||||
run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_IGE_256_AES, testnum, count, d);
|
||||
}
|
||||
}
|
||||
if (doit[D_GHASH]) {
|
||||
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);
|
||||
loopargs[i].gcm_ctx =
|
||||
CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
|
||||
CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
|
||||
(unsigned char *)"0123456789ab", 12);
|
||||
}
|
||||
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
print_message(names[D_GHASH], c[D_GHASH][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_GHASH], c[D_GHASH][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2094,7 +2186,6 @@ int speed_main(int argc, char **argv)
|
||||
for (i = 0; i < loopargs_len; i++)
|
||||
CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_CAMELLIA
|
||||
if (doit[D_CBC_128_CML]) {
|
||||
if (async_jobs > 0) {
|
||||
@@ -2102,9 +2193,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_128_CML]);
|
||||
doit[D_CBC_128_CML] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
|
||||
Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2120,9 +2211,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_192_CML]);
|
||||
doit[D_CBC_192_CML] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
if (async_jobs > 0) {
|
||||
BIO_printf(bio_err, "Async mode is not supported, exiting...");
|
||||
exit(1);
|
||||
@@ -2142,9 +2233,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_256_CML]);
|
||||
doit[D_CBC_256_CML] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
|
||||
lengths[testnum]);
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
|
||||
Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2162,8 +2253,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_IDEA]);
|
||||
doit[D_CBC_IDEA] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
|
||||
IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2181,8 +2273,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_SEED]);
|
||||
doit[D_CBC_SEED] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
|
||||
SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2199,8 +2292,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_RC2]);
|
||||
doit[D_CBC_RC2] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
if (async_jobs > 0) {
|
||||
BIO_printf(bio_err, "Async mode is not supported, exiting...");
|
||||
exit(1);
|
||||
@@ -2222,8 +2316,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_RC5]);
|
||||
doit[D_CBC_RC5] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
if (async_jobs > 0) {
|
||||
BIO_printf(bio_err, "Async mode is not supported, exiting...");
|
||||
exit(1);
|
||||
@@ -2245,8 +2340,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_BF]);
|
||||
doit[D_CBC_BF] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_BF], c[D_CBC_BF][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
|
||||
BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2264,8 +2360,9 @@ int speed_main(int argc, char **argv)
|
||||
names[D_CBC_CAST]);
|
||||
doit[D_CBC_CAST] = 0;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum], lengths[testnum]);
|
||||
for (testnum = 0; testnum < size_num && async_init == 0; testnum++) {
|
||||
print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
|
||||
lengths[testnum], seconds.sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
|
||||
CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
|
||||
@@ -2276,6 +2373,16 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (doit[D_RAND]) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
print_result(D_RAND, testnum, count, d);
|
||||
}
|
||||
}
|
||||
|
||||
if (doit[D_EVP]) {
|
||||
if (multiblock && evp_cipher) {
|
||||
@@ -2290,11 +2397,11 @@ int speed_main(int argc, char **argv)
|
||||
BIO_printf(bio_err, "Async mode is not supported, exiting...");
|
||||
exit(1);
|
||||
}
|
||||
multiblock_speed(evp_cipher);
|
||||
multiblock_speed(evp_cipher, &seconds);
|
||||
ret = 0;
|
||||
goto end;
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
if (evp_cipher) {
|
||||
|
||||
names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
|
||||
@@ -2302,19 +2409,33 @@ int speed_main(int argc, char **argv)
|
||||
* -O3 -fschedule-insns messes up an optimization here!
|
||||
* names[D_EVP] somehow becomes NULL
|
||||
*/
|
||||
print_message(names[D_EVP], save_count, lengths[testnum]);
|
||||
print_message(names[D_EVP], save_count, lengths[testnum],
|
||||
seconds.sym);
|
||||
|
||||
for (k = 0; k < loopargs_len; k++) {
|
||||
loopargs[k].ctx = EVP_CIPHER_CTX_new();
|
||||
if (decrypt)
|
||||
EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
|
||||
else
|
||||
EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL, key16, iv);
|
||||
EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL, NULL,
|
||||
iv, decrypt ? 0 : 1);
|
||||
|
||||
EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
|
||||
|
||||
keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx);
|
||||
loopargs[k].key = app_malloc(keylen, "evp_cipher key");
|
||||
EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key);
|
||||
EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL,
|
||||
loopargs[k].key, NULL, -1);
|
||||
OPENSSL_clear_free(loopargs[k].key, keylen);
|
||||
}
|
||||
switch (EVP_CIPHER_mode(evp_cipher)) {
|
||||
case EVP_CIPH_CCM_MODE:
|
||||
loopfunc = EVP_Update_loop_ccm;
|
||||
break;
|
||||
default:
|
||||
loopfunc = EVP_Update_loop;
|
||||
}
|
||||
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Update_loop, loopargs);
|
||||
count = run_benchmark(async_jobs, loopfunc, loopargs);
|
||||
d = Time_F(STOP);
|
||||
for (k = 0; k < loopargs_len; k++) {
|
||||
EVP_CIPHER_CTX_free(loopargs[k].ctx);
|
||||
@@ -2322,7 +2443,8 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
if (evp_md) {
|
||||
names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
|
||||
print_message(names[D_EVP], save_count, lengths[testnum]);
|
||||
print_message(names[D_EVP], save_count, lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2340,6 +2462,34 @@ int speed_main(int argc, char **argv)
|
||||
if (!rsa_doit[testnum])
|
||||
continue;
|
||||
for (i = 0; i < loopargs_len; i++) {
|
||||
if (primes > 2) {
|
||||
/* we haven't set keys yet, generate multi-prime RSA keys */
|
||||
BIGNUM *bn = BN_new();
|
||||
|
||||
if (bn == NULL)
|
||||
goto end;
|
||||
if (!BN_set_word(bn, RSA_F4)) {
|
||||
BN_free(bn);
|
||||
goto end;
|
||||
}
|
||||
|
||||
BIO_printf(bio_err, "Generate multi-prime RSA key for %s\n",
|
||||
rsa_choices[testnum].name);
|
||||
|
||||
loopargs[i].rsa_key[testnum] = RSA_new();
|
||||
if (loopargs[i].rsa_key[testnum] == NULL) {
|
||||
BN_free(bn);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!RSA_generate_multi_prime_key(loopargs[i].rsa_key[testnum],
|
||||
rsa_bits[testnum],
|
||||
primes, bn, NULL)) {
|
||||
BN_free(bn);
|
||||
goto end;
|
||||
}
|
||||
BN_free(bn);
|
||||
}
|
||||
st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
|
||||
&loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
|
||||
if (st == 0)
|
||||
@@ -2352,7 +2502,8 @@ int speed_main(int argc, char **argv)
|
||||
rsa_count = 1;
|
||||
} else {
|
||||
pkey_print_message("private", "rsa",
|
||||
rsa_c[testnum][0], rsa_bits[testnum], RSA_SECONDS);
|
||||
rsa_c[testnum][0], rsa_bits[testnum],
|
||||
seconds.rsa);
|
||||
/* RSA_blinding_on(rsa_key[testnum],NULL); */
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
|
||||
@@ -2361,7 +2512,7 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R1:%ld:%d:%.2f\n"
|
||||
: "%ld %d bit private RSA's in %.2fs\n",
|
||||
count, rsa_bits[testnum], d);
|
||||
rsa_results[testnum][0] = d / (double)count;
|
||||
rsa_results[testnum][0] = (double)count / d;
|
||||
rsa_count = count;
|
||||
}
|
||||
|
||||
@@ -2378,7 +2529,8 @@ int speed_main(int argc, char **argv)
|
||||
rsa_doit[testnum] = 0;
|
||||
} else {
|
||||
pkey_print_message("public", "rsa",
|
||||
rsa_c[testnum][1], rsa_bits[testnum], RSA_SECONDS);
|
||||
rsa_c[testnum][1], rsa_bits[testnum],
|
||||
seconds.rsa);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2386,7 +2538,7 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R2:%ld:%d:%.2f\n"
|
||||
: "%ld %d bit public RSA's in %.2fs\n",
|
||||
count, rsa_bits[testnum], d);
|
||||
rsa_results[testnum][1] = d / (double)count;
|
||||
rsa_results[testnum][1] = (double)count / d;
|
||||
}
|
||||
|
||||
if (rsa_count <= 1) {
|
||||
@@ -2401,9 +2553,6 @@ int speed_main(int argc, char **argv)
|
||||
RAND_bytes(loopargs[i].buf, 36);
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
if (RAND_status() != 1) {
|
||||
RAND_seed(rnd_seed, sizeof(rnd_seed));
|
||||
}
|
||||
for (testnum = 0; testnum < DSA_NUM; testnum++) {
|
||||
int st = 0;
|
||||
if (!dsa_doit[testnum])
|
||||
@@ -2424,7 +2573,8 @@ int speed_main(int argc, char **argv)
|
||||
rsa_count = 1;
|
||||
} else {
|
||||
pkey_print_message("sign", "dsa",
|
||||
dsa_c[testnum][0], dsa_bits[testnum], DSA_SECONDS);
|
||||
dsa_c[testnum][0], dsa_bits[testnum],
|
||||
seconds.dsa);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2432,7 +2582,7 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R3:%ld:%d:%.2f\n"
|
||||
: "%ld %d bit DSA signs in %.2fs\n",
|
||||
count, dsa_bits[testnum], d);
|
||||
dsa_results[testnum][0] = d / (double)count;
|
||||
dsa_results[testnum][0] = (double)count / d;
|
||||
rsa_count = count;
|
||||
}
|
||||
|
||||
@@ -2449,7 +2599,8 @@ int speed_main(int argc, char **argv)
|
||||
dsa_doit[testnum] = 0;
|
||||
} else {
|
||||
pkey_print_message("verify", "dsa",
|
||||
dsa_c[testnum][1], dsa_bits[testnum], DSA_SECONDS);
|
||||
dsa_c[testnum][1], dsa_bits[testnum],
|
||||
seconds.dsa);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2457,7 +2608,7 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R4:%ld:%d:%.2f\n"
|
||||
: "%ld %d bit DSA verify in %.2fs\n",
|
||||
count, dsa_bits[testnum], d);
|
||||
dsa_results[testnum][1] = d / (double)count;
|
||||
dsa_results[testnum][1] = (double)count / d;
|
||||
}
|
||||
|
||||
if (rsa_count <= 1) {
|
||||
@@ -2469,16 +2620,14 @@ int speed_main(int argc, char **argv)
|
||||
#endif /* OPENSSL_NO_DSA */
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
if (RAND_status() != 1) {
|
||||
RAND_seed(rnd_seed, sizeof(rnd_seed));
|
||||
}
|
||||
for (testnum = 0; testnum < EC_NUM; testnum++) {
|
||||
int st = 1;
|
||||
|
||||
if (!ecdsa_doit[testnum])
|
||||
continue; /* Ignore Curve */
|
||||
for (i = 0; i < loopargs_len; i++) {
|
||||
loopargs[i].ecdsa[testnum] = EC_KEY_new_by_curve_name(test_curves[testnum]);
|
||||
loopargs[i].ecdsa[testnum] =
|
||||
EC_KEY_new_by_curve_name(test_curves[testnum]);
|
||||
if (loopargs[i].ecdsa[testnum] == NULL) {
|
||||
st = 0;
|
||||
break;
|
||||
@@ -2494,7 +2643,8 @@ int speed_main(int argc, char **argv)
|
||||
/* 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]);
|
||||
&loopargs[i].siglen,
|
||||
loopargs[i].ecdsa[testnum]);
|
||||
if (st == 0)
|
||||
break;
|
||||
}
|
||||
@@ -2506,7 +2656,8 @@ int speed_main(int argc, char **argv)
|
||||
} else {
|
||||
pkey_print_message("sign", "ecdsa",
|
||||
ecdsa_c[testnum][0],
|
||||
test_curves_bits[testnum], ECDSA_SECONDS);
|
||||
test_curves_bits[testnum],
|
||||
seconds.ecdsa);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2515,14 +2666,15 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R5:%ld:%d:%.2f\n" :
|
||||
"%ld %d bit ECDSA signs in %.2fs \n",
|
||||
count, test_curves_bits[testnum], d);
|
||||
ecdsa_results[testnum][0] = d / (double)count;
|
||||
ecdsa_results[testnum][0] = (double)count / d;
|
||||
rsa_count = count;
|
||||
}
|
||||
|
||||
/* Perform ECDSA verification test */
|
||||
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]);
|
||||
loopargs[i].siglen,
|
||||
loopargs[i].ecdsa[testnum]);
|
||||
if (st != 1)
|
||||
break;
|
||||
}
|
||||
@@ -2534,7 +2686,8 @@ int speed_main(int argc, char **argv)
|
||||
} else {
|
||||
pkey_print_message("verify", "ecdsa",
|
||||
ecdsa_c[testnum][1],
|
||||
test_curves_bits[testnum], ECDSA_SECONDS);
|
||||
test_curves_bits[testnum],
|
||||
seconds.ecdsa);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
@@ -2542,7 +2695,7 @@ int speed_main(int argc, char **argv)
|
||||
mr ? "+R6:%ld:%d:%.2f\n"
|
||||
: "%ld %d bit ECDSA verify in %.2fs\n",
|
||||
count, test_curves_bits[testnum], d);
|
||||
ecdsa_results[testnum][1] = d / (double)count;
|
||||
ecdsa_results[testnum][1] = (double)count / d;
|
||||
}
|
||||
|
||||
if (rsa_count <= 1) {
|
||||
@@ -2553,93 +2706,159 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (RAND_status() != 1) {
|
||||
RAND_seed(rnd_seed, sizeof(rnd_seed));
|
||||
}
|
||||
for (testnum = 0; testnum < EC_NUM; testnum++) {
|
||||
int ecdh_checks = 1;
|
||||
|
||||
if (!ecdh_doit[testnum])
|
||||
continue;
|
||||
|
||||
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) {
|
||||
EVP_PKEY_CTX *kctx = NULL;
|
||||
EVP_PKEY_CTX *test_ctx = NULL;
|
||||
EVP_PKEY_CTX *ctx = NULL;
|
||||
EVP_PKEY *key_A = NULL;
|
||||
EVP_PKEY *key_B = NULL;
|
||||
size_t outlen;
|
||||
size_t test_outlen;
|
||||
|
||||
/* Ensure that the error queue is empty */
|
||||
if (ERR_peek_error()) {
|
||||
BIO_printf(bio_err,
|
||||
"WARNING: the error queue contains previous unhandled errors.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
}
|
||||
|
||||
/* Let's try to create a ctx directly from the NID: this works for
|
||||
* curves like Curve25519 that are not implemented through the low
|
||||
* level EC interface.
|
||||
* If this fails we try creating a EVP_PKEY_EC generic param ctx,
|
||||
* then we set the curve by NID before deriving the actual keygen
|
||||
* ctx for that specific curve. */
|
||||
kctx = EVP_PKEY_CTX_new_id(test_curves[testnum], NULL); /* keygen ctx from NID */
|
||||
if (!kctx) {
|
||||
EVP_PKEY_CTX *pctx = NULL;
|
||||
EVP_PKEY *params = NULL;
|
||||
|
||||
/* If we reach this code EVP_PKEY_CTX_new_id() failed and a
|
||||
* "int_ctx_new:unsupported algorithm" error was added to the
|
||||
* error queue.
|
||||
* We remove it from the error queue as we are handling it. */
|
||||
unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */
|
||||
if (error == ERR_peek_last_error() && /* oldest and latest errors match */
|
||||
/* check that the error origin matches */
|
||||
ERR_GET_LIB(error) == ERR_LIB_EVP &&
|
||||
ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW &&
|
||||
ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM)
|
||||
ERR_get_error(); /* pop error from queue */
|
||||
if (ERR_peek_error()) {
|
||||
BIO_printf(bio_err,
|
||||
"Unhandled error in the error queue during ECDH init.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( /* Create the context for parameter generation */
|
||||
!(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
|
||||
/* Initialise the parameter generation */
|
||||
!EVP_PKEY_paramgen_init(pctx) ||
|
||||
/* Set the curve by NID */
|
||||
!EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
|
||||
test_curves
|
||||
[testnum]) ||
|
||||
/* Create the parameter object params */
|
||||
!EVP_PKEY_paramgen(pctx, ¶ms)) {
|
||||
ecdh_checks = 0;
|
||||
BIO_printf(bio_err, "ECDH EC params init failure.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
/* Create the context for the key generation */
|
||||
kctx = EVP_PKEY_CTX_new(params, NULL);
|
||||
|
||||
EVP_PKEY_free(params);
|
||||
params = NULL;
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
pctx = NULL;
|
||||
}
|
||||
if (kctx == NULL || /* keygen ctx is not null */
|
||||
!EVP_PKEY_keygen_init(kctx) /* init keygen ctx */ ) {
|
||||
ecdh_checks = 0;
|
||||
BIO_printf(bio_err, "ECDH keygen failure.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_keygen(kctx, &key_A) || /* generate secret key A */
|
||||
!EVP_PKEY_keygen(kctx, &key_B) || /* generate secret key B */
|
||||
!(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
|
||||
!EVP_PKEY_derive_init(ctx) || /* init derivation ctx */
|
||||
!EVP_PKEY_derive_set_peer(ctx, key_B) || /* set peer pubkey in ctx */
|
||||
!EVP_PKEY_derive(ctx, NULL, &outlen) || /* determine max length */
|
||||
outlen == 0 || /* ensure outlen is a valid size */
|
||||
outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
|
||||
ecdh_checks = 0;
|
||||
BIO_printf(bio_err, "ECDH key generation failure.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Here we perform a test run, comparing the output of a*B and b*A;
|
||||
* we try this here and assume that further EVP_PKEY_derive calls
|
||||
* never fail, so we can skip checks in the actually benchmarked
|
||||
* code, for maximum performance. */
|
||||
if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */
|
||||
!EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */
|
||||
!EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */
|
||||
!EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */
|
||||
!EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */
|
||||
!EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */
|
||||
test_outlen != outlen /* compare output length */ ) {
|
||||
ecdh_checks = 0;
|
||||
BIO_printf(bio_err, "ECDH computation failure.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
|
||||
if (CRYPTO_memcmp(loopargs[i].secret_a,
|
||||
loopargs[i].secret_b, outlen)) {
|
||||
ecdh_checks = 0;
|
||||
BIO_printf(bio_err, "ECDH computations don't match.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
loopargs[i].ecdh_ctx[testnum] = ctx;
|
||||
loopargs[i].outlen[testnum] = outlen;
|
||||
|
||||
EVP_PKEY_free(key_A);
|
||||
EVP_PKEY_free(key_B);
|
||||
EVP_PKEY_CTX_free(kctx);
|
||||
kctx = NULL;
|
||||
EVP_PKEY_CTX_free(test_ctx);
|
||||
test_ctx = NULL;
|
||||
}
|
||||
if (ecdh_checks == 0) {
|
||||
BIO_printf(bio_err, "ECDH failure.\n");
|
||||
ERR_print_errors(bio_err);
|
||||
rsa_count = 1;
|
||||
} else {
|
||||
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;
|
||||
rsa_count = 1;
|
||||
} else {
|
||||
int secret_size_a, secret_size_b;
|
||||
/*
|
||||
* 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 = EC_GROUP_get_degree(
|
||||
EC_KEY_get0_group(loopargs[i].ecdh_a[testnum]));
|
||||
|
||||
if (field_size <= 24 * 8) { /* 192 bits */
|
||||
loopargs[i].outlen = KDF1_SHA1_len;
|
||||
loopargs[i].kdf = KDF1_SHA1;
|
||||
} else {
|
||||
loopargs[i].outlen = (field_size + 7) / 8;
|
||||
loopargs[i].kdf = NULL;
|
||||
}
|
||||
secret_size_a =
|
||||
ECDH_compute_key(loopargs[i].secret_a, loopargs[i].outlen,
|
||||
EC_KEY_get0_public_key(loopargs[i].ecdh_b[testnum]),
|
||||
loopargs[i].ecdh_a[testnum], loopargs[i].kdf);
|
||||
secret_size_b =
|
||||
ECDH_compute_key(loopargs[i].secret_b, loopargs[i].outlen,
|
||||
EC_KEY_get0_public_key(loopargs[i].ecdh_a[testnum]),
|
||||
loopargs[i].ecdh_b[testnum], loopargs[i].kdf);
|
||||
if (secret_size_a != secret_size_b)
|
||||
ecdh_checks = 0;
|
||||
else
|
||||
ecdh_checks = 1;
|
||||
|
||||
for (k = 0; k < secret_size_a && ecdh_checks == 1; k++) {
|
||||
if (loopargs[i].secret_a[k] != loopargs[i].secret_b[k])
|
||||
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);
|
||||
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);
|
||||
ecdh_results[testnum][0] = d / (double)count;
|
||||
rsa_count = count;
|
||||
}
|
||||
if (ecdh_checks != 0) {
|
||||
pkey_print_message("", "ecdh",
|
||||
ecdh_c[testnum][0],
|
||||
test_curves_bits[testnum],
|
||||
seconds.ecdh);
|
||||
Time_F(START);
|
||||
count =
|
||||
run_benchmark(async_jobs, ECDH_EVP_derive_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);
|
||||
ecdh_results[testnum][0] = (double)count / d;
|
||||
rsa_count = count;
|
||||
}
|
||||
|
||||
if (rsa_count <= 1) {
|
||||
@@ -2684,7 +2903,7 @@ int speed_main(int argc, char **argv)
|
||||
("The 'numbers' are in 1000s of bytes per second processed.\n");
|
||||
printf("type ");
|
||||
}
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++)
|
||||
for (testnum = 0; testnum < size_num; testnum++)
|
||||
printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
|
||||
printf("\n");
|
||||
}
|
||||
@@ -2696,7 +2915,7 @@ int speed_main(int argc, char **argv)
|
||||
printf("+F:%d:%s", k, names[k]);
|
||||
else
|
||||
printf("%-13s", names[k]);
|
||||
for (testnum = 0; testnum < SIZE_NUM; testnum++) {
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
if (results[k][testnum] > 10000 && !mr)
|
||||
printf(" %11.2fk", results[k][testnum] / 1e3);
|
||||
else
|
||||
@@ -2718,8 +2937,8 @@ int speed_main(int argc, char **argv)
|
||||
k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
|
||||
else
|
||||
printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
|
||||
rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
|
||||
1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
|
||||
rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
|
||||
rsa_results[k][0], rsa_results[k][1]);
|
||||
}
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
@@ -2736,8 +2955,8 @@ int speed_main(int argc, char **argv)
|
||||
k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
|
||||
else
|
||||
printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
|
||||
dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
|
||||
1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
|
||||
dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
|
||||
dsa_results[k][0], dsa_results[k][1]);
|
||||
}
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_EC
|
||||
@@ -2758,8 +2977,8 @@ int speed_main(int argc, char **argv)
|
||||
printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
|
||||
test_curves_bits[k],
|
||||
test_curves_names[k],
|
||||
ecdsa_results[k][0], ecdsa_results[k][1],
|
||||
1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
|
||||
1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1],
|
||||
ecdsa_results[k][0], ecdsa_results[k][1]);
|
||||
}
|
||||
|
||||
testnum = 1;
|
||||
@@ -2779,7 +2998,7 @@ int speed_main(int argc, char **argv)
|
||||
printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
|
||||
test_curves_bits[k],
|
||||
test_curves_names[k],
|
||||
ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
|
||||
1.0 / ecdh_results[k][0], ecdh_results[k][0]);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2802,8 +3021,7 @@ int speed_main(int argc, char **argv)
|
||||
#ifndef OPENSSL_NO_EC
|
||||
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]);
|
||||
EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
|
||||
}
|
||||
OPENSSL_free(loopargs[i].secret_a);
|
||||
OPENSSL_free(loopargs[i].secret_b);
|
||||
@@ -2820,17 +3038,17 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
OPENSSL_free(loopargs);
|
||||
release_engine(e);
|
||||
return (ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void print_message(const char *s, long num, int length)
|
||||
static void print_message(const char *s, long num, int length, int tm)
|
||||
{
|
||||
#ifdef SIGALRM
|
||||
BIO_printf(bio_err,
|
||||
mr ? "+DT:%s:%d:%d\n"
|
||||
: "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
|
||||
: "Doing %s for %ds on %d size blocks: ", s, tm, length);
|
||||
(void)BIO_flush(bio_err);
|
||||
alarm(SECONDS);
|
||||
alarm(tm);
|
||||
#else
|
||||
BIO_printf(bio_err,
|
||||
mr ? "+DN:%s:%ld:%d\n"
|
||||
@@ -2897,7 +3115,7 @@ static char *sstrsep(char **string, const char *delim)
|
||||
return token;
|
||||
}
|
||||
|
||||
static int do_multi(int multi)
|
||||
static int do_multi(int multi, int size_num)
|
||||
{
|
||||
int n;
|
||||
int fd[2];
|
||||
@@ -2943,8 +3161,9 @@ static int do_multi(int multi)
|
||||
if (p)
|
||||
*p = '\0';
|
||||
if (buf[0] != '+') {
|
||||
BIO_printf(bio_err, "Don't understand line '%s' from child %d\n",
|
||||
buf, n);
|
||||
BIO_printf(bio_err,
|
||||
"Don't understand line '%s' from child %d\n", buf,
|
||||
n);
|
||||
continue;
|
||||
}
|
||||
printf("Got: %s from %d\n", buf, n);
|
||||
@@ -2955,7 +3174,7 @@ static int do_multi(int multi)
|
||||
p = buf + 3;
|
||||
alg = atoi(sstrsep(&p, sep));
|
||||
sstrsep(&p, sep);
|
||||
for (j = 0; j < SIZE_NUM; ++j)
|
||||
for (j = 0; j < size_num; ++j)
|
||||
results[alg][j] += atof(sstrsep(&p, sep));
|
||||
} else if (strncmp(buf, "+F2:", 4) == 0) {
|
||||
int k;
|
||||
@@ -2966,16 +3185,10 @@ static int do_multi(int multi)
|
||||
sstrsep(&p, sep);
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
|
||||
else
|
||||
rsa_results[k][0] = d;
|
||||
rsa_results[k][0] += d;
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
|
||||
else
|
||||
rsa_results[k][1] = d;
|
||||
rsa_results[k][1] += d;
|
||||
}
|
||||
# ifndef OPENSSL_NO_DSA
|
||||
else if (strncmp(buf, "+F3:", 4) == 0) {
|
||||
@@ -2987,16 +3200,10 @@ static int do_multi(int multi)
|
||||
sstrsep(&p, sep);
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
|
||||
else
|
||||
dsa_results[k][0] = d;
|
||||
dsa_results[k][0] += d;
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
|
||||
else
|
||||
dsa_results[k][1] = d;
|
||||
dsa_results[k][1] += d;
|
||||
}
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_EC
|
||||
@@ -3009,18 +3216,10 @@ static int do_multi(int multi)
|
||||
sstrsep(&p, sep);
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
ecdsa_results[k][0] =
|
||||
1 / (1 / ecdsa_results[k][0] + 1 / d);
|
||||
else
|
||||
ecdsa_results[k][0] = d;
|
||||
ecdsa_results[k][0] += d;
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
ecdsa_results[k][1] =
|
||||
1 / (1 / ecdsa_results[k][1] + 1 / d);
|
||||
else
|
||||
ecdsa_results[k][1] = d;
|
||||
ecdsa_results[k][1] += d;
|
||||
} else if (strncmp(buf, "+F5:", 4) == 0) {
|
||||
int k;
|
||||
double d;
|
||||
@@ -3030,18 +3229,15 @@ static int do_multi(int multi)
|
||||
sstrsep(&p, sep);
|
||||
|
||||
d = atof(sstrsep(&p, sep));
|
||||
if (n)
|
||||
ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
|
||||
else
|
||||
ecdh_results[k][0] = d;
|
||||
|
||||
ecdh_results[k][0] += d;
|
||||
}
|
||||
# endif
|
||||
|
||||
else if (strncmp(buf, "+H:", 3) == 0) {
|
||||
;
|
||||
} else
|
||||
BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf, n);
|
||||
BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
|
||||
n);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
@@ -3051,26 +3247,39 @@ static int do_multi(int multi)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void multiblock_speed(const EVP_CIPHER *evp_cipher)
|
||||
static void multiblock_speed(const EVP_CIPHER *evp_cipher,
|
||||
const openssl_speed_sec_t *seconds)
|
||||
{
|
||||
static int mblengths[] =
|
||||
static const int mblengths_list[] =
|
||||
{ 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
|
||||
int j, count, num = OSSL_NELEM(mblengths);
|
||||
const int *mblengths = mblengths_list;
|
||||
int j, count, keylen, num = OSSL_NELEM(mblengths_list);
|
||||
const char *alg_name;
|
||||
unsigned char *inp, *out, no_key[32], no_iv[16];
|
||||
unsigned char *inp, *out, *key, no_key[32], no_iv[16];
|
||||
EVP_CIPHER_CTX *ctx;
|
||||
double d = 0.0;
|
||||
|
||||
if (lengths_single) {
|
||||
mblengths = &lengths_single;
|
||||
num = 1;
|
||||
}
|
||||
|
||||
inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
|
||||
out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
|
||||
ctx = EVP_CIPHER_CTX_new();
|
||||
EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
|
||||
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key),
|
||||
no_key);
|
||||
EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv);
|
||||
|
||||
keylen = EVP_CIPHER_CTX_key_length(ctx);
|
||||
key = app_malloc(keylen, "evp_cipher key");
|
||||
EVP_CIPHER_CTX_rand_key(ctx, key);
|
||||
EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);
|
||||
OPENSSL_clear_free(key, keylen);
|
||||
|
||||
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
|
||||
alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
|
||||
|
||||
for (j = 0; j < num; j++) {
|
||||
print_message(alg_name, 0, mblengths[j]);
|
||||
print_message(alg_name, 0, mblengths[j], seconds->sym);
|
||||
Time_F(START);
|
||||
for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
|
||||
unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
|
||||
@@ -3103,8 +3312,8 @@ static void multiblock_speed(const EVP_CIPHER *evp_cipher)
|
||||
|
||||
RAND_bytes(out, 16);
|
||||
len += 16;
|
||||
aad[11] = len >> 8;
|
||||
aad[12] = len;
|
||||
aad[11] = (unsigned char)(len >> 8);
|
||||
aad[12] = (unsigned char)(len);
|
||||
pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
|
||||
EVP_AEAD_TLS1_AAD_LEN, aad);
|
||||
EVP_Cipher(ctx, out, inp, len + pad);
|
||||
|
||||
Reference in New Issue
Block a user