bench_impl.h (4205B)
1 /*********************************************************************** 2 * Copyright (c) 2018-2020 Andrew Poelstra, Jonas Nick * 3 * Distributed under the MIT software license, see the accompanying * 4 * file COPYING or https://www.opensource.org/licenses/mit-license.php.* 5 ***********************************************************************/ 6 7 #ifndef SECP256K1_MODULE_SCHNORRSIG_BENCH_H 8 #define SECP256K1_MODULE_SCHNORRSIG_BENCH_H 9 10 #include "../../../include/secp256k1_schnorrsig.h" 11 12 #define MSGLEN 32 13 14 typedef struct { 15 haskellsecp256k1_v0_1_0_context *ctx; 16 int n; 17 18 const haskellsecp256k1_v0_1_0_keypair **keypairs; 19 const unsigned char **pk; 20 const unsigned char **sigs; 21 const unsigned char **msgs; 22 } bench_schnorrsig_data; 23 24 static void bench_schnorrsig_sign(void* arg, int iters) { 25 bench_schnorrsig_data *data = (bench_schnorrsig_data *)arg; 26 int i; 27 unsigned char msg[MSGLEN] = {0}; 28 unsigned char sig[64]; 29 30 for (i = 0; i < iters; i++) { 31 msg[0] = i; 32 msg[1] = i >> 8; 33 CHECK(haskellsecp256k1_v0_1_0_schnorrsig_sign_custom(data->ctx, sig, msg, MSGLEN, data->keypairs[i], NULL)); 34 } 35 } 36 37 static void bench_schnorrsig_verify(void* arg, int iters) { 38 bench_schnorrsig_data *data = (bench_schnorrsig_data *)arg; 39 int i; 40 41 for (i = 0; i < iters; i++) { 42 haskellsecp256k1_v0_1_0_xonly_pubkey pk; 43 CHECK(haskellsecp256k1_v0_1_0_xonly_pubkey_parse(data->ctx, &pk, data->pk[i]) == 1); 44 CHECK(haskellsecp256k1_v0_1_0_schnorrsig_verify(data->ctx, data->sigs[i], data->msgs[i], MSGLEN, &pk)); 45 } 46 } 47 48 static void run_schnorrsig_bench(int iters, int argc, char** argv) { 49 int i; 50 bench_schnorrsig_data data; 51 int d = argc == 1; 52 53 data.ctx = haskellsecp256k1_v0_1_0_context_create(SECP256K1_CONTEXT_NONE); 54 data.keypairs = (const haskellsecp256k1_v0_1_0_keypair **)malloc(iters * sizeof(haskellsecp256k1_v0_1_0_keypair *)); 55 data.pk = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); 56 data.msgs = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); 57 data.sigs = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); 58 59 CHECK(MSGLEN >= 4); 60 for (i = 0; i < iters; i++) { 61 unsigned char sk[32]; 62 unsigned char *msg = (unsigned char *)malloc(MSGLEN); 63 unsigned char *sig = (unsigned char *)malloc(64); 64 haskellsecp256k1_v0_1_0_keypair *keypair = (haskellsecp256k1_v0_1_0_keypair *)malloc(sizeof(*keypair)); 65 unsigned char *pk_char = (unsigned char *)malloc(32); 66 haskellsecp256k1_v0_1_0_xonly_pubkey pk; 67 msg[0] = sk[0] = i; 68 msg[1] = sk[1] = i >> 8; 69 msg[2] = sk[2] = i >> 16; 70 msg[3] = sk[3] = i >> 24; 71 memset(&msg[4], 'm', MSGLEN - 4); 72 memset(&sk[4], 's', 28); 73 74 data.keypairs[i] = keypair; 75 data.pk[i] = pk_char; 76 data.msgs[i] = msg; 77 data.sigs[i] = sig; 78 79 CHECK(haskellsecp256k1_v0_1_0_keypair_create(data.ctx, keypair, sk)); 80 CHECK(haskellsecp256k1_v0_1_0_schnorrsig_sign_custom(data.ctx, sig, msg, MSGLEN, keypair, NULL)); 81 CHECK(haskellsecp256k1_v0_1_0_keypair_xonly_pub(data.ctx, &pk, NULL, keypair)); 82 CHECK(haskellsecp256k1_v0_1_0_xonly_pubkey_serialize(data.ctx, pk_char, &pk) == 1); 83 } 84 85 if (d || have_flag(argc, argv, "schnorrsig") || have_flag(argc, argv, "sign") || have_flag(argc, argv, "schnorrsig_sign")) run_benchmark("schnorrsig_sign", bench_schnorrsig_sign, NULL, NULL, (void *) &data, 10, iters); 86 if (d || have_flag(argc, argv, "schnorrsig") || have_flag(argc, argv, "verify") || have_flag(argc, argv, "schnorrsig_verify")) run_benchmark("schnorrsig_verify", bench_schnorrsig_verify, NULL, NULL, (void *) &data, 10, iters); 87 88 for (i = 0; i < iters; i++) { 89 free((void *)data.keypairs[i]); 90 free((void *)data.pk[i]); 91 free((void *)data.msgs[i]); 92 free((void *)data.sigs[i]); 93 } 94 95 /* Casting to (void *) avoids a stupid warning in MSVC. */ 96 free((void *)data.keypairs); 97 free((void *)data.pk); 98 free((void *)data.msgs); 99 free((void *)data.sigs); 100 101 haskellsecp256k1_v0_1_0_context_destroy(data.ctx); 102 } 103 104 #endif