Introduce secp256k1_scalar_t for future constant-time mod order operations
This commit is contained in:
153
src/secp256k1.c
153
src/secp256k1.c
@@ -8,6 +8,7 @@
|
||||
#include "util.h"
|
||||
#include "num_impl.h"
|
||||
#include "field_impl.h"
|
||||
#include "scalar_impl.h"
|
||||
#include "group_impl.h"
|
||||
#include "ecmult_impl.h"
|
||||
#include "ecmult_gen_impl.h"
|
||||
@@ -75,15 +76,15 @@ int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
DEBUG_CHECK(nonce != NULL);
|
||||
|
||||
secp256k1_num_t sec, non, msg;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_init(&non);
|
||||
secp256k1_num_init(&msg);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
secp256k1_num_set_bin(&non, nonce, 32);
|
||||
secp256k1_num_set_bin(&msg, message, messagelen);
|
||||
int ret = !secp256k1_num_is_zero(&non) &&
|
||||
(secp256k1_num_cmp(&non, &secp256k1_ge_consts->order) < 0);
|
||||
secp256k1_scalar_t sec, non, msg;
|
||||
secp256k1_scalar_init(&sec);
|
||||
secp256k1_scalar_init(&non);
|
||||
secp256k1_scalar_init(&msg);
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, NULL);
|
||||
int overflow = 0;
|
||||
secp256k1_scalar_set_bin(&non, nonce, 32, &overflow);
|
||||
secp256k1_scalar_set_bin(&msg, message, messagelen, NULL);
|
||||
int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
|
||||
secp256k1_ecdsa_sig_t sig;
|
||||
secp256k1_ecdsa_sig_init(&sig);
|
||||
if (ret) {
|
||||
@@ -93,12 +94,12 @@ int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned
|
||||
secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig);
|
||||
}
|
||||
secp256k1_ecdsa_sig_free(&sig);
|
||||
secp256k1_num_clear(&msg);
|
||||
secp256k1_num_clear(&non);
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_free(&msg);
|
||||
secp256k1_num_free(&non);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_scalar_clear(&msg);
|
||||
secp256k1_scalar_clear(&non);
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_free(&msg);
|
||||
secp256k1_scalar_free(&non);
|
||||
secp256k1_scalar_free(&sec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -110,15 +111,15 @@ int secp256k1_ecdsa_sign_compact(const unsigned char *message, int messagelen, u
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
DEBUG_CHECK(nonce != NULL);
|
||||
|
||||
secp256k1_num_t sec, non, msg;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_init(&non);
|
||||
secp256k1_num_init(&msg);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
secp256k1_num_set_bin(&non, nonce, 32);
|
||||
secp256k1_num_set_bin(&msg, message, messagelen);
|
||||
int ret = !secp256k1_num_is_zero(&non) &&
|
||||
(secp256k1_num_cmp(&non, &secp256k1_ge_consts->order) < 0);
|
||||
secp256k1_scalar_t sec, non, msg;
|
||||
secp256k1_scalar_init(&sec);
|
||||
secp256k1_scalar_init(&non);
|
||||
secp256k1_scalar_init(&msg);
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, NULL);
|
||||
int overflow = 0;
|
||||
secp256k1_scalar_set_bin(&non, nonce, 32, &overflow);
|
||||
secp256k1_scalar_set_bin(&msg, message, messagelen, NULL);
|
||||
int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
|
||||
secp256k1_ecdsa_sig_t sig;
|
||||
secp256k1_ecdsa_sig_init(&sig);
|
||||
if (ret) {
|
||||
@@ -129,12 +130,12 @@ int secp256k1_ecdsa_sign_compact(const unsigned char *message, int messagelen, u
|
||||
secp256k1_num_get_bin(sig64 + 32, 32, &sig.s);
|
||||
}
|
||||
secp256k1_ecdsa_sig_free(&sig);
|
||||
secp256k1_num_clear(&msg);
|
||||
secp256k1_num_clear(&non);
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_free(&msg);
|
||||
secp256k1_num_free(&non);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_scalar_clear(&msg);
|
||||
secp256k1_scalar_clear(&non);
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_free(&msg);
|
||||
secp256k1_scalar_free(&non);
|
||||
secp256k1_scalar_free(&sec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -169,13 +170,13 @@ int secp256k1_ecdsa_recover_compact(const unsigned char *msg, int msglen, const
|
||||
int secp256k1_ec_seckey_verify(const unsigned char *seckey) {
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
|
||||
secp256k1_num_t sec;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
int ret = !secp256k1_num_is_zero(&sec) &&
|
||||
(secp256k1_num_cmp(&sec, &secp256k1_ge_consts->order) < 0);
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_scalar_t sec;
|
||||
secp256k1_scalar_init(&sec);
|
||||
int overflow;
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, &overflow);
|
||||
int ret = !secp256k1_scalar_is_zero(&sec) && !overflow;
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_free(&sec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -192,13 +193,13 @@ int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsi
|
||||
DEBUG_CHECK(pubkeylen != NULL);
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
|
||||
secp256k1_num_t sec;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
secp256k1_scalar_t sec;
|
||||
secp256k1_scalar_init(&sec);
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, NULL);
|
||||
secp256k1_gej_t pj;
|
||||
secp256k1_ecmult_gen(&pj, &sec);
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_free(&sec);
|
||||
secp256k1_ge_t p;
|
||||
secp256k1_ge_set_gej(&p, &pj);
|
||||
secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed);
|
||||
@@ -220,22 +221,23 @@ int secp256k1_ec_privkey_tweak_add(unsigned char *seckey, const unsigned char *t
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
DEBUG_CHECK(tweak != NULL);
|
||||
|
||||
secp256k1_num_t term;
|
||||
secp256k1_num_init(&term);
|
||||
secp256k1_num_set_bin(&term, tweak, 32);
|
||||
secp256k1_num_t sec;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
secp256k1_scalar_t term;
|
||||
secp256k1_scalar_init(&term);
|
||||
int overflow = 0;
|
||||
secp256k1_scalar_set_bin(&term, tweak, 32, &overflow);
|
||||
secp256k1_scalar_t sec;
|
||||
secp256k1_scalar_init(&sec);
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, NULL);
|
||||
|
||||
int ret = secp256k1_eckey_privkey_tweak_add(&sec, &term);
|
||||
int ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow;
|
||||
if (ret) {
|
||||
secp256k1_num_get_bin(seckey, 32, &sec);
|
||||
secp256k1_scalar_get_bin(seckey, 32, &sec);
|
||||
}
|
||||
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_clear(&term);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_num_free(&term);
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_clear(&term);
|
||||
secp256k1_scalar_free(&sec);
|
||||
secp256k1_scalar_free(&term);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -266,21 +268,22 @@ int secp256k1_ec_privkey_tweak_mul(unsigned char *seckey, const unsigned char *t
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
DEBUG_CHECK(tweak != NULL);
|
||||
|
||||
secp256k1_num_t factor;
|
||||
secp256k1_num_init(&factor);
|
||||
secp256k1_num_set_bin(&factor, tweak, 32);
|
||||
secp256k1_num_t sec;
|
||||
secp256k1_num_init(&sec);
|
||||
secp256k1_num_set_bin(&sec, seckey, 32);
|
||||
int ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor);
|
||||
secp256k1_scalar_t factor;
|
||||
secp256k1_scalar_init(&factor);
|
||||
int overflow = 0;
|
||||
secp256k1_scalar_set_bin(&factor, tweak, 32, &overflow);
|
||||
secp256k1_scalar_t sec;
|
||||
secp256k1_scalar_init(&sec);
|
||||
secp256k1_scalar_set_bin(&sec, seckey, 32, NULL);
|
||||
int ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow;
|
||||
if (ret) {
|
||||
secp256k1_num_get_bin(seckey, 32, &sec);
|
||||
secp256k1_scalar_get_bin(seckey, 32, &sec);
|
||||
}
|
||||
|
||||
secp256k1_num_clear(&sec);
|
||||
secp256k1_num_clear(&factor);
|
||||
secp256k1_num_free(&sec);
|
||||
secp256k1_num_free(&factor);
|
||||
secp256k1_scalar_clear(&sec);
|
||||
secp256k1_scalar_clear(&factor);
|
||||
secp256k1_scalar_free(&sec);
|
||||
secp256k1_scalar_free(&factor);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -312,11 +315,12 @@ int secp256k1_ec_privkey_export(const unsigned char *seckey, unsigned char *priv
|
||||
DEBUG_CHECK(privkey != NULL);
|
||||
DEBUG_CHECK(privkeylen != NULL);
|
||||
|
||||
secp256k1_num_t key;
|
||||
secp256k1_num_init(&key);
|
||||
secp256k1_num_set_bin(&key, seckey, 32);
|
||||
secp256k1_scalar_t key;
|
||||
secp256k1_scalar_init(&key);
|
||||
secp256k1_scalar_set_bin(&key, seckey, 32, NULL);
|
||||
int ret = secp256k1_eckey_privkey_serialize(privkey, privkeylen, &key, compressed);
|
||||
secp256k1_num_free(&key);
|
||||
secp256k1_scalar_clear(&key);
|
||||
secp256k1_scalar_free(&key);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -324,11 +328,12 @@ int secp256k1_ec_privkey_import(unsigned char *seckey, const unsigned char *priv
|
||||
DEBUG_CHECK(seckey != NULL);
|
||||
DEBUG_CHECK(privkey != NULL);
|
||||
|
||||
secp256k1_num_t key;
|
||||
secp256k1_num_init(&key);
|
||||
secp256k1_scalar_t key;
|
||||
secp256k1_scalar_init(&key);
|
||||
int ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen);
|
||||
if (ret)
|
||||
secp256k1_num_get_bin(seckey, 32, &key);
|
||||
secp256k1_num_free(&key);
|
||||
secp256k1_scalar_get_bin(seckey, 32, &key);
|
||||
secp256k1_scalar_clear(&key);
|
||||
secp256k1_scalar_free(&key);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user