@aeternity/aepp-sdk 9.0.1 → 10.0.0-beta.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/dist/aepp-sdk.browser-script.js +1 -1
- package/dist/aepp-sdk.browser-script.js.LICENSE.txt +0 -9
- package/dist/aepp-sdk.browser-script.js.map +1 -1
- package/dist/aepp-sdk.browser.js +1 -1
- package/dist/aepp-sdk.browser.js.map +1 -1
- package/dist/aepp-sdk.js +1 -1
- package/dist/aepp-sdk.js.map +1 -1
- package/es/account/base.js +30 -122
- package/es/account/base.js.map +1 -1
- package/es/account/memory.js +17 -19
- package/es/account/memory.js.map +1 -1
- package/es/account/multiple.js +73 -164
- package/es/account/multiple.js.map +1 -1
- package/es/ae/aens.js +164 -599
- package/es/ae/aens.js.map +1 -1
- package/es/ae/contract.js +82 -759
- package/es/ae/contract.js.map +1 -1
- package/es/ae/index.js +78 -315
- package/es/ae/index.js.map +1 -1
- package/es/ae/oracle.js +130 -498
- package/es/ae/oracle.js.map +1 -1
- package/es/chain/index.js +1 -1
- package/es/chain/index.js.map +1 -1
- package/es/chain/node.js +288 -1008
- package/es/chain/node.js.map +1 -1
- package/es/channel/handlers.js +597 -1086
- package/es/channel/handlers.js.map +1 -1
- package/es/channel/index.js +203 -451
- package/es/channel/index.js.map +1 -1
- package/es/channel/internal.js +129 -301
- package/es/channel/internal.js.map +1 -1
- package/es/contract/aci/index.js +319 -480
- package/es/contract/aci/index.js.map +1 -1
- package/es/contract/aci/transformation.js +35 -711
- package/es/contract/aci/transformation.js.map +1 -1
- package/es/contract/compiler.js +129 -203
- package/es/contract/compiler.js.map +1 -1
- package/es/contract/ga/helpers.js +16 -114
- package/es/contract/ga/helpers.js.map +1 -1
- package/es/contract/ga/index.js +101 -242
- package/es/contract/ga/index.js.map +1 -1
- package/es/contract/index.js +1 -1
- package/es/contract/index.js.map +1 -1
- package/es/index.js +1 -2
- package/es/index.js.map +1 -1
- package/es/node-pool/index.js +54 -73
- package/es/node-pool/index.js.map +1 -1
- package/es/node.js +56 -157
- package/es/node.js.map +1 -1
- package/es/other.d.ts +1 -1
- package/es/tx/builder/helpers.js +38 -75
- package/es/tx/builder/helpers.js.map +1 -1
- package/es/tx/builder/index.js +196 -294
- package/es/tx/builder/index.js.map +1 -1
- package/es/tx/builder/schema.js +577 -459
- package/es/tx/builder/schema.js.map +1 -1
- package/es/tx/index.js +1 -1
- package/es/tx/index.js.map +1 -1
- package/es/tx/tx-object.js +105 -132
- package/es/tx/tx-object.js.map +1 -1
- package/es/tx/tx.js +808 -1628
- package/es/tx/tx.js.map +1 -1
- package/es/tx/validator.js +132 -268
- package/es/tx/validator.js.map +1 -1
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js +17 -21
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js.map +1 -1
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js +38 -74
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js.map +1 -1
- package/es/utils/aepp-wallet-communication/content-script-bridge.js +14 -15
- package/es/utils/aepp-wallet-communication/content-script-bridge.js.map +1 -1
- package/es/utils/aepp-wallet-communication/helpers.js +60 -105
- package/es/utils/aepp-wallet-communication/helpers.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js +179 -510
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js +70 -89
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js +353 -600
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js.map +1 -1
- package/es/utils/aepp-wallet-communication/schema.js +43 -39
- package/es/utils/aepp-wallet-communication/schema.js.map +1 -1
- package/es/utils/aepp-wallet-communication/wallet-detector.js +32 -58
- package/es/utils/aepp-wallet-communication/wallet-detector.js.map +1 -1
- package/es/utils/amount-formatter.js +41 -61
- package/es/utils/amount-formatter.js.map +1 -1
- package/es/utils/async-init.js +28 -64
- package/es/utils/async-init.js.map +1 -1
- package/es/utils/bignumber.js +3 -11
- package/es/utils/bignumber.js.map +1 -1
- package/es/utils/bytes.js +5 -9
- package/es/utils/bytes.js.map +1 -1
- package/es/utils/crypto.js +47 -62
- package/es/utils/crypto.js.map +1 -1
- package/es/utils/hd-wallet.js +45 -81
- package/es/utils/hd-wallet.js.map +1 -1
- package/es/utils/json-big.js +16 -49
- package/es/utils/json-big.js.map +1 -1
- package/es/utils/keystore.js +81 -246
- package/es/utils/keystore.js.map +1 -1
- package/es/utils/mptree.js +88 -134
- package/es/utils/mptree.js.map +1 -1
- package/es/utils/other.js +10 -60
- package/es/utils/other.js.map +1 -1
- package/es/utils/semver-satisfies.js +9 -28
- package/es/utils/semver-satisfies.js.map +1 -1
- package/es/utils/string.js +4 -13
- package/es/utils/string.js.map +1 -1
- package/es/utils/swagger.js +85 -224
- package/es/utils/swagger.js.map +1 -1
- package/package.json +44 -40
- package/src/account/multiple.js +18 -19
- package/src/ae/aens.js +25 -21
- package/src/ae/contract.js +32 -163
- package/src/ae/index.js +3 -3
- package/src/ae/oracle.js +18 -14
- package/src/chain/node.js +2 -4
- package/src/channel/handlers.js +0 -1
- package/src/channel/index.js +4 -5
- package/src/contract/aci/index.js +221 -102
- package/src/contract/aci/transformation.js +30 -422
- package/src/contract/compiler.js +45 -4
- package/src/contract/ga/helpers.js +1 -8
- package/src/contract/ga/index.js +13 -11
- package/src/index.js +0 -2
- package/src/node-pool/index.js +21 -12
- package/src/node.js +22 -26
- package/src/tx/builder/index.js +2 -1
- package/src/tx/builder/schema.js +2 -1
- package/src/tx/tx.js +147 -143
- package/src/tx/validator.js +9 -7
- package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +1 -3
- package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +3 -3
- package/src/utils/aepp-wallet-communication/schema.js +1 -3
- package/src/utils/bignumber.ts +2 -1
- package/src/utils/other.ts +1 -1
- package/src/utils/semver-satisfies.ts +1 -1
- package/src/utils/swagger.js +14 -7
- package/src/contract/aci/helpers.js +0 -140
package/es/utils/crypto.js
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import _Number$MAX_SAFE_INTEGER from "@babel/runtime-corejs3/core-js-stable/number/max-safe-integer";
|
|
2
|
-
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
3
|
-
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
|
|
4
|
-
import _findIndexInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find-index";
|
|
5
|
-
|
|
6
1
|
/*
|
|
7
2
|
* ISC License (ISC)
|
|
8
3
|
* Copyright 2018 aeternity developers
|
|
@@ -34,7 +29,7 @@ import { str2buf, toBytes } from './bytes';
|
|
|
34
29
|
import { decode } from '../tx/builder/helpers';
|
|
35
30
|
import { hash } from './crypto-ts';
|
|
36
31
|
export * from './crypto-ts';
|
|
37
|
-
|
|
32
|
+
const Ecb = aesjs.ModeOfOperation.ecb;
|
|
38
33
|
/**
|
|
39
34
|
* Generate address from secret key
|
|
40
35
|
* @rtype (secret: String) => tx: Promise[String]
|
|
@@ -43,9 +38,9 @@ var Ecb = aesjs.ModeOfOperation.ecb;
|
|
|
43
38
|
*/
|
|
44
39
|
|
|
45
40
|
export function getAddressFromPriv(secret) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return
|
|
41
|
+
const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret));
|
|
42
|
+
const publicBuffer = Buffer.from(keys.publicKey);
|
|
43
|
+
return `ak_${encodeBase58Check(publicBuffer)}`;
|
|
49
44
|
}
|
|
50
45
|
/**
|
|
51
46
|
* Check if address is valid
|
|
@@ -56,7 +51,7 @@ export function getAddressFromPriv(secret) {
|
|
|
56
51
|
*/
|
|
57
52
|
|
|
58
53
|
export function isAddressValid(address) {
|
|
59
|
-
|
|
54
|
+
let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'ak';
|
|
60
55
|
if (typeof address !== 'string') return false;
|
|
61
56
|
|
|
62
57
|
try {
|
|
@@ -92,7 +87,7 @@ export function sha256hash(input) {
|
|
|
92
87
|
*/
|
|
93
88
|
|
|
94
89
|
export function salt() {
|
|
95
|
-
return Math.floor(Math.random() * Math.floor(
|
|
90
|
+
return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));
|
|
96
91
|
}
|
|
97
92
|
/**
|
|
98
93
|
* Base64check encode given `input`
|
|
@@ -102,25 +97,19 @@ export function salt() {
|
|
|
102
97
|
*/
|
|
103
98
|
|
|
104
99
|
export function encodeBase64Check(input) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
var payloadWithChecksum = _concatInstanceProperty(Buffer).call(Buffer, [buffer, checksum], buffer.length + 4);
|
|
109
|
-
|
|
100
|
+
const buffer = Buffer.from(input);
|
|
101
|
+
const checksum = checkSumFn(input);
|
|
102
|
+
const payloadWithChecksum = Buffer.concat([buffer, checksum], buffer.length + 4);
|
|
110
103
|
return payloadWithChecksum.toString('base64');
|
|
111
104
|
}
|
|
112
105
|
export function checkSumFn(payload) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return _sliceInstanceProperty(_context = sha256hash(sha256hash(payload))).call(_context, 0, 4);
|
|
106
|
+
return sha256hash(sha256hash(payload)).slice(0, 4);
|
|
116
107
|
}
|
|
117
108
|
|
|
118
109
|
function decodeRaw(buffer) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
var newChecksum = checkSumFn(payload);
|
|
110
|
+
const payload = buffer.slice(0, -4);
|
|
111
|
+
const checksum = buffer.slice(-4);
|
|
112
|
+
const newChecksum = checkSumFn(payload);
|
|
124
113
|
if (!checksum.equals(newChecksum)) return;
|
|
125
114
|
return payload;
|
|
126
115
|
}
|
|
@@ -133,8 +122,8 @@ function decodeRaw(buffer) {
|
|
|
133
122
|
|
|
134
123
|
|
|
135
124
|
export function decodeBase64Check(str) {
|
|
136
|
-
|
|
137
|
-
|
|
125
|
+
const buffer = Buffer.from(str, 'base64');
|
|
126
|
+
const payload = decodeRaw(buffer);
|
|
138
127
|
if (!payload) throw new Error('Invalid checksum');
|
|
139
128
|
return Buffer.from(payload);
|
|
140
129
|
}
|
|
@@ -167,11 +156,9 @@ export function decodeBase58Check(str) {
|
|
|
167
156
|
*/
|
|
168
157
|
|
|
169
158
|
export function encodeUnsigned(value) {
|
|
170
|
-
|
|
159
|
+
const binary = Buffer.allocUnsafe(4);
|
|
171
160
|
binary.writeUInt32BE(value);
|
|
172
|
-
return
|
|
173
|
-
return i !== 0;
|
|
174
|
-
}));
|
|
161
|
+
return binary.slice(binary.findIndex(i => i !== 0));
|
|
175
162
|
} // Todo Duplicated in tx builder. remove
|
|
176
163
|
|
|
177
164
|
/**
|
|
@@ -183,11 +170,9 @@ export function encodeUnsigned(value) {
|
|
|
183
170
|
*/
|
|
184
171
|
|
|
185
172
|
export function encodeContractAddress(owner, nonce) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
return "ct_".concat(encodeBase58Check(hash(binary)));
|
|
173
|
+
const publicKey = decode(owner, 'ak');
|
|
174
|
+
const binary = Buffer.concat([publicKey, encodeUnsigned(nonce)]);
|
|
175
|
+
return `ct_${encodeBase58Check(hash(binary))}`;
|
|
191
176
|
} // KEY-PAIR HELPERS
|
|
192
177
|
|
|
193
178
|
/**
|
|
@@ -208,11 +193,11 @@ export function generateKeyPairFromSecret(secret) {
|
|
|
208
193
|
*/
|
|
209
194
|
|
|
210
195
|
export function generateKeyPair() {
|
|
211
|
-
|
|
196
|
+
let raw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
212
197
|
// <node>/apps/aens/test/aens_test_utils.erl
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
198
|
+
const keyPair = nacl.sign.keyPair();
|
|
199
|
+
const publicBuffer = Buffer.from(keyPair.publicKey);
|
|
200
|
+
const secretBuffer = Buffer.from(keyPair.secretKey);
|
|
216
201
|
|
|
217
202
|
if (raw) {
|
|
218
203
|
return {
|
|
@@ -221,7 +206,7 @@ export function generateKeyPair() {
|
|
|
221
206
|
};
|
|
222
207
|
} else {
|
|
223
208
|
return {
|
|
224
|
-
publicKey:
|
|
209
|
+
publicKey: `ak_${encodeBase58Check(publicBuffer)}`,
|
|
225
210
|
secretKey: secretBuffer.toString('hex')
|
|
226
211
|
};
|
|
227
212
|
}
|
|
@@ -235,8 +220,8 @@ export function generateKeyPair() {
|
|
|
235
220
|
*/
|
|
236
221
|
|
|
237
222
|
export function encryptKey(password, binaryData) {
|
|
238
|
-
|
|
239
|
-
|
|
223
|
+
const hashedPasswordBytes = sha256hash(password);
|
|
224
|
+
const aesEcb = new Ecb(hashedPasswordBytes);
|
|
240
225
|
return aesEcb.encrypt(binaryData);
|
|
241
226
|
}
|
|
242
227
|
/**
|
|
@@ -248,9 +233,9 @@ export function encryptKey(password, binaryData) {
|
|
|
248
233
|
*/
|
|
249
234
|
|
|
250
235
|
export function decryptKey(password, encrypted) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
236
|
+
const encryptedBytes = Buffer.from(encrypted);
|
|
237
|
+
const hashedPasswordBytes = sha256hash(password);
|
|
238
|
+
const aesEcb = new Ecb(hashedPasswordBytes);
|
|
254
239
|
return Buffer.from(aesEcb.decrypt(encryptedBytes));
|
|
255
240
|
} // SIGNATURES
|
|
256
241
|
|
|
@@ -278,10 +263,10 @@ export function verify(str, signature, publicKey) {
|
|
|
278
263
|
return nacl.sign.detached.verify(new Uint8Array(str), signature, publicKey);
|
|
279
264
|
}
|
|
280
265
|
export function messageToHash(message) {
|
|
281
|
-
|
|
282
|
-
|
|
266
|
+
const p = Buffer.from('aeternity Signed Message:\n', 'utf8');
|
|
267
|
+
const msg = Buffer.from(message, 'utf8');
|
|
283
268
|
if (msg.length >= 0xFD) throw new Error('message too long');
|
|
284
|
-
return hash(
|
|
269
|
+
return hash(Buffer.concat([Buffer.from([p.length]), p, Buffer.from([msg.length]), msg]));
|
|
285
270
|
}
|
|
286
271
|
export function signMessage(message, privateKey) {
|
|
287
272
|
return sign(messageToHash(message), privateKey);
|
|
@@ -298,9 +283,9 @@ export function verifyMessage(str, signature, publicKey) {
|
|
|
298
283
|
*/
|
|
299
284
|
|
|
300
285
|
export function aeEncodeKey(binaryKey) {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
return
|
|
286
|
+
const publicKeyBuffer = Buffer.from(binaryKey, 'hex');
|
|
287
|
+
const pubKeyAddress = encodeBase58Check(publicKeyBuffer);
|
|
288
|
+
return `ak_${pubKeyAddress}`;
|
|
304
289
|
}
|
|
305
290
|
/**
|
|
306
291
|
* Check key pair for validity
|
|
@@ -313,8 +298,8 @@ export function aeEncodeKey(binaryKey) {
|
|
|
313
298
|
*/
|
|
314
299
|
|
|
315
300
|
export function isValidKeypair(privateKey, publicKey) {
|
|
316
|
-
|
|
317
|
-
|
|
301
|
+
const message = Buffer.from('TheMessage');
|
|
302
|
+
const signature = sign(message, privateKey);
|
|
318
303
|
return verify(message, signature, publicKey);
|
|
319
304
|
}
|
|
320
305
|
/**
|
|
@@ -328,10 +313,10 @@ export function isValidKeypair(privateKey, publicKey) {
|
|
|
328
313
|
*/
|
|
329
314
|
|
|
330
315
|
export function encryptData(msg, publicKey) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
316
|
+
const ephemeralKeyPair = nacl.box.keyPair();
|
|
317
|
+
const pubKeyUInt8Array = decode(publicKey, 'ak');
|
|
318
|
+
const nonce = nacl.randomBytes(nacl.box.nonceLength);
|
|
319
|
+
const encryptedMessage = nacl.box(Buffer.from(msg), nonce, ed2curve.convertPublicKey(pubKeyUInt8Array), ephemeralKeyPair.secretKey);
|
|
335
320
|
return {
|
|
336
321
|
ciphertext: Buffer.from(encryptedMessage).toString('hex'),
|
|
337
322
|
ephemPubKey: Buffer.from(ephemeralKeyPair.publicKey).toString('hex'),
|
|
@@ -348,11 +333,11 @@ export function encryptData(msg, publicKey) {
|
|
|
348
333
|
*/
|
|
349
334
|
|
|
350
335
|
export function decryptData(secretKey, encryptedData) {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
336
|
+
const receiverSecretKeyUint8Array = ed2curve.convertSecretKey(Buffer.from(secretKey, 'hex'));
|
|
337
|
+
const nonce = Buffer.from(encryptedData.nonce, 'hex');
|
|
338
|
+
const ciphertext = Buffer.from(encryptedData.ciphertext, 'hex');
|
|
339
|
+
const ephemPubKey = Buffer.from(encryptedData.ephemPubKey, 'hex');
|
|
340
|
+
const decrypted = nacl.box.open(ciphertext, nonce, ephemPubKey, receiverSecretKeyUint8Array);
|
|
356
341
|
return decrypted ? Buffer.from(decrypted) : decrypted;
|
|
357
342
|
}
|
|
358
343
|
//# sourceMappingURL=crypto.js.map
|
package/es/utils/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/crypto.js"],"names":["bs58check","ed2curve","nacl","aesjs","shajs","str2buf","toBytes","decode","hash","Ecb","ModeOfOperation","ecb","getAddressFromPriv","secret","keys","sign","keyPair","fromSecretKey","publicBuffer","Buffer","from","publicKey","encodeBase58Check","isAddressValid","address","prefix","length","e","addressFromDecimal","decimalAddress","aeEncodeKey","sha256hash","input","update","digest","salt","Math","floor","random","encodeBase64Check","buffer","checksum","checkSumFn","payloadWithChecksum","toString","payload","decodeRaw","newChecksum","equals","decodeBase64Check","str","Error","encode","decodeBase58Check","encodeUnsigned","value","binary","allocUnsafe","writeUInt32BE","i","encodeContractAddress","owner","nonce","generateKeyPairFromSecret","generateKeyPair","raw","secretBuffer","secretKey","encryptKey","password","binaryData","hashedPasswordBytes","aesEcb","encrypt","decryptKey","encrypted","encryptedBytes","decrypt","data","privateKey","detached","verify","signature","Uint8Array","messageToHash","message","p","msg","signMessage","verifyMessage","binaryKey","publicKeyBuffer","pubKeyAddress","isValidKeypair","encryptData","ephemeralKeyPair","box","pubKeyUInt8Array","randomBytes","nonceLength","encryptedMessage","convertPublicKey","ciphertext","ephemPubKey","version","decryptData","encryptedData","receiverSecretKeyUint8Array","convertSecretKey","decrypted","open"],"mappings":"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","sourcesContent":["/*\n * ISC License (ISC)\n * Copyright 2018 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n/**\n * Crypto module\n * @module @aeternity/aepp-sdk/es/utils/crypto\n * @example import { Crypto } from '@aeternity/aepp-sdk'\n */\n\nimport bs58check from 'bs58check'\nimport ed2curve from 'ed2curve'\nimport nacl from 'tweetnacl'\nimport aesjs from 'aes-js'\nimport shajs from 'sha.js'\n\nimport { str2buf, toBytes } from './bytes'\nimport { decode } from '../tx/builder/helpers'\nimport { hash } from './crypto-ts'\n\nexport * from './crypto-ts'\n\nconst Ecb = aesjs.ModeOfOperation.ecb\n\n/**\n * Generate address from secret key\n * @rtype (secret: String) => tx: Promise[String]\n * @param {String} secret - Private key\n * @return {String} Public key\n */\nexport function getAddressFromPriv (secret) {\n const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret))\n const publicBuffer = Buffer.from(keys.publicKey)\n return `ak_${encodeBase58Check(publicBuffer)}`\n}\n\n/**\n * Check if address is valid\n * @rtype (input: String) => valid: Boolean\n * @param {String} address - Address\n * @param {String} prefix Transaction prefix. Default: 'ak'\n * @return {Boolean} valid\n */\nexport function isAddressValid (address, prefix = 'ak') {\n if (typeof address !== 'string') return false\n try {\n return decode(address, prefix).length === 32\n } catch (e) {\n return false\n }\n}\n\n/**\n * Parse decimal address and return base58Check encoded address with prefix 'ak'\n * @rtype (input: String) => address: String\n * @param {String} decimalAddress - Address\n * @return {String} address\n */\nexport function addressFromDecimal (decimalAddress) {\n return aeEncodeKey(toBytes(decimalAddress, true))\n}\n\n/**\n * Calculate SHA256 hash of `input`\n * @rtype (input: String) => hash: String\n * @param {String} input - Data to hash\n * @return {String} Hash\n */\nexport function sha256hash (input) {\n return shajs('sha256').update(input).digest()\n}\n\n/**\n * Generate a random salt (positive integer)\n * @rtype () => salt: Number\n * @return {Number} random salt\n */\nexport function salt () {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER))\n}\n\n/**\n * Base64check encode given `input`\n * @rtype (input: String|buffer) => Buffer\n * @param {String} input - Data to encode\n * @return {Buffer} Base64check encoded data\n */\nexport function encodeBase64Check (input) {\n const buffer = Buffer.from(input)\n const checksum = checkSumFn(input)\n const payloadWithChecksum = Buffer.concat([buffer, checksum], buffer.length + 4)\n return payloadWithChecksum.toString('base64')\n}\n\nexport function checkSumFn (payload) {\n return sha256hash(sha256hash(payload)).slice(0, 4)\n}\n\nfunction decodeRaw (buffer) {\n const payload = buffer.slice(0, -4)\n const checksum = buffer.slice(-4)\n const newChecksum = checkSumFn(payload)\n\n if (!checksum.equals(newChecksum)) return\n\n return payload\n}\n\n/**\n * Base64check decode given `str`\n * @rtype (str: String) => Buffer\n * @param {String} str - Data to decode\n * @return {Buffer} Base64check decoded data\n */\nexport function decodeBase64Check (str) {\n const buffer = Buffer.from(str, 'base64')\n const payload = decodeRaw(buffer)\n if (!payload) throw new Error('Invalid checksum')\n return Buffer.from(payload)\n}\n\n/**\n * Base58 encode given `input`\n * @rtype (input: String) => String\n * @param {String|Buffer} input - Data to encode\n * @return {String} Base58 encoded data\n */\nexport function encodeBase58Check (input) {\n return bs58check.encode(Buffer.from(input))\n}\n\n/**\n * Base58 decode given `str`\n * @rtype (str: String) => Buffer\n * @param {String} str - Data to decode\n * @return {Buffer} Base58 decoded data\n */\nexport function decodeBase58Check (str) {\n return bs58check.decode(str)\n}\n\n/**\n * Converts a positive integer to the smallest possible\n * representation in a binary digit representation\n * @rtype (value: Number) => Buffer\n * @param {Number} value - Value to encode\n * @return {Buffer} - Encoded data\n */\nexport function encodeUnsigned (value) {\n const binary = Buffer.allocUnsafe(4)\n binary.writeUInt32BE(value)\n return binary.slice(binary.findIndex(i => i !== 0))\n}\n\n// Todo Duplicated in tx builder. remove\n/**\n * Compute contract address\n * @rtype (owner: String, nonce: Number) => String\n * @param {String} owner - Address of contract owner\n * @param {Number} nonce - Round when contract was created\n * @return {String} - Contract address\n */\nexport function encodeContractAddress (owner, nonce) {\n const publicKey = decode(owner, 'ak')\n const binary = Buffer.concat([publicKey, encodeUnsigned(nonce)])\n return `ct_${encodeBase58Check(hash(binary))}`\n}\n\n// KEY-PAIR HELPERS\n\n/**\n * Generate keyPair from secret key\n * @rtype (secret: Uint8Array) => KeyPair\n * @param {Uint8Array} secret - secret key\n * @return {Object} - Object with Private(privateKey) and Public(publicKey) keys\n */\nexport function generateKeyPairFromSecret (secret) {\n return nacl.sign.keyPair.fromSecretKey(secret)\n}\n\n/**\n * Generate a random ED25519 keypair\n * @rtype (raw: Boolean) => {publicKey: String, secretKey: String} | {publicKey: Buffer, secretKey: Buffer}\n * @param {Boolean} raw - Whether to return raw (binary) keys\n * @return {Object} Key pair\n */\nexport function generateKeyPair (raw = false) {\n // <node>/apps/aens/test/aens_test_utils.erl\n const keyPair = nacl.sign.keyPair()\n\n const publicBuffer = Buffer.from(keyPair.publicKey)\n const secretBuffer = Buffer.from(keyPair.secretKey)\n\n if (raw) {\n return {\n publicKey: publicBuffer,\n secretKey: secretBuffer\n }\n } else {\n return {\n publicKey: `ak_${encodeBase58Check(publicBuffer)}`,\n secretKey: secretBuffer.toString('hex')\n }\n }\n}\n\n/**\n * Encrypt given data using `password`\n * @rtype (password: String, binaryData: Buffer) => Uint8Array\n * @param {String} password - Password to encrypt with\n * @param {Buffer} binaryData - Data to encrypt\n * @return {Uint8Array} Encrypted data\n */\nexport function encryptKey (password, binaryData) {\n const hashedPasswordBytes = sha256hash(password)\n const aesEcb = new Ecb(hashedPasswordBytes)\n return aesEcb.encrypt(binaryData)\n}\n\n/**\n * Decrypt given data using `password`\n * @rtype (password: String, encrypted: String) => Uint8Array\n * @param {String} password - Password to decrypt with\n * @param {String} encrypted - Data to decrypt\n * @return {Buffer} Decrypted data\n */\nexport function decryptKey (password, encrypted) {\n const encryptedBytes = Buffer.from(encrypted)\n const hashedPasswordBytes = sha256hash(password)\n const aesEcb = new Ecb(hashedPasswordBytes)\n return Buffer.from(aesEcb.decrypt(encryptedBytes))\n}\n\n// SIGNATURES\n\n/**\n * Generate signature\n * @rtype (data: String|Buffer, privateKey: Buffer) => Buffer\n * @param {String|Buffer} data - Data to sign\n * @param {String|Buffer} privateKey - Key to sign with\n * @return {Buffer|Uint8Array} Signature\n */\nexport function sign (data, privateKey) {\n return nacl.sign.detached(Buffer.from(data), Buffer.from(privateKey))\n}\n\n/**\n * Verify that signature was signed by public key\n * @rtype (str: String, signature: Buffer, publicKey: Buffer) => Boolean\n * @param {String|Buffer} str - Data to verify\n * @param {Buffer} signature - Signature to verify\n * @param {Buffer} publicKey - Key to verify against\n * @return {Boolean} Valid?\n */\nexport function verify (str, signature, publicKey) {\n return nacl.sign.detached.verify(new Uint8Array(str), signature, publicKey)\n}\n\nexport function messageToHash (message) {\n const p = Buffer.from('aeternity Signed Message:\\n', 'utf8')\n const msg = Buffer.from(message, 'utf8')\n if (msg.length >= 0xFD) throw new Error('message too long')\n return hash(Buffer.concat([Buffer.from([p.length]), p, Buffer.from([msg.length]), msg]))\n}\n\nexport function signMessage (message, privateKey) {\n return sign(messageToHash(message), privateKey)\n}\n\nexport function verifyMessage (str, signature, publicKey) {\n return verify(messageToHash(str), signature, publicKey)\n}\n\n/**\n * æternity readable public keys are the base58-encoded public key, prepended\n * with 'ak_'\n * @rtype (binaryKey: Buffer) => String\n * @param {Buffer} binaryKey - Key to encode\n * @return {String} Encoded key\n */\nexport function aeEncodeKey (binaryKey) {\n const publicKeyBuffer = Buffer.from(binaryKey, 'hex')\n const pubKeyAddress = encodeBase58Check(publicKeyBuffer)\n return `ak_${pubKeyAddress}`\n}\n\n/**\n * Check key pair for validity\n *\n * Sign a message, and then verifying that signature\n * @rtype (privateKey: Buffer, publicKey: Buffer) => Boolean\n * @param {Buffer} privateKey - Private key to verify\n * @param {Buffer} publicKey - Public key to verify\n * @return {Boolean} Valid?\n */\nexport function isValidKeypair (privateKey, publicKey) {\n const message = Buffer.from('TheMessage')\n const signature = sign(message, privateKey)\n return verify(message, signature, publicKey)\n}\n\n/**\n * This function encrypts a message using base58check encoded and 'ak' prefixed\n * publicKey such that only the corresponding secretKey will\n * be able to decrypt\n * @rtype (msg: String, publicKey: String) => Object\n * @param {Buffer} msg - Data to encode\n * @param {String} publicKey - Public key\n * @return {Object}\n */\nexport function encryptData (msg, publicKey) {\n const ephemeralKeyPair = nacl.box.keyPair()\n const pubKeyUInt8Array = decode(publicKey, 'ak')\n const nonce = nacl.randomBytes(nacl.box.nonceLength)\n\n const encryptedMessage = nacl.box(\n Buffer.from(msg),\n nonce,\n ed2curve.convertPublicKey(pubKeyUInt8Array),\n ephemeralKeyPair.secretKey\n )\n\n return {\n ciphertext: Buffer.from(encryptedMessage).toString('hex'),\n ephemPubKey: Buffer.from(ephemeralKeyPair.publicKey).toString('hex'),\n nonce: Buffer.from(nonce).toString('hex'),\n version: 'x25519-xsalsa20-poly1305'\n }\n}\n\n/**\n * This function decrypt a message using secret key\n * @rtype (secretKey: String, encryptedData: Object) => Buffer|null\n * @param {String} secretKey - Secret key\n * @param {Object} encryptedData - Encrypted data\n * @return {Buffer|null}\n */\nexport function decryptData (secretKey, encryptedData) {\n const receiverSecretKeyUint8Array = ed2curve.convertSecretKey(Buffer.from(secretKey, 'hex'))\n const nonce = Buffer.from(encryptedData.nonce, 'hex')\n const ciphertext = Buffer.from(encryptedData.ciphertext, 'hex')\n const ephemPubKey = Buffer.from(encryptedData.ephemPubKey, 'hex')\n const decrypted = nacl.box.open(\n ciphertext,\n nonce,\n ephemPubKey,\n receiverSecretKeyUint8Array\n )\n return decrypted ? Buffer.from(decrypted) : decrypted\n}\n"],"file":"crypto.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/crypto.js"],"names":["bs58check","ed2curve","nacl","aesjs","shajs","str2buf","toBytes","decode","hash","Ecb","ModeOfOperation","ecb","getAddressFromPriv","secret","keys","sign","keyPair","fromSecretKey","publicBuffer","Buffer","from","publicKey","encodeBase58Check","isAddressValid","address","prefix","length","e","addressFromDecimal","decimalAddress","aeEncodeKey","sha256hash","input","update","digest","salt","Math","floor","random","Number","MAX_SAFE_INTEGER","encodeBase64Check","buffer","checksum","checkSumFn","payloadWithChecksum","concat","toString","payload","slice","decodeRaw","newChecksum","equals","decodeBase64Check","str","Error","encode","decodeBase58Check","encodeUnsigned","value","binary","allocUnsafe","writeUInt32BE","findIndex","i","encodeContractAddress","owner","nonce","generateKeyPairFromSecret","generateKeyPair","raw","secretBuffer","secretKey","encryptKey","password","binaryData","hashedPasswordBytes","aesEcb","encrypt","decryptKey","encrypted","encryptedBytes","decrypt","data","privateKey","detached","verify","signature","Uint8Array","messageToHash","message","p","msg","signMessage","verifyMessage","binaryKey","publicKeyBuffer","pubKeyAddress","isValidKeypair","encryptData","ephemeralKeyPair","box","pubKeyUInt8Array","randomBytes","nonceLength","encryptedMessage","convertPublicKey","ciphertext","ephemPubKey","version","decryptData","encryptedData","receiverSecretKeyUint8Array","convertSecretKey","decrypted","open"],"mappings":"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","sourcesContent":["/*\n * ISC License (ISC)\n * Copyright 2018 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n/**\n * Crypto module\n * @module @aeternity/aepp-sdk/es/utils/crypto\n * @example import { Crypto } from '@aeternity/aepp-sdk'\n */\n\nimport bs58check from 'bs58check'\nimport ed2curve from 'ed2curve'\nimport nacl from 'tweetnacl'\nimport aesjs from 'aes-js'\nimport shajs from 'sha.js'\n\nimport { str2buf, toBytes } from './bytes'\nimport { decode } from '../tx/builder/helpers'\nimport { hash } from './crypto-ts'\n\nexport * from './crypto-ts'\n\nconst Ecb = aesjs.ModeOfOperation.ecb\n\n/**\n * Generate address from secret key\n * @rtype (secret: String) => tx: Promise[String]\n * @param {String} secret - Private key\n * @return {String} Public key\n */\nexport function getAddressFromPriv (secret) {\n const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret))\n const publicBuffer = Buffer.from(keys.publicKey)\n return `ak_${encodeBase58Check(publicBuffer)}`\n}\n\n/**\n * Check if address is valid\n * @rtype (input: String) => valid: Boolean\n * @param {String} address - Address\n * @param {String} prefix Transaction prefix. Default: 'ak'\n * @return {Boolean} valid\n */\nexport function isAddressValid (address, prefix = 'ak') {\n if (typeof address !== 'string') return false\n try {\n return decode(address, prefix).length === 32\n } catch (e) {\n return false\n }\n}\n\n/**\n * Parse decimal address and return base58Check encoded address with prefix 'ak'\n * @rtype (input: String) => address: String\n * @param {String} decimalAddress - Address\n * @return {String} address\n */\nexport function addressFromDecimal (decimalAddress) {\n return aeEncodeKey(toBytes(decimalAddress, true))\n}\n\n/**\n * Calculate SHA256 hash of `input`\n * @rtype (input: String) => hash: String\n * @param {String} input - Data to hash\n * @return {String} Hash\n */\nexport function sha256hash (input) {\n return shajs('sha256').update(input).digest()\n}\n\n/**\n * Generate a random salt (positive integer)\n * @rtype () => salt: Number\n * @return {Number} random salt\n */\nexport function salt () {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER))\n}\n\n/**\n * Base64check encode given `input`\n * @rtype (input: String|buffer) => Buffer\n * @param {String} input - Data to encode\n * @return {Buffer} Base64check encoded data\n */\nexport function encodeBase64Check (input) {\n const buffer = Buffer.from(input)\n const checksum = checkSumFn(input)\n const payloadWithChecksum = Buffer.concat([buffer, checksum], buffer.length + 4)\n return payloadWithChecksum.toString('base64')\n}\n\nexport function checkSumFn (payload) {\n return sha256hash(sha256hash(payload)).slice(0, 4)\n}\n\nfunction decodeRaw (buffer) {\n const payload = buffer.slice(0, -4)\n const checksum = buffer.slice(-4)\n const newChecksum = checkSumFn(payload)\n\n if (!checksum.equals(newChecksum)) return\n\n return payload\n}\n\n/**\n * Base64check decode given `str`\n * @rtype (str: String) => Buffer\n * @param {String} str - Data to decode\n * @return {Buffer} Base64check decoded data\n */\nexport function decodeBase64Check (str) {\n const buffer = Buffer.from(str, 'base64')\n const payload = decodeRaw(buffer)\n if (!payload) throw new Error('Invalid checksum')\n return Buffer.from(payload)\n}\n\n/**\n * Base58 encode given `input`\n * @rtype (input: String) => String\n * @param {String|Buffer} input - Data to encode\n * @return {String} Base58 encoded data\n */\nexport function encodeBase58Check (input) {\n return bs58check.encode(Buffer.from(input))\n}\n\n/**\n * Base58 decode given `str`\n * @rtype (str: String) => Buffer\n * @param {String} str - Data to decode\n * @return {Buffer} Base58 decoded data\n */\nexport function decodeBase58Check (str) {\n return bs58check.decode(str)\n}\n\n/**\n * Converts a positive integer to the smallest possible\n * representation in a binary digit representation\n * @rtype (value: Number) => Buffer\n * @param {Number} value - Value to encode\n * @return {Buffer} - Encoded data\n */\nexport function encodeUnsigned (value) {\n const binary = Buffer.allocUnsafe(4)\n binary.writeUInt32BE(value)\n return binary.slice(binary.findIndex(i => i !== 0))\n}\n\n// Todo Duplicated in tx builder. remove\n/**\n * Compute contract address\n * @rtype (owner: String, nonce: Number) => String\n * @param {String} owner - Address of contract owner\n * @param {Number} nonce - Round when contract was created\n * @return {String} - Contract address\n */\nexport function encodeContractAddress (owner, nonce) {\n const publicKey = decode(owner, 'ak')\n const binary = Buffer.concat([publicKey, encodeUnsigned(nonce)])\n return `ct_${encodeBase58Check(hash(binary))}`\n}\n\n// KEY-PAIR HELPERS\n\n/**\n * Generate keyPair from secret key\n * @rtype (secret: Uint8Array) => KeyPair\n * @param {Uint8Array} secret - secret key\n * @return {Object} - Object with Private(privateKey) and Public(publicKey) keys\n */\nexport function generateKeyPairFromSecret (secret) {\n return nacl.sign.keyPair.fromSecretKey(secret)\n}\n\n/**\n * Generate a random ED25519 keypair\n * @rtype (raw: Boolean) => {publicKey: String, secretKey: String} | {publicKey: Buffer, secretKey: Buffer}\n * @param {Boolean} raw - Whether to return raw (binary) keys\n * @return {Object} Key pair\n */\nexport function generateKeyPair (raw = false) {\n // <node>/apps/aens/test/aens_test_utils.erl\n const keyPair = nacl.sign.keyPair()\n\n const publicBuffer = Buffer.from(keyPair.publicKey)\n const secretBuffer = Buffer.from(keyPair.secretKey)\n\n if (raw) {\n return {\n publicKey: publicBuffer,\n secretKey: secretBuffer\n }\n } else {\n return {\n publicKey: `ak_${encodeBase58Check(publicBuffer)}`,\n secretKey: secretBuffer.toString('hex')\n }\n }\n}\n\n/**\n * Encrypt given data using `password`\n * @rtype (password: String, binaryData: Buffer) => Uint8Array\n * @param {String} password - Password to encrypt with\n * @param {Buffer} binaryData - Data to encrypt\n * @return {Uint8Array} Encrypted data\n */\nexport function encryptKey (password, binaryData) {\n const hashedPasswordBytes = sha256hash(password)\n const aesEcb = new Ecb(hashedPasswordBytes)\n return aesEcb.encrypt(binaryData)\n}\n\n/**\n * Decrypt given data using `password`\n * @rtype (password: String, encrypted: String) => Uint8Array\n * @param {String} password - Password to decrypt with\n * @param {String} encrypted - Data to decrypt\n * @return {Buffer} Decrypted data\n */\nexport function decryptKey (password, encrypted) {\n const encryptedBytes = Buffer.from(encrypted)\n const hashedPasswordBytes = sha256hash(password)\n const aesEcb = new Ecb(hashedPasswordBytes)\n return Buffer.from(aesEcb.decrypt(encryptedBytes))\n}\n\n// SIGNATURES\n\n/**\n * Generate signature\n * @rtype (data: String|Buffer, privateKey: Buffer) => Buffer\n * @param {String|Buffer} data - Data to sign\n * @param {String|Buffer} privateKey - Key to sign with\n * @return {Buffer|Uint8Array} Signature\n */\nexport function sign (data, privateKey) {\n return nacl.sign.detached(Buffer.from(data), Buffer.from(privateKey))\n}\n\n/**\n * Verify that signature was signed by public key\n * @rtype (str: String, signature: Buffer, publicKey: Buffer) => Boolean\n * @param {String|Buffer} str - Data to verify\n * @param {Buffer} signature - Signature to verify\n * @param {Buffer} publicKey - Key to verify against\n * @return {Boolean} Valid?\n */\nexport function verify (str, signature, publicKey) {\n return nacl.sign.detached.verify(new Uint8Array(str), signature, publicKey)\n}\n\nexport function messageToHash (message) {\n const p = Buffer.from('aeternity Signed Message:\\n', 'utf8')\n const msg = Buffer.from(message, 'utf8')\n if (msg.length >= 0xFD) throw new Error('message too long')\n return hash(Buffer.concat([Buffer.from([p.length]), p, Buffer.from([msg.length]), msg]))\n}\n\nexport function signMessage (message, privateKey) {\n return sign(messageToHash(message), privateKey)\n}\n\nexport function verifyMessage (str, signature, publicKey) {\n return verify(messageToHash(str), signature, publicKey)\n}\n\n/**\n * æternity readable public keys are the base58-encoded public key, prepended\n * with 'ak_'\n * @rtype (binaryKey: Buffer) => String\n * @param {Buffer} binaryKey - Key to encode\n * @return {String} Encoded key\n */\nexport function aeEncodeKey (binaryKey) {\n const publicKeyBuffer = Buffer.from(binaryKey, 'hex')\n const pubKeyAddress = encodeBase58Check(publicKeyBuffer)\n return `ak_${pubKeyAddress}`\n}\n\n/**\n * Check key pair for validity\n *\n * Sign a message, and then verifying that signature\n * @rtype (privateKey: Buffer, publicKey: Buffer) => Boolean\n * @param {Buffer} privateKey - Private key to verify\n * @param {Buffer} publicKey - Public key to verify\n * @return {Boolean} Valid?\n */\nexport function isValidKeypair (privateKey, publicKey) {\n const message = Buffer.from('TheMessage')\n const signature = sign(message, privateKey)\n return verify(message, signature, publicKey)\n}\n\n/**\n * This function encrypts a message using base58check encoded and 'ak' prefixed\n * publicKey such that only the corresponding secretKey will\n * be able to decrypt\n * @rtype (msg: String, publicKey: String) => Object\n * @param {Buffer} msg - Data to encode\n * @param {String} publicKey - Public key\n * @return {Object}\n */\nexport function encryptData (msg, publicKey) {\n const ephemeralKeyPair = nacl.box.keyPair()\n const pubKeyUInt8Array = decode(publicKey, 'ak')\n const nonce = nacl.randomBytes(nacl.box.nonceLength)\n\n const encryptedMessage = nacl.box(\n Buffer.from(msg),\n nonce,\n ed2curve.convertPublicKey(pubKeyUInt8Array),\n ephemeralKeyPair.secretKey\n )\n\n return {\n ciphertext: Buffer.from(encryptedMessage).toString('hex'),\n ephemPubKey: Buffer.from(ephemeralKeyPair.publicKey).toString('hex'),\n nonce: Buffer.from(nonce).toString('hex'),\n version: 'x25519-xsalsa20-poly1305'\n }\n}\n\n/**\n * This function decrypt a message using secret key\n * @rtype (secretKey: String, encryptedData: Object) => Buffer|null\n * @param {String} secretKey - Secret key\n * @param {Object} encryptedData - Encrypted data\n * @return {Buffer|null}\n */\nexport function decryptData (secretKey, encryptedData) {\n const receiverSecretKeyUint8Array = ed2curve.convertSecretKey(Buffer.from(secretKey, 'hex'))\n const nonce = Buffer.from(encryptedData.nonce, 'hex')\n const ciphertext = Buffer.from(encryptedData.ciphertext, 'hex')\n const ephemPubKey = Buffer.from(encryptedData.ephemPubKey, 'hex')\n const decrypted = nacl.box.open(\n ciphertext,\n nonce,\n ephemPubKey,\n receiverSecretKeyUint8Array\n )\n return decrypted ? Buffer.from(decrypted) : decrypted\n}\n"],"file":"crypto.js"}
|
package/es/utils/hd-wallet.js
CHANGED
|
@@ -1,65 +1,39 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
|
|
2
|
-
|
|
3
|
-
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
-
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context4; _forEachInstanceProperty(_context4 = ownKeys(Object(source), true)).call(_context4, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context5; _forEachInstanceProperty(_context5 = ownKeys(Object(source))).call(_context5, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
6
|
-
|
|
7
|
-
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
|
8
|
-
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
|
|
9
|
-
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
|
|
10
|
-
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
|
|
11
|
-
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
12
|
-
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
|
13
|
-
import _fillInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/fill";
|
|
14
|
-
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
|
15
|
-
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
|
16
|
-
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
|
17
|
-
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
|
18
|
-
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
|
19
|
-
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
|
20
|
-
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
|
21
1
|
import nacl from 'tweetnacl';
|
|
22
2
|
import { full as hmac } from 'tweetnacl-auth';
|
|
23
3
|
import { fromString } from 'bip32-path';
|
|
24
4
|
import { validateMnemonic, mnemonicToSeed, generateMnemonic as genMnemonic } from '@aeternity/bip39';
|
|
25
5
|
import { decryptKey, encodeBase58Check, encryptKey } from './crypto';
|
|
26
|
-
|
|
27
|
-
|
|
6
|
+
const ED25519_CURVE = Buffer.from('ed25519 seed');
|
|
7
|
+
const HARDENED_OFFSET = 0x80000000;
|
|
28
8
|
|
|
29
|
-
|
|
30
|
-
return Buffer.from(buffer).toString('hex');
|
|
31
|
-
};
|
|
9
|
+
const toHex = buffer => Buffer.from(buffer).toString('hex');
|
|
32
10
|
|
|
33
11
|
export function derivePathFromKey(path, key) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
_forEachInstanceProperty(segments).call(segments, function (segment, i) {
|
|
12
|
+
const segments = path === '' ? [] : fromString(path).toPathArray();
|
|
13
|
+
segments.forEach((segment, i) => {
|
|
37
14
|
if (segment < HARDENED_OFFSET) {
|
|
38
|
-
throw new Error(
|
|
15
|
+
throw new Error(`Segment #${i + 1} is not hardened`);
|
|
39
16
|
}
|
|
40
17
|
});
|
|
41
|
-
|
|
42
|
-
return _reduceInstanceProperty(segments).call(segments, function (parentKey, segment) {
|
|
43
|
-
return deriveChild(parentKey, segment);
|
|
44
|
-
}, key);
|
|
18
|
+
return segments.reduce((parentKey, segment) => deriveChild(parentKey, segment), key);
|
|
45
19
|
}
|
|
46
20
|
export function derivePathFromSeed(path, seed) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!_includesInstanceProperty(_context = ['m', 'm/']).call(_context, _sliceInstanceProperty(path).call(path, 0, 2))) {
|
|
21
|
+
if (!['m', 'm/'].includes(path.slice(0, 2))) {
|
|
50
22
|
throw new Error('Invalid path');
|
|
51
23
|
}
|
|
52
24
|
|
|
53
|
-
|
|
54
|
-
return derivePathFromKey(
|
|
25
|
+
const masterKey = getMasterKeyFromSeed(seed);
|
|
26
|
+
return derivePathFromKey(path.slice(2), masterKey);
|
|
55
27
|
}
|
|
56
28
|
|
|
57
29
|
function formatAccount(keys) {
|
|
58
|
-
|
|
59
|
-
|
|
30
|
+
const {
|
|
31
|
+
secretKey,
|
|
32
|
+
publicKey
|
|
33
|
+
} = keys;
|
|
60
34
|
return {
|
|
61
35
|
secretKey: toHex(secretKey),
|
|
62
|
-
publicKey:
|
|
36
|
+
publicKey: `ak_${encodeBase58Check(publicKey)}`
|
|
63
37
|
};
|
|
64
38
|
}
|
|
65
39
|
|
|
@@ -70,36 +44,30 @@ export function generateMnemonic() {
|
|
|
70
44
|
return genMnemonic();
|
|
71
45
|
}
|
|
72
46
|
export function getMasterKeyFromSeed(seed) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
var IR = _sliceInstanceProperty(I).call(I, 32);
|
|
78
|
-
|
|
47
|
+
const I = hmac(seed, ED25519_CURVE);
|
|
48
|
+
const IL = I.slice(0, 32);
|
|
49
|
+
const IR = I.slice(32);
|
|
79
50
|
return {
|
|
80
51
|
secretKey: IL,
|
|
81
52
|
chainCode: IR
|
|
82
53
|
};
|
|
83
54
|
}
|
|
84
55
|
export function deriveChild(_ref, index) {
|
|
85
|
-
|
|
86
|
-
|
|
56
|
+
let {
|
|
57
|
+
secretKey,
|
|
58
|
+
chainCode
|
|
59
|
+
} = _ref;
|
|
87
60
|
|
|
88
61
|
if (index < HARDENED_OFFSET) {
|
|
89
|
-
throw new Error(
|
|
62
|
+
throw new Error(`Child index #${index} is not supported`);
|
|
90
63
|
}
|
|
91
64
|
|
|
92
|
-
|
|
65
|
+
const indexBuffer = Buffer.allocUnsafe(4);
|
|
93
66
|
indexBuffer.writeUInt32BE(index, 0);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
var IL = _sliceInstanceProperty(I).call(I, 0, 32);
|
|
100
|
-
|
|
101
|
-
var IR = _sliceInstanceProperty(I).call(I, 32);
|
|
102
|
-
|
|
67
|
+
const data = Buffer.concat([Buffer.alloc(1, 0), Buffer.from(secretKey), Buffer.from(indexBuffer)]);
|
|
68
|
+
const I = hmac(data, chainCode);
|
|
69
|
+
const IL = I.slice(0, 32);
|
|
70
|
+
const IR = I.slice(32);
|
|
103
71
|
return {
|
|
104
72
|
secretKey: IL,
|
|
105
73
|
chainCode: IR
|
|
@@ -110,39 +78,35 @@ export function generateSaveHDWallet(mnemonic, password) {
|
|
|
110
78
|
throw new Error('Invalid mnemonic');
|
|
111
79
|
}
|
|
112
80
|
|
|
113
|
-
|
|
114
|
-
|
|
81
|
+
const seed = mnemonicToSeed(mnemonic);
|
|
82
|
+
const walletKey = derivePathFromSeed('m/44h/457h', seed);
|
|
115
83
|
return {
|
|
116
84
|
secretKey: toHex(encryptKey(password, walletKey.secretKey)),
|
|
117
85
|
chainCode: toHex(encryptKey(password, walletKey.chainCode))
|
|
118
86
|
};
|
|
119
87
|
}
|
|
120
88
|
export function getSaveHDWalletAccounts(saveHDWallet, password, accountCount) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
var walletKey = {
|
|
89
|
+
const walletKey = {
|
|
124
90
|
secretKey: decryptKey(password, Buffer.from(saveHDWallet.secretKey, 'hex')),
|
|
125
91
|
chainCode: decryptKey(password, Buffer.from(saveHDWallet.chainCode, 'hex'))
|
|
126
92
|
};
|
|
127
|
-
return
|
|
128
|
-
return formatAccount(getKeyPair(derivePathFromKey("".concat(idx, "h/0h/0h"), walletKey).secretKey));
|
|
129
|
-
});
|
|
93
|
+
return new Array(accountCount).fill().map((_, idx) => formatAccount(getKeyPair(derivePathFromKey(`${idx}h/0h/0h`, walletKey).secretKey)));
|
|
130
94
|
}
|
|
131
|
-
export
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return
|
|
95
|
+
export const getHdWalletAccountFromMnemonic = (mnemonic, accountIdx) => {
|
|
96
|
+
const seed = mnemonicToSeed(mnemonic);
|
|
97
|
+
const walletKey = derivePathFromSeed('m/44h/457h', seed);
|
|
98
|
+
const derived = derivePathFromKey(`${accountIdx}h/0h/0h`, walletKey);
|
|
99
|
+
const keyPair = getKeyPair(derived.secretKey);
|
|
100
|
+
return { ...formatAccount(keyPair),
|
|
137
101
|
idx: accountIdx
|
|
138
|
-
}
|
|
102
|
+
};
|
|
139
103
|
};
|
|
140
104
|
export default {
|
|
141
|
-
getHdWalletAccountFromMnemonic
|
|
142
|
-
getSaveHDWalletAccounts
|
|
143
|
-
generateSaveHDWallet
|
|
144
|
-
generateMnemonic
|
|
145
|
-
deriveChild
|
|
146
|
-
getMasterKeyFromSeed
|
|
105
|
+
getHdWalletAccountFromMnemonic,
|
|
106
|
+
getSaveHDWalletAccounts,
|
|
107
|
+
generateSaveHDWallet,
|
|
108
|
+
generateMnemonic,
|
|
109
|
+
deriveChild,
|
|
110
|
+
getMasterKeyFromSeed
|
|
147
111
|
};
|
|
148
112
|
//# sourceMappingURL=hd-wallet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/hd-wallet.js"],"names":["nacl","full","hmac","fromString","validateMnemonic","mnemonicToSeed","generateMnemonic","genMnemonic","decryptKey","encodeBase58Check","encryptKey","ED25519_CURVE","Buffer","from","HARDENED_OFFSET","toHex","buffer","toString","derivePathFromKey","path","key","segments","toPathArray","segment","i","Error","parentKey","deriveChild","derivePathFromSeed","seed","masterKey","getMasterKeyFromSeed","formatAccount","keys","secretKey","publicKey","getKeyPair","sign","keyPair","fromSeed","I","IL","IR","chainCode","index","indexBuffer","allocUnsafe","writeUInt32BE","data","alloc","generateSaveHDWallet","mnemonic","password","walletKey","getSaveHDWalletAccounts","saveHDWallet","accountCount","Array","_","idx","getHdWalletAccountFromMnemonic","accountIdx","derived"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/hd-wallet.js"],"names":["nacl","full","hmac","fromString","validateMnemonic","mnemonicToSeed","generateMnemonic","genMnemonic","decryptKey","encodeBase58Check","encryptKey","ED25519_CURVE","Buffer","from","HARDENED_OFFSET","toHex","buffer","toString","derivePathFromKey","path","key","segments","toPathArray","forEach","segment","i","Error","reduce","parentKey","deriveChild","derivePathFromSeed","seed","includes","slice","masterKey","getMasterKeyFromSeed","formatAccount","keys","secretKey","publicKey","getKeyPair","sign","keyPair","fromSeed","I","IL","IR","chainCode","index","indexBuffer","allocUnsafe","writeUInt32BE","data","concat","alloc","generateSaveHDWallet","mnemonic","password","walletKey","getSaveHDWalletAccounts","saveHDWallet","accountCount","Array","fill","map","_","idx","getHdWalletAccountFromMnemonic","accountIdx","derived"],"mappings":"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","sourcesContent":["import nacl from 'tweetnacl'\nimport { full as hmac } from 'tweetnacl-auth'\nimport { fromString } from 'bip32-path'\nimport { validateMnemonic, mnemonicToSeed, generateMnemonic as genMnemonic } from '@aeternity/bip39'\nimport { decryptKey, encodeBase58Check, encryptKey } from './crypto'\n\nconst ED25519_CURVE = Buffer.from('ed25519 seed')\nconst HARDENED_OFFSET = 0x80000000\n\nconst toHex = (buffer) => Buffer.from(buffer).toString('hex')\n\nexport function derivePathFromKey (path, key) {\n const segments = path === '' ? [] : fromString(path).toPathArray()\n segments.forEach((segment, i) => {\n if (segment < HARDENED_OFFSET) {\n throw new Error(`Segment #${i + 1} is not hardened`)\n }\n })\n\n return segments.reduce((parentKey, segment) => deriveChild(parentKey, segment), key)\n}\n\nexport function derivePathFromSeed (path, seed) {\n if (!['m', 'm/'].includes(path.slice(0, 2))) {\n throw new Error('Invalid path')\n }\n const masterKey = getMasterKeyFromSeed(seed)\n return derivePathFromKey(path.slice(2), masterKey)\n}\n\nfunction formatAccount (keys) {\n const { secretKey, publicKey } = keys\n return {\n secretKey: toHex(secretKey),\n publicKey: `ak_${encodeBase58Check(publicKey)}`\n }\n}\n\nexport function getKeyPair (secretKey) {\n return nacl.sign.keyPair.fromSeed(secretKey)\n}\n\nexport function generateMnemonic () {\n return genMnemonic()\n}\n\nexport function getMasterKeyFromSeed (seed) {\n const I = hmac(seed, ED25519_CURVE)\n const IL = I.slice(0, 32)\n const IR = I.slice(32)\n return {\n secretKey: IL,\n chainCode: IR\n }\n}\n\nexport function deriveChild ({ secretKey, chainCode }, index) {\n if (index < HARDENED_OFFSET) {\n throw new Error(`Child index #${index} is not supported`)\n }\n const indexBuffer = Buffer.allocUnsafe(4)\n indexBuffer.writeUInt32BE(index, 0)\n\n const data = Buffer.concat([Buffer.alloc(1, 0), Buffer.from(secretKey), Buffer.from(indexBuffer)])\n\n const I = hmac(data, chainCode)\n const IL = I.slice(0, 32)\n const IR = I.slice(32)\n return {\n secretKey: IL,\n chainCode: IR\n }\n}\n\nexport function generateSaveHDWallet (mnemonic, password) {\n if (!validateMnemonic(mnemonic)) {\n throw new Error('Invalid mnemonic')\n }\n const seed = mnemonicToSeed(mnemonic)\n const walletKey = derivePathFromSeed('m/44h/457h', seed)\n return {\n secretKey: toHex(encryptKey(password, walletKey.secretKey)),\n chainCode: toHex(encryptKey(password, walletKey.chainCode))\n }\n}\n\nexport function getSaveHDWalletAccounts (saveHDWallet, password, accountCount) {\n const walletKey = {\n secretKey: decryptKey(password, Buffer.from(saveHDWallet.secretKey, 'hex')),\n chainCode: decryptKey(password, Buffer.from(saveHDWallet.chainCode, 'hex'))\n }\n return (new Array(accountCount)).fill()\n .map((_, idx) =>\n formatAccount(getKeyPair(derivePathFromKey(`${idx}h/0h/0h`, walletKey).secretKey)))\n}\n\nexport const getHdWalletAccountFromMnemonic = (mnemonic, accountIdx) => {\n const seed = mnemonicToSeed(mnemonic)\n const walletKey = derivePathFromSeed('m/44h/457h', seed)\n const derived = derivePathFromKey(`${accountIdx}h/0h/0h`, walletKey)\n const keyPair = getKeyPair(derived.secretKey)\n return {\n ...formatAccount(keyPair),\n idx: accountIdx\n }\n}\n\nexport default {\n getHdWalletAccountFromMnemonic,\n getSaveHDWalletAccounts,\n generateSaveHDWallet,\n generateMnemonic,\n deriveChild,\n getMasterKeyFromSeed\n}\n"],"file":"hd-wallet.js"}
|