/ src / secp256k1 / src / modules / schnorrsig / bench_impl.h
bench_impl.h
  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      secp256k1_context *ctx;
 16      int n;
 17  
 18      const secp256k1_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(secp256k1_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          secp256k1_xonly_pubkey pk;
 43          CHECK(secp256k1_xonly_pubkey_parse(data->ctx, &pk, data->pk[i]) == 1);
 44          CHECK(secp256k1_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 = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
 54      data.keypairs = malloc(iters * sizeof(secp256k1_keypair *));
 55      data.pk = malloc(iters * sizeof(unsigned char *));
 56      data.msgs = malloc(iters * sizeof(unsigned char *));
 57      data.sigs = 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 = malloc(MSGLEN);
 63          unsigned char *sig = malloc(64);
 64          secp256k1_keypair *keypair = malloc(sizeof(*keypair));
 65          unsigned char *pk_char = malloc(32);
 66          secp256k1_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(secp256k1_keypair_create(data.ctx, keypair, sk));
 80          CHECK(secp256k1_schnorrsig_sign_custom(data.ctx, sig, msg, MSGLEN, keypair, NULL));
 81          CHECK(secp256k1_keypair_xonly_pub(data.ctx, &pk, NULL, keypair));
 82          CHECK(secp256k1_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      secp256k1_context_destroy(data.ctx);
102  }
103  
104  #endif