@@ -1019,56 +1019,114 @@ void musig_sort_test(void) {
10191019 }
10201020}
10211021
1022- void musig_test_vectors (void ) {
1022+ void musig_test_vectors_helper (unsigned char pk_ser [][32 ], int n_pks , const unsigned char * combined_pk_expected , int sort , int has_second_pk , int second_pk_idx ) {
1023+ secp256k1_xonly_pubkey * pk = malloc (n_pks * sizeof (secp256k1_xonly_pubkey ));
10231024 secp256k1_xonly_pubkey combined_pk ;
10241025 unsigned char combined_pk_ser [32 ];
1025- secp256k1_xonly_pubkey pk [2 ];
1026- const unsigned char pk_ser1 [32 ] = {
1027- 0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 ,
1028- 0x49 , 0x34 , 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 ,
1029- 0xB5 , 0x31 , 0xC8 , 0x45 , 0x83 , 0x6F , 0x99 , 0xB0 ,
1030- 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9
1031- };
1032- const unsigned char pk_ser2 [32 ] = {
1033- 0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F ,
1034- 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE ,
1035- 0x58 , 0xFE , 0xAE , 0x1D , 0xA2 , 0xDE , 0xCE , 0xD8 ,
1036- 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59
1037- };
1038- const unsigned char combined_pk_expected [32 ] = {
1039- 0x4B , 0xFC , 0x12 , 0x07 , 0x07 , 0x7D , 0x48 , 0xEC ,
1040- 0x99 , 0x98 , 0xD4 , 0xD4 , 0xFA , 0x62 , 0xD9 , 0x9A ,
1041- 0x2F , 0x59 , 0x1A , 0x4A , 0xC6 , 0x19 , 0xEC , 0xFD ,
1042- 0xA6 , 0x82 , 0x5D , 0xCC , 0xDF , 0xA0 , 0x79 , 0xF9 ,
1043- };
1044- const unsigned char combined_pk_expected2 [32 ] = {
1045- 0x08 , 0xD9 , 0xB8 , 0x2A , 0x26 , 0x7B , 0x8B , 0x8D ,
1046- 0x85 , 0xC6 , 0x18 , 0xAF , 0x56 , 0xB2 , 0xFB , 0x9A ,
1047- 0x68 , 0x7D , 0x1A , 0xC6 , 0xA9 , 0x22 , 0xF4 , 0x87 ,
1048- 0xC2 , 0xD8 , 0x48 , 0x94 , 0x5C , 0xC0 , 0x19 , 0xD0 ,
1049- };
1050-
1051- CHECK (secp256k1_xonly_pubkey_parse (ctx , & pk [0 ], pk_ser1 ));
1052- CHECK (secp256k1_xonly_pubkey_parse (ctx , & pk [1 ], pk_ser2 ));
1053- CHECK (secp256k1_musig_pubkey_combine (ctx , NULL , & combined_pk , NULL , pk , 2 ) == 1 );
1026+ secp256k1_musig_pre_session pre_session ;
1027+ secp256k1_fe second_pk_x ;
1028+ int i ;
1029+
1030+ for (i = 0 ; i < n_pks ; i ++ ) {
1031+ CHECK (secp256k1_xonly_pubkey_parse (ctx , & pk [i ], pk_ser [i ]));
1032+ }
1033+
1034+ if (sort ) {
1035+ CHECK (secp256k1_musig_sort_pubkeys (ctx , pk , n_pks ));
1036+ }
1037+ CHECK (secp256k1_musig_pubkey_combine (ctx , NULL , & combined_pk , & pre_session , pk , n_pks ) == 1 );
1038+ CHECK (secp256k1_fe_set_b32 (& second_pk_x , pre_session .second_pk ));
1039+ CHECK (secp256k1_fe_is_zero (& second_pk_x ) == !has_second_pk );
1040+ if (!secp256k1_fe_is_zero (& second_pk_x )) {
1041+ CHECK (memcmp (& pk_ser [second_pk_idx ], & pre_session .second_pk , sizeof (pk_ser [second_pk_idx ])) == 0 );
1042+ }
10541043 CHECK (secp256k1_xonly_pubkey_serialize (ctx , combined_pk_ser , & combined_pk ));
10551044 /* TODO: remove */
1056- /* int i, j ; */
1045+ /* int k, l ; */
10571046 /* printf("const unsigned char combined_pk_expected[32] = {\n"); */
1058- /* for (i = 0; i < 4; i ++) { */
1047+ /* for (k = 0; k < 4; k ++) { */
10591048 /* printf(" "); */
1060- /* for (j = 0; j < 8; j ++) { */
1061- /* printf("0x%02X, ", combined_pk_ser[i *8+j ]); */
1049+ /* for (l = 0; l < 8; l ++) { */
1050+ /* printf("0x%02X, ", combined_pk_ser[k *8+l ]); */
10621051 /* } */
10631052 /* printf("\n"); */
10641053 /* } */
10651054 /* printf("};\n"); */
10661055 CHECK (memcmp (combined_pk_ser , combined_pk_expected , sizeof (combined_pk_ser )) == 0 );
1056+ free (pk );
1057+ }
10671058
1068- CHECK (secp256k1_musig_sort_pubkeys (ctx , pk , 2 ));
1069- CHECK (secp256k1_musig_pubkey_combine (ctx , NULL , & combined_pk , NULL , pk , 2 ) == 1 );
1070- CHECK (secp256k1_xonly_pubkey_serialize (ctx , combined_pk_ser , & combined_pk ));
1071- CHECK (memcmp (combined_pk_ser , combined_pk_expected2 , sizeof (combined_pk_ser )) == 0 );
1059+ void musig_test_vectors (void ) {
1060+ unsigned char pk_ser [2 ][32 ] = {{
1061+ 0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 ,
1062+ 0x49 , 0x34 , 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 ,
1063+ 0xB5 , 0x31 , 0xC8 , 0x45 , 0x83 , 0x6F , 0x99 , 0xB0 ,
1064+ 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9
1065+ }, {
1066+ 0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F ,
1067+ 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE ,
1068+ 0x58 , 0xFE , 0xAE , 0x1D , 0xA2 , 0xDE , 0xCE , 0xD8 ,
1069+ 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59
1070+ }};
1071+ int has_second_pk ;
1072+ int sort ;
1073+ int second_pk_idx ;
1074+ {
1075+ const unsigned char combined_pk_expected [32 ] = {
1076+ 0xF3 , 0xEC , 0x05 , 0x08 , 0x4D , 0xC9 , 0x1F , 0xB1 ,
1077+ 0x21 , 0x5E , 0xA7 , 0x99 , 0x86 , 0xC7 , 0x0A , 0x7E ,
1078+ 0x15 , 0x37 , 0x2E , 0xD4 , 0x75 , 0x5F , 0x95 , 0xB4 ,
1079+ 0xA6 , 0x4F , 0x29 , 0x1B , 0x0A , 0xD3 , 0x35 , 0x40
1080+ };
1081+ sort = 0 ;
1082+ has_second_pk = 1 ;
1083+ second_pk_idx = 1 ;
1084+ musig_test_vectors_helper (pk_ser , 2 , combined_pk_expected , sort , has_second_pk , second_pk_idx );
1085+ }
1086+ {
1087+ const unsigned char combined_pk_expected [32 ] = {
1088+ 0x63 , 0x4D , 0x37 , 0xCA , 0xCE , 0x85 , 0xC6 , 0x1D ,
1089+ 0x3E , 0x51 , 0x92 , 0x3B , 0x92 , 0x44 , 0xB1 , 0xA2 ,
1090+ 0x6A , 0x05 , 0xB1 , 0x52 , 0x2E , 0xC8 , 0x99 , 0x21 ,
1091+ 0x87 , 0xA6 , 0x56 , 0xA3 , 0x32 , 0xA4 , 0xC1 , 0xA6 ,
1092+ };
1093+ sort = 1 ;
1094+ has_second_pk = 1 ;
1095+ second_pk_idx = 0 ;
1096+ musig_test_vectors_helper (pk_ser , 2 , combined_pk_expected , sort , has_second_pk , second_pk_idx );
1097+ }
1098+ {
1099+ unsigned char pk_ser_tmp [3 ][32 ];
1100+ int i ;
1101+
1102+ for (i = 0 ; i < 3 ; i ++ ) {
1103+ memcpy (pk_ser_tmp [i ], pk_ser [0 ], sizeof (pk_ser_tmp [i ]));
1104+ }
1105+ {
1106+ const unsigned char combined_pk_expected [32 ] = {
1107+ 0xA0 , 0xFD , 0x5D , 0x2F , 0xCC , 0x4F , 0x90 , 0xDF ,
1108+ 0x42 , 0xD4 , 0x26 , 0x38 , 0x31 , 0x73 , 0x0B , 0x21 ,
1109+ 0xC4 , 0xAB , 0x0E , 0xFA , 0xD2 , 0x09 , 0x10 , 0xD0 ,
1110+ 0x07 , 0xED , 0xCB , 0x69 , 0x1D , 0xD5 , 0xD1 , 0x82 ,
1111+ };
1112+ sort = 0 ;
1113+ has_second_pk = 0 ;
1114+ musig_test_vectors_helper (pk_ser_tmp , 3 , combined_pk_expected , sort , has_second_pk , second_pk_idx );
1115+ }
1116+ {
1117+ const unsigned char combined_pk_expected [32 ] = {
1118+ 0x74 , 0x21 , 0xD4 , 0xBA , 0xCC , 0x4B , 0x10 , 0x12 ,
1119+ 0x5C , 0x77 , 0x48 , 0xB9 , 0x47 , 0xC8 , 0xCB , 0x14 ,
1120+ 0xF0 , 0xFB , 0x14 , 0xDA , 0xBE , 0x56 , 0x8F , 0xDE ,
1121+ 0x6E , 0xB7 , 0xAC , 0x55 , 0x35 , 0xCD , 0x84 , 0x51 ,
1122+ };
1123+ sort = 0 ;
1124+ has_second_pk = 1 ;
1125+ second_pk_idx = 2 ;
1126+ memcpy (pk_ser_tmp [2 ], pk_ser [1 ], sizeof (pk_ser_tmp [2 ]));
1127+ musig_test_vectors_helper (pk_ser_tmp , 3 , combined_pk_expected , sort , has_second_pk , second_pk_idx );
1128+ }
1129+ }
10721130}
10731131
10741132void run_musig_tests (void ) {
0 commit comments