1 | var crypto = require('crypto')
|
2 | var assert = require('assert')
|
3 | var base58 = require('bs58')
|
4 |
|
5 | function encode(payload, version) {
|
6 | if (Array.isArray(payload) || payload instanceof Uint8Array)
|
7 | payload = new Buffer(payload)
|
8 |
|
9 | var buf
|
10 | if (version != null) {
|
11 | if (typeof version == 'number')
|
12 | version = new Buffer([version])
|
13 | buf = Buffer.concat([version, payload])
|
14 | } else {
|
15 | buf = payload
|
16 | }
|
17 |
|
18 | var checksum = sha256x2(buf).slice(0, 4)
|
19 | var result = Buffer.concat([buf, checksum])
|
20 | return base58.encode(result)
|
21 | }
|
22 |
|
23 | function decode(base58str, version) {
|
24 | var arr = base58.decode(base58str)
|
25 | var buf = new Buffer(arr)
|
26 | var versionLength
|
27 |
|
28 | if (version == null)
|
29 | versionLength = 0
|
30 | else {
|
31 | if (typeof version == 'number')
|
32 | version = new Buffer([version])
|
33 |
|
34 | versionLength = version.length
|
35 | var versionCompare = buf.slice(0, versionLength)
|
36 | if (versionCompare.toString('hex') !== version.toString('hex'))
|
37 | throw new Error('Invalid version')
|
38 | }
|
39 |
|
40 | var checksum = buf.slice(-4)
|
41 | var endPos = buf.length - 4
|
42 | var bytes = buf.slice(0, endPos)
|
43 |
|
44 | var newChecksum = sha256x2(bytes).slice(0, 4)
|
45 | if (checksum.toString('hex') !== newChecksum.toString('hex'))
|
46 | throw new Error('Invalid checksum')
|
47 |
|
48 | return bytes.slice(versionLength)
|
49 | }
|
50 |
|
51 | function isValid(base58str, version) {
|
52 | try {
|
53 | decode(base58str, version)
|
54 | } catch (e) {
|
55 | return false
|
56 | }
|
57 |
|
58 | return true
|
59 | }
|
60 |
|
61 | function createEncoder(version) {
|
62 | return function(payload) {
|
63 | return encode(payload, version)
|
64 | }
|
65 | }
|
66 |
|
67 | function createDecoder(version) {
|
68 | return function(base58str) {
|
69 | return decode(base58str, version)
|
70 | }
|
71 | }
|
72 |
|
73 | function createValidator(version) {
|
74 | return function(base58str) {
|
75 | return isValid(base58str, version)
|
76 | }
|
77 | }
|
78 |
|
79 | function sha256x2(buffer) {
|
80 | var sha = crypto.createHash('sha256').update(buffer).digest()
|
81 | return crypto.createHash('sha256').update(sha).digest()
|
82 | }
|
83 |
|
84 | module.exports = {
|
85 | encode: encode,
|
86 | decode: decode,
|
87 | isValid: isValid,
|
88 | createEncoder: createEncoder,
|
89 | createDecoder: createDecoder,
|
90 | createValidator: createValidator
|
91 | }
|