UNPKG

2.27 kBJavaScriptView Raw
1'use strict';
2
3var _ = require('lodash');
4var Base58 = require('./base58');
5var buffer = require('buffer');
6var sha256sha256 = require('../crypto/hash').sha256sha256;
7
8var Base58Check = function Base58Check(obj) {
9 if (!(this instanceof Base58Check))
10 return new Base58Check(obj);
11 if (Buffer.isBuffer(obj)) {
12 var buf = obj;
13 this.fromBuffer(buf);
14 } else if (typeof obj === 'string') {
15 var str = obj;
16 this.fromString(str);
17 } else if (obj) {
18 this.set(obj);
19 }
20};
21
22Base58Check.prototype.set = function(obj) {
23 this.buf = obj.buf || this.buf || undefined;
24 return this;
25};
26
27Base58Check.validChecksum = function validChecksum(data, checksum) {
28 if (_.isString(data)) {
29 data = Buffer.from(Base58.decode(data));
30 }
31 if (_.isString(checksum)) {
32 checksum = Buffer.from(Base58.decode(checksum));
33 }
34 if (!checksum) {
35 checksum = data.slice(-4);
36 data = data.slice(0, -4);
37 }
38 return Base58Check.checksum(data).toString('hex') === checksum.toString('hex');
39};
40
41Base58Check.decode = function(s) {
42 if (typeof s !== 'string')
43 throw new Error('Input must be a string');
44
45 var buf = Buffer.from(Base58.decode(s));
46
47 if (buf.length < 4)
48 throw new Error("Input string too short");
49
50 var data = buf.slice(0, -4);
51 var csum = buf.slice(-4);
52
53 var hash = sha256sha256(data);
54 var hash4 = hash.slice(0, 4);
55
56 if (csum.toString('hex') !== hash4.toString('hex'))
57 throw new Error("Checksum mismatch");
58
59 return data;
60};
61
62Base58Check.checksum = function(buffer) {
63 return sha256sha256(buffer).slice(0, 4);
64};
65
66Base58Check.encode = function(buf) {
67 if (!Buffer.isBuffer(buf))
68 throw new Error('Input must be a buffer');
69 var checkedBuf = Buffer.alloc(buf.length + 4);
70 var hash = Base58Check.checksum(buf);
71 buf.copy(checkedBuf);
72 hash.copy(checkedBuf, buf.length);
73 return Base58.encode(checkedBuf);
74};
75
76Base58Check.prototype.fromBuffer = function(buf) {
77 this.buf = buf;
78 return this;
79};
80
81Base58Check.prototype.fromString = function(str) {
82 var buf = Base58Check.decode(str);
83 this.buf = buf;
84 return this;
85};
86
87Base58Check.prototype.toBuffer = function() {
88 return this.buf;
89};
90
91Base58Check.prototype.toString = function() {
92 return Base58Check.encode(this.buf);
93};
94
95module.exports = Base58Check;