Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/secp256k1.c
Show First 20 Lines • Show All 544 Lines • ▼ Show 20 Lines | int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
ARG_CHECK(seckey != NULL); | ARG_CHECK(seckey != NULL); | ||||
ret = secp256k1_scalar_set_b32_seckey(&sec, seckey); | ret = secp256k1_scalar_set_b32_seckey(&sec, seckey); | ||||
secp256k1_scalar_clear(&sec); | secp256k1_scalar_clear(&sec); | ||||
return ret; | return ret; | ||||
} | } | ||||
int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { | static int secp256k1_ec_pubkey_create_helper(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, secp256k1_scalar *seckey_scalar, secp256k1_ge *p, const unsigned char *seckey) { | ||||
secp256k1_gej pj; | secp256k1_gej pj; | ||||
int ret; | |||||
ret = secp256k1_scalar_set_b32_seckey(seckey_scalar, seckey); | |||||
secp256k1_scalar_cmov(seckey_scalar, &secp256k1_scalar_one, !ret); | |||||
secp256k1_ecmult_gen(ecmult_gen_ctx, &pj, seckey_scalar); | |||||
secp256k1_ge_set_gej(p, &pj); | |||||
return ret; | |||||
} | |||||
int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { | |||||
secp256k1_ge p; | secp256k1_ge p; | ||||
secp256k1_scalar sec; | secp256k1_scalar seckey_scalar; | ||||
int ret = 0; | int ret = 0; | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
ARG_CHECK(pubkey != NULL); | ARG_CHECK(pubkey != NULL); | ||||
memset(pubkey, 0, sizeof(*pubkey)); | memset(pubkey, 0, sizeof(*pubkey)); | ||||
ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); | ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); | ||||
ARG_CHECK(seckey != NULL); | ARG_CHECK(seckey != NULL); | ||||
ret = secp256k1_scalar_set_b32_seckey(&sec, seckey); | ret = secp256k1_ec_pubkey_create_helper(&ctx->ecmult_gen_ctx, &seckey_scalar, &p, seckey); | ||||
secp256k1_scalar_cmov(&sec, &secp256k1_scalar_one, !ret); | |||||
secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); | |||||
secp256k1_ge_set_gej(&p, &pj); | |||||
secp256k1_pubkey_save(pubkey, &p); | secp256k1_pubkey_save(pubkey, &p); | ||||
memczero(pubkey, sizeof(*pubkey), !ret); | memczero(pubkey, sizeof(*pubkey), !ret); | ||||
secp256k1_scalar_clear(&sec); | secp256k1_scalar_clear(&seckey_scalar); | ||||
return ret; | return ret; | ||||
} | } | ||||
int secp256k1_ec_seckey_negate(const secp256k1_context* ctx, unsigned char *seckey) { | int secp256k1_ec_seckey_negate(const secp256k1_context* ctx, unsigned char *seckey) { | ||||
secp256k1_scalar sec; | secp256k1_scalar sec; | ||||
int ret = 0; | int ret = 0; | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
ARG_CHECK(seckey != NULL); | ARG_CHECK(seckey != NULL); | ||||
Show All 21 Lines | int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *pubkey) { | ||||
memset(pubkey, 0, sizeof(*pubkey)); | memset(pubkey, 0, sizeof(*pubkey)); | ||||
if (ret) { | if (ret) { | ||||
secp256k1_ge_neg(&p, &p); | secp256k1_ge_neg(&p, &p); | ||||
secp256k1_pubkey_save(pubkey, &p); | secp256k1_pubkey_save(pubkey, &p); | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { | |||||
static int secp256k1_ec_seckey_tweak_add_helper(secp256k1_scalar *sec, const unsigned char *tweak) { | |||||
secp256k1_scalar term; | secp256k1_scalar term; | ||||
int overflow = 0; | |||||
int ret = 0; | |||||
secp256k1_scalar_set_b32(&term, tweak, &overflow); | |||||
ret = (!overflow) & secp256k1_eckey_privkey_tweak_add(sec, &term); | |||||
secp256k1_scalar_clear(&term); | |||||
return ret; | |||||
} | |||||
int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { | |||||
secp256k1_scalar sec; | secp256k1_scalar sec; | ||||
int ret = 0; | int ret = 0; | ||||
int overflow = 0; | |||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
ARG_CHECK(seckey != NULL); | ARG_CHECK(seckey != NULL); | ||||
ARG_CHECK(tweak != NULL); | ARG_CHECK(tweak != NULL); | ||||
secp256k1_scalar_set_b32(&term, tweak, &overflow); | |||||
ret = secp256k1_scalar_set_b32_seckey(&sec, seckey); | ret = secp256k1_scalar_set_b32_seckey(&sec, seckey); | ||||
ret &= secp256k1_ec_seckey_tweak_add_helper(&sec, tweak); | |||||
ret &= (!overflow) & secp256k1_eckey_privkey_tweak_add(&sec, &term); | |||||
secp256k1_scalar_cmov(&sec, &secp256k1_scalar_zero, !ret); | secp256k1_scalar_cmov(&sec, &secp256k1_scalar_zero, !ret); | ||||
secp256k1_scalar_get_b32(seckey, &sec); | secp256k1_scalar_get_b32(seckey, &sec); | ||||
secp256k1_scalar_clear(&sec); | secp256k1_scalar_clear(&sec); | ||||
secp256k1_scalar_clear(&term); | |||||
return ret; | return ret; | ||||
} | } | ||||
int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { | int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { | ||||
return secp256k1_ec_seckey_tweak_add(ctx, seckey, tweak); | return secp256k1_ec_seckey_tweak_add(ctx, seckey, tweak); | ||||
} | } | ||||
static int secp256k1_ec_pubkey_tweak_add_helper(const secp256k1_ecmult_context* ecmult_ctx, secp256k1_ge *p, const unsigned char *tweak) { | static int secp256k1_ec_pubkey_tweak_add_helper(const secp256k1_ecmult_context* ecmult_ctx, secp256k1_ge *p, const unsigned char *tweak) { | ||||
▲ Show 20 Lines • Show All 123 Lines • Show Last 20 Lines |