Skip to content

Commit ee00af3

Browse files
jonasnickdeadalnix
authored andcommitted
Separate helper functions for pubkey_create and seckey_tweak_add
Summary: This is in preparation for allowing code reuse by keypair functions This is a partial backport of secp256k1 [[bitcoin-core/secp256k1#558 | PR558]] : bitcoin-core/secp256k1@f001034 Test Plan: ninja check-secp256k1 Reviewers: #bitcoin_abc, Fabien Reviewed By: #bitcoin_abc, Fabien Differential Revision: https://reviews.bitcoinabc.org/D7642
1 parent a7fc679 commit ee00af3

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

src/secp256k1/src/secp256k1.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -550,26 +550,33 @@ int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char
550550
return ret;
551551
}
552552

553-
int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) {
553+
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) {
554554
secp256k1_gej pj;
555+
int ret;
556+
557+
ret = secp256k1_scalar_set_b32_seckey(seckey_scalar, seckey);
558+
secp256k1_scalar_cmov(seckey_scalar, &secp256k1_scalar_one, !ret);
559+
560+
secp256k1_ecmult_gen(ecmult_gen_ctx, &pj, seckey_scalar);
561+
secp256k1_ge_set_gej(p, &pj);
562+
return ret;
563+
}
564+
565+
int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) {
555566
secp256k1_ge p;
556-
secp256k1_scalar sec;
567+
secp256k1_scalar seckey_scalar;
557568
int ret = 0;
558569
VERIFY_CHECK(ctx != NULL);
559570
ARG_CHECK(pubkey != NULL);
560571
memset(pubkey, 0, sizeof(*pubkey));
561572
ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
562573
ARG_CHECK(seckey != NULL);
563574

564-
ret = secp256k1_scalar_set_b32_seckey(&sec, seckey);
565-
secp256k1_scalar_cmov(&sec, &secp256k1_scalar_one, !ret);
566-
567-
secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec);
568-
secp256k1_ge_set_gej(&p, &pj);
575+
ret = secp256k1_ec_pubkey_create_helper(&ctx->ecmult_gen_ctx, &seckey_scalar, &p, seckey);
569576
secp256k1_pubkey_save(pubkey, &p);
570577
memczero(pubkey, sizeof(*pubkey), !ret);
571578

572-
secp256k1_scalar_clear(&sec);
579+
secp256k1_scalar_clear(&seckey_scalar);
573580
return ret;
574581
}
575582

@@ -607,24 +614,31 @@ int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *p
607614
return ret;
608615
}
609616

610-
int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {
617+
618+
static int secp256k1_ec_seckey_tweak_add_helper(secp256k1_scalar *sec, const unsigned char *tweak) {
611619
secp256k1_scalar term;
620+
int overflow = 0;
621+
int ret = 0;
622+
623+
secp256k1_scalar_set_b32(&term, tweak, &overflow);
624+
ret = (!overflow) & secp256k1_eckey_privkey_tweak_add(sec, &term);
625+
secp256k1_scalar_clear(&term);
626+
return ret;
627+
}
628+
629+
int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {
612630
secp256k1_scalar sec;
613631
int ret = 0;
614-
int overflow = 0;
615632
VERIFY_CHECK(ctx != NULL);
616633
ARG_CHECK(seckey != NULL);
617634
ARG_CHECK(tweak != NULL);
618635

619-
secp256k1_scalar_set_b32(&term, tweak, &overflow);
620636
ret = secp256k1_scalar_set_b32_seckey(&sec, seckey);
621-
622-
ret &= (!overflow) & secp256k1_eckey_privkey_tweak_add(&sec, &term);
637+
ret &= secp256k1_ec_seckey_tweak_add_helper(&sec, tweak);
623638
secp256k1_scalar_cmov(&sec, &secp256k1_scalar_zero, !ret);
624639
secp256k1_scalar_get_b32(seckey, &sec);
625640

626641
secp256k1_scalar_clear(&sec);
627-
secp256k1_scalar_clear(&term);
628642
return ret;
629643
}
630644

0 commit comments

Comments
 (0)