UNPKG

2.1 kBJavaScriptView Raw
1var pempal = require('pempal')
2 , nacl = require('tweetnacl')
3 , assert = require('assert')
4 , libPubkey = require('./pubkey')
5 , a = require('../utils/a')
6 , crypto = require('crypto')
7
8function parseWallet (buf) {
9 try {
10 assert.equal(buf.length, 96)
11 }
12 catch (e) {
13 throw new Error('invalid wallet')
14 }
15 return {
16 signSk: buf.slice(0, 64),
17 decryptSk: buf.slice(64),
18 sign: function (signBuf, detach) {
19 if (detach) {
20 //console.log('signed', crypto.createHash('sha1').update(signBuf).digest('hex'))
21 var sig = Buffer(nacl.sign.detached(a(signBuf), a(this.signSk)))
22 //console.log('sig', crypto.createHash('sha1').update(sig).digest('hex'))
23 return sig
24 }
25 return Buffer(nacl.sign(a(signBuf), a(this.signSk)))
26 },
27 regen: function () {
28 if (!this.pubkey) throw new Error('wallet must have pubkey prop to regen')
29 var boxKey = nacl.box.keyPair()
30 this.decryptSk = boxKey.secretKey
31 buf = Buffer.concat([
32 Buffer(this.signSk),
33 Buffer(this.decryptSk)
34 ])
35 var pubkeyBuf = Buffer.concat([
36 Buffer(this.pubkey.verifyPk),
37 Buffer(boxKey.publicKey)
38 ])
39 var name = this.pubkey.name
40 var email = this.pubkey.email
41 this.pubkey = libPubkey.parse(pubkeyBuf)
42 this.pubkey.name = name
43 this.pubkey.email = email
44 },
45 toBuffer: function () {
46 return buf
47 },
48 toPEM: function (passphrase) {
49 return pempal.encode(this.toBuffer(), {tag: 'SALTY WALLET', passphrase: passphrase})
50 }
51 }
52}
53
54function createWallet (info) {
55 var boxKey = nacl.box.keyPair()
56 var signKey = nacl.sign.keyPair()
57 var walletBuf = Buffer.concat([
58 Buffer(signKey.secretKey),
59 Buffer(boxKey.secretKey)
60 ])
61 var wallet = parseWallet(walletBuf)
62 var pubkeyBuf = Buffer.concat([
63 Buffer(signKey.publicKey),
64 Buffer(boxKey.publicKey)
65 ])
66 wallet.pubkey = libPubkey.parse(pubkeyBuf)
67 wallet.pubkey.name = info.name
68 wallet.pubkey.email = info.email
69 return wallet
70}
71
72module.exports = {
73 parse: parseWallet,
74 create: createWallet
75}
\No newline at end of file