72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
#define _GNU_SOURCE
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <math.h>
|
|
|
|
extern void curve25519_donna(uint8_t *, const uint8_t *, const uint8_t *);
|
|
extern uint64_t tsc_read();
|
|
|
|
int
|
|
main(int argc, char **argv) {
|
|
uint8_t private_key[32], public[32], peer1[32], peer2[32], output[32];
|
|
static const uint8_t basepoint[32] = {9};
|
|
unsigned i;
|
|
uint64_t sum = 0, sum_squares = 0, skipped = 0, mean;
|
|
static const unsigned count = 200000;
|
|
|
|
memset(private_key, 42, sizeof(private_key));
|
|
|
|
private_key[0] &= 248;
|
|
private_key[31] &= 127;
|
|
private_key[31] |= 64;
|
|
|
|
curve25519_donna(public, private_key, basepoint);
|
|
memset(peer1, 0, sizeof(peer1));
|
|
memset(peer2, 255, sizeof(peer2));
|
|
|
|
for (i = 0; i < count; ++i) {
|
|
const uint64_t start = tsc_read();
|
|
curve25519_donna(output, peer1, public);
|
|
const uint64_t end = tsc_read();
|
|
const uint64_t delta = end - start;
|
|
if (delta > 650000) {
|
|
// something terrible happened (task switch etc)
|
|
skipped++;
|
|
continue;
|
|
}
|
|
sum += delta;
|
|
sum_squares += (delta * delta);
|
|
}
|
|
|
|
mean = sum / ((uint64_t) count);
|
|
printf("all 0: mean:%lu sd:%f skipped:%lu\n",
|
|
mean,
|
|
sqrt((double)(sum_squares/((uint64_t) count) - mean*mean)),
|
|
skipped);
|
|
|
|
sum = sum_squares = skipped = 0;
|
|
|
|
for (i = 0; i < count; ++i) {
|
|
const uint64_t start = tsc_read();
|
|
curve25519_donna(output, peer2, public);
|
|
const uint64_t end = tsc_read();
|
|
const uint64_t delta = end - start;
|
|
if (delta > 650000) {
|
|
// something terrible happened (task switch etc)
|
|
skipped++;
|
|
continue;
|
|
}
|
|
sum += delta;
|
|
sum_squares += (delta * delta);
|
|
}
|
|
|
|
mean = sum / ((uint64_t) count);
|
|
printf("all 1: mean:%lu sd:%f skipped:%lu\n",
|
|
mean,
|
|
sqrt((double)(sum_squares/((uint64_t) count) - mean*mean)),
|
|
skipped);
|
|
|
|
return 0;
|
|
}
|