-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
700 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/********************************************************************** | ||
* Copyright (c) 2014 Pieter Wuille * | ||
* Distributed under the MIT software license, see the accompanying * | ||
* file COPYING or http://www.opensource.org/licenses/mit-license.php.* | ||
**********************************************************************/ | ||
|
||
#include <stdio.h> | ||
#include <string.h> | ||
|
||
#include "include/secp256k1.h" | ||
#include "util.h" | ||
#include "bench.h" | ||
|
||
typedef struct { | ||
unsigned char key[32]; | ||
unsigned char sig[64]; | ||
unsigned char pubkey[33]; | ||
int pubkeylen; | ||
} benchmark_schnorr_sig_t; | ||
|
||
typedef struct { | ||
unsigned char msg[32]; | ||
benchmark_schnorr_sig_t sigs[64]; | ||
int numsigs; | ||
} benchmark_schnorr_verify_t; | ||
|
||
static void benchmark_schnorr_init(void* arg) { | ||
int i, k; | ||
benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; | ||
|
||
for (i = 0; i < 32; i++) data->msg[i] = 1 + i; | ||
for (k = 0; k < data->numsigs; k++) { | ||
for (i = 0; i < 32; i++) data->sigs[k].key[i] = 33 + i + k; | ||
secp256k1_schnorr_sign(data->msg, data->sigs[k].sig, data->sigs[k].key, NULL, NULL); | ||
data->sigs[k].pubkeylen = 33; | ||
CHECK(secp256k1_ec_pubkey_create(data->sigs[k].pubkey, &data->sigs[k].pubkeylen, data->sigs[k].key, 1)); | ||
} | ||
} | ||
|
||
static void benchmark_schnorr_verify(void* arg) { | ||
int i; | ||
benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; | ||
|
||
for (i = 0; i < 20000 / data->numsigs; i++) { | ||
data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); | ||
CHECK(secp256k1_schnorr_verify(data->msg, data->sigs[0].sig, data->sigs[0].pubkey, data->sigs[0].pubkeylen) == ((i & 0xFF) == 0)); | ||
data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); | ||
} | ||
} | ||
|
||
static void benchmark_schnorr_verify_batch(void* arg) { | ||
int i, k; | ||
benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; | ||
|
||
const unsigned char *sig_ptr[64]; | ||
const unsigned char *pubkey_ptr[64]; | ||
int pubkeylen[64]; | ||
|
||
for (k = 0; k < data->numsigs; k++) { | ||
sig_ptr[k] = &data->sigs[k].sig[0]; | ||
pubkey_ptr[k] = &data->sigs[k].pubkey[0]; | ||
pubkeylen[k] = data->sigs[k].pubkeylen; | ||
} | ||
|
||
for (i = 0; i < 20000 / data->numsigs; i++) { | ||
data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); | ||
CHECK(secp256k1_schnorr_verify_batch(data->numsigs, data->msg, sig_ptr, pubkey_ptr, pubkeylen) == ((i & 0xFF) == 0)); | ||
data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); | ||
} | ||
} | ||
|
||
|
||
|
||
int main(void) { | ||
benchmark_schnorr_verify_t data; | ||
|
||
secp256k1_start(SECP256K1_START_VERIFY | SECP256K1_START_SIGN); | ||
|
||
data.numsigs = 1; | ||
run_benchmark("schnorr_verify", benchmark_schnorr_verify, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
run_benchmark("schnorr_verify_batch1", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
data.numsigs = 2; | ||
run_benchmark("schnorr_verify_batch2", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
data.numsigs = 4; | ||
run_benchmark("schnorr_verify_batch4", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
data.numsigs = 8; | ||
run_benchmark("schnorr_verify_batch8", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
data.numsigs = 16; | ||
run_benchmark("schnorr_verify_batch16", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
data.numsigs = 32; | ||
run_benchmark("schnorr_verify_batch32", benchmark_schnorr_verify_batch, benchmark_schnorr_init, NULL, &data, 10, 20000); | ||
|
||
secp256k1_stop(); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/*********************************************************************** | ||
* Copyright (c) 2015 Pieter Wuille * | ||
* Distributed under the MIT software license, see the accompanying * | ||
* file COPYING or http://www.opensource.org/licenses/mit-license.php. * | ||
***********************************************************************/ | ||
|
||
#ifndef _SECP256K1_SCHNORR_ | ||
#define _SECP256K1_SCHNORR_ | ||
|
||
#include "scalar.h" | ||
#include "group.h" | ||
|
||
typedef void (*secp256k1_schnorr_msghash_t)(unsigned char *h32, const unsigned char *r32, const unsigned char *msg32); | ||
|
||
static int secp256k1_schnorr_sig_sign(unsigned char *sig64, const secp256k1_scalar_t *key, const secp256k1_scalar_t *nonce, secp256k1_schnorr_msghash_t hash, const unsigned char *msg32); | ||
static int secp256k1_schnorr_sig_verify(const unsigned char *sig64, const secp256k1_ge_t *pubkey, secp256k1_schnorr_msghash_t hash, const unsigned char *msg32); | ||
static int secp256k1_schnorr_sig_verify_batch(int n, unsigned char (* const sig64)[64], const secp256k1_ge_t *pubkey, secp256k1_schnorr_msghash_t hash, const unsigned char *msg32); | ||
|
||
#endif |
Oops, something went wrong.