@@ -111,7 +111,7 @@ static void test_schnorr_adaptor_api(void) {
111
111
secp256k1_xonly_pubkey pk ;
112
112
secp256k1_xonly_pubkey zero_pk ;
113
113
unsigned char pre_sig [65 ];
114
- unsigned char invalid_pre_sig [65 ] = {{ 0 } };
114
+ unsigned char invalid_pre_sig [65 ] = { 0 };
115
115
unsigned char sig [64 ];
116
116
unsigned char sec_adaptor [32 ];
117
117
secp256k1_pubkey adaptor ;
@@ -130,7 +130,7 @@ static void test_schnorr_adaptor_api(void) {
130
130
CHECK (secp256k1_ec_pubkey_create (CTX , & adaptor , sec_adaptor ) == 1 );
131
131
132
132
/* main test body */
133
- CHECK (CTX , secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , NULL ) == 1 );
133
+ CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , NULL ) == 1 );
134
134
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_presign (CTX , NULL , msg , & keypair , & adaptor , NULL ));
135
135
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_presign (CTX , pre_sig , NULL , & keypair , & adaptor , NULL ));
136
136
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , NULL , & adaptor , NULL ));
@@ -159,6 +159,7 @@ static void test_schnorr_adaptor_api(void) {
159
159
CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor , pre_sig , sig ) == 1 );
160
160
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_extract_sec (CTX , NULL , pre_sig , sig ));
161
161
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor , NULL , sig ));
162
+ /* invokes the ARG_CHECK on pre_sig[0] */
162
163
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor , invalid_pre_sig , sig ));
163
164
CHECK_ILLEGAL (CTX , secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor , pre_sig , NULL ));
164
165
}
@@ -1001,150 +1002,163 @@ static void test_schnorr_adaptor_spec_vectors(void) {
1001
1002
};
1002
1003
}
1003
1004
1004
- static void test_schnorr_adaptor_presign (void ) {
1005
+ static void test_schnorr_adaptor_edge_cases (void ) {
1005
1006
unsigned char sk [32 ];
1006
1007
secp256k1_xonly_pubkey pk ;
1007
1008
secp256k1_keypair keypair ;
1008
- secp256k1_scalar adaptor_scalar ;
1009
- secp256k1_gej tj ;
1010
- secp256k1_ge tg ;
1011
- const unsigned char msg [32 ] = "this is for the schnorr adaptor." ;
1012
- unsigned char sig [65 ];
1013
- unsigned char sig2 [65 ];
1014
- unsigned char secadaptor [32 ];
1015
- unsigned char aux_rand [32 ];
1016
- unsigned char adaptor33 [33 ];
1017
- secp256k1_pubkey t ;
1009
+ const unsigned char msg [32 ] = "this is a schnorr adaptor msg..." ;
1010
+ unsigned char sec_adaptor [32 ];
1011
+ unsigned char extracted_sec_adaptor [32 ];
1018
1012
secp256k1_pubkey adaptor ;
1019
- size_t size = 33 ;
1013
+ secp256k1_pubkey extracted_adaptor ;
1014
+ unsigned char aux_rand [32 ];
1015
+ unsigned char pre_sig [65 ];
1016
+ unsigned char sig [64 ];
1020
1017
1021
1018
secp256k1_testrand256 (sk );
1022
- secp256k1_testrand256 (secadaptor );
1019
+ secp256k1_testrand256 (sec_adaptor );
1023
1020
secp256k1_testrand256 (aux_rand );
1024
- secp256k1_scalar_set_b32 (& adaptor_scalar , secadaptor , NULL );
1025
- secp256k1_ecmult_gen (& CTX -> ecmult_gen_ctx , & tj , & adaptor_scalar );
1026
- secp256k1_ge_set_gej (& tg , & tj );
1027
- CHECK (secp256k1_eckey_pubkey_serialize (& tg , adaptor33 , & size , 1 ) == 1 );
1028
- CHECK (secp256k1_keypair_create (CTX , & keypair , sk ) == 1 );
1029
- CHECK (secp256k1_keypair_xonly_pub (CTX , & pk , NULL , & keypair ) == 1 );
1030
- CHECK (secp256k1_ec_pubkey_parse (CTX , & adaptor , adaptor33 , 33 ) == 1 );
1031
- CHECK (secp256k1_schnorr_adaptor_presign (CTX , sig , msg , & keypair , & adaptor , NULL ) == 1 );
1032
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig , msg , & pk ));
1033
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor ) == 0 );
1034
- /* Test with aux_rand */
1035
- CHECK (secp256k1_schnorr_adaptor_presign (CTX , sig2 , msg , & keypair , & adaptor , aux_rand ) == 1 );
1036
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig , msg , & pk ));
1037
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor ) == 0 );
1038
- }
1021
+ CHECK (secp256k1_keypair_create (CTX , & keypair , sk ));
1022
+ CHECK (secp256k1_keypair_xonly_pub (CTX , & pk , NULL , & keypair ));
1023
+ CHECK (secp256k1_ec_pubkey_create (CTX , & adaptor , sec_adaptor ));
1039
1024
1040
- #define N_SIGS 3
1041
- /* Creates N_SIGS valid signatures and verifies them with extract
1042
- * Then flips some bits and checks that extract now fails to get the right
1043
- * adaptor point. */
1044
- static void test_schnorr_adaptor_extract (void ) {
1045
- unsigned char sk [32 ];
1046
- secp256k1_xonly_pubkey pk ;
1047
- secp256k1_keypair keypair ;
1048
- secp256k1_scalar adaptor_scalar ;
1049
- secp256k1_gej tj ;
1050
- secp256k1_ge tg ;
1051
- secp256k1_scalar s ;
1052
- unsigned char msg [N_SIGS ][32 ];
1053
- unsigned char sig [N_SIGS ][65 ];
1054
- unsigned char secadaptor [N_SIGS ][32 ];
1055
- unsigned char adaptor33 [N_SIGS ][33 ];
1056
- secp256k1_pubkey t ;
1057
- secp256k1_pubkey adaptor [N_SIGS ];
1058
- size_t size = 33 ;
1059
- size_t i ;
1025
+ /* Test schnorr_adaptor_presign */
1026
+ CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1060
1027
1061
- secp256k1_testrand256 (sk );
1062
- CHECK (secp256k1_keypair_create (CTX , & keypair , sk ) == 1 );
1063
- CHECK (secp256k1_keypair_xonly_pub (CTX , & pk , NULL , & keypair ) == 1 );
1028
+ /* TODO: test with different nonce functions after `schnorr_adaptor_presign_custom`
1029
+ * implementation */
1064
1030
1065
- for ( i = 0 ; i < N_SIGS ; i ++ ) {
1066
- secp256k1_testrand256 ( msg [ i ] );
1067
- secp256k1_testrand256 ( secadaptor [ i ] );
1068
- secp256k1_scalar_set_b32 ( & adaptor_scalar , secadaptor [ i ], NULL );
1069
- secp256k1_ecmult_gen ( & CTX -> ecmult_gen_ctx , & tj , & adaptor_scalar );
1070
- secp256k1_ge_set_gej ( & tg , & tj );
1071
- CHECK ( secp256k1_eckey_pubkey_serialize ( & tg , adaptor33 [ i ], & size , 1 ) == 1 ) ;
1072
- CHECK ( secp256k1_ec_pubkey_parse ( CTX , & adaptor [ i ], adaptor33 [ i ], 33 ) == 1 ) ;
1073
- CHECK ( secp256k1_schnorr_adaptor_presign ( CTX , sig [ i ], msg [ i ], & keypair , & adaptor [ i ], NULL ) == 1 );
1074
- CHECK ( secp256k1_schnorr_adaptor_extract ( CTX , & t , sig [ i ], msg [ i ], & pk ) );
1075
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [ i ] ) == 0 );
1031
+ /* Test schnorr_adaptor_extract */
1032
+ CHECK ( secp256k1_schnorr_adaptor_presign ( CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1033
+ CHECK ( secp256k1_schnorr_adaptor_extract ( CTX , & extracted_adaptor , pre_sig , msg , & pk ) == 1 );
1034
+ CHECK ( secp256k1_ec_pubkey_cmp ( CTX , & extracted_adaptor , & adaptor ) == 0 );
1035
+ {
1036
+ /* invalid R' (= pre_sig[0:33]) */
1037
+ unsigned char pre_sig_tmp [ 65 ] ;
1038
+ secp256k1_pubkey extracted_adaptor_tmp ;
1039
+ memcpy ( pre_sig_tmp , pre_sig , sizeof ( pre_sig_tmp ) );
1040
+ memset ( pre_sig_tmp , 0xFF , 33 );
1041
+ CHECK (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig_tmp , msg , & pk ) == 0 );
1076
1042
}
1077
-
1078
1043
{
1079
- /* Flip some bits in the signature and check that extract fails to
1080
- * extract the correct adaptor point */
1081
- size_t sig_idx = secp256k1_testrand_int (N_SIGS );
1082
- size_t byte_idx = secp256k1_testrand_bits (5 );
1083
- unsigned char xorbyte = secp256k1_testrand_int (254 )+ 1 ;
1084
- sig [sig_idx ][33 + byte_idx ] ^= xorbyte ;
1085
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig [sig_idx ], msg [sig_idx ], & pk ));
1086
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [sig_idx ]) != 0 );
1087
- sig [sig_idx ][33 + byte_idx ] ^= xorbyte ;
1088
-
1089
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig [sig_idx ], msg [sig_idx ], & pk ));
1090
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [sig_idx ]) == 0 );
1044
+ /* overflowing s */
1045
+ unsigned char pre_sig_tmp [65 ];
1046
+ secp256k1_pubkey extracted_adaptor_tmp ;
1047
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1048
+ memset (& pre_sig_tmp [33 ], 0xFF , 32 );
1049
+ CHECK (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig_tmp , msg , & pk ) == 0 );
1091
1050
}
1051
+ {
1052
+ /* negated s */
1053
+ unsigned char pre_sig_tmp [65 ];
1054
+ secp256k1_scalar s ;
1055
+ secp256k1_pubkey extracted_adaptor_tmp ;
1056
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1057
+ secp256k1_scalar_set_b32 (& s , & pre_sig_tmp [33 ], NULL );
1058
+ secp256k1_scalar_negate (& s , & s );
1059
+ secp256k1_scalar_get_b32 (& pre_sig_tmp [33 ], & s );
1060
+ CHECK (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig_tmp , msg , & pk ) == 1 );
1061
+ CHECK (secp256k1_ec_pubkey_cmp (CTX , & extracted_adaptor_tmp , & adaptor ) != 0 );
1062
+ }
1063
+ {
1064
+ /* any flipped bit in the pre-signature will extract
1065
+ * an invalid adaptor point */
1066
+ unsigned char pre_sig_tmp [65 ];
1067
+ secp256k1_pubkey extracted_adaptor_tmp ;
1068
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1069
+ rand_flip_bit (& pre_sig_tmp [1 ], sizeof (pre_sig_tmp ) - 1 );
1070
+ /* depending on which bit was flipped adaptor_extract can either
1071
+ * return 0 (parsing pre-signature failed) or 1 (parsing
1072
+ * pre-signature success) */
1073
+ if (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig_tmp , msg , & pk )) {
1074
+ CHECK (secp256k1_ec_pubkey_cmp (CTX , & extracted_adaptor_tmp , & adaptor ) != 0 );
1075
+ }
1076
+ }
1077
+ {
1078
+ /* any flipped bit in the message will extract an invalid
1079
+ * adaptor point */
1080
+ unsigned char msg_tmp [32 ];
1081
+ secp256k1_pubkey extracted_adaptor_tmp ;
1082
+ memcpy (msg_tmp , msg , sizeof (msg_tmp ));
1083
+ rand_flip_bit (msg_tmp , sizeof (msg_tmp ));
1084
+ CHECK (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig , msg_tmp , & pk ) == 1 );
1085
+ CHECK (secp256k1_ec_pubkey_cmp (CTX , & extracted_adaptor_tmp , & adaptor ) != 0 );
1086
+ }
1087
+ /* Note: presig test vectors 12, 13, 14 will cover the edge case
1088
+ * of adaptor_extract returning 0 when [1] R = infinity, or
1089
+ * [2] T = infinity. So, we don't need to test such scenarios here */
1092
1090
1093
- /* Test overflowing s */
1094
- CHECK (secp256k1_schnorr_adaptor_presign (CTX , sig [0 ], msg [0 ], & keypair , & adaptor [0 ], NULL ) == 1 );
1095
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig [0 ], msg [0 ], & pk ));
1096
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [0 ]) == 0 );
1097
- memset (& sig [0 ][33 ], 0xFF , 32 );
1098
- CHECK (!secp256k1_schnorr_adaptor_extract (CTX , & t , sig [0 ], msg [0 ], & pk ));
1099
-
1100
- /* Test negative s */
1101
- CHECK (secp256k1_schnorr_adaptor_presign (CTX , sig [0 ], msg [0 ], & keypair , & adaptor [0 ], NULL ) == 1 );
1102
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig [0 ], msg [0 ], & pk ));
1103
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [0 ]) == 0 );
1104
- secp256k1_scalar_set_b32 (& s , & sig [0 ][33 ], NULL );
1105
- secp256k1_scalar_negate (& s , & s );
1106
- secp256k1_scalar_get_b32 (& sig [0 ][33 ], & s );
1107
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig [0 ], msg [0 ], & pk ));
1108
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor [0 ]) != 0 );
1109
- }
1110
- #undef N_SIGS
1111
-
1112
- static void test_schnorr_adaptor_adapt_extract_sec (void ) {
1113
- unsigned char sk [32 ];
1114
- secp256k1_xonly_pubkey pk ;
1115
- secp256k1_keypair keypair ;
1116
- secp256k1_scalar adaptor_scalar ;
1117
- secp256k1_gej tj ;
1118
- secp256k1_ge tg ;
1119
- unsigned char msg [32 ];
1120
- unsigned char sig [65 ];
1121
- unsigned char sig64 [64 ];
1122
- unsigned char secadaptor [32 ];
1123
- unsigned char aux_rand [32 ];
1124
- unsigned char adaptor33 [33 ];
1125
- secp256k1_pubkey t ;
1126
- unsigned char t2 [32 ];
1127
- secp256k1_pubkey adaptor ;
1128
- size_t size = 33 ;
1091
+ /* Test schnorr_adaptor_adapt */
1092
+ CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1093
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig , pre_sig , sec_adaptor ) == 1 );
1094
+ CHECK (secp256k1_schnorrsig_verify (CTX , sig , msg , sizeof (msg ), & pk ) == 1 );
1095
+ {
1096
+ /* overflowing sec_adaptor */
1097
+ unsigned char sig_tmp [64 ];
1098
+ unsigned char sec_adaptor_tmp [32 ];
1099
+ memset (sec_adaptor_tmp , 0xFF , 32 );
1100
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig , sec_adaptor_tmp ) == 0 );
1101
+ }
1102
+ {
1103
+ /* overflowing s */
1104
+ unsigned char sig_tmp [64 ];
1105
+ unsigned char pre_sig_tmp [65 ];
1106
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1107
+ memset (& pre_sig_tmp [33 ], 0xFF , 32 );
1108
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig_tmp , sec_adaptor ) == 0 );
1109
+ }
1110
+ {
1111
+ /* negated s */
1112
+ unsigned char sig_tmp [64 ];
1113
+ unsigned char pre_sig_tmp [65 ];
1114
+ secp256k1_scalar s ;
1115
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1116
+ secp256k1_scalar_set_b32 (& s , & pre_sig_tmp [33 ], NULL );
1117
+ secp256k1_scalar_negate (& s , & s );
1118
+ secp256k1_scalar_get_b32 (& pre_sig_tmp [33 ], & s );
1119
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig_tmp , sec_adaptor ) == 1 );
1120
+ CHECK (secp256k1_schnorrsig_verify (CTX , sig_tmp , msg , sizeof (msg ), & pk ) == 0 );
1121
+ }
1122
+ {
1123
+ /* any flipped bit in the pre-signature will result in
1124
+ * an invalid signature */
1125
+ unsigned char sig_tmp [64 ];
1126
+ unsigned char pre_sig_tmp [65 ];
1127
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1128
+ rand_flip_bit (& pre_sig_tmp [1 ], sizeof (pre_sig_tmp ) - 1 );
1129
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig_tmp , sec_adaptor ) == 1 );
1130
+ CHECK (secp256k1_schnorrsig_verify (CTX , sig_tmp , msg , sizeof (msg ), & pk ) == 0 );
1131
+ }
1132
+ {
1133
+ /* any flipped bit in the sec_adaptor will result in an
1134
+ * invalid signature */
1135
+ unsigned char sig_tmp [64 ];
1136
+ unsigned char sec_adaptor_tmp [32 ];
1137
+ memcpy (sec_adaptor_tmp , sec_adaptor , sizeof (sec_adaptor_tmp ));
1138
+ rand_flip_bit (sec_adaptor_tmp , sizeof (sec_adaptor_tmp ));
1139
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig , sec_adaptor_tmp ) == 1 );
1140
+ CHECK (secp256k1_schnorrsig_verify (CTX , sig_tmp , msg , sizeof (msg ), & pk ) == 0 );
1141
+ }
1129
1142
1130
- secp256k1_testrand256 (sk );
1131
- secp256k1_testrand256 (msg );
1132
- secp256k1_testrand256 (secadaptor );
1133
- secp256k1_testrand256 (aux_rand );
1134
- secp256k1_scalar_set_b32 (& adaptor_scalar , secadaptor , NULL );
1135
- secp256k1_ecmult_gen (& CTX -> ecmult_gen_ctx , & tj , & adaptor_scalar );
1136
- secp256k1_ge_set_gej (& tg , & tj );
1137
- CHECK (secp256k1_eckey_pubkey_serialize (& tg , adaptor33 , & size , 1 ) == 1 );
1138
- CHECK (secp256k1_keypair_create (CTX , & keypair , sk ) == 1 );
1139
- CHECK (secp256k1_keypair_xonly_pub (CTX , & pk , NULL , & keypair ) == 1 );
1140
- CHECK (secp256k1_ec_pubkey_parse (CTX , & adaptor , adaptor33 , 33 ) == 1 );
1141
- CHECK (secp256k1_schnorr_adaptor_presign (CTX , sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1142
- CHECK (secp256k1_schnorr_adaptor_extract (CTX , & t , sig , msg , & pk ));
1143
- CHECK (secp256k1_ec_pubkey_cmp (CTX , & t , & adaptor ) == 0 );
1144
- CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig64 , sig , secadaptor ) == 1 );
1145
- CHECK (secp256k1_schnorrsig_verify (CTX , sig64 , msg , sizeof (msg ), & pk ) == 1 );
1146
- CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , t2 , sig , sig64 ) == 1 );
1147
- CHECK (secp256k1_memcmp_var (t2 , secadaptor , 32 ) == 0 );
1143
+ /* Test schnorr_adaptor_extract_sec */
1144
+ CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1145
+ CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig , pre_sig , sec_adaptor ) == 1 );
1146
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor , pre_sig , sig ) == 1 );
1147
+ CHECK (secp256k1_memcmp_var (extracted_sec_adaptor , sec_adaptor , sizeof (extracted_sec_adaptor )) == 0 );
1148
+ {
1149
+ /* overflowing pre_sig[33:65] */
1150
+ }
1151
+ {
1152
+ /* overflowing sig[32:64] */
1153
+ }
1154
+ {
1155
+ /* any flipped bit in the pre-signature will extract
1156
+ * an invalid secret adaptor */
1157
+ }
1158
+ {
1159
+ /* any flipped bit in the signature will extract
1160
+ * an invalid secret adaptor */
1161
+ }
1148
1162
}
1149
1163
1150
1164
static void run_schnorr_adaptor_tests (void ) {
@@ -1154,9 +1168,7 @@ static void run_schnorr_adaptor_tests(void) {
1154
1168
test_schnorr_adaptor_api ();
1155
1169
test_schnorr_adaptor_spec_vectors ();
1156
1170
for (i = 0 ; i < COUNT ; i ++ ) {
1157
- test_schnorr_adaptor_presign ();
1158
- test_schnorr_adaptor_extract ();
1159
- test_schnorr_adaptor_adapt_extract_sec ();
1171
+ test_schnorr_adaptor_edge_cases ();
1160
1172
}
1161
1173
}
1162
1174
0 commit comments