1 | var 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 |
|
8 | function 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 |
|
21 | var sig = Buffer(nacl.sign.detached(a(signBuf), a(this.signSk)))
|
22 |
|
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 |
|
54 | function 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 |
|
72 | module.exports = {
|
73 | parse: parseWallet,
|
74 | create: createWallet
|
75 | } |
\ | No newline at end of file |