From fc4a0118f7bec011b852264010d3ca64be22aebf Mon Sep 17 00:00:00 2001 From: aiju Date: Sat, 9 Jun 2012 00:10:14 +0200 Subject: [PATCH] btc btc btc btc --- sys/src/cmd/auth/factotum/ecdsa.c | 6 +- sys/src/cmd/btc/genkey.c | 133 ++++++++++++++++++++++++++++++ sys/src/cmd/btc/mkfile | 2 +- sys/src/cmd/btc/sign.c | 13 +-- 4 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 sys/src/cmd/btc/genkey.c diff --git a/sys/src/cmd/auth/factotum/ecdsa.c b/sys/src/cmd/auth/factotum/ecdsa.c index f31c51a17..31cc0853d 100644 --- a/sys/src/cmd/auth/factotum/ecdsa.c +++ b/sys/src/cmd/auth/factotum/ecdsa.c @@ -22,20 +22,16 @@ struct State { static int decryptkey(Fsstate *fss, char *key, char *password) { - uchar keyenc[53], hash[32], ivec[AESbsize]; + uchar keyenc[53], hash[32]; AESstate s; State *st; - char buf[100]; if(base58dec(key, keyenc, 53) < 0) return failure(fss, "invalid base58"); sha2_256((uchar *)password, strlen(password), hash, nil); sha2_256(hash, 32, hash, nil); - genrandom(ivec, sizeof ivec); setupAESstate(&s, hash, 32, keyenc+37); aesCBCdecrypt(keyenc, 37, &s); - memset(buf, 0, sizeof buf); - base58enc(keyenc, buf, 37); if(keyenc[0] != 0x80) return RpcNeedkey; sha2_256(keyenc, 33, hash, nil); diff --git a/sys/src/cmd/btc/genkey.c b/sys/src/cmd/btc/genkey.c new file mode 100644 index 000000000..2b0141a56 --- /dev/null +++ b/sys/src/cmd/btc/genkey.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +ECdomain dom; + +void readln(char *prompt, char *line, int len, int raw); + +void +address(ECpub *p, char *buf) +{ + uchar buf1[65], buf2[25], buf3[25]; + + buf1[0] = 4; + buf3[0] = 0; + mptobe(p->x, buf1 + 1, 32, nil); + mptobe(p->y, buf1 + 33, 32, nil); + sha2_256(buf1, 65, buf2, nil); + ripemd160(buf2, 32, buf3 + 1, nil); + sha2_256(buf3, 21, buf2, nil); + sha2_256(buf2, 32, buf2, nil); + memcpy(buf3 + 21, buf2, 4); + memset(buf, 0, 100); + base58enc(buf3, buf, 25); +} + +void +pubkey(ECpub *b, char *buf) +{ + uchar buf1[65]; + + buf1[0] = 4; + mptobe(b->x, buf1 + 1, 32, nil); + mptobe(b->y, buf1 + 33, 32, nil); + memset(buf, 0, 100); + base58enc(buf1, buf, 65); +} + +void +privkey(ECpriv *p, char *buf, char *pw) +{ + uchar buf1[53], buf2[32]; + AESstate st; + + buf1[0] = 0x80; + mptobe(p->d, buf1 + 1, 32, nil); + sha2_256(buf1, 33, buf2, nil); + sha2_256(buf2, 32, buf2, nil); + memcpy(buf1 + 33, buf2, 4); + sha2_256((uchar *) pw, strlen(pw), buf2, nil); + sha2_256(buf2, 32, buf2, nil); + genrandom(buf1 + 37, 16); + setupAESstate(&st, buf2, 32, buf1+37); + aesCBCencrypt(buf1, 37, &st); + memset(buf, 0, 100); + base58enc(buf1, buf, 53); +} + +void +main() +{ + ECpriv *p; + char addr[100], pub[100], priv[100], pw[256], pw2[256]; + + dom.p = strtomp("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", nil, 16, nil); + dom.a = uitomp(0, nil); + dom.b = uitomp(7, nil); + dom.n = strtomp("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", nil, 16, nil); + dom.h = uitomp(1, nil); + dom.G = strtoec(&dom, "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", nil, nil); + p = ecgen(&dom, nil); + readln("password: ", pw, sizeof pw, 1); + readln("repeat: ", pw2, sizeof pw2, 1); + if(strcmp(pw, pw2) != 0) + sysfatal("passwords don't match"); + address(p, addr); + pubkey(p, pub); + privkey(p, priv, pw); + print("%s %s %s\n", addr, pub, priv); +} + +void +readln(char *prompt, char *line, int len, int raw) +{ + char *p; + int fdin, fdout, ctl, n, nr; + + fdin = open("/dev/cons", OREAD); + fdout = open("/dev/cons", OWRITE); + fprint(fdout, "%s", prompt); + if(raw){ + ctl = open("/dev/consctl", OWRITE); + if(ctl < 0) + sysfatal("couldn't set raw mode"); + write(ctl, "rawon", 5); + } else + ctl = -1; + nr = 0; + p = line; + for(;;){ + n = read(fdin, p, 1); + if(n < 0){ + close(ctl); + sysfatal("can't read cons\n"); + } + if(*p == 0x7f) + exits(0); + if(n == 0 || *p == '\n' || *p == '\r'){ + *p = '\0'; + if(raw){ + write(ctl, "rawoff", 6); + write(fdout, "\n", 1); + } + close(ctl); + return; + } + if(*p == '\b'){ + if(nr > 0){ + nr--; + p--; + } + }else{ + nr++; + p++; + } + if(nr == len){ + fprint(fdout, "line too long; try again\n"); + nr = 0; + p = line; + } + } +} diff --git a/sys/src/cmd/btc/mkfile b/sys/src/cmd/btc/mkfile index 578aeeee4..c30cd7690 100644 --- a/sys/src/cmd/btc/mkfile +++ b/sys/src/cmd/btc/mkfile @@ -1,6 +1,6 @@