@@ -56,6 +56,7 @@ typedef struct {
56
56
57
57
/* Benchmark output. */
58
58
secp256k1_gej * output ;
59
+ secp256k1_fe * output_xonly ;
59
60
} bench_data ;
60
61
61
62
/* Hashes x into [0, POINTS) twice and store the result in offset1 and offset2. */
@@ -123,6 +124,32 @@ static void bench_ecmult_const_teardown(void* arg, int iters) {
123
124
bench_ecmult_teardown_helper (data , & data -> offset1 , & data -> offset2 , NULL , iters );
124
125
}
125
126
127
+ static void bench_ecmult_const_xonly (void * arg , int iters ) {
128
+ bench_data * data = (bench_data * )arg ;
129
+ int i ;
130
+
131
+ for (i = 0 ; i < iters ; ++ i ) {
132
+ const secp256k1_ge * pubkey = & data -> pubkeys [(data -> offset1 + i ) % POINTS ];
133
+ const secp256k1_scalar * scalar = & data -> scalars [(data -> offset2 + i ) % POINTS ];
134
+ int known_on_curve = 1 ;
135
+ secp256k1_ecmult_const_xonly (& data -> output_xonly [i ], & pubkey -> x , NULL , scalar , known_on_curve );
136
+ }
137
+ }
138
+
139
+ static void bench_ecmult_const_xonly_teardown (void * arg , int iters ) {
140
+ bench_data * data = (bench_data * )arg ;
141
+ int i ;
142
+
143
+ /* verify by comparing with x coordinate of regular ecmult result */
144
+ for (i = 0 ; i < iters ; ++ i ) {
145
+ const secp256k1_gej * pubkey_gej = & data -> pubkeys_gej [(data -> offset1 + i ) % POINTS ];
146
+ const secp256k1_scalar * scalar = & data -> scalars [(data -> offset2 + i ) % POINTS ];
147
+ secp256k1_gej expected_gej ;
148
+ secp256k1_ecmult (& expected_gej , pubkey_gej , scalar , NULL );
149
+ CHECK (secp256k1_gej_eq_x_var (& data -> output_xonly [i ], & expected_gej ));
150
+ }
151
+ }
152
+
126
153
static void bench_ecmult_1p (void * arg , int iters ) {
127
154
bench_data * data = (bench_data * )arg ;
128
155
int i ;
@@ -171,6 +198,8 @@ static void run_ecmult_bench(bench_data* data, int iters) {
171
198
run_benchmark (str , bench_ecmult_gen , bench_ecmult_setup , bench_ecmult_gen_teardown , data , 10 , iters );
172
199
sprintf (str , "ecmult_const" );
173
200
run_benchmark (str , bench_ecmult_const , bench_ecmult_setup , bench_ecmult_const_teardown , data , 10 , iters );
201
+ sprintf (str , "ecmult_const_xonly" );
202
+ run_benchmark (str , bench_ecmult_const_xonly , bench_ecmult_setup , bench_ecmult_const_xonly_teardown , data , 10 , iters );
174
203
/* ecmult with non generator point */
175
204
sprintf (str , "ecmult_1p" );
176
205
run_benchmark (str , bench_ecmult_1p , bench_ecmult_setup , bench_ecmult_1p_teardown , data , 10 , iters );
@@ -319,6 +348,7 @@ int main(int argc, char **argv) {
319
348
data .pubkeys_gej = malloc (sizeof (secp256k1_gej ) * POINTS );
320
349
data .expected_output = malloc (sizeof (secp256k1_gej ) * (iters + 1 ));
321
350
data .output = malloc (sizeof (secp256k1_gej ) * (iters + 1 ));
351
+ data .output_xonly = malloc (sizeof (secp256k1_fe ) * (iters + 1 ));
322
352
323
353
/* Generate a set of scalars, and private/public keypairs. */
324
354
secp256k1_gej_set_ge (& data .pubkeys_gej [0 ], & secp256k1_ge_const_g );
@@ -361,6 +391,7 @@ int main(int argc, char **argv) {
361
391
free (data .pubkeys );
362
392
free (data .pubkeys_gej );
363
393
free (data .seckeys );
394
+ free (data .output_xonly );
364
395
free (data .output );
365
396
free (data .expected_output );
366
397
0 commit comments