validation bugfixes: validates main bitcoin chain

This commit is contained in:
Pieter Wuille 2013-03-12 00:39:29 +01:00
parent a6d68949c1
commit e3f741f1d4
4 changed files with 22 additions and 13 deletions

17
ecdsa.h
View file

@ -30,11 +30,11 @@ public:
bool Parse(const unsigned char *sig, int size) { bool Parse(const unsigned char *sig, int size) {
if (sig[0] != 0x30) return false; if (sig[0] != 0x30) return false;
if (sig[1] != size-2) return false;
int lenr = sig[3]; int lenr = sig[3];
if (4+lenr >= size) return false; if (5+lenr >= size) return false;
int lens = sig[lenr+5]; 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 (sig[2] != 0x02) return false;
if (lenr == 0) return false; if (lenr == 0) return false;
if (sig[lenr+4] != 0x02) return false; if (sig[lenr+4] != 0x02) return false;
@ -80,6 +80,10 @@ public:
r = rin; r = rin;
s = sin; 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) { 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); m.SetBytes(msg, msglen);
if (!ParsePubKey(q, pubkey, pubkeylen)) if (!ParsePubKey(q, pubkey, pubkeylen))
return -1; return -1;
if (!s.Parse(sig, siglen)) if (!s.Parse(sig, siglen)) {
fprintf(stderr, "Can't parse signature: ");
for (int i=0; i<siglen; i++) fprintf(stderr,"%02x", sig[i]);
fprintf(stderr, "\n");
return -2; return -2;
}
// fprintf(stderr, "Verifying ECDSA: msg=%s pubkey=%s sig=%s\n", m.ToString().c_str(), q.ToString().c_str(), s.ToString().c_str());
if (!s.Verify(ctx, q, m)) if (!s.Verify(ctx, q, m))
return 0; return 0;
return 1; return 1;

View file

@ -308,7 +308,7 @@ public:
} }
/** Set this to be the (modular) inverse of another FieldElem. Magnitude=1 */ /** Set this to be the (modular) inverse of another FieldElem. Magnitude=1 */
void SetInverse(Context &ctx, const FieldElem &a); void SetInverse(Context &ctx, FieldElem &a);
std::string ToString() { std::string ToString() {
unsigned char tmp[32]; unsigned char tmp[32];
@ -368,7 +368,7 @@ const FieldConstants &GetFieldConst() {
return field_const; return field_const;
} }
void FieldElem::SetInverse(Context &ctx, const FieldElem &a) { void FieldElem::SetInverse(Context &ctx, FieldElem &a) {
#if 0 #if 0
// calculate a^p, with p={45,63,1019,1023} // calculate a^p, with p={45,63,1019,1023}
FieldElem a2; a2.SetSquare(a); FieldElem a2; a2.SetSquare(a);
@ -402,7 +402,7 @@ void FieldElem::SetInverse(Context &ctx, const FieldElem &a) {
SetMult(x,a45); SetMult(x,a45);
#else #else
unsigned char b[32]; unsigned char b[32];
GetBytes(b); a.GetBytes(b);
{ {
const Number &p = GetFieldConst().field_p; const Number &p = GetFieldConst().field_p;
Context ct(ctx); Context ct(ctx);

View file

@ -39,11 +39,11 @@ public:
y.SetNeg(y, 1); y.SetNeg(y, 1);
} }
void GetX(FieldElem &xout) const { void GetX(Context &ctx, FieldElem &xout) {
xout = x; xout = x;
} }
void GetY(FieldElem &yout) const { void GetY(Context &ctx, FieldElem &yout) {
yout = y; yout = y;
} }

View file

@ -70,7 +70,7 @@ public:
memset(bin,0,len); memset(bin,0,len);
size_t count = 0; size_t count = 0;
mpz_export(bin + len - size, &count, 1, 1, 1, 0, bn); mpz_export(bin + len - size, &count, 1, 1, 1, 0, bn);
assert(size == count); assert(count == 0 || size == count);
} }
void SetInt(int x) { void SetInt(int x) {
mpz_set_si(bn, x); mpz_set_si(bn, x);
@ -80,7 +80,7 @@ public:
} }
void SetModMul(Context &ctx, const Number &a, const Number &b, const Number &m) { void SetModMul(Context &ctx, const Number &a, const Number &b, const Number &m) {
mpz_mul(bn, a.bn, b.bn); mpz_mul(bn, a.bn, b.bn);
mpz_mod(bn, a.bn, m.bn); mpz_mod(bn, bn, m.bn);
} }
void SetAdd(Context &ctx, const Number &a1, const Number &a2) { void SetAdd(Context &ctx, const Number &a1, const Number &a2) {
mpz_add(bn, a1.bn, a2.bn); mpz_add(bn, a1.bn, a2.bn);
@ -144,8 +144,8 @@ public:
mpz_fdiv_q_2exp(high.bn, bn, bits); mpz_fdiv_q_2exp(high.bn, bn, bits);
} }
std::string ToString() { std::string ToString() const {
char *str = (char*)malloc((GetBits() + 7)/8 + 2); char *str = (char*)malloc(mpz_sizeinbase(bn,16) + 2);
mpz_get_str(str, 16, bn); mpz_get_str(str, 16, bn);
std::string ret(str); std::string ret(str);
free(str); free(str);