Commit | Line | Data |
---|---|---|
07aa4c70 DA |
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 | ***********************************************************************/ | |
8dfd53ee JN |
6 | |
7 | #include <string.h> | |
8 | #include <stdlib.h> | |
9 | ||
10 | ||
3c90bdda WB |
11 | #include "../include/secp256k1.h" |
12 | #include "../include/secp256k1_schnorrsig.h" | |
8dfd53ee JN |
13 | #include "util.h" |
14 | #include "bench.h" | |
15 | ||
a0c3fc17 JN |
16 | #define MSGLEN 32 |
17 | ||
8dfd53ee JN |
18 | typedef struct { |
19 | secp256k1_context *ctx; | |
20 | int n; | |
21 | ||
22 | const secp256k1_keypair **keypairs; | |
23 | const unsigned char **pk; | |
24 | const unsigned char **sigs; | |
25 | const unsigned char **msgs; | |
26 | } bench_schnorrsig_data; | |
27 | ||
28 | void bench_schnorrsig_sign(void* arg, int iters) { | |
29 | bench_schnorrsig_data *data = (bench_schnorrsig_data *)arg; | |
30 | int i; | |
5f6ceafc | 31 | unsigned char msg[MSGLEN] = {0}; |
8dfd53ee JN |
32 | unsigned char sig[64]; |
33 | ||
34 | for (i = 0; i < iters; i++) { | |
35 | msg[0] = i; | |
36 | msg[1] = i >> 8; | |
5f6ceafc | 37 | CHECK(secp256k1_schnorrsig_sign_custom(data->ctx, sig, msg, MSGLEN, data->keypairs[i], NULL)); |
8dfd53ee JN |
38 | } |
39 | } | |
40 | ||
41 | void bench_schnorrsig_verify(void* arg, int iters) { | |
42 | bench_schnorrsig_data *data = (bench_schnorrsig_data *)arg; | |
43 | int i; | |
44 | ||
45 | for (i = 0; i < iters; i++) { | |
46 | secp256k1_xonly_pubkey pk; | |
47 | CHECK(secp256k1_xonly_pubkey_parse(data->ctx, &pk, data->pk[i]) == 1); | |
a0c3fc17 | 48 | CHECK(secp256k1_schnorrsig_verify(data->ctx, data->sigs[i], data->msgs[i], MSGLEN, &pk)); |
8dfd53ee JN |
49 | } |
50 | } | |
51 | ||
52 | int main(void) { | |
53 | int i; | |
54 | bench_schnorrsig_data data; | |
55 | int iters = get_iters(10000); | |
56 | ||
57 | data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN); | |
58 | data.keypairs = (const secp256k1_keypair **)malloc(iters * sizeof(secp256k1_keypair *)); | |
59 | data.pk = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); | |
60 | data.msgs = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); | |
61 | data.sigs = (const unsigned char **)malloc(iters * sizeof(unsigned char *)); | |
62 | ||
5f6ceafc | 63 | CHECK(MSGLEN >= 4); |
8dfd53ee JN |
64 | for (i = 0; i < iters; i++) { |
65 | unsigned char sk[32]; | |
a0c3fc17 | 66 | unsigned char *msg = (unsigned char *)malloc(MSGLEN); |
8dfd53ee JN |
67 | unsigned char *sig = (unsigned char *)malloc(64); |
68 | secp256k1_keypair *keypair = (secp256k1_keypair *)malloc(sizeof(*keypair)); | |
69 | unsigned char *pk_char = (unsigned char *)malloc(32); | |
70 | secp256k1_xonly_pubkey pk; | |
71 | msg[0] = sk[0] = i; | |
72 | msg[1] = sk[1] = i >> 8; | |
73 | msg[2] = sk[2] = i >> 16; | |
74 | msg[3] = sk[3] = i >> 24; | |
5f6ceafc | 75 | memset(&msg[4], 'm', MSGLEN - 4); |
8dfd53ee JN |
76 | memset(&sk[4], 's', 28); |
77 | ||
78 | data.keypairs[i] = keypair; | |
79 | data.pk[i] = pk_char; | |
80 | data.msgs[i] = msg; | |
81 | data.sigs[i] = sig; | |
82 | ||
83 | CHECK(secp256k1_keypair_create(data.ctx, keypair, sk)); | |
5f6ceafc | 84 | CHECK(secp256k1_schnorrsig_sign_custom(data.ctx, sig, msg, MSGLEN, keypair, NULL)); |
8dfd53ee JN |
85 | CHECK(secp256k1_keypair_xonly_pub(data.ctx, &pk, NULL, keypair)); |
86 | CHECK(secp256k1_xonly_pubkey_serialize(data.ctx, pk_char, &pk) == 1); | |
87 | } | |
88 | ||
89 | run_benchmark("schnorrsig_sign", bench_schnorrsig_sign, NULL, NULL, (void *) &data, 10, iters); | |
90 | run_benchmark("schnorrsig_verify", bench_schnorrsig_verify, NULL, NULL, (void *) &data, 10, iters); | |
91 | ||
92 | for (i = 0; i < iters; i++) { | |
93 | free((void *)data.keypairs[i]); | |
94 | free((void *)data.pk[i]); | |
95 | free((void *)data.msgs[i]); | |
96 | free((void *)data.sigs[i]); | |
97 | } | |
98 | free(data.keypairs); | |
99 | free(data.pk); | |
100 | free(data.msgs); | |
101 | free(data.sigs); | |
102 | ||
103 | secp256k1_context_destroy(data.ctx); | |
104 | return 0; | |
105 | } |