multichain-address-validator 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +10 -0
- package/.travis.yml +11 -0
- package/.vscode/launch.json +23 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/config/esbuild.inject.js +1 -0
- package/config/esbuild.ts +14 -0
- package/dist/chain-validators.d.ts +2 -0
- package/dist/chain-validators.js +98 -0
- package/dist/crypto/base32.d.ts +5 -0
- package/dist/crypto/base32.js +64 -0
- package/dist/crypto/base58.d.ts +4 -0
- package/dist/crypto/base58.js +42 -0
- package/dist/crypto/bech32.d.ts +17 -0
- package/dist/crypto/bech32.js +124 -0
- package/dist/crypto/biginteger.d.ts +57 -0
- package/dist/crypto/biginteger.js +1311 -0
- package/dist/crypto/blake256.d.ts +22 -0
- package/dist/crypto/blake256.js +169 -0
- package/dist/crypto/blake2b.d.ts +13 -0
- package/dist/crypto/blake2b.js +242 -0
- package/dist/crypto/cnBase58.d.ts +7 -0
- package/dist/crypto/cnBase58.js +209 -0
- package/dist/crypto/segwit_addr.d.ts +12 -0
- package/dist/crypto/segwit_addr.js +102 -0
- package/dist/crypto/utils.d.ts +26 -0
- package/dist/crypto/utils.js +123 -0
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +5 -0
- package/dist/multichain-address-validator.bundle.min.js +17 -0
- package/dist/multichain-address-validator.d.ts +2 -0
- package/dist/multichain-address-validator.js +8 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +5 -0
- package/dist/validators/algorand_validator.d.ts +5 -0
- package/dist/validators/algorand_validator.js +23 -0
- package/dist/validators/base58_validator.d.ts +4 -0
- package/dist/validators/base58_validator.js +31 -0
- package/dist/validators/bch_validator.d.ts +13 -0
- package/dist/validators/bch_validator.js +50 -0
- package/dist/validators/bip173_validator.d.ts +7 -0
- package/dist/validators/bip173_validator.js +12 -0
- package/dist/validators/bitcoin_validator.d.ts +12 -0
- package/dist/validators/bitcoin_validator.js +68 -0
- package/dist/validators/cardano_validator.d.ts +5 -0
- package/dist/validators/cardano_validator.js +41 -0
- package/dist/validators/eos_validator.d.ts +5 -0
- package/dist/validators/eos_validator.js +10 -0
- package/dist/validators/ethereum_validator.d.ts +6 -0
- package/dist/validators/ethereum_validator.js +30 -0
- package/dist/validators/index.d.ts +16 -0
- package/dist/validators/index.js +16 -0
- package/dist/validators/monero_validator.d.ts +5 -0
- package/dist/validators/monero_validator.js +58 -0
- package/dist/validators/nano_validator.d.ts +6 -0
- package/dist/validators/nano_validator.js +23 -0
- package/dist/validators/nem_validator.d.ts +5 -0
- package/dist/validators/nem_validator.js +14 -0
- package/dist/validators/polkadot_validator.d.ts +5 -0
- package/dist/validators/polkadot_validator.js +49 -0
- package/dist/validators/ripple_validator.d.ts +10 -0
- package/dist/validators/ripple_validator.js +26 -0
- package/dist/validators/sia_validator.d.ts +5 -0
- package/dist/validators/sia_validator.js +27 -0
- package/dist/validators/solana_validator.d.ts +5 -0
- package/dist/validators/solana_validator.js +10 -0
- package/dist/validators/tezos_validator.d.ts +5 -0
- package/dist/validators/tezos_validator.js +30 -0
- package/dist/validators/tron_validator.d.ts +8 -0
- package/dist/validators/tron_validator.js +45 -0
- package/dist/validators/xlm_validator.d.ts +6 -0
- package/dist/validators/xlm_validator.js +32 -0
- package/index.html +12 -0
- package/package.json +353 -0
- package/src/chain-validators.ts +131 -0
- package/src/crypto/base32.ts +66 -0
- package/src/crypto/base58.ts +46 -0
- package/src/crypto/bech32.js +132 -0
- package/src/crypto/biginteger.js +1426 -0
- package/src/crypto/blake256.js +186 -0
- package/src/crypto/blake2b.js +276 -0
- package/src/crypto/cnBase58.js +226 -0
- package/src/crypto/segwit_addr.js +112 -0
- package/src/crypto/utils.ts +133 -0
- package/src/helpers.ts +7 -0
- package/src/multichain-address-validator.ts +11 -0
- package/src/types.ts +18 -0
- package/src/validators/algorand_validator.ts +28 -0
- package/src/validators/base58_validator.ts +32 -0
- package/src/validators/bch_validator.ts +66 -0
- package/src/validators/bip173_validator.ts +19 -0
- package/src/validators/bitcoin_validator.ts +94 -0
- package/src/validators/cardano_validator.ts +50 -0
- package/src/validators/eos_validator.ts +13 -0
- package/src/validators/ethereum_validator.ts +37 -0
- package/src/validators/index.ts +16 -0
- package/src/validators/monero_validator.ts +72 -0
- package/src/validators/nano_validator.ts +32 -0
- package/src/validators/nem_validator.ts +18 -0
- package/src/validators/polkadot_validator.ts +57 -0
- package/src/validators/ripple_validator.ts +36 -0
- package/src/validators/sia_validator.ts +33 -0
- package/src/validators/solana_validator.ts +12 -0
- package/src/validators/tezos_validator.ts +36 -0
- package/src/validators/tron_validator.ts +59 -0
- package/src/validators/xlm_validator.ts +42 -0
- package/test/addresses/addresses.ts +45 -0
- package/test/addresses/algorand.json +6 -0
- package/test/addresses/bch-testnet.json +4 -0
- package/test/addresses/bch.json +12 -0
- package/test/addresses/btc-testnet.json +6 -0
- package/test/addresses/btc.json +14 -0
- package/test/addresses/cardano.json +8 -0
- package/test/addresses/doge.json +7 -0
- package/test/addresses/eos.json +6 -0
- package/test/addresses/evm.json +21 -0
- package/test/addresses/invalid.json +15 -0
- package/test/addresses/ltc-testnet.json +7 -0
- package/test/addresses/ltc.json +9 -0
- package/test/addresses/monero.json +7 -0
- package/test/addresses/nano.json +12 -0
- package/test/addresses/nem.json +4 -0
- package/test/addresses/polkadot.json +8 -0
- package/test/addresses/ripple.json +11 -0
- package/test/addresses/sia.json +6 -0
- package/test/addresses/solana.json +8 -0
- package/test/addresses/tezos.json +9 -0
- package/test/addresses/tron.json +6 -0
- package/test/addresses/xlm.json +12 -0
- package/test/multichain-address-validator.test.ts +1589 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credits to https://github.com/cryptocoinjs/blake-hash
|
|
3
|
+
*/
|
|
4
|
+
Blake256.sigma = [
|
|
5
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
|
6
|
+
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
|
|
7
|
+
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
|
|
8
|
+
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
|
|
9
|
+
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
|
|
10
|
+
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9],
|
|
11
|
+
[12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11],
|
|
12
|
+
[13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10],
|
|
13
|
+
[6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5],
|
|
14
|
+
[10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0],
|
|
15
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
|
16
|
+
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
|
|
17
|
+
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
|
|
18
|
+
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
|
|
19
|
+
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
|
|
20
|
+
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9]
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
Blake256.u256 = [
|
|
24
|
+
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
|
|
25
|
+
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
|
|
26
|
+
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
|
|
27
|
+
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
Blake256.padding = Buffer.from([
|
|
31
|
+
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
32
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
33
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
34
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
35
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
36
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
37
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
38
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
Blake256.prototype._length_carry = function (arr) {
|
|
42
|
+
for (var j = 0; j < arr.length; ++j) {
|
|
43
|
+
if (arr[j] < 0x0100000000) break
|
|
44
|
+
arr[j] -= 0x0100000000
|
|
45
|
+
arr[j + 1] += 1
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Blake256.prototype.update = function (data, encoding) {
|
|
50
|
+
data = Buffer.from(data, encoding);
|
|
51
|
+
var block = this._block
|
|
52
|
+
var offset = 0
|
|
53
|
+
|
|
54
|
+
while (this._blockOffset + data.length - offset >= block.length) {
|
|
55
|
+
for (var i = this._blockOffset; i < block.length;) block[i++] = data[offset++]
|
|
56
|
+
|
|
57
|
+
this._length[0] += block.length * 8
|
|
58
|
+
this._length_carry(this._length)
|
|
59
|
+
|
|
60
|
+
this._compress()
|
|
61
|
+
this._blockOffset = 0
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
while (offset < data.length) block[this._blockOffset++] = data[offset++]
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var zo = Buffer.from([0x01])
|
|
69
|
+
var oo = Buffer.from([0x81])
|
|
70
|
+
|
|
71
|
+
function rot (x, n) {
|
|
72
|
+
return ((x << (32 - n)) | (x >>> n)) >>> 0
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function g (v, m, i, a, b, c, d, e) {
|
|
76
|
+
var sigma = Blake256.sigma
|
|
77
|
+
var u256 = Blake256.u256
|
|
78
|
+
|
|
79
|
+
v[a] = (v[a] + ((m[sigma[i][e]] ^ u256[sigma[i][e + 1]]) >>> 0) + v[b]) >>> 0
|
|
80
|
+
v[d] = rot(v[d] ^ v[a], 16)
|
|
81
|
+
v[c] = (v[c] + v[d]) >>> 0
|
|
82
|
+
v[b] = rot(v[b] ^ v[c], 12)
|
|
83
|
+
v[a] = (v[a] + ((m[sigma[i][e + 1]] ^ u256[sigma[i][e]]) >>> 0) + v[b]) >>> 0
|
|
84
|
+
v[d] = rot(v[d] ^ v[a], 8)
|
|
85
|
+
v[c] = (v[c] + v[d]) >>> 0
|
|
86
|
+
v[b] = rot(v[b] ^ v[c], 7)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function Blake256 () {
|
|
90
|
+
this._h = [
|
|
91
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
|
92
|
+
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
this._s = [0, 0, 0, 0]
|
|
96
|
+
|
|
97
|
+
this._block = Buffer.allocUnsafe(64)
|
|
98
|
+
this._blockOffset = 0
|
|
99
|
+
this._length = [0, 0]
|
|
100
|
+
|
|
101
|
+
this._nullt = false
|
|
102
|
+
|
|
103
|
+
this._zo = zo
|
|
104
|
+
this._oo = oo
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
Blake256.prototype._compress = function () {
|
|
108
|
+
var u256 = Blake256.u256
|
|
109
|
+
var v = new Array(16)
|
|
110
|
+
var m = new Array(16)
|
|
111
|
+
var i
|
|
112
|
+
|
|
113
|
+
for (i = 0; i < 16; ++i) m[i] = this._block.readUInt32BE(i * 4)
|
|
114
|
+
for (i = 0; i < 8; ++i) v[i] = this._h[i] >>> 0
|
|
115
|
+
for (i = 8; i < 12; ++i) v[i] = (this._s[i - 8] ^ u256[i - 8]) >>> 0
|
|
116
|
+
for (i = 12; i < 16; ++i) v[i] = u256[i - 8]
|
|
117
|
+
|
|
118
|
+
if (!this._nullt) {
|
|
119
|
+
v[12] = (v[12] ^ this._length[0]) >>> 0
|
|
120
|
+
v[13] = (v[13] ^ this._length[0]) >>> 0
|
|
121
|
+
v[14] = (v[14] ^ this._length[1]) >>> 0
|
|
122
|
+
v[15] = (v[15] ^ this._length[1]) >>> 0
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
for (i = 0; i < 14; ++i) {
|
|
126
|
+
/* column step */
|
|
127
|
+
g(v, m, i, 0, 4, 8, 12, 0)
|
|
128
|
+
g(v, m, i, 1, 5, 9, 13, 2)
|
|
129
|
+
g(v, m, i, 2, 6, 10, 14, 4)
|
|
130
|
+
g(v, m, i, 3, 7, 11, 15, 6)
|
|
131
|
+
/* diagonal step */
|
|
132
|
+
g(v, m, i, 0, 5, 10, 15, 8)
|
|
133
|
+
g(v, m, i, 1, 6, 11, 12, 10)
|
|
134
|
+
g(v, m, i, 2, 7, 8, 13, 12)
|
|
135
|
+
g(v, m, i, 3, 4, 9, 14, 14)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (i = 0; i < 16; ++i) this._h[i % 8] = (this._h[i % 8] ^ v[i]) >>> 0
|
|
139
|
+
for (i = 0; i < 8; ++i) this._h[i] = (this._h[i] ^ this._s[i % 4]) >>> 0
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
Blake256.prototype._padding = function () {
|
|
143
|
+
var lo = this._length[0] + this._blockOffset * 8
|
|
144
|
+
var hi = this._length[1]
|
|
145
|
+
if (lo >= 0x0100000000) {
|
|
146
|
+
lo -= 0x0100000000
|
|
147
|
+
hi += 1
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var msglen = Buffer.allocUnsafe(8)
|
|
151
|
+
msglen.writeUInt32BE(hi, 0)
|
|
152
|
+
msglen.writeUInt32BE(lo, 4)
|
|
153
|
+
|
|
154
|
+
if (this._blockOffset === 55) {
|
|
155
|
+
this._length[0] -= 8
|
|
156
|
+
this.update(this._oo)
|
|
157
|
+
} else {
|
|
158
|
+
if (this._blockOffset < 55) {
|
|
159
|
+
if (this._blockOffset === 0) this._nullt = true
|
|
160
|
+
this._length[0] -= (55 - this._blockOffset) * 8
|
|
161
|
+
this.update(Blake256.padding.slice(0, 55 - this._blockOffset))
|
|
162
|
+
} else {
|
|
163
|
+
this._length[0] -= (64 - this._blockOffset) * 8
|
|
164
|
+
this.update(Blake256.padding.slice(0, 64 - this._blockOffset))
|
|
165
|
+
this._length[0] -= 55 * 8
|
|
166
|
+
this.update(Blake256.padding.slice(1, 1 + 55))
|
|
167
|
+
this._nullt = true
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
this.update(this._zo)
|
|
171
|
+
this._length[0] -= 8
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this._length[0] -= 64
|
|
175
|
+
this.update(msglen)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
Blake256.prototype.digest = function (encoding) {
|
|
179
|
+
this._padding()
|
|
180
|
+
|
|
181
|
+
var buffer = Buffer.allocUnsafe(32)
|
|
182
|
+
for (var i = 0; i < 8; ++i) buffer.writeUInt32BE(this._h[i], i * 4)
|
|
183
|
+
return buffer.toString(encoding);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export default Blake256;
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Credits to https://github.com/emilbayes/blake2b
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2017, Emil Bay github@tixz.dk
|
|
7
|
+
*
|
|
8
|
+
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
9
|
+
*
|
|
10
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// 64-bit unsigned addition
|
|
14
|
+
// Sets v[a,a+1] += v[b,b+1]
|
|
15
|
+
// v should be a Uint32Array
|
|
16
|
+
function ADD64AA (v, a, b) {
|
|
17
|
+
var o0 = v[a] + v[b]
|
|
18
|
+
var o1 = v[a + 1] + v[b + 1]
|
|
19
|
+
if (o0 >= 0x100000000) {
|
|
20
|
+
o1++
|
|
21
|
+
}
|
|
22
|
+
v[a] = o0
|
|
23
|
+
v[a + 1] = o1
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 64-bit unsigned addition
|
|
27
|
+
// Sets v[a,a+1] += b
|
|
28
|
+
// b0 is the low 32 bits of b, b1 represents the high 32 bits
|
|
29
|
+
function ADD64AC (v, a, b0, b1) {
|
|
30
|
+
var o0 = v[a] + b0
|
|
31
|
+
if (b0 < 0) {
|
|
32
|
+
o0 += 0x100000000
|
|
33
|
+
}
|
|
34
|
+
var o1 = v[a + 1] + b1
|
|
35
|
+
if (o0 >= 0x100000000) {
|
|
36
|
+
o1++
|
|
37
|
+
}
|
|
38
|
+
v[a] = o0
|
|
39
|
+
v[a + 1] = o1
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Little-endian byte access
|
|
43
|
+
function B2B_GET32 (arr, i) {
|
|
44
|
+
return (arr[i] ^
|
|
45
|
+
(arr[i + 1] << 8) ^
|
|
46
|
+
(arr[i + 2] << 16) ^
|
|
47
|
+
(arr[i + 3] << 24))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// G Mixing function
|
|
51
|
+
// The ROTRs are inlined for speed
|
|
52
|
+
function B2B_G (a, b, c, d, ix, iy) {
|
|
53
|
+
var x0 = m[ix]
|
|
54
|
+
var x1 = m[ix + 1]
|
|
55
|
+
var y0 = m[iy]
|
|
56
|
+
var y1 = m[iy + 1]
|
|
57
|
+
|
|
58
|
+
ADD64AA(v, a, b) // v[a,a+1] += v[b,b+1] ... in JS we must store a uint64 as two uint32s
|
|
59
|
+
ADD64AC(v, a, x0, x1) // v[a, a+1] += x ... x0 is the low 32 bits of x, x1 is the high 32 bits
|
|
60
|
+
|
|
61
|
+
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated to the right by 32 bits
|
|
62
|
+
var xor0 = v[d] ^ v[a]
|
|
63
|
+
var xor1 = v[d + 1] ^ v[a + 1]
|
|
64
|
+
v[d] = xor1
|
|
65
|
+
v[d + 1] = xor0
|
|
66
|
+
|
|
67
|
+
ADD64AA(v, c, d)
|
|
68
|
+
|
|
69
|
+
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 24 bits
|
|
70
|
+
xor0 = v[b] ^ v[c]
|
|
71
|
+
xor1 = v[b + 1] ^ v[c + 1]
|
|
72
|
+
v[b] = (xor0 >>> 24) ^ (xor1 << 8)
|
|
73
|
+
v[b + 1] = (xor1 >>> 24) ^ (xor0 << 8)
|
|
74
|
+
|
|
75
|
+
ADD64AA(v, a, b)
|
|
76
|
+
ADD64AC(v, a, y0, y1)
|
|
77
|
+
|
|
78
|
+
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated right by 16 bits
|
|
79
|
+
xor0 = v[d] ^ v[a]
|
|
80
|
+
xor1 = v[d + 1] ^ v[a + 1]
|
|
81
|
+
v[d] = (xor0 >>> 16) ^ (xor1 << 16)
|
|
82
|
+
v[d + 1] = (xor1 >>> 16) ^ (xor0 << 16)
|
|
83
|
+
|
|
84
|
+
ADD64AA(v, c, d)
|
|
85
|
+
|
|
86
|
+
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 63 bits
|
|
87
|
+
xor0 = v[b] ^ v[c]
|
|
88
|
+
xor1 = v[b + 1] ^ v[c + 1]
|
|
89
|
+
v[b] = (xor1 >>> 31) ^ (xor0 << 1)
|
|
90
|
+
v[b + 1] = (xor0 >>> 31) ^ (xor1 << 1)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Initialization Vector
|
|
94
|
+
var BLAKE2B_IV32 = new Uint32Array([
|
|
95
|
+
0xF3BCC908, 0x6A09E667, 0x84CAA73B, 0xBB67AE85,
|
|
96
|
+
0xFE94F82B, 0x3C6EF372, 0x5F1D36F1, 0xA54FF53A,
|
|
97
|
+
0xADE682D1, 0x510E527F, 0x2B3E6C1F, 0x9B05688C,
|
|
98
|
+
0xFB41BD6B, 0x1F83D9AB, 0x137E2179, 0x5BE0CD19
|
|
99
|
+
])
|
|
100
|
+
|
|
101
|
+
var SIGMA8 = [
|
|
102
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
103
|
+
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
|
104
|
+
11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
|
105
|
+
7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
|
106
|
+
9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
|
107
|
+
2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
|
108
|
+
12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,
|
|
109
|
+
13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,
|
|
110
|
+
6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,
|
|
111
|
+
10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,
|
|
112
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
113
|
+
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
// These are offsets into a uint64 buffer.
|
|
117
|
+
// Multiply them all by 2 to make them offsets into a uint32 buffer,
|
|
118
|
+
// because this is Javascript and we don't have uint64s
|
|
119
|
+
var SIGMA82 = new Uint8Array(SIGMA8.map(function (x) { return x * 2 }))
|
|
120
|
+
|
|
121
|
+
// Compression function. 'last' flag indicates last block.
|
|
122
|
+
// Note we're representing 16 uint64s as 32 uint32s
|
|
123
|
+
var v = new Uint32Array(32)
|
|
124
|
+
var m = new Uint32Array(32)
|
|
125
|
+
function blake2bCompress (ctx, last) {
|
|
126
|
+
var i = 0
|
|
127
|
+
|
|
128
|
+
// init work variables
|
|
129
|
+
for (i = 0; i < 16; i++) {
|
|
130
|
+
v[i] = ctx.h[i]
|
|
131
|
+
v[i + 16] = BLAKE2B_IV32[i]
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// low 64 bits of offset
|
|
135
|
+
v[24] = v[24] ^ ctx.t
|
|
136
|
+
v[25] = v[25] ^ (ctx.t / 0x100000000)
|
|
137
|
+
// high 64 bits not supported, offset may not be higher than 2**53-1
|
|
138
|
+
|
|
139
|
+
// last block flag set ?
|
|
140
|
+
if (last) {
|
|
141
|
+
v[28] = ~v[28]
|
|
142
|
+
v[29] = ~v[29]
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// get little-endian words
|
|
146
|
+
for (i = 0; i < 32; i++) {
|
|
147
|
+
m[i] = B2B_GET32(ctx.b, 4 * i)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// twelve rounds of mixing
|
|
151
|
+
for (i = 0; i < 12; i++) {
|
|
152
|
+
B2B_G(0, 8, 16, 24, SIGMA82[i * 16 + 0], SIGMA82[i * 16 + 1])
|
|
153
|
+
B2B_G(2, 10, 18, 26, SIGMA82[i * 16 + 2], SIGMA82[i * 16 + 3])
|
|
154
|
+
B2B_G(4, 12, 20, 28, SIGMA82[i * 16 + 4], SIGMA82[i * 16 + 5])
|
|
155
|
+
B2B_G(6, 14, 22, 30, SIGMA82[i * 16 + 6], SIGMA82[i * 16 + 7])
|
|
156
|
+
B2B_G(0, 10, 20, 30, SIGMA82[i * 16 + 8], SIGMA82[i * 16 + 9])
|
|
157
|
+
B2B_G(2, 12, 22, 24, SIGMA82[i * 16 + 10], SIGMA82[i * 16 + 11])
|
|
158
|
+
B2B_G(4, 14, 16, 26, SIGMA82[i * 16 + 12], SIGMA82[i * 16 + 13])
|
|
159
|
+
B2B_G(6, 8, 18, 28, SIGMA82[i * 16 + 14], SIGMA82[i * 16 + 15])
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
for (i = 0; i < 16; i++) {
|
|
163
|
+
ctx.h[i] = ctx.h[i] ^ v[i] ^ v[i + 16]
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// reusable parameter_block
|
|
168
|
+
var parameter_block = new Uint8Array([
|
|
169
|
+
0, 0, 0, 0, // 0: outlen, keylen, fanout, depth
|
|
170
|
+
0, 0, 0, 0, // 4: leaf length, sequential mode
|
|
171
|
+
0, 0, 0, 0, // 8: node offset
|
|
172
|
+
0, 0, 0, 0, // 12: node offset
|
|
173
|
+
0, 0, 0, 0, // 16: node depth, inner length, rfu
|
|
174
|
+
0, 0, 0, 0, // 20: rfu
|
|
175
|
+
0, 0, 0, 0, // 24: rfu
|
|
176
|
+
0, 0, 0, 0, // 28: rfu
|
|
177
|
+
0, 0, 0, 0, // 32: salt
|
|
178
|
+
0, 0, 0, 0, // 36: salt
|
|
179
|
+
0, 0, 0, 0, // 40: salt
|
|
180
|
+
0, 0, 0, 0, // 44: salt
|
|
181
|
+
0, 0, 0, 0, // 48: personal
|
|
182
|
+
0, 0, 0, 0, // 52: personal
|
|
183
|
+
0, 0, 0, 0, // 56: personal
|
|
184
|
+
0, 0, 0, 0 // 60: personal
|
|
185
|
+
])
|
|
186
|
+
|
|
187
|
+
// Creates a BLAKE2b hashing context
|
|
188
|
+
// Requires an output length between 1 and 64 bytes
|
|
189
|
+
// Takes an optional Uint8Array key
|
|
190
|
+
function Blake2b (outlen, key, salt, personal) {
|
|
191
|
+
// zero out parameter_block before usage
|
|
192
|
+
parameter_block.fill(0)
|
|
193
|
+
// state, 'param block'
|
|
194
|
+
|
|
195
|
+
this.b = new Uint8Array(128)
|
|
196
|
+
this.h = new Uint32Array(16)
|
|
197
|
+
this.t = 0 // input count
|
|
198
|
+
this.c = 0 // pointer within buffer
|
|
199
|
+
this.outlen = outlen // output length in bytes
|
|
200
|
+
|
|
201
|
+
parameter_block[0] = outlen
|
|
202
|
+
if (key) parameter_block[1] = key.length
|
|
203
|
+
parameter_block[2] = 1 // fanout
|
|
204
|
+
parameter_block[3] = 1 // depth
|
|
205
|
+
|
|
206
|
+
if (salt) parameter_block.set(salt, 32)
|
|
207
|
+
if (personal) parameter_block.set(personal, 48)
|
|
208
|
+
|
|
209
|
+
// initialize hash state
|
|
210
|
+
for (var i = 0; i < 16; i++) {
|
|
211
|
+
this.h[i] = BLAKE2B_IV32[i] ^ B2B_GET32(parameter_block, i * 4)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// key the hash, if applicable
|
|
215
|
+
if (key) {
|
|
216
|
+
blake2bUpdate(this, key)
|
|
217
|
+
// at the end
|
|
218
|
+
this.c = 128
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
Blake2b.prototype.update = function (input) {
|
|
223
|
+
blake2bUpdate(this, input)
|
|
224
|
+
return this
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
Blake2b.prototype.digest = function (out) {
|
|
228
|
+
var buf = (!out || out === 'binary' || out === 'hex') ? new Uint8Array(this.outlen) : out
|
|
229
|
+
blake2bFinal(this, buf)
|
|
230
|
+
if (out === 'hex') return hexSlice(buf)
|
|
231
|
+
return buf
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
Blake2b.prototype.final = Blake2b.prototype.digest
|
|
235
|
+
|
|
236
|
+
// Updates a BLAKE2b streaming hash
|
|
237
|
+
// Requires hash context and Uint8Array (byte array)
|
|
238
|
+
function blake2bUpdate (ctx, input) {
|
|
239
|
+
for (var i = 0; i < input.length; i++) {
|
|
240
|
+
if (ctx.c === 128) { // buffer full ?
|
|
241
|
+
ctx.t += ctx.c // add counters
|
|
242
|
+
blake2bCompress(ctx, false) // compress (not last)
|
|
243
|
+
ctx.c = 0 // counter to zero
|
|
244
|
+
}
|
|
245
|
+
ctx.b[ctx.c++] = input[i]
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Completes a BLAKE2b streaming hash
|
|
250
|
+
// Returns a Uint8Array containing the message digest
|
|
251
|
+
function blake2bFinal (ctx, out) {
|
|
252
|
+
ctx.t += ctx.c // mark last block offset
|
|
253
|
+
|
|
254
|
+
while (ctx.c < 128) { // fill up with zeros
|
|
255
|
+
ctx.b[ctx.c++] = 0
|
|
256
|
+
}
|
|
257
|
+
blake2bCompress(ctx, true) // final block flag = 1
|
|
258
|
+
|
|
259
|
+
for (var i = 0; i < ctx.outlen; i++) {
|
|
260
|
+
out[i] = ctx.h[i >> 2] >> (8 * (i & 3))
|
|
261
|
+
}
|
|
262
|
+
return out
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function hexSlice (buf) {
|
|
266
|
+
var str = ''
|
|
267
|
+
for (var i = 0; i < buf.length; i++) str += toHex(buf[i])
|
|
268
|
+
return str
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function toHex (n) {
|
|
272
|
+
if (n < 16) return '0' + n.toString(16)
|
|
273
|
+
return n.toString(16)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export default Blake2b;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { BigInteger as JSBigInt } from './biginteger'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
Copyright (c) 2017, moneroexamples
|
|
5
|
+
|
|
6
|
+
All rights reserved.
|
|
7
|
+
|
|
8
|
+
Redistribution and use in source and binary forms, with or without
|
|
9
|
+
modification, are permitted provided that the following conditions are met:
|
|
10
|
+
|
|
11
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
12
|
+
list of conditions and the following disclaimer.
|
|
13
|
+
|
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
15
|
+
this list of conditions and the following disclaimer in the documentation
|
|
16
|
+
and/or other materials provided with the distribution.
|
|
17
|
+
|
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors
|
|
19
|
+
may be used to endorse or promote products derived from this software without
|
|
20
|
+
specific prior written permission.
|
|
21
|
+
|
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
23
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
24
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
25
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
26
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
27
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
28
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
29
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
30
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
31
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
|
|
33
|
+
Parts of the project are originally copyright (c) 2014-2017, MyMonero.com
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
var cnBase58 = (function () {
|
|
37
|
+
var b58 = {};
|
|
38
|
+
|
|
39
|
+
var alphabet_str = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
40
|
+
var alphabet = [];
|
|
41
|
+
for (var i = 0; i < alphabet_str.length; i++) {
|
|
42
|
+
alphabet.push(alphabet_str.charCodeAt(i));
|
|
43
|
+
}
|
|
44
|
+
var encoded_block_sizes = [0, 2, 3, 5, 6, 7, 9, 10, 11];
|
|
45
|
+
|
|
46
|
+
var alphabet_size = alphabet.length;
|
|
47
|
+
var full_block_size = 8;
|
|
48
|
+
var full_encoded_block_size = 11;
|
|
49
|
+
|
|
50
|
+
var UINT64_MAX = new JSBigInt(2).pow(64);
|
|
51
|
+
|
|
52
|
+
function hextobin(hex) {
|
|
53
|
+
if (hex.length % 2 !== 0) throw "Hex string has invalid length!";
|
|
54
|
+
var res = new Uint8Array(hex.length / 2);
|
|
55
|
+
for (var i = 0; i < hex.length / 2; ++i) {
|
|
56
|
+
res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
57
|
+
}
|
|
58
|
+
return res;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function bintohex(bin) {
|
|
62
|
+
var out = [];
|
|
63
|
+
for (var i = 0; i < bin.length; ++i) {
|
|
64
|
+
out.push(("0" + bin[i].toString(16)).slice(-2));
|
|
65
|
+
}
|
|
66
|
+
return out.join("");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function strtobin(str) {
|
|
70
|
+
var res = new Uint8Array(str.length);
|
|
71
|
+
for (var i = 0; i < str.length; i++) {
|
|
72
|
+
res[i] = str.charCodeAt(i);
|
|
73
|
+
}
|
|
74
|
+
return res;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function bintostr(bin) {
|
|
78
|
+
var out = [];
|
|
79
|
+
for (var i = 0; i < bin.length; i++) {
|
|
80
|
+
out.push(String.fromCharCode(bin[i]));
|
|
81
|
+
}
|
|
82
|
+
return out.join("");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function uint8_be_to_64(data) {
|
|
86
|
+
if (data.length < 1 || data.length > 8) {
|
|
87
|
+
throw "Invalid input length";
|
|
88
|
+
}
|
|
89
|
+
var res = JSBigInt.ZERO;
|
|
90
|
+
var twopow8 = new JSBigInt(2).pow(8);
|
|
91
|
+
var i = 0;
|
|
92
|
+
switch (9 - data.length) {
|
|
93
|
+
case 1:
|
|
94
|
+
res = res.add(data[i++]);
|
|
95
|
+
case 2:
|
|
96
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
97
|
+
case 3:
|
|
98
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
99
|
+
case 4:
|
|
100
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
101
|
+
case 5:
|
|
102
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
103
|
+
case 6:
|
|
104
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
105
|
+
case 7:
|
|
106
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
107
|
+
case 8:
|
|
108
|
+
res = res.multiply(twopow8).add(data[i++]);
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
throw "Impossible condition";
|
|
112
|
+
}
|
|
113
|
+
return res;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function uint64_to_8be(num, size) {
|
|
117
|
+
var res = new Uint8Array(size);
|
|
118
|
+
if (size < 1 || size > 8) {
|
|
119
|
+
throw "Invalid input length";
|
|
120
|
+
}
|
|
121
|
+
var twopow8 = new JSBigInt(2).pow(8);
|
|
122
|
+
for (var i = size - 1; i >= 0; i--) {
|
|
123
|
+
res[i] = num.remainder(twopow8).toJSValue();
|
|
124
|
+
num = num.divide(twopow8);
|
|
125
|
+
}
|
|
126
|
+
return res;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
b58.encode_block = function (data, buf, index) {
|
|
130
|
+
if (data.length < 1 || data.length > full_encoded_block_size) {
|
|
131
|
+
throw "Invalid block length: " + data.length;
|
|
132
|
+
}
|
|
133
|
+
var num = uint8_be_to_64(data);
|
|
134
|
+
var i = encoded_block_sizes[data.length] - 1;
|
|
135
|
+
// while num > 0
|
|
136
|
+
while (num.compare(0) === 1) {
|
|
137
|
+
var div = num.divRem(alphabet_size);
|
|
138
|
+
// remainder = num % alphabet_size
|
|
139
|
+
var remainder = div[1];
|
|
140
|
+
// num = num / alphabet_size
|
|
141
|
+
num = div[0];
|
|
142
|
+
buf[index + i] = alphabet[remainder.toJSValue()];
|
|
143
|
+
i--;
|
|
144
|
+
}
|
|
145
|
+
return buf;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
b58.encode = function (hex) {
|
|
149
|
+
var data = hextobin(hex);
|
|
150
|
+
if (data.length === 0) {
|
|
151
|
+
return "";
|
|
152
|
+
}
|
|
153
|
+
var full_block_count = Math.floor(data.length / full_block_size);
|
|
154
|
+
var last_block_size = data.length % full_block_size;
|
|
155
|
+
var res_size = full_block_count * full_encoded_block_size + encoded_block_sizes[last_block_size];
|
|
156
|
+
|
|
157
|
+
var res = new Uint8Array(res_size);
|
|
158
|
+
var i;
|
|
159
|
+
for (i = 0; i < res_size; ++i) {
|
|
160
|
+
res[i] = alphabet[0];
|
|
161
|
+
}
|
|
162
|
+
for (i = 0; i < full_block_count; i++) {
|
|
163
|
+
res = b58.encode_block(data.subarray(i * full_block_size, i * full_block_size + full_block_size), res, i * full_encoded_block_size);
|
|
164
|
+
}
|
|
165
|
+
if (last_block_size > 0) {
|
|
166
|
+
res = b58.encode_block(data.subarray(full_block_count * full_block_size, full_block_count * full_block_size + last_block_size), res, full_block_count * full_encoded_block_size)
|
|
167
|
+
}
|
|
168
|
+
return bintostr(res);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
b58.decode_block = function (data, buf, index) {
|
|
172
|
+
if (data.length < 1 || data.length > full_encoded_block_size) {
|
|
173
|
+
throw "Invalid block length: " + data.length;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
var res_size = encoded_block_sizes.indexOf(data.length);
|
|
177
|
+
if (res_size <= 0) {
|
|
178
|
+
throw "Invalid block size";
|
|
179
|
+
}
|
|
180
|
+
var res_num = new JSBigInt(0);
|
|
181
|
+
var order = new JSBigInt(1);
|
|
182
|
+
for (var i = data.length - 1; i >= 0; i--) {
|
|
183
|
+
var digit = alphabet.indexOf(data[i]);
|
|
184
|
+
if (digit < 0) {
|
|
185
|
+
throw "Invalid symbol";
|
|
186
|
+
}
|
|
187
|
+
var product = order.multiply(digit).add(res_num);
|
|
188
|
+
// if product > UINT64_MAX
|
|
189
|
+
if (product.compare(UINT64_MAX) === 1) {
|
|
190
|
+
throw "Overflow";
|
|
191
|
+
}
|
|
192
|
+
res_num = product;
|
|
193
|
+
order = order.multiply(alphabet_size);
|
|
194
|
+
}
|
|
195
|
+
if (res_size < full_block_size && (new JSBigInt(2).pow(8 * res_size).compare(res_num) <= 0)) {
|
|
196
|
+
throw "Overflow 2";
|
|
197
|
+
}
|
|
198
|
+
buf.set(uint64_to_8be(res_num, res_size), index);
|
|
199
|
+
return buf;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
b58.decode = function (enc) {
|
|
203
|
+
enc = strtobin(enc);
|
|
204
|
+
if (enc.length === 0) {
|
|
205
|
+
return "";
|
|
206
|
+
}
|
|
207
|
+
var full_block_count = Math.floor(enc.length / full_encoded_block_size);
|
|
208
|
+
var last_block_size = enc.length % full_encoded_block_size;
|
|
209
|
+
var last_block_decoded_size = encoded_block_sizes.indexOf(last_block_size);
|
|
210
|
+
if (last_block_decoded_size < 0) {
|
|
211
|
+
throw "Invalid encoded length";
|
|
212
|
+
}
|
|
213
|
+
var data_size = full_block_count * full_block_size + last_block_decoded_size;
|
|
214
|
+
var data = new Uint8Array(data_size);
|
|
215
|
+
for (var i = 0; i < full_block_count; i++) {
|
|
216
|
+
data = b58.decode_block(enc.subarray(i * full_encoded_block_size, i * full_encoded_block_size + full_encoded_block_size), data, i * full_block_size);
|
|
217
|
+
}
|
|
218
|
+
if (last_block_size > 0) {
|
|
219
|
+
data = b58.decode_block(enc.subarray(full_block_count * full_encoded_block_size, full_block_count * full_encoded_block_size + last_block_size), data, full_block_count * full_block_size);
|
|
220
|
+
}
|
|
221
|
+
return bintohex(data);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
return b58;
|
|
225
|
+
})();
|
|
226
|
+
export default cnBase58;
|