22
22
23
23
static const unsigned char secp256k1_musig_secnonce_magic [4 ] = { 0x22 , 0x0e , 0xdc , 0xf1 };
24
24
25
- static void secp256k1_musig_secnonce_save (secp256k1_musig_secnonce * secnonce , secp256k1_scalar * k ) {
25
+ static void secp256k1_musig_secnonce_save (secp256k1_musig_secnonce * secnonce , const secp256k1_scalar * k , secp256k1_ge * pk ) {
26
26
memcpy (& secnonce -> data [0 ], secp256k1_musig_secnonce_magic , 4 );
27
27
secp256k1_scalar_get_b32 (& secnonce -> data [4 ], & k [0 ]);
28
28
secp256k1_scalar_get_b32 (& secnonce -> data [36 ], & k [1 ]);
29
+ secp256k1_point_save (& secnonce -> data [68 ], pk );
29
30
}
30
31
31
- static int secp256k1_musig_secnonce_load (const secp256k1_context * ctx , secp256k1_scalar * k , secp256k1_musig_secnonce * secnonce ) {
32
+ static int secp256k1_musig_secnonce_load (const secp256k1_context * ctx , secp256k1_scalar * k , secp256k1_ge * pk , secp256k1_musig_secnonce * secnonce ) {
32
33
int is_zero ;
33
34
ARG_CHECK (secp256k1_memcmp_var (& secnonce -> data [0 ], secp256k1_musig_secnonce_magic , 4 ) == 0 );
34
35
secp256k1_scalar_set_b32 (& k [0 ], & secnonce -> data [4 ], NULL );
35
36
secp256k1_scalar_set_b32 (& k [1 ], & secnonce -> data [36 ], NULL );
37
+ secp256k1_point_load (pk , & secnonce -> data [68 ]);
36
38
/* We make very sure that the nonce isn't invalidated by checking the values
37
39
* in addition to the magic. */
38
40
is_zero = secp256k1_scalar_is_zero (& k [0 ]) & secp256k1_scalar_is_zero (& k [1 ]);
@@ -44,10 +46,12 @@ static int secp256k1_musig_secnonce_load(const secp256k1_context* ctx, secp256k1
44
46
/* If flag is true, invalidate the secnonce; otherwise leave it. Constant-time. */
45
47
static void secp256k1_musig_secnonce_invalidate (const secp256k1_context * ctx , secp256k1_musig_secnonce * secnonce , int flag ) {
46
48
secp256k1_memczero (secnonce -> data , sizeof (secnonce -> data ), flag );
47
- /* The flag argument is usually classified. So, above code makes the magic
48
- * classified. However, we need the magic to be declassified to be able to
49
- * compare it during secnonce_load. */
49
+ /* The flag argument is usually classified. So, the line above makes the
50
+ * magic and public key classified. However, we need both to be
51
+ * declassified. Note that we don't declassify the entire object, because if
52
+ * flag is 0, then k[0] and k[1] have not been zeroed. */
50
53
secp256k1_declassify (ctx , secnonce -> data , sizeof (secp256k1_musig_secnonce_magic ));
54
+ secp256k1_declassify (ctx , & secnonce -> data [68 ], 64 );
51
55
}
52
56
53
57
static const unsigned char secp256k1_musig_pubnonce_magic [4 ] = { 0xf5 , 0x7a , 0x3d , 0xa0 };
@@ -355,6 +359,8 @@ int secp256k1_musig_nonce_gen(const secp256k1_context* ctx, secp256k1_musig_secn
355
359
size_t pk_ser_len = sizeof (pk_ser );
356
360
unsigned char aggpk_ser [32 ];
357
361
unsigned char * aggpk_ser_ptr = NULL ;
362
+ secp256k1_ge pk ;
363
+ int pk_serialize_success ;
358
364
int ret = 1 ;
359
365
360
366
VERIFY_CHECK (ctx != NULL );
@@ -393,16 +399,19 @@ int secp256k1_musig_nonce_gen(const secp256k1_context* ctx, secp256k1_musig_secn
393
399
VERIFY_CHECK (ret_tmp );
394
400
aggpk_ser_ptr = aggpk_ser ;
395
401
}
396
- if (!secp256k1_ec_pubkey_serialize (ctx , pk_ser , & pk_ser_len , pubkey , SECP256K1_EC_COMPRESSED )) {
402
+ if (!secp256k1_pubkey_load (ctx , & pk , pubkey )) {
397
403
return 0 ;
398
404
}
405
+ pk_serialize_success = secp256k1_eckey_pubkey_serialize (& pk , pk_ser , & pk_ser_len , SECP256K1_EC_COMPRESSED );
406
+ /* A pubkey cannot be the point at infinity */
407
+ VERIFY_CHECK (pk_serialize_success );
399
408
VERIFY_CHECK (pk_ser_len == sizeof (pk_ser ));
400
409
401
410
secp256k1_nonce_function_musig (k , session_id32 , msg32 , seckey , pk_ser , aggpk_ser_ptr , extra_input32 );
402
411
VERIFY_CHECK (!secp256k1_scalar_is_zero (& k [0 ]));
403
412
VERIFY_CHECK (!secp256k1_scalar_is_zero (& k [1 ]));
404
413
VERIFY_CHECK (!secp256k1_scalar_eq (& k [0 ], & k [1 ]));
405
- secp256k1_musig_secnonce_save (secnonce , k );
414
+ secp256k1_musig_secnonce_save (secnonce , k , & pk );
406
415
secp256k1_musig_secnonce_invalidate (ctx , secnonce , !ret );
407
416
408
417
for (i = 0 ; i < 2 ; i ++ ) {
@@ -562,7 +571,7 @@ static void secp256k1_musig_partial_sign_clear(secp256k1_scalar *sk, secp256k1_s
562
571
563
572
int secp256k1_musig_partial_sign (const secp256k1_context * ctx , secp256k1_musig_partial_sig * partial_sig , secp256k1_musig_secnonce * secnonce , const secp256k1_keypair * keypair , const secp256k1_musig_keyagg_cache * keyagg_cache , const secp256k1_musig_session * session ) {
564
573
secp256k1_scalar sk ;
565
- secp256k1_ge pk ;
574
+ secp256k1_ge pk , keypair_pk ;
566
575
secp256k1_scalar k [2 ];
567
576
secp256k1_scalar mu , s ;
568
577
secp256k1_keyagg_cache_internal cache_i ;
@@ -573,7 +582,7 @@ int secp256k1_musig_partial_sign(const secp256k1_context* ctx, secp256k1_musig_p
573
582
574
583
ARG_CHECK (secnonce != NULL );
575
584
/* Fails if the magic doesn't match */
576
- ret = secp256k1_musig_secnonce_load (ctx , k , secnonce );
585
+ ret = secp256k1_musig_secnonce_load (ctx , k , & pk , secnonce );
577
586
/* Set nonce to zero to avoid nonce reuse. This will cause subsequent calls
578
587
* of this function to fail */
579
588
memset (secnonce , 0 , sizeof (* secnonce ));
@@ -587,10 +596,12 @@ int secp256k1_musig_partial_sign(const secp256k1_context* ctx, secp256k1_musig_p
587
596
ARG_CHECK (keyagg_cache != NULL );
588
597
ARG_CHECK (session != NULL );
589
598
590
- if (!secp256k1_keypair_load (ctx , & sk , & pk , keypair )) {
599
+ if (!secp256k1_keypair_load (ctx , & sk , & keypair_pk , keypair )) {
591
600
secp256k1_musig_partial_sign_clear (& sk , k );
592
601
return 0 ;
593
602
}
603
+ ARG_CHECK (secp256k1_fe_equal_var (& pk .x , & keypair_pk .x )
604
+ && secp256k1_fe_equal_var (& pk .y , & keypair_pk .y ));
594
605
if (!secp256k1_keyagg_cache_load (ctx , & cache_i , keyagg_cache )) {
595
606
secp256k1_musig_partial_sign_clear (& sk , k );
596
607
return 0 ;
0 commit comments