Skip to content

Instantly share code, notes, and snippets.

@niamster
Last active November 4, 2015 10:27
Show Gist options
  • Save niamster/e128236499a072f68a44 to your computer and use it in GitHub Desktop.
Save niamster/e128236499a072f68a44 to your computer and use it in GitHub Desktop.
hmac-bench.c
#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <assert.h>
#include <getopt.h>
#include <openssl/md5.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/hmac.h>
#include <blake2.h>
typedef uint64_t us_t;
static void usage(void) {
printf("[-k <key len>]\n");
printf("[-d <data len>]\n");
printf("[-r <rounds>]\n");
}
static us_t utime(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000000 + tv.tv_usec;
}
int
main(int argc, char **argv) {
int c;
unsigned char *key, *data;
unsigned int klen = 32;
unsigned int dlen = 256*1024;
int rounds = 1000;
unsigned char digest[16];
unsigned int dglen;
us_t start, delta;
while ((c = getopt(argc, argv, "k:d:r:")) > 0) {
switch (c) {
default:
case 'h':
case '?':
usage();
return 0;
case 'k':
klen = atoi(optarg);
break;
case 'd':
dlen = atoi(optarg);
break;
case 'r':
rounds = atoi(optarg);
break;
}
}
assert(klen > 0);
assert(dlen > 0);
assert(rounds > 0);
key = malloc(klen);
assert(key);
data = malloc(dlen);
assert(data);
printf("klen=%u, dlen=%u, rounds=%d\n", klen, dlen, rounds);
assert(RAND_pseudo_bytes(key, klen) == 1);
assert(RAND_pseudo_bytes(data, dlen) == 1);
/* warmup */
assert(HMAC(EVP_md5(), key, klen, data, dlen, digest, &dglen));
assert(dglen == sizeof(digest));
blake2s(digest, data, key, sizeof(digest), dlen, klen);
const uint64_t kbytes = ((uint64_t)dlen*(uint64_t)rounds)/1024ULL;
start = utime();
for (int i=0; i<rounds; ++i) {
assert(HMAC(EVP_md5(), key, klen, data, dlen, digest, &dglen));
assert(dglen == sizeof(digest));
}
delta = utime() - start;
printf("HMAC-MD5: %.2f KBps\n", (float)(kbytes*1000000ULL)/delta);
start = utime();
for (int i=0; i<rounds; ++i) {
assert(blake2sp(digest, data, key, sizeof(digest), dlen, klen) == 0);
}
delta = utime() - start;
printf("BLAKE2sp: %.2f KBps\n", (float)(kbytes*1000000ULL)/delta);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment