csecp256k1

Haskell FFI bindings to bitcoin-core/secp256k1 (docs.ppad.tech/csecp256k1).
git clone git://git.ppad.tech/csecp256k1.git
Log | Files | Refs | README | LICENSE

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