#undef SECONDS
#define SECONDS 3
-#define PRIME_SECONDS 10
#define RSA_SECONDS 10
#define DSA_SECONDS 10
#define ECDSA_SECONDS 10
#define BUFSIZE (1024*16+1)
#define MAX_MISALIGNMENT 63
-#define ALGOR_NUM 30
+#define ALGOR_NUM 31
#define SIZE_NUM 6
-#define PRIME_NUM 3
#define RSA_NUM 7
#define DSA_NUM 3
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);
"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 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 randomness";
-#endif
-
#ifdef SIGALRM
# if defined(__STDC__) || defined(sgi) || defined(_AIX)
# define SIGRETTYPE void
# if !defined(SIGALRM)
# define SIGALRM
# endif
-static unsigned int lapse, schlock;
+static unsigned int lapse;
+static volatile unsigned int schlock;
static void alarm_win32(unsigned int secs)
{
lapse = secs * 1000;
#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},
{"cast5", D_CBC_CAST},
#endif
{"ghash", D_GHASH},
+ {"rand", D_RAND},
{NULL}
};
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)
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)
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;
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++) {
long l0, l1;
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];
}
}
#endif
+ if (doit[D_RAND]) {
+ for (testnum = 0; testnum < SIZE_NUM; testnum++) {
+ print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum]);
+ 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) {
key16, iv);
EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
}
+ 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);
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])
#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 (RAND_status() != 1) {
- RAND_seed(rnd_seed, sizeof rnd_seed);
- }
for (testnum = 0; testnum < EC_NUM; testnum++) {
int ecdh_checks = 1;