diff options
author | aiju <aiju@phicode.de> | 2012-06-08 23:48:41 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2012-06-08 23:48:41 +0200 |
commit | 42656f38efa50235c363ab1522021cf6726b8e93 (patch) | |
tree | 1eab38291d041040e94766721c3169b069cd9256 /sys/src/cmd/auth | |
parent | baea7ec1e2c4175d00b0aa9f4208d103e38b2323 (diff) |
more bitcoin
Diffstat (limited to 'sys/src/cmd/auth')
-rw-r--r-- | sys/src/cmd/auth/factotum/ecdsa.c | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/sys/src/cmd/auth/factotum/ecdsa.c b/sys/src/cmd/auth/factotum/ecdsa.c index d21c97299..f31c51a17 100644 --- a/sys/src/cmd/auth/factotum/ecdsa.c +++ b/sys/src/cmd/auth/factotum/ecdsa.c @@ -15,7 +15,8 @@ static char *phasenames[] = { struct State { ECpriv p; - char *sign; + uchar buf[100]; + int n; }; static int @@ -36,11 +37,11 @@ decryptkey(Fsstate *fss, char *key, char *password) memset(buf, 0, sizeof buf); base58enc(keyenc, buf, 37); if(keyenc[0] != 0x80) - return failure(fss, "invalid key '%s'", buf); + return RpcNeedkey; sha2_256(keyenc, 33, hash, nil); sha2_256(hash, 32, hash, nil); if(memcmp(keyenc + 33, hash, 4) != 0) - return failure(fss, "checksum error"); + return RpcNeedkey; st = fss->ps; st->p.d = betomp(keyenc + 1, 32, nil); st->p.x = mpnew(0); @@ -67,6 +68,7 @@ ecdsainit(Proto *, Fsstate *fss) dom.h = uitomp(1, nil); dom.G = strtoec(&dom, "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", nil, nil); } + fss->ps = nil; if((iscli = isclient(_strfindattr(fss->attr, "role"))) < 0) return failure(fss, nil); if(iscli==0) @@ -91,7 +93,7 @@ ecdsainit(Proto *, Fsstate *fss) } if(key == nil || password == nil) return RpcNeedkey; - fss->ps = malloc(sizeof(State)); + fss->ps = emalloc(sizeof(State)); ret = decryptkey(fss, key, password); if(ret != RpcOk) return ret; @@ -103,12 +105,11 @@ ecdsainit(Proto *, Fsstate *fss) return RpcOk; } -static char * -derencode(mpint *r, mpint *s) +static void +derencode(mpint *r, mpint *s, uchar *buf, int *n) { - uchar buf[100], rk[33], sk[33]; - char *str; - int rl, sl, i; + uchar rk[33], sk[33]; + int rl, sl; mptobe(r, rk, 32, nil); mptobe(s, sk, 32, nil); @@ -132,17 +133,13 @@ derencode(mpint *r, mpint *s) buf[4 + rl] = 0x02; buf[5 + rl] = sl; memmove(buf + 6 + rl, sk, sl); - str = malloc(1024); - for(i = 0; i < 6 + rl + sl; i++) - sprint(str + 2 * i, "%.2x", buf[i]); - return str; + *n = 6 + rl + sl; } static int ecdsawrite(Fsstate *fss, void *va, uint n) { State *st; - uchar hash[32]; mpint *r, *s; st = fss->ps; @@ -150,12 +147,10 @@ ecdsawrite(Fsstate *fss, void *va, uint n) default: return phaseerror(fss, "write"); case CHaveKey: - sha2_256(va, n, hash, nil); - sha2_256(hash, 32, hash, nil); r = mpnew(0); s = mpnew(0); - ecdsasign(&dom, &st->p, hash, 32, r, s); - st->sign = derencode(r, s); + ecdsasign(&dom, &st->p, va, n, r, s); + derencode(r, s, st->buf, &st->n); mpfree(r); mpfree(s); fss->phase = CHaveText; @@ -166,11 +161,16 @@ ecdsawrite(Fsstate *fss, void *va, uint n) static int ecdsaread(Fsstate *fss, void *va, uint *n) { + State *st; + + st = fss->ps; switch(fss->phase){ default: return phaseerror(fss, "read"); case CHaveText: - *n = snprint(va, *n, ((State *)fss->ps)->sign); + if(*n > st->n) + *n = st->n; + memcpy(va, st->buf, *n); fss->phase = Established; return RpcOk; } @@ -182,13 +182,13 @@ ecdsaclose(Fsstate *fss) State *st; st = fss->ps; + if(st == nil) + return; if(st->p.x != nil){ mpfree(st->p.x); mpfree(st->p.y); mpfree(st->p.d); } - if(st->sign != nil) - free(st->sign); free(st); fss->ps = nil; } |