Merge #854: Rename msg32 to msghash32 in ecdsa_sign/verify and add explanation
6e85d675aaf9dc17842096f9cbf8cfab216c9331 Rename tweak to tweak32 in public API (Jonas Nick) f587f04e35719883546afd54cb491ead18eb6fc7 Rename msg32 to msghash32 in ecdsa_sign/verify and add explanation (Jonas Nick) Pull request description: This fixes #307 if there's nothing else that's confusing. ACKs for top commit: real-or-random: ACK 6e85d675aaf9dc17842096f9cbf8cfab216c9331 I inspected the diff Tree-SHA512: 1b0dc9dfffd497058dc39c962a512ed6d7f89218020fef9d2c03aaae1aefbf272b918c4fe6503434b62547714855fe1b8b89f2366f3ae6cde16143207c9e6b86
This commit is contained in:
		
						commit
						dc6e5c3a5c
					
				@ -452,7 +452,14 @@ SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(
 | 
			
		||||
 *           0: incorrect or unparseable signature
 | 
			
		||||
 *  Args:    ctx:       a secp256k1 context object, initialized for verification.
 | 
			
		||||
 *  In:      sig:       the signature being verified (cannot be NULL)
 | 
			
		||||
 *           msg32:     the 32-byte message hash being verified (cannot be NULL)
 | 
			
		||||
 *           msghash32: the 32-byte message hash being verified (cannot be NULL).
 | 
			
		||||
 *                      The verifier must make sure to apply a cryptographic
 | 
			
		||||
 *                      hash function to the message by itself and not accept an
 | 
			
		||||
 *                      msghash32 value directly. Otherwise, it would be easy to
 | 
			
		||||
 *                      create a "valid" signature without knowledge of the
 | 
			
		||||
 *                      secret key. See also
 | 
			
		||||
 *                      https://bitcoin.stackexchange.com/a/81116/35586 for more
 | 
			
		||||
 *                      background on this topic.
 | 
			
		||||
 *           pubkey:    pointer to an initialized public key to verify with (cannot be NULL)
 | 
			
		||||
 *
 | 
			
		||||
 * To avoid accepting malleable signatures, only ECDSA signatures in lower-S
 | 
			
		||||
@ -467,7 +474,7 @@ SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    const secp256k1_ecdsa_signature *sig,
 | 
			
		||||
    const unsigned char *msg32,
 | 
			
		||||
    const unsigned char *msghash32,
 | 
			
		||||
    const secp256k1_pubkey *pubkey
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
 | 
			
		||||
 | 
			
		||||
@ -534,9 +541,9 @@ SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_def
 | 
			
		||||
 *           0: the nonce generation function failed, or the secret key was invalid.
 | 
			
		||||
 *  Args:    ctx:       pointer to a context object, initialized for signing (cannot be NULL)
 | 
			
		||||
 *  Out:     sig:       pointer to an array where the signature will be placed (cannot be NULL)
 | 
			
		||||
 *  In:      msg32:  the 32-byte message hash being signed (cannot be NULL)
 | 
			
		||||
 *  In:      msghash32: the 32-byte message hash being signed (cannot be NULL)
 | 
			
		||||
 *           seckey:    pointer to a 32-byte secret key (cannot be NULL)
 | 
			
		||||
 *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
 | 
			
		||||
 *           noncefp:   pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
 | 
			
		||||
 *           ndata:     pointer to arbitrary data used by the nonce generation function (can be NULL)
 | 
			
		||||
 *
 | 
			
		||||
 * The created signature is always in lower-S form. See
 | 
			
		||||
@ -545,7 +552,7 @@ SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_def
 | 
			
		||||
SECP256K1_API int secp256k1_ecdsa_sign(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    secp256k1_ecdsa_signature *sig,
 | 
			
		||||
    const unsigned char *msg32,
 | 
			
		||||
    const unsigned char *msghash32,
 | 
			
		||||
    const unsigned char *seckey,
 | 
			
		||||
    secp256k1_nonce_function noncefp,
 | 
			
		||||
    const void *ndata
 | 
			
		||||
@ -626,7 +633,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate(
 | 
			
		||||
 *                  invalid according to secp256k1_ec_seckey_verify, this
 | 
			
		||||
 *                  function returns 0. seckey will be set to some unspecified
 | 
			
		||||
 *                  value if this function returns 0. (cannot be NULL)
 | 
			
		||||
 *  In:      tweak: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *  In:    tweak32: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *                  secp256k1_ec_seckey_verify, this function returns 0. For
 | 
			
		||||
 *                  uniformly random 32-byte arrays the chance of being invalid
 | 
			
		||||
 *                  is negligible (around 1 in 2^128) (cannot be NULL).
 | 
			
		||||
@ -634,7 +641,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_add(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    unsigned char *seckey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Same as secp256k1_ec_seckey_tweak_add, but DEPRECATED. Will be removed in
 | 
			
		||||
@ -642,7 +649,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_add(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    unsigned char *seckey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Tweak a public key by adding tweak times the generator to it.
 | 
			
		||||
@ -654,7 +661,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
 | 
			
		||||
 *                  (cannot be NULL).
 | 
			
		||||
 *  In/Out: pubkey: pointer to a public key object. pubkey will be set to an
 | 
			
		||||
 *                  invalid value if this function returns 0 (cannot be NULL).
 | 
			
		||||
 *  In:      tweak: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *  In:    tweak32: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *                  secp256k1_ec_seckey_verify, this function returns 0. For
 | 
			
		||||
 *                  uniformly random 32-byte arrays the chance of being invalid
 | 
			
		||||
 *                  is negligible (around 1 in 2^128) (cannot be NULL).
 | 
			
		||||
@ -662,7 +669,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    secp256k1_pubkey *pubkey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Tweak a secret key by multiplying it by a tweak.
 | 
			
		||||
@ -673,7 +680,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(
 | 
			
		||||
 *                  invalid according to secp256k1_ec_seckey_verify, this
 | 
			
		||||
 *                  function returns 0. seckey will be set to some unspecified
 | 
			
		||||
 *                  value if this function returns 0. (cannot be NULL)
 | 
			
		||||
 *  In:      tweak: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *  In:    tweak32: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *                  secp256k1_ec_seckey_verify, this function returns 0. For
 | 
			
		||||
 *                  uniformly random 32-byte arrays the chance of being invalid
 | 
			
		||||
 *                  is negligible (around 1 in 2^128) (cannot be NULL).
 | 
			
		||||
@ -681,7 +688,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_mul(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    unsigned char *seckey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Same as secp256k1_ec_seckey_tweak_mul, but DEPRECATED. Will be removed in
 | 
			
		||||
@ -689,7 +696,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_mul(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    unsigned char *seckey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Tweak a public key by multiplying it by a tweak value.
 | 
			
		||||
@ -699,7 +706,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
 | 
			
		||||
 *                  (cannot be NULL).
 | 
			
		||||
 *  In/Out: pubkey: pointer to a public key object. pubkey will be set to an
 | 
			
		||||
 *                  invalid value if this function returns 0 (cannot be NULL).
 | 
			
		||||
 *  In:      tweak: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *  In:    tweak32: pointer to a 32-byte tweak. If the tweak is invalid according to
 | 
			
		||||
 *                  secp256k1_ec_seckey_verify, this function returns 0. For
 | 
			
		||||
 *                  uniformly random 32-byte arrays the chance of being invalid
 | 
			
		||||
 *                  is negligible (around 1 in 2^128) (cannot be NULL).
 | 
			
		||||
@ -707,7 +714,7 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    secp256k1_pubkey *pubkey,
 | 
			
		||||
    const unsigned char *tweak
 | 
			
		||||
    const unsigned char *tweak32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
			
		||||
 | 
			
		||||
/** Updates the context randomization to protect against side-channel leakage.
 | 
			
		||||
 | 
			
		||||
@ -73,15 +73,15 @@ SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact(
 | 
			
		||||
 *           0: the nonce generation function failed, or the secret key was invalid.
 | 
			
		||||
 *  Args:    ctx:       pointer to a context object, initialized for signing (cannot be NULL)
 | 
			
		||||
 *  Out:     sig:       pointer to an array where the signature will be placed (cannot be NULL)
 | 
			
		||||
 *  In:      msg32:  the 32-byte message hash being signed (cannot be NULL)
 | 
			
		||||
 *  In:      msghash32: the 32-byte message hash being signed (cannot be NULL)
 | 
			
		||||
 *           seckey:    pointer to a 32-byte secret key (cannot be NULL)
 | 
			
		||||
 *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
 | 
			
		||||
 *           noncefp:   pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
 | 
			
		||||
 *           ndata:     pointer to arbitrary data used by the nonce generation function (can be NULL)
 | 
			
		||||
 */
 | 
			
		||||
SECP256K1_API int secp256k1_ecdsa_sign_recoverable(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    secp256k1_ecdsa_recoverable_signature *sig,
 | 
			
		||||
    const unsigned char *msg32,
 | 
			
		||||
    const unsigned char *msghash32,
 | 
			
		||||
    const unsigned char *seckey,
 | 
			
		||||
    secp256k1_nonce_function noncefp,
 | 
			
		||||
    const void *ndata
 | 
			
		||||
@ -94,13 +94,13 @@ SECP256K1_API int secp256k1_ecdsa_sign_recoverable(
 | 
			
		||||
 *  Args:    ctx:       pointer to a context object, initialized for verification (cannot be NULL)
 | 
			
		||||
 *  Out:     pubkey:    pointer to the recovered public key (cannot be NULL)
 | 
			
		||||
 *  In:      sig:       pointer to initialized signature that supports pubkey recovery (cannot be NULL)
 | 
			
		||||
 *           msg32:      the 32-byte message hash assumed to be signed (cannot be NULL)
 | 
			
		||||
 *           msghash32: the 32-byte message hash assumed to be signed (cannot be NULL)
 | 
			
		||||
 */
 | 
			
		||||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover(
 | 
			
		||||
    const secp256k1_context* ctx,
 | 
			
		||||
    secp256k1_pubkey *pubkey,
 | 
			
		||||
    const secp256k1_ecdsa_recoverable_signature *sig,
 | 
			
		||||
    const unsigned char *msg32
 | 
			
		||||
    const unsigned char *msghash32
 | 
			
		||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
 | 
			
		||||
@ -120,34 +120,34 @@ static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, cons
 | 
			
		||||
    return !secp256k1_gej_is_infinity(&qj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {
 | 
			
		||||
int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {
 | 
			
		||||
    secp256k1_scalar r, s;
 | 
			
		||||
    int ret, recid;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
 | 
			
		||||
    ARG_CHECK(msg32 != NULL);
 | 
			
		||||
    ARG_CHECK(msghash32 != NULL);
 | 
			
		||||
    ARG_CHECK(signature != NULL);
 | 
			
		||||
    ARG_CHECK(seckey != NULL);
 | 
			
		||||
 | 
			
		||||
    ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, &recid, msg32, seckey, noncefp, noncedata);
 | 
			
		||||
    ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, &recid, msghash32, seckey, noncefp, noncedata);
 | 
			
		||||
    secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) {
 | 
			
		||||
int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msghash32) {
 | 
			
		||||
    secp256k1_ge q;
 | 
			
		||||
    secp256k1_scalar r, s;
 | 
			
		||||
    secp256k1_scalar m;
 | 
			
		||||
    int recid;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
 | 
			
		||||
    ARG_CHECK(msg32 != NULL);
 | 
			
		||||
    ARG_CHECK(msghash32 != NULL);
 | 
			
		||||
    ARG_CHECK(signature != NULL);
 | 
			
		||||
    ARG_CHECK(pubkey != NULL);
 | 
			
		||||
 | 
			
		||||
    secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature);
 | 
			
		||||
    VERIFY_CHECK(recid >= 0 && recid < 4);  /* should have been caught in parse_compact */
 | 
			
		||||
    secp256k1_scalar_set_b32(&m, msg32, NULL);
 | 
			
		||||
    secp256k1_scalar_set_b32(&m, msghash32, NULL);
 | 
			
		||||
    if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) {
 | 
			
		||||
        secp256k1_pubkey_save(pubkey, &q);
 | 
			
		||||
        return 1;
 | 
			
		||||
 | 
			
		||||
@ -422,17 +422,17 @@ int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) {
 | 
			
		||||
int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msghash32, const secp256k1_pubkey *pubkey) {
 | 
			
		||||
    secp256k1_ge q;
 | 
			
		||||
    secp256k1_scalar r, s;
 | 
			
		||||
    secp256k1_scalar m;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
 | 
			
		||||
    ARG_CHECK(msg32 != NULL);
 | 
			
		||||
    ARG_CHECK(msghash32 != NULL);
 | 
			
		||||
    ARG_CHECK(sig != NULL);
 | 
			
		||||
    ARG_CHECK(pubkey != NULL);
 | 
			
		||||
 | 
			
		||||
    secp256k1_scalar_set_b32(&m, msg32, NULL);
 | 
			
		||||
    secp256k1_scalar_set_b32(&m, msghash32, NULL);
 | 
			
		||||
    secp256k1_ecdsa_signature_load(ctx, &r, &s, sig);
 | 
			
		||||
    return (!secp256k1_scalar_is_high(&s) &&
 | 
			
		||||
            secp256k1_pubkey_load(ctx, &q, pubkey) &&
 | 
			
		||||
@ -533,16 +533,16 @@ static int secp256k1_ecdsa_sign_inner(const secp256k1_context* ctx, secp256k1_sc
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {
 | 
			
		||||
int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {
 | 
			
		||||
    secp256k1_scalar r, s;
 | 
			
		||||
    int ret;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
 | 
			
		||||
    ARG_CHECK(msg32 != NULL);
 | 
			
		||||
    ARG_CHECK(msghash32 != NULL);
 | 
			
		||||
    ARG_CHECK(signature != NULL);
 | 
			
		||||
    ARG_CHECK(seckey != NULL);
 | 
			
		||||
 | 
			
		||||
    ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, NULL, msg32, seckey, noncefp, noncedata);
 | 
			
		||||
    ret = secp256k1_ecdsa_sign_inner(ctx, &r, &s, NULL, msghash32, seckey, noncefp, noncedata);
 | 
			
		||||
    secp256k1_ecdsa_signature_save(signature, &r, &s);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
@ -623,26 +623,26 @@ int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int secp256k1_ec_seckey_tweak_add_helper(secp256k1_scalar *sec, const unsigned char *tweak) {
 | 
			
		||||
static int secp256k1_ec_seckey_tweak_add_helper(secp256k1_scalar *sec, const unsigned char *tweak32) {
 | 
			
		||||
    secp256k1_scalar term;
 | 
			
		||||
    int overflow = 0;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    secp256k1_scalar_set_b32(&term, tweak, &overflow);
 | 
			
		||||
    secp256k1_scalar_set_b32(&term, tweak32, &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) {
 | 
			
		||||
int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak32) {
 | 
			
		||||
    secp256k1_scalar sec;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(seckey != NULL);
 | 
			
		||||
    ARG_CHECK(tweak != NULL);
 | 
			
		||||
    ARG_CHECK(tweak32 != NULL);
 | 
			
		||||
 | 
			
		||||
    ret = secp256k1_scalar_set_b32_seckey(&sec, seckey);
 | 
			
		||||
    ret &= secp256k1_ec_seckey_tweak_add_helper(&sec, tweak);
 | 
			
		||||
    ret &= secp256k1_ec_seckey_tweak_add_helper(&sec, tweak32);
 | 
			
		||||
    secp256k1_scalar_cmov(&sec, &secp256k1_scalar_zero, !ret);
 | 
			
		||||
    secp256k1_scalar_get_b32(seckey, &sec);
 | 
			
		||||
 | 
			
		||||
@ -650,28 +650,28 @@ int secp256k1_ec_seckey_tweak_add(const secp256k1_context* ctx, unsigned char *s
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak32) {
 | 
			
		||||
    return secp256k1_ec_seckey_tweak_add(ctx, seckey, tweak32);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 *tweak32) {
 | 
			
		||||
    secp256k1_scalar term;
 | 
			
		||||
    int overflow = 0;
 | 
			
		||||
    secp256k1_scalar_set_b32(&term, tweak, &overflow);
 | 
			
		||||
    secp256k1_scalar_set_b32(&term, tweak32, &overflow);
 | 
			
		||||
    return !overflow && secp256k1_eckey_pubkey_tweak_add(ecmult_ctx, p, &term);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) {
 | 
			
		||||
int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) {
 | 
			
		||||
    secp256k1_ge p;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
 | 
			
		||||
    ARG_CHECK(pubkey != NULL);
 | 
			
		||||
    ARG_CHECK(tweak != NULL);
 | 
			
		||||
    ARG_CHECK(tweak32 != NULL);
 | 
			
		||||
 | 
			
		||||
    ret = secp256k1_pubkey_load(ctx, &p, pubkey);
 | 
			
		||||
    memset(pubkey, 0, sizeof(*pubkey));
 | 
			
		||||
    ret = ret && secp256k1_ec_pubkey_tweak_add_helper(&ctx->ecmult_ctx, &p, tweak);
 | 
			
		||||
    ret = ret && secp256k1_ec_pubkey_tweak_add_helper(&ctx->ecmult_ctx, &p, tweak32);
 | 
			
		||||
    if (ret) {
 | 
			
		||||
        secp256k1_pubkey_save(pubkey, &p);
 | 
			
		||||
    }
 | 
			
		||||
@ -679,16 +679,16 @@ int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ec_seckey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {
 | 
			
		||||
int secp256k1_ec_seckey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak32) {
 | 
			
		||||
    secp256k1_scalar factor;
 | 
			
		||||
    secp256k1_scalar sec;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int overflow = 0;
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(seckey != NULL);
 | 
			
		||||
    ARG_CHECK(tweak != NULL);
 | 
			
		||||
    ARG_CHECK(tweak32 != NULL);
 | 
			
		||||
 | 
			
		||||
    secp256k1_scalar_set_b32(&factor, tweak, &overflow);
 | 
			
		||||
    secp256k1_scalar_set_b32(&factor, tweak32, &overflow);
 | 
			
		||||
    ret = secp256k1_scalar_set_b32_seckey(&sec, seckey);
 | 
			
		||||
    ret &= (!overflow) & secp256k1_eckey_privkey_tweak_mul(&sec, &factor);
 | 
			
		||||
    secp256k1_scalar_cmov(&sec, &secp256k1_scalar_zero, !ret);
 | 
			
		||||
@ -699,11 +699,11 @@ int secp256k1_ec_seckey_tweak_mul(const secp256k1_context* ctx, unsigned char *s
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {
 | 
			
		||||
    return secp256k1_ec_seckey_tweak_mul(ctx, seckey, tweak);
 | 
			
		||||
int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak32) {
 | 
			
		||||
    return secp256k1_ec_seckey_tweak_mul(ctx, seckey, tweak32);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) {
 | 
			
		||||
int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) {
 | 
			
		||||
    secp256k1_ge p;
 | 
			
		||||
    secp256k1_scalar factor;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
@ -711,9 +711,9 @@ int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey
 | 
			
		||||
    VERIFY_CHECK(ctx != NULL);
 | 
			
		||||
    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
 | 
			
		||||
    ARG_CHECK(pubkey != NULL);
 | 
			
		||||
    ARG_CHECK(tweak != NULL);
 | 
			
		||||
    ARG_CHECK(tweak32 != NULL);
 | 
			
		||||
 | 
			
		||||
    secp256k1_scalar_set_b32(&factor, tweak, &overflow);
 | 
			
		||||
    secp256k1_scalar_set_b32(&factor, tweak32, &overflow);
 | 
			
		||||
    ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey);
 | 
			
		||||
    memset(pubkey, 0, sizeof(*pubkey));
 | 
			
		||||
    if (ret) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user