btc btc btc btc
This commit is contained in:
parent
964b86fcd9
commit
fc4a0118f7
|
@ -22,20 +22,16 @@ struct State {
|
||||||
static int
|
static int
|
||||||
decryptkey(Fsstate *fss, char *key, char *password)
|
decryptkey(Fsstate *fss, char *key, char *password)
|
||||||
{
|
{
|
||||||
uchar keyenc[53], hash[32], ivec[AESbsize];
|
uchar keyenc[53], hash[32];
|
||||||
AESstate s;
|
AESstate s;
|
||||||
State *st;
|
State *st;
|
||||||
char buf[100];
|
|
||||||
|
|
||||||
if(base58dec(key, keyenc, 53) < 0)
|
if(base58dec(key, keyenc, 53) < 0)
|
||||||
return failure(fss, "invalid base58");
|
return failure(fss, "invalid base58");
|
||||||
sha2_256((uchar *)password, strlen(password), hash, nil);
|
sha2_256((uchar *)password, strlen(password), hash, nil);
|
||||||
sha2_256(hash, 32, hash, nil);
|
sha2_256(hash, 32, hash, nil);
|
||||||
genrandom(ivec, sizeof ivec);
|
|
||||||
setupAESstate(&s, hash, 32, keyenc+37);
|
setupAESstate(&s, hash, 32, keyenc+37);
|
||||||
aesCBCdecrypt(keyenc, 37, &s);
|
aesCBCdecrypt(keyenc, 37, &s);
|
||||||
memset(buf, 0, sizeof buf);
|
|
||||||
base58enc(keyenc, buf, 37);
|
|
||||||
if(keyenc[0] != 0x80)
|
if(keyenc[0] != 0x80)
|
||||||
return RpcNeedkey;
|
return RpcNeedkey;
|
||||||
sha2_256(keyenc, 33, hash, nil);
|
sha2_256(keyenc, 33, hash, nil);
|
||||||
|
|
133
sys/src/cmd/btc/genkey.c
Normal file
133
sys/src/cmd/btc/genkey.c
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <mp.h>
|
||||||
|
#include <libsec.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
</$objtype/mkfile
|
</$objtype/mkfile
|
||||||
|
|
||||||
TARG=httpfs sign
|
TARG=httpfs sign genkey
|
||||||
|
|
||||||
BIN=/$objtype/bin/btc
|
BIN=/$objtype/bin/btc
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ struct TxOut {
|
||||||
uchar sc[10000];
|
uchar sc[10000];
|
||||||
};
|
};
|
||||||
|
|
||||||
Biobuf *bp;
|
Biobuf *bp, *bpout;
|
||||||
|
|
||||||
int nin, nout;
|
int nin, nout;
|
||||||
TxIn *in[0xFD];
|
TxIn *in[0xFD];
|
||||||
|
@ -272,6 +272,8 @@ main()
|
||||||
|
|
||||||
bp = malloc(sizeof(*bp));
|
bp = malloc(sizeof(*bp));
|
||||||
Binit(bp, 0, OREAD);
|
Binit(bp, 0, OREAD);
|
||||||
|
bpout = malloc(sizeof(*bpout));
|
||||||
|
Binit(bpout, 1, OWRITE);
|
||||||
linenum = 0;
|
linenum = 0;
|
||||||
for(;;){
|
for(;;){
|
||||||
line = Brdstr(bp, '\n', 1);
|
line = Brdstr(bp, '\n', 1);
|
||||||
|
@ -337,14 +339,15 @@ main()
|
||||||
}
|
}
|
||||||
n = serialize(buf, -1);
|
n = serialize(buf, -1);
|
||||||
for(i = 0; i < n; i++){
|
for(i = 0; i < n; i++){
|
||||||
print("%.2x", buf[i]);
|
Bprint(bpout, "%.2x", buf[i]);
|
||||||
if((i%4)==3)
|
if((i%4)==3)
|
||||||
print(" ");
|
Bputc(bpout, ' ');
|
||||||
if((i%32)==31)
|
if((i%32)==31)
|
||||||
print("\n");
|
Bputc(bpout, '\n');
|
||||||
}
|
}
|
||||||
if((i%32)!=0)
|
if((i%32)!=0)
|
||||||
print("\n");
|
Bputc(bpout, '\n');
|
||||||
|
Bterm(bpout);
|
||||||
}
|
}
|
||||||
|
|
||||||
Word words[] = {
|
Word words[] = {
|
||||||
|
|
Loading…
Reference in a new issue