|
17 | 17 |
|
18 | 18 | #include <algorithm> |
19 | 19 | #include <cassert> |
| 20 | +#include <cstdio> // Add this include for printf |
20 | 21 |
|
21 | 22 | using namespace util::hex_literals; |
22 | 23 |
|
@@ -230,9 +231,128 @@ bool XOnlyPubKey::IsFullyValid() const |
230 | 231 | bool XOnlyPubKey::VerifySchnorr(const uint256& msg, std::span<const unsigned char> sigbytes) const |
231 | 232 | { |
232 | 233 | assert(sigbytes.size() == 64); |
| 234 | + |
| 235 | + // Log the input parameters |
| 236 | + printf("XOnlyPubKey::VerifySchnorr - Input parameters:\n"); |
| 237 | + printf(" sigbytes.size(): %zu\n", sigbytes.size()); |
| 238 | + printf(" msg (hex): "); |
| 239 | + for (int i = 0; i < 32; i++) { |
| 240 | + printf("%02x", msg.begin()[i]); |
| 241 | + } |
| 242 | + printf("\n"); |
| 243 | + printf(" sigbytes (hex): "); |
| 244 | + for (size_t i = 0; i < sigbytes.size(); i++) { |
| 245 | + printf("%02x", sigbytes[i]); |
| 246 | + } |
| 247 | + printf("\n"); |
| 248 | + printf(" m_keydata (hex): "); |
| 249 | + for (size_t i = 0; i < m_keydata.size(); i++) { |
| 250 | + printf("%02x", m_keydata.data()[i]); |
| 251 | + } |
| 252 | + printf("\n"); |
| 253 | + |
| 254 | + // Check if the public key is valid |
| 255 | + printf(" IsFullyValid(): %s\n", IsFullyValid() ? "true" : "false"); |
| 256 | + |
233 | 257 | secp256k1_xonly_pubkey pubkey; |
234 | | - if (!secp256k1_xonly_pubkey_parse(secp256k1_context_static, &pubkey, m_keydata.data())) return false; |
235 | | - return secp256k1_schnorrsig_verify(secp256k1_context_static, sigbytes.data(), msg.begin(), 32, &pubkey); |
| 258 | + bool parse_result = secp256k1_xonly_pubkey_parse(secp256k1_context_static, &pubkey, m_keydata.data()); |
| 259 | + printf(" secp256k1_xonly_pubkey_parse result: %s\n", parse_result ? "true" : "false"); |
| 260 | + |
| 261 | + if (!parse_result) { |
| 262 | + printf(" FAILED: Could not parse xonly pubkey\n"); |
| 263 | + return false; |
| 264 | + } |
| 265 | + |
| 266 | + // Log the parsed pubkey data |
| 267 | + unsigned char serialized_pubkey[32]; |
| 268 | + secp256k1_xonly_pubkey_serialize(secp256k1_context_static, serialized_pubkey, &pubkey); |
| 269 | + printf(" parsed pubkey (hex): "); |
| 270 | + for (int i = 0; i < 32; i++) { |
| 271 | + printf("%02x", serialized_pubkey[i]); |
| 272 | + } |
| 273 | + printf("\n"); |
| 274 | + |
| 275 | + // Check if the signature bytes look valid (non-zero) |
| 276 | + bool sig_has_nonzero = false; |
| 277 | + for (size_t i = 0; i < sigbytes.size(); i++) { |
| 278 | + if (sigbytes[i] != 0) { |
| 279 | + sig_has_nonzero = true; |
| 280 | + break; |
| 281 | + } |
| 282 | + } |
| 283 | + printf(" signature has non-zero bytes: %s\n", sig_has_nonzero ? "true" : "false"); |
| 284 | + |
| 285 | + // Check if the message hash looks valid (non-zero) |
| 286 | + bool msg_has_nonzero = false; |
| 287 | + for (int i = 0; i < 32; i++) { |
| 288 | + if (msg.begin()[i] != 0) { |
| 289 | + msg_has_nonzero = true; |
| 290 | + break; |
| 291 | + } |
| 292 | + } |
| 293 | + printf(" message hash has non-zero bytes: %s\n", msg_has_nonzero ? "true" : "false"); |
| 294 | + |
| 295 | + // Log the first few bytes of signature components for debugging |
| 296 | + printf(" signature R (first 16 bytes): "); |
| 297 | + for (int i = 0; i < 16; i++) { |
| 298 | + printf("%02x", sigbytes[i]); |
| 299 | + } |
| 300 | + printf("\n"); |
| 301 | + printf(" signature S (first 16 bytes): "); |
| 302 | + for (int i = 32; i < 48; i++) { |
| 303 | + printf("%02x", sigbytes[i]); |
| 304 | + } |
| 305 | + printf("\n"); |
| 306 | + |
| 307 | + // Log the exact parameters being passed to secp256k1_schnorrsig_verify |
| 308 | + printf(" Calling secp256k1_schnorrsig_verify with:\n"); |
| 309 | + printf(" context: %p\n", (void*)secp256k1_context_static); |
| 310 | + printf(" sig64: %p (first byte: %02x)\n", (void*)sigbytes.data(), sigbytes[0]); |
| 311 | + printf(" msg: %p (first byte: %02x)\n", (void*)msg.begin(), msg.begin()[0]); |
| 312 | + printf(" msglen: 32\n"); |
| 313 | + printf(" pubkey: %p\n", (void*)&pubkey); |
| 314 | + |
| 315 | + bool verify_result = secp256k1_schnorrsig_verify(secp256k1_context_static, sigbytes.data(), msg.begin(), 32, &pubkey); |
| 316 | + printf(" secp256k1_schnorrsig_verify result: %s\n", verify_result ? "true" : "false"); |
| 317 | + |
| 318 | + // Try with a different message to see if it's a message issue |
| 319 | + uint256 zero_msg; |
| 320 | + zero_msg.SetNull(); |
| 321 | + bool zero_verify_result = secp256k1_schnorrsig_verify(secp256k1_context_static, sigbytes.data(), zero_msg.begin(), 32, &pubkey); |
| 322 | + printf(" secp256k1_schnorrsig_verify with zero message: %s\n", zero_verify_result ? "true" : "false"); |
| 323 | + |
| 324 | + // Try with a different signature to see if it's a signature issue |
| 325 | + unsigned char zero_sig[64] = {0}; |
| 326 | + bool zero_sig_verify_result = secp256k1_schnorrsig_verify(secp256k1_context_static, zero_sig, msg.begin(), 32, &pubkey); |
| 327 | + printf(" secp256k1_schnorrsig_verify with zero signature: %s\n", zero_sig_verify_result ? "true" : "false"); |
| 328 | + |
| 329 | + // Try with byte-reversed message to check for endianness issues |
| 330 | + unsigned char reversed_msg[32]; |
| 331 | + for (int i = 0; i < 32; i++) { |
| 332 | + reversed_msg[i] = msg.begin()[31 - i]; |
| 333 | + } |
| 334 | + printf(" reversed msg (hex): "); |
| 335 | + for (int i = 0; i < 32; i++) { |
| 336 | + printf("%02x", reversed_msg[i]); |
| 337 | + } |
| 338 | + printf("\n"); |
| 339 | + bool reversed_verify_result = secp256k1_schnorrsig_verify(secp256k1_context_static, sigbytes.data(), reversed_msg, 32, &pubkey); |
| 340 | + printf(" secp256k1_schnorrsig_verify with reversed message: %s\n", reversed_verify_result ? "true" : "false"); |
| 341 | + |
| 342 | + // Try with byte-reversed signature to check for signature endianness |
| 343 | + unsigned char reversed_sig[64]; |
| 344 | + for (int i = 0; i < 64; i++) { |
| 345 | + reversed_sig[i] = sigbytes[63 - i]; |
| 346 | + } |
| 347 | + printf(" reversed sig (first 16 bytes): "); |
| 348 | + for (int i = 0; i < 16; i++) { |
| 349 | + printf("%02x", reversed_sig[i]); |
| 350 | + } |
| 351 | + printf("\n"); |
| 352 | + bool reversed_sig_verify_result = secp256k1_schnorrsig_verify(secp256k1_context_static, reversed_sig, msg.begin(), 32, &pubkey); |
| 353 | + printf(" secp256k1_schnorrsig_verify with reversed signature: %s\n", reversed_sig_verify_result ? "true" : "false"); |
| 354 | + |
| 355 | + return verify_result; |
236 | 356 | } |
237 | 357 |
|
238 | 358 | static const HashWriter HASHER_TAPTWEAK{TaggedHash("TapTweak")}; |
|
0 commit comments