Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/modules/schnorr/tests_impl.h
Show All 14 Lines | void test_schnorr_end_to_end(void) { | ||||
unsigned char schnorr_signature[64]; | unsigned char schnorr_signature[64]; | ||||
secp256k1_pubkey pubkey; | secp256k1_pubkey pubkey; | ||||
/* Generate a random key and message. */ | /* Generate a random key and message. */ | ||||
{ | { | ||||
secp256k1_scalar key; | secp256k1_scalar key; | ||||
random_scalar_order_test(&key); | random_scalar_order_test(&key); | ||||
secp256k1_scalar_get_b32(privkey, &key); | secp256k1_scalar_get_b32(privkey, &key); | ||||
secp256k1_rand256_test(message); | secp256k1_testrand256_test(message); | ||||
} | } | ||||
/* Construct and verify corresponding public key. */ | /* Construct and verify corresponding public key. */ | ||||
CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); | CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); | ||||
CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); | CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); | ||||
/* Schnorr sign. */ | /* Schnorr sign. */ | ||||
CHECK(secp256k1_schnorr_sign(ctx, schnorr_signature, message, privkey, NULL, NULL) == 1); | CHECK(secp256k1_schnorr_sign(ctx, schnorr_signature, message, privkey, NULL, NULL) == 1); | ||||
CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 1); | CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 1); | ||||
/* Destroy signature and verify again. */ | /* Destroy signature and verify again. */ | ||||
schnorr_signature[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); | schnorr_signature[secp256k1_testrand_bits(6)] += 1 + secp256k1_testrand_int(255); | ||||
CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 0); | CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 0); | ||||
} | } | ||||
#define SIG_COUNT 32 | #define SIG_COUNT 32 | ||||
void test_schnorr_sign_verify(void) { | void test_schnorr_sign_verify(void) { | ||||
unsigned char msg32[32]; | unsigned char msg32[32]; | ||||
unsigned char sig64[SIG_COUNT][64]; | unsigned char sig64[SIG_COUNT][64]; | ||||
unsigned char ndata[SIG_COUNT][32]; | unsigned char ndata[SIG_COUNT][32]; | ||||
secp256k1_gej pubkeyj[SIG_COUNT]; | secp256k1_gej pubkeyj[SIG_COUNT]; | ||||
secp256k1_ge pubkey[SIG_COUNT]; | secp256k1_ge pubkey[SIG_COUNT]; | ||||
secp256k1_scalar key[SIG_COUNT]; | secp256k1_scalar key[SIG_COUNT]; | ||||
int i, j; | int i, j; | ||||
secp256k1_rand256_test(msg32); | secp256k1_testrand256_test(msg32); | ||||
for (i = 0; i < SIG_COUNT; i++) { | for (i = 0; i < SIG_COUNT; i++) { | ||||
random_scalar_order_test(&key[i]); | random_scalar_order_test(&key[i]); | ||||
secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubkeyj[i], &key[i]); | secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubkeyj[i], &key[i]); | ||||
secp256k1_ge_set_gej_var(&pubkey[i], &pubkeyj[i]); | secp256k1_ge_set_gej_var(&pubkey[i], &pubkeyj[i]); | ||||
secp256k1_fe_normalize(&pubkey[i].x); | secp256k1_fe_normalize(&pubkey[i].x); | ||||
secp256k1_fe_normalize(&pubkey[i].y); | secp256k1_fe_normalize(&pubkey[i].y); | ||||
do { | do { | ||||
secp256k1_rand256_test(ndata[i]); | secp256k1_testrand256_test(ndata[i]); | ||||
if (secp256k1_schnorr_sig_sign(ctx, sig64[i], msg32, &key[i], &pubkey[i], NULL, &ndata[i])) { | if (secp256k1_schnorr_sig_sign(ctx, sig64[i], msg32, &key[i], &pubkey[i], NULL, &ndata[i])) { | ||||
break; | break; | ||||
} | } | ||||
} while(1); | } while(1); | ||||
CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[i], &pubkey[i], msg32)); | CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[i], &pubkey[i], msg32)); | ||||
/* Apply several random modifications to the sig and check that it | /* Apply several random modifications to the sig and check that it | ||||
* doesn't verify anymore. */ | * doesn't verify anymore. */ | ||||
for (j = 0; j < count; j++) { | for (j = 0; j < count; j++) { | ||||
int pos = secp256k1_rand_bits(6); | int pos = secp256k1_testrand_bits(6); | ||||
int mod = 1 + secp256k1_rand_int(255); | int mod = 1 + secp256k1_testrand_int(255); | ||||
sig64[i][pos] ^= mod; | sig64[i][pos] ^= mod; | ||||
CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[i], &pubkey[i], msg32) == 0); | CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[i], &pubkey[i], msg32) == 0); | ||||
sig64[i][pos] ^= mod; | sig64[i][pos] ^= mod; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
#undef SIG_COUNT | #undef SIG_COUNT | ||||
▲ Show 20 Lines • Show All 443 Lines • Show Last 20 Lines |