From e3f741f1d4263ba87ae41149039ce4838fd99089 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Tue, 12 Mar 2013 00:39:29 +0100 Subject: [PATCH] validation bugfixes: validates main bitcoin chain --- ecdsa.h | 17 +++++++++++++---- field.h | 6 +++--- group.h | 4 ++-- num_gmp.h | 8 ++++---- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/ecdsa.h b/ecdsa.h index 8588ad0d69..2fd4dfd5b1 100644 --- a/ecdsa.h +++ b/ecdsa.h @@ -30,11 +30,11 @@ public: bool Parse(const unsigned char *sig, int size) { if (sig[0] != 0x30) return false; - if (sig[1] != size-2) return false; int lenr = sig[3]; - if (4+lenr >= size) return false; + if (5+lenr >= size) return false; int lens = sig[lenr+5]; - if (lenr+lens+6 != size) return false; + if (sig[1] != lenr+lens+4) return false; + if (lenr+lens+6 > size) return false; if (sig[2] != 0x02) return false; if (lenr == 0) return false; if (sig[lenr+4] != 0x02) return false; @@ -80,6 +80,10 @@ public: r = rin; s = sin; } + + std::string ToString() const { + return "(" + r.ToString() + "," + s.ToString() + ")"; + } }; int VerifyECDSA(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { @@ -90,8 +94,13 @@ int VerifyECDSA(const unsigned char *msg, int msglen, const unsigned char *sig, m.SetBytes(msg, msglen); if (!ParsePubKey(q, pubkey, pubkeylen)) return -1; - if (!s.Parse(sig, siglen)) + if (!s.Parse(sig, siglen)) { + fprintf(stderr, "Can't parse signature: "); + for (int i=0; i