@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/json-big.js
CHANGED
|
@@ -1,61 +1,30 @@
|
|
|
1
|
-
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
|
2
|
-
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
|
3
|
-
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
|
4
|
-
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
|
5
|
-
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
|
6
|
-
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
|
7
|
-
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
|
8
|
-
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
|
9
|
-
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
|
|
10
|
-
import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
|
|
11
|
-
import _typeof from "@babel/runtime-corejs3/helpers/typeof";
|
|
12
|
-
|
|
13
|
-
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; }
|
|
14
|
-
|
|
15
|
-
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; }
|
|
16
|
-
|
|
17
|
-
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
|
|
18
|
-
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
|
19
|
-
import _Object$entries from "@babel/runtime-corejs3/core-js-stable/object/entries";
|
|
20
|
-
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
|
|
21
|
-
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
22
1
|
import JsonBig from '@aeternity/json-bigint';
|
|
23
2
|
import BigNumber from 'bignumber.js';
|
|
24
|
-
|
|
3
|
+
const jsonBig = JsonBig({
|
|
25
4
|
storeAsString: true
|
|
26
5
|
});
|
|
27
6
|
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return _reduceInstanceProperty(_context = _mapInstanceProperty(_context2 = _Object$entries(value)).call(_context2, function (_ref) {
|
|
33
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
34
|
-
key = _ref2[0],
|
|
35
|
-
value = _ref2[1];
|
|
36
|
-
|
|
7
|
+
const convertValuesToBigNumbers = value => {
|
|
8
|
+
if (typeof value === 'object' && value !== null && value.constructor === Object) {
|
|
9
|
+
return Object.entries(value).map(_ref => {
|
|
10
|
+
let [key, value] = _ref;
|
|
37
11
|
return [key, convertValuesToBigNumbers(value)];
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return _objectSpread(_objectSpread({}, p), {}, _defineProperty({}, k, v));
|
|
12
|
+
}).reduce((p, _ref2) => {
|
|
13
|
+
let [k, v] = _ref2;
|
|
14
|
+
return { ...p,
|
|
15
|
+
[k]: v
|
|
16
|
+
};
|
|
44
17
|
}, {});
|
|
45
18
|
}
|
|
46
19
|
|
|
47
|
-
if (
|
|
48
|
-
return
|
|
49
|
-
return convertValuesToBigNumbers(item);
|
|
50
|
-
});
|
|
20
|
+
if (Array.isArray(value)) {
|
|
21
|
+
return value.map(item => convertValuesToBigNumbers(item));
|
|
51
22
|
}
|
|
52
23
|
|
|
53
24
|
if (typeof value === 'string' && BigNumber(value).toString(10) === value) {
|
|
54
|
-
|
|
25
|
+
const bn = BigNumber(value);
|
|
55
26
|
|
|
56
|
-
bn.toJSON =
|
|
57
|
-
return bn.toString(10);
|
|
58
|
-
};
|
|
27
|
+
bn.toJSON = () => bn.toString(10);
|
|
59
28
|
|
|
60
29
|
return bn;
|
|
61
30
|
}
|
|
@@ -64,14 +33,12 @@ var convertValuesToBigNumbers = function convertValuesToBigNumbers(value) {
|
|
|
64
33
|
};
|
|
65
34
|
|
|
66
35
|
export default {
|
|
67
|
-
stringify: function
|
|
68
|
-
var _context3;
|
|
69
|
-
|
|
36
|
+
stringify: function (object) {
|
|
70
37
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
71
38
|
args[_key - 1] = arguments[_key];
|
|
72
39
|
}
|
|
73
40
|
|
|
74
|
-
return jsonBig.stringify
|
|
41
|
+
return jsonBig.stringify(convertValuesToBigNumbers(object), ...args);
|
|
75
42
|
},
|
|
76
43
|
parse: jsonBig.parse
|
|
77
44
|
};
|
package/es/utils/json-big.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/json-big.js"],"names":["JsonBig","BigNumber","jsonBig","storeAsString","convertValuesToBigNumbers","value","constructor","Object","key","p","k","v","item","toString","bn","toJSON","stringify","object","args","parse"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/json-big.js"],"names":["JsonBig","BigNumber","jsonBig","storeAsString","convertValuesToBigNumbers","value","constructor","Object","entries","map","key","reduce","p","k","v","Array","isArray","item","toString","bn","toJSON","stringify","object","args","parse"],"mappings":"AAAA,OAAOA,OAAP,MAAoB,wBAApB;AACA,OAAOC,SAAP,MAAsB,cAAtB;AAEA,MAAMC,OAAO,GAAGF,OAAO,CAAC;AAAEG,EAAAA,aAAa,EAAE;AAAjB,CAAD,CAAvB;;AAEA,MAAMC,yBAAyB,GAAGC,KAAK,IAAI;AACzC,MAAI,OAAOA,KAAP,KAAiB,QAAjB,IAA6BA,KAAK,KAAK,IAAvC,IAA+CA,KAAK,CAACC,WAAN,KAAsBC,MAAzE,EAAiF;AAC/E,WAAOA,MAAM,CAACC,OAAP,CAAeH,KAAf,EACJI,GADI,CACA;AAAA,UAAC,CAACC,GAAD,EAAML,KAAN,CAAD;AAAA,aAAkB,CAACK,GAAD,EAAMN,yBAAyB,CAACC,KAAD,CAA/B,CAAlB;AAAA,KADA,EAEJM,MAFI,CAEG,CAACC,CAAD;AAAA,UAAI,CAACC,CAAD,EAAIC,CAAJ,CAAJ;AAAA,aAAgB,EAAE,GAAGF,CAAL;AAAQ,SAACC,CAAD,GAAKC;AAAb,OAAhB;AAAA,KAFH,EAEsC,EAFtC,CAAP;AAGD;;AACD,MAAIC,KAAK,CAACC,OAAN,CAAcX,KAAd,CAAJ,EAA0B;AACxB,WAAOA,KAAK,CAACI,GAAN,CAAUQ,IAAI,IAAIb,yBAAyB,CAACa,IAAD,CAA3C,CAAP;AACD;;AACD,MAAI,OAAOZ,KAAP,KAAiB,QAAjB,IAA6BJ,SAAS,CAACI,KAAD,CAAT,CAAiBa,QAAjB,CAA0B,EAA1B,MAAkCb,KAAnE,EAA0E;AACxE,UAAMc,EAAE,GAAGlB,SAAS,CAACI,KAAD,CAApB;;AACAc,IAAAA,EAAE,CAACC,MAAH,GAAY,MAAMD,EAAE,CAACD,QAAH,CAAY,EAAZ,CAAlB;;AACA,WAAOC,EAAP;AACD;;AACD,SAAOd,KAAP;AACD,CAfD;;AAiBA,eAAe;AACbgB,EAAAA,SAAS,EAAE,UAACC,MAAD;AAAA,sCAAYC,IAAZ;AAAYA,MAAAA,IAAZ;AAAA;;AAAA,WAAqBrB,OAAO,CAACmB,SAAR,CAAkBjB,yBAAyB,CAACkB,MAAD,CAA3C,EAAqD,GAAGC,IAAxD,CAArB;AAAA,GADE;AAEbC,EAAAA,KAAK,EAAEtB,OAAO,CAACsB;AAFF,CAAf","sourcesContent":["import JsonBig from '@aeternity/json-bigint'\nimport BigNumber from 'bignumber.js'\n\nconst jsonBig = JsonBig({ storeAsString: true })\n\nconst convertValuesToBigNumbers = value => {\n if (typeof value === 'object' && value !== null && value.constructor === Object) {\n return Object.entries(value)\n .map(([key, value]) => [key, convertValuesToBigNumbers(value)])\n .reduce((p, [k, v]) => ({ ...p, [k]: v }), {})\n }\n if (Array.isArray(value)) {\n return value.map(item => convertValuesToBigNumbers(item))\n }\n if (typeof value === 'string' && BigNumber(value).toString(10) === value) {\n const bn = BigNumber(value)\n bn.toJSON = () => bn.toString(10)\n return bn\n }\n return value\n}\n\nexport default {\n stringify: (object, ...args) => jsonBig.stringify(convertValuesToBigNumbers(object), ...args),\n parse: jsonBig.parse\n}\n"],"file":"json-big.js"}
|
package/es/utils/keystore.js
CHANGED
|
@@ -1,26 +1,9 @@
|
|
|
1
|
-
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
|
2
|
-
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
|
3
|
-
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
|
4
|
-
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
|
5
|
-
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
|
6
|
-
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
|
7
|
-
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
|
8
|
-
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
|
|
9
|
-
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
|
|
10
|
-
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
|
|
11
|
-
|
|
12
|
-
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; }
|
|
13
|
-
|
|
14
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context6; _forEachInstanceProperty(_context6 = ownKeys(Object(source), true)).call(_context6, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context7; _forEachInstanceProperty(_context7 = ownKeys(Object(source))).call(_context7, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
15
|
-
|
|
16
|
-
import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign";
|
|
17
|
-
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
|
18
1
|
import nacl from 'tweetnacl';
|
|
19
2
|
import { v4 as uuid } from 'uuid';
|
|
20
3
|
import { encodeBase58Check } from './crypto';
|
|
21
4
|
import { str2buf } from './bytes';
|
|
22
5
|
|
|
23
|
-
|
|
6
|
+
const _sodium = require('libsodium-wrappers-sumo');
|
|
24
7
|
/**
|
|
25
8
|
* KeyStore module
|
|
26
9
|
* @module @aeternity/aepp-sdk/es/utils/keystore
|
|
@@ -29,7 +12,7 @@ var _sodium = require('libsodium-wrappers-sumo');
|
|
|
29
12
|
*/
|
|
30
13
|
|
|
31
14
|
|
|
32
|
-
|
|
15
|
+
const DEFAULTS = {
|
|
33
16
|
crypto: {
|
|
34
17
|
secret_type: 'ed25519',
|
|
35
18
|
symmetric_alg: 'xsalsa20-poly1305',
|
|
@@ -42,53 +25,24 @@ var DEFAULTS = {
|
|
|
42
25
|
}
|
|
43
26
|
}; // DERIVED KEY PART
|
|
44
27
|
|
|
45
|
-
|
|
28
|
+
const DERIVED_KEY_FUNCTIONS = {
|
|
46
29
|
argon2id: deriveKeyUsingArgon2id
|
|
47
30
|
};
|
|
48
|
-
export function deriveKeyUsingArgon2id(
|
|
49
|
-
|
|
31
|
+
export async function deriveKeyUsingArgon2id(password, salt, options) {
|
|
32
|
+
const {
|
|
33
|
+
memlimit_kib: memoryCost,
|
|
34
|
+
opslimit: timeCost
|
|
35
|
+
} = options.kdf_params; // const isBrowser = !(typeof module !== 'undefined' && module.exports)
|
|
36
|
+
|
|
37
|
+
return _sodium.ready.then(async () => {
|
|
38
|
+
// tslint:disable-next-line:typedef
|
|
39
|
+
const sodium = _sodium;
|
|
40
|
+
const result = sodium.crypto_pwhash(32, password, salt, timeCost, memoryCost * 1024, sodium.crypto_pwhash_ALG_ARGON2ID13);
|
|
41
|
+
return Buffer.from(result);
|
|
42
|
+
});
|
|
50
43
|
} // CRYPTO PART
|
|
51
44
|
|
|
52
|
-
|
|
53
|
-
_deriveKeyUsingArgon2id = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(password, salt, options) {
|
|
54
|
-
var _options$kdf_params, memoryCost, timeCost;
|
|
55
|
-
|
|
56
|
-
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
57
|
-
while (1) {
|
|
58
|
-
switch (_context2.prev = _context2.next) {
|
|
59
|
-
case 0:
|
|
60
|
-
_options$kdf_params = options.kdf_params, memoryCost = _options$kdf_params.memlimit_kib, timeCost = _options$kdf_params.opslimit; // const isBrowser = !(typeof module !== 'undefined' && module.exports)
|
|
61
|
-
|
|
62
|
-
return _context2.abrupt("return", _sodium.ready.then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
63
|
-
var sodium, result;
|
|
64
|
-
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
65
|
-
while (1) {
|
|
66
|
-
switch (_context.prev = _context.next) {
|
|
67
|
-
case 0:
|
|
68
|
-
// tslint:disable-next-line:typedef
|
|
69
|
-
sodium = _sodium;
|
|
70
|
-
result = sodium.crypto_pwhash(32, password, salt, timeCost, memoryCost * 1024, sodium.crypto_pwhash_ALG_ARGON2ID13);
|
|
71
|
-
return _context.abrupt("return", Buffer.from(result));
|
|
72
|
-
|
|
73
|
-
case 3:
|
|
74
|
-
case "end":
|
|
75
|
-
return _context.stop();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}, _callee);
|
|
79
|
-
}))));
|
|
80
|
-
|
|
81
|
-
case 2:
|
|
82
|
-
case "end":
|
|
83
|
-
return _context2.stop();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}, _callee2);
|
|
87
|
-
}));
|
|
88
|
-
return _deriveKeyUsingArgon2id.apply(this, arguments);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
var CRYPTO_FUNCTIONS = {
|
|
45
|
+
const CRYPTO_FUNCTIONS = {
|
|
92
46
|
'xsalsa20-poly1305': {
|
|
93
47
|
encrypt: encryptXsalsa20Poly1305,
|
|
94
48
|
decrypt: decryptXsalsa20Poly1305
|
|
@@ -96,17 +50,21 @@ var CRYPTO_FUNCTIONS = {
|
|
|
96
50
|
};
|
|
97
51
|
|
|
98
52
|
function encryptXsalsa20Poly1305(_ref) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
53
|
+
let {
|
|
54
|
+
plaintext,
|
|
55
|
+
key,
|
|
56
|
+
nonce
|
|
57
|
+
} = _ref;
|
|
102
58
|
return nacl.secretbox(plaintext, nonce, key);
|
|
103
59
|
}
|
|
104
60
|
|
|
105
61
|
function decryptXsalsa20Poly1305(_ref2) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
62
|
+
let {
|
|
63
|
+
ciphertext,
|
|
64
|
+
key,
|
|
65
|
+
nonce
|
|
66
|
+
} = _ref2;
|
|
67
|
+
const res = nacl.secretbox.open(ciphertext, nonce, key);
|
|
110
68
|
if (!res) throw new Error('Invalid password or nonce');
|
|
111
69
|
return res;
|
|
112
70
|
}
|
|
@@ -121,12 +79,12 @@ function decryptXsalsa20Poly1305(_ref2) {
|
|
|
121
79
|
|
|
122
80
|
|
|
123
81
|
function encrypt(plaintext, key, nonce) {
|
|
124
|
-
|
|
82
|
+
let algo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULTS.crypto.symmetric_alg;
|
|
125
83
|
if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available');
|
|
126
84
|
return CRYPTO_FUNCTIONS[algo].encrypt({
|
|
127
|
-
plaintext
|
|
128
|
-
nonce
|
|
129
|
-
key
|
|
85
|
+
plaintext,
|
|
86
|
+
nonce,
|
|
87
|
+
key
|
|
130
88
|
});
|
|
131
89
|
}
|
|
132
90
|
/**
|
|
@@ -142,9 +100,9 @@ function encrypt(plaintext, key, nonce) {
|
|
|
142
100
|
function decrypt(ciphertext, key, nonce, algo) {
|
|
143
101
|
if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available');
|
|
144
102
|
return CRYPTO_FUNCTIONS[algo].decrypt({
|
|
145
|
-
ciphertext
|
|
146
|
-
nonce
|
|
147
|
-
key
|
|
103
|
+
ciphertext,
|
|
104
|
+
nonce,
|
|
105
|
+
key
|
|
148
106
|
});
|
|
149
107
|
}
|
|
150
108
|
/**
|
|
@@ -158,8 +116,18 @@ function decrypt(ciphertext, key, nonce, algo) {
|
|
|
158
116
|
*/
|
|
159
117
|
|
|
160
118
|
|
|
161
|
-
function deriveKey(
|
|
162
|
-
|
|
119
|
+
async function deriveKey(password, nonce) {
|
|
120
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
121
|
+
kdf_params: DEFAULTS.crypto.kdf_params,
|
|
122
|
+
kdf: DEFAULTS.crypto.kdf
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
if (typeof password === 'undefined' || password === null || !nonce) {
|
|
126
|
+
throw new Error('Must provide password and nonce to derive a key');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (!Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) throw new Error('Unsupported kdf type');
|
|
130
|
+
return DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options);
|
|
163
131
|
}
|
|
164
132
|
/**
|
|
165
133
|
* Assemble key data object in secret-storage format.
|
|
@@ -176,59 +144,16 @@ function deriveKey(_x4, _x5) {
|
|
|
176
144
|
*/
|
|
177
145
|
|
|
178
146
|
|
|
179
|
-
function _deriveKey() {
|
|
180
|
-
_deriveKey = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(password, nonce) {
|
|
181
|
-
var options,
|
|
182
|
-
_args3 = arguments;
|
|
183
|
-
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
184
|
-
while (1) {
|
|
185
|
-
switch (_context3.prev = _context3.next) {
|
|
186
|
-
case 0:
|
|
187
|
-
options = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {
|
|
188
|
-
kdf_params: DEFAULTS.crypto.kdf_params,
|
|
189
|
-
kdf: DEFAULTS.crypto.kdf
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
if (!(typeof password === 'undefined' || password === null || !nonce)) {
|
|
193
|
-
_context3.next = 3;
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
throw new Error('Must provide password and nonce to derive a key');
|
|
198
|
-
|
|
199
|
-
case 3:
|
|
200
|
-
if (Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) {
|
|
201
|
-
_context3.next = 5;
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
throw new Error('Unsupported kdf type');
|
|
206
|
-
|
|
207
|
-
case 5:
|
|
208
|
-
return _context3.abrupt("return", DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options));
|
|
209
|
-
|
|
210
|
-
case 6:
|
|
211
|
-
case "end":
|
|
212
|
-
return _context3.stop();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}, _callee3);
|
|
216
|
-
}));
|
|
217
|
-
return _deriveKey.apply(this, arguments);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
147
|
function marshal(name, derivedKey, privateKey, nonce, salt) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return _Object$assign({
|
|
226
|
-
name: name,
|
|
148
|
+
let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
149
|
+
const opt = Object.assign({}, DEFAULTS.crypto, options);
|
|
150
|
+
return Object.assign({
|
|
151
|
+
name,
|
|
227
152
|
version: 1,
|
|
228
153
|
public_key: getAddressFromPriv(privateKey),
|
|
229
154
|
id: uuid()
|
|
230
155
|
}, {
|
|
231
|
-
crypto:
|
|
156
|
+
crypto: Object.assign({
|
|
232
157
|
secret_type: opt.secret_type,
|
|
233
158
|
symmetric_alg: opt.symmetric_alg,
|
|
234
159
|
ciphertext: Buffer.from(encrypt(Buffer.from(privateKey), derivedKey, nonce, opt.symmetric_alg)).toString('hex'),
|
|
@@ -237,17 +162,17 @@ function marshal(name, derivedKey, privateKey, nonce, salt) {
|
|
|
237
162
|
}
|
|
238
163
|
}, {
|
|
239
164
|
kdf: opt.kdf,
|
|
240
|
-
kdf_params:
|
|
165
|
+
kdf_params: { ...opt.kdf_params,
|
|
241
166
|
salt: Buffer.from(salt).toString('hex')
|
|
242
|
-
}
|
|
167
|
+
}
|
|
243
168
|
})
|
|
244
169
|
});
|
|
245
170
|
}
|
|
246
171
|
|
|
247
172
|
export function getAddressFromPriv(secret) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
return
|
|
173
|
+
const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret));
|
|
174
|
+
const publicBuffer = Buffer.from(keys.publicKey);
|
|
175
|
+
return `ak_${encodeBase58Check(publicBuffer)}`;
|
|
251
176
|
}
|
|
252
177
|
/**
|
|
253
178
|
* Recover plaintext private key from secret-storage key object.
|
|
@@ -256,8 +181,19 @@ export function getAddressFromPriv(secret) {
|
|
|
256
181
|
* @return {Buffer} Plaintext private key.
|
|
257
182
|
*/
|
|
258
183
|
|
|
259
|
-
export function recover(
|
|
260
|
-
|
|
184
|
+
export async function recover(password, keyObject) {
|
|
185
|
+
validateKeyObj(keyObject);
|
|
186
|
+
const nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce));
|
|
187
|
+
const salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt));
|
|
188
|
+
const kdfParams = keyObject.crypto.kdf_params;
|
|
189
|
+
const kdf = keyObject.crypto.kdf;
|
|
190
|
+
const key = await decrypt(Uint8Array.from(str2buf(keyObject.crypto.ciphertext)), await deriveKey(password, salt, {
|
|
191
|
+
kdf,
|
|
192
|
+
kdf_params: kdfParams
|
|
193
|
+
}), nonce, keyObject.crypto.symmetric_alg);
|
|
194
|
+
if (!key) throw new Error('Invalid password');
|
|
195
|
+
if (Buffer.from(key).length === 64) return Buffer.from(key).toString('hex');
|
|
196
|
+
return Buffer.from(key).toString('utf-8');
|
|
261
197
|
}
|
|
262
198
|
/**
|
|
263
199
|
* Export private key to keystore secret-storage format.
|
|
@@ -273,121 +209,20 @@ export function recover(_x6, _x7) {
|
|
|
273
209
|
* @return {Object}
|
|
274
210
|
*/
|
|
275
211
|
|
|
276
|
-
function
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
case 0:
|
|
283
|
-
validateKeyObj(keyObject);
|
|
284
|
-
nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce));
|
|
285
|
-
salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt));
|
|
286
|
-
kdfParams = keyObject.crypto.kdf_params;
|
|
287
|
-
kdf = keyObject.crypto.kdf;
|
|
288
|
-
_context4.t0 = decrypt;
|
|
289
|
-
_context4.t1 = Uint8Array.from(str2buf(keyObject.crypto.ciphertext));
|
|
290
|
-
_context4.next = 9;
|
|
291
|
-
return deriveKey(password, salt, {
|
|
292
|
-
kdf: kdf,
|
|
293
|
-
kdf_params: kdfParams
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
case 9:
|
|
297
|
-
_context4.t2 = _context4.sent;
|
|
298
|
-
_context4.t3 = nonce;
|
|
299
|
-
_context4.t4 = keyObject.crypto.symmetric_alg;
|
|
300
|
-
_context4.next = 14;
|
|
301
|
-
return (0, _context4.t0)(_context4.t1, _context4.t2, _context4.t3, _context4.t4);
|
|
302
|
-
|
|
303
|
-
case 14:
|
|
304
|
-
key = _context4.sent;
|
|
305
|
-
|
|
306
|
-
if (key) {
|
|
307
|
-
_context4.next = 17;
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
throw new Error('Invalid password');
|
|
312
|
-
|
|
313
|
-
case 17:
|
|
314
|
-
if (!(Buffer.from(key).length === 64)) {
|
|
315
|
-
_context4.next = 19;
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return _context4.abrupt("return", Buffer.from(key).toString('hex'));
|
|
320
|
-
|
|
321
|
-
case 19:
|
|
322
|
-
return _context4.abrupt("return", Buffer.from(key).toString('utf-8'));
|
|
323
|
-
|
|
324
|
-
case 20:
|
|
325
|
-
case "end":
|
|
326
|
-
return _context4.stop();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}, _callee4);
|
|
330
|
-
}));
|
|
331
|
-
return _recover.apply(this, arguments);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
export function dump(_x8, _x9, _x10) {
|
|
335
|
-
return _dump.apply(this, arguments);
|
|
212
|
+
export async function dump(name, password, privateKey) {
|
|
213
|
+
let nonce = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nacl.randomBytes(24);
|
|
214
|
+
let salt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : nacl.randomBytes(16);
|
|
215
|
+
let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
216
|
+
const opt = Object.assign({}, DEFAULTS.crypto, options);
|
|
217
|
+
return marshal(name, await deriveKey(password, salt, opt), privateKey, nonce, salt, opt);
|
|
336
218
|
}
|
|
337
|
-
|
|
338
|
-
function _dump() {
|
|
339
|
-
_dump = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(name, password, privateKey) {
|
|
340
|
-
var nonce,
|
|
341
|
-
salt,
|
|
342
|
-
options,
|
|
343
|
-
opt,
|
|
344
|
-
_args5 = arguments;
|
|
345
|
-
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
346
|
-
while (1) {
|
|
347
|
-
switch (_context5.prev = _context5.next) {
|
|
348
|
-
case 0:
|
|
349
|
-
nonce = _args5.length > 3 && _args5[3] !== undefined ? _args5[3] : nacl.randomBytes(24);
|
|
350
|
-
salt = _args5.length > 4 && _args5[4] !== undefined ? _args5[4] : nacl.randomBytes(16);
|
|
351
|
-
options = _args5.length > 5 && _args5[5] !== undefined ? _args5[5] : {};
|
|
352
|
-
opt = _Object$assign({}, DEFAULTS.crypto, options);
|
|
353
|
-
_context5.t0 = marshal;
|
|
354
|
-
_context5.t1 = name;
|
|
355
|
-
_context5.next = 8;
|
|
356
|
-
return deriveKey(password, salt, opt);
|
|
357
|
-
|
|
358
|
-
case 8:
|
|
359
|
-
_context5.t2 = _context5.sent;
|
|
360
|
-
_context5.t3 = privateKey;
|
|
361
|
-
_context5.t4 = nonce;
|
|
362
|
-
_context5.t5 = salt;
|
|
363
|
-
_context5.t6 = opt;
|
|
364
|
-
return _context5.abrupt("return", (0, _context5.t0)(_context5.t1, _context5.t2, _context5.t3, _context5.t4, _context5.t5, _context5.t6));
|
|
365
|
-
|
|
366
|
-
case 14:
|
|
367
|
-
case "end":
|
|
368
|
-
return _context5.stop();
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}, _callee5);
|
|
372
|
-
}));
|
|
373
|
-
return _dump.apply(this, arguments);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
219
|
export function validateKeyObj(obj) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
if (missingRootKeys.length) throw new Error("Invalid key file format. Require properties: ".concat(missingRootKeys));
|
|
385
|
-
|
|
386
|
-
var missingCryptoKeys = _filterInstanceProperty(cryptoKeys).call(cryptoKeys, function (key) {
|
|
387
|
-
return !Object.prototype.hasOwnProperty.call(obj.crypto, key);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
if (missingCryptoKeys.length) throw new Error("Invalid key file format. Require properties: ".concat(missingCryptoKeys));
|
|
220
|
+
const root = ['crypto', 'id', 'version', 'public_key'];
|
|
221
|
+
const cryptoKeys = ['cipher_params', 'ciphertext', 'symmetric_alg', 'kdf', 'kdf_params'];
|
|
222
|
+
const missingRootKeys = root.filter(key => !Object.prototype.hasOwnProperty.call(obj, key));
|
|
223
|
+
if (missingRootKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingRootKeys}`);
|
|
224
|
+
const missingCryptoKeys = cryptoKeys.filter(key => !Object.prototype.hasOwnProperty.call(obj.crypto, key));
|
|
225
|
+
if (missingCryptoKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingCryptoKeys}`);
|
|
391
226
|
return true;
|
|
392
227
|
}
|
|
393
228
|
//# sourceMappingURL=keystore.js.map
|
package/es/utils/keystore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/keystore.js"],"names":["nacl","v4","uuid","encodeBase58Check","str2buf","_sodium","require","DEFAULTS","crypto","secret_type","symmetric_alg","kdf","kdf_params","memlimit_kib","opslimit","parallelism","DERIVED_KEY_FUNCTIONS","argon2id","deriveKeyUsingArgon2id","password","salt","options","memoryCost","timeCost","ready","then","sodium","result","crypto_pwhash","crypto_pwhash_ALG_ARGON2ID13","Buffer","from","CRYPTO_FUNCTIONS","encrypt","encryptXsalsa20Poly1305","decrypt","decryptXsalsa20Poly1305","plaintext","key","nonce","secretbox","ciphertext","res","open","Error","algo","deriveKey","Object","prototype","hasOwnProperty","call","marshal","name","derivedKey","privateKey","opt","version","public_key","getAddressFromPriv","id","toString","cipher_params","secret","keys","sign","keyPair","fromSecretKey","publicBuffer","publicKey","recover","keyObject","validateKeyObj","Uint8Array","kdfParams","length","dump","randomBytes","obj","root","cryptoKeys","missingRootKeys","missingCryptoKeys"],"mappings":"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","sourcesContent":["import nacl from 'tweetnacl'\nimport { v4 as uuid } from 'uuid'\n\nimport { encodeBase58Check } from './crypto'\nimport { str2buf } from './bytes'\n\nconst _sodium = require('libsodium-wrappers-sumo')\n\n/**\n * KeyStore module\n * @module @aeternity/aepp-sdk/es/utils/keystore\n * @example import { Keystore } from '@aeternity/aepp-sdk'\n * @example const { Keystore } = require('@aeternity/aepp-sdk')\n */\n\nconst DEFAULTS = {\n crypto: {\n secret_type: 'ed25519',\n symmetric_alg: 'xsalsa20-poly1305',\n kdf: 'argon2id',\n kdf_params: {\n memlimit_kib: 65536,\n opslimit: 3,\n parallelism: 1\n }\n }\n}\n\n// DERIVED KEY PART\nconst DERIVED_KEY_FUNCTIONS = {\n argon2id: deriveKeyUsingArgon2id\n}\n\nexport async function deriveKeyUsingArgon2id (password, salt, options) {\n const { memlimit_kib: memoryCost, opslimit: timeCost } = options.kdf_params\n // const isBrowser = !(typeof module !== 'undefined' && module.exports)\n\n return _sodium.ready.then(async () => {\n // tslint:disable-next-line:typedef\n const sodium = _sodium\n\n const result = sodium.crypto_pwhash(\n 32,\n password,\n salt,\n timeCost,\n memoryCost * 1024,\n sodium.crypto_pwhash_ALG_ARGON2ID13\n )\n return Buffer.from(result)\n })\n}\n\n// CRYPTO PART\nconst CRYPTO_FUNCTIONS = {\n 'xsalsa20-poly1305': { encrypt: encryptXsalsa20Poly1305, decrypt: decryptXsalsa20Poly1305 }\n}\n\nfunction encryptXsalsa20Poly1305 ({ plaintext, key, nonce }) {\n return nacl.secretbox(plaintext, nonce, key)\n}\n\nfunction decryptXsalsa20Poly1305 ({ ciphertext, key, nonce }) {\n const res = nacl.secretbox.open(ciphertext, nonce, key)\n if (!res) throw new Error('Invalid password or nonce')\n return res\n}\n\n/**\n * Symmetric private key encryption using secret (derived) key.\n * @param {buffer|string} plaintext Data to be encrypted.\n * @param {buffer|string} key Secret key.\n * @param {buffer|string} nonce Randomly generated nonce.\n * @param {string=} algo Encryption algorithm (default: DEFAULTS.crypto.symmetric_alg).\n * @return {buffer} Encrypted data.\n */\nfunction encrypt (plaintext, key, nonce, algo = DEFAULTS.crypto.symmetric_alg) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available')\n return CRYPTO_FUNCTIONS[algo].encrypt({ plaintext, nonce, key })\n}\n\n/**\n * Symmetric private key decryption using secret (derived) key.\n * @param {buffer|Uint8Array} ciphertext Data to be decrypted.\n * @param {buffer|Uint8Array} key Secret key.\n * @param {buffer|Uint8Array} nonce Nonce from key-object.\n * @param {string=} algo Encryption algorithm.\n * @return {buffer} Decrypted data.\n */\nfunction decrypt (ciphertext, key, nonce, algo) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available')\n return CRYPTO_FUNCTIONS[algo].decrypt({ ciphertext, nonce, key })\n}\n\n/**\n * Derive secret key from password with key derivation function.\n * @param {string} password User-supplied password.\n * @param {buffer|Uint8Array} nonce Randomly generated nonce.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: DEFAULTS.crypto.kdf).\n * @param {Object=} options.kdf_params KDF parameters (default: DEFAULTS.crypto.kdf_params).\n * @return {buffer} Secret key derived from password.\n */\nasync function deriveKey (password, nonce, options = {\n kdf_params: DEFAULTS.crypto.kdf_params,\n kdf: DEFAULTS.crypto.kdf\n}) {\n if (typeof password === 'undefined' || password === null || !nonce) {\n throw new Error('Must provide password and nonce to derive a key')\n }\n\n if (!Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) throw new Error('Unsupported kdf type')\n\n return DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options)\n}\n\n/**\n * Assemble key data object in secret-storage format.\n * @param {buffer} name Key name.\n * @param {buffer} derivedKey Password-derived secret key.\n * @param {buffer} privateKey Private key.\n * @param {buffer} nonce Randomly generated 24byte nonce.\n * @param {buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: argon2id).\n * @param {string=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdf_params KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nfunction marshal (name, derivedKey, privateKey, nonce, salt, options = {}) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return Object.assign(\n { name, version: 1, public_key: getAddressFromPriv(privateKey), id: uuid() },\n {\n crypto: Object.assign(\n {\n secret_type: opt.secret_type,\n symmetric_alg: opt.symmetric_alg,\n ciphertext: Buffer.from(encrypt(Buffer.from(privateKey), derivedKey, nonce, opt.symmetric_alg)).toString('hex'),\n cipher_params: { nonce: Buffer.from(nonce).toString('hex') }\n },\n { kdf: opt.kdf, kdf_params: { ...opt.kdf_params, salt: Buffer.from(salt).toString('hex') } }\n )\n }\n )\n}\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 * Recover plaintext private key from secret-storage key object.\n * @param {String} password Keystore object password.\n * @param {Object} keyObject Keystore object.\n * @return {Buffer} Plaintext private key.\n */\nexport async function recover (password, keyObject) {\n validateKeyObj(keyObject)\n const nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce))\n const salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt))\n const kdfParams = keyObject.crypto.kdf_params\n const kdf = keyObject.crypto.kdf\n\n const key = await decrypt(\n Uint8Array.from(str2buf(keyObject.crypto.ciphertext)),\n await deriveKey(password, salt, { kdf, kdf_params: kdfParams }),\n nonce,\n keyObject.crypto.symmetric_alg\n )\n if (!key) throw new Error('Invalid password')\n\n if (Buffer.from(key).length === 64) return Buffer.from(key).toString('hex')\n return Buffer.from(key).toString('utf-8')\n}\n\n/**\n * Export private key to keystore secret-storage format.\n * @param {String} name Key name.\n * @param {String} password User-supplied password.\n * @param {String} privateKey Private key.\n * @param {Buffer} nonce Randomly generated 24byte nonce.\n * @param {Buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {String=} options.kdf Key derivation function (default: pbkdf2).\n * @param {String=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdfparams KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nexport async function dump (name, password, privateKey, nonce = nacl.randomBytes(24), salt = nacl.randomBytes(16), options = {}) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return marshal(\n name,\n await deriveKey(password, salt, opt),\n privateKey,\n nonce,\n salt,\n opt\n )\n}\n\nexport function validateKeyObj (obj) {\n const root = ['crypto', 'id', 'version', 'public_key']\n const cryptoKeys = ['cipher_params', 'ciphertext', 'symmetric_alg', 'kdf', 'kdf_params']\n\n const missingRootKeys = root.filter(key => !Object.prototype.hasOwnProperty.call(obj, key))\n if (missingRootKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingRootKeys}`)\n\n const missingCryptoKeys = cryptoKeys.filter(key => !Object.prototype.hasOwnProperty.call(obj.crypto, key))\n if (missingCryptoKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingCryptoKeys}`)\n\n return true\n}\n"],"file":"keystore.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/keystore.js"],"names":["nacl","v4","uuid","encodeBase58Check","str2buf","_sodium","require","DEFAULTS","crypto","secret_type","symmetric_alg","kdf","kdf_params","memlimit_kib","opslimit","parallelism","DERIVED_KEY_FUNCTIONS","argon2id","deriveKeyUsingArgon2id","password","salt","options","memoryCost","timeCost","ready","then","sodium","result","crypto_pwhash","crypto_pwhash_ALG_ARGON2ID13","Buffer","from","CRYPTO_FUNCTIONS","encrypt","encryptXsalsa20Poly1305","decrypt","decryptXsalsa20Poly1305","plaintext","key","nonce","secretbox","ciphertext","res","open","Error","algo","deriveKey","Object","prototype","hasOwnProperty","call","marshal","name","derivedKey","privateKey","opt","assign","version","public_key","getAddressFromPriv","id","toString","cipher_params","secret","keys","sign","keyPair","fromSecretKey","publicBuffer","publicKey","recover","keyObject","validateKeyObj","Uint8Array","kdfParams","length","dump","randomBytes","obj","root","cryptoKeys","missingRootKeys","filter","missingCryptoKeys"],"mappings":"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","sourcesContent":["import nacl from 'tweetnacl'\nimport { v4 as uuid } from 'uuid'\n\nimport { encodeBase58Check } from './crypto'\nimport { str2buf } from './bytes'\n\nconst _sodium = require('libsodium-wrappers-sumo')\n\n/**\n * KeyStore module\n * @module @aeternity/aepp-sdk/es/utils/keystore\n * @example import { Keystore } from '@aeternity/aepp-sdk'\n * @example const { Keystore } = require('@aeternity/aepp-sdk')\n */\n\nconst DEFAULTS = {\n crypto: {\n secret_type: 'ed25519',\n symmetric_alg: 'xsalsa20-poly1305',\n kdf: 'argon2id',\n kdf_params: {\n memlimit_kib: 65536,\n opslimit: 3,\n parallelism: 1\n }\n }\n}\n\n// DERIVED KEY PART\nconst DERIVED_KEY_FUNCTIONS = {\n argon2id: deriveKeyUsingArgon2id\n}\n\nexport async function deriveKeyUsingArgon2id (password, salt, options) {\n const { memlimit_kib: memoryCost, opslimit: timeCost } = options.kdf_params\n // const isBrowser = !(typeof module !== 'undefined' && module.exports)\n\n return _sodium.ready.then(async () => {\n // tslint:disable-next-line:typedef\n const sodium = _sodium\n\n const result = sodium.crypto_pwhash(\n 32,\n password,\n salt,\n timeCost,\n memoryCost * 1024,\n sodium.crypto_pwhash_ALG_ARGON2ID13\n )\n return Buffer.from(result)\n })\n}\n\n// CRYPTO PART\nconst CRYPTO_FUNCTIONS = {\n 'xsalsa20-poly1305': { encrypt: encryptXsalsa20Poly1305, decrypt: decryptXsalsa20Poly1305 }\n}\n\nfunction encryptXsalsa20Poly1305 ({ plaintext, key, nonce }) {\n return nacl.secretbox(plaintext, nonce, key)\n}\n\nfunction decryptXsalsa20Poly1305 ({ ciphertext, key, nonce }) {\n const res = nacl.secretbox.open(ciphertext, nonce, key)\n if (!res) throw new Error('Invalid password or nonce')\n return res\n}\n\n/**\n * Symmetric private key encryption using secret (derived) key.\n * @param {buffer|string} plaintext Data to be encrypted.\n * @param {buffer|string} key Secret key.\n * @param {buffer|string} nonce Randomly generated nonce.\n * @param {string=} algo Encryption algorithm (default: DEFAULTS.crypto.symmetric_alg).\n * @return {buffer} Encrypted data.\n */\nfunction encrypt (plaintext, key, nonce, algo = DEFAULTS.crypto.symmetric_alg) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available')\n return CRYPTO_FUNCTIONS[algo].encrypt({ plaintext, nonce, key })\n}\n\n/**\n * Symmetric private key decryption using secret (derived) key.\n * @param {buffer|Uint8Array} ciphertext Data to be decrypted.\n * @param {buffer|Uint8Array} key Secret key.\n * @param {buffer|Uint8Array} nonce Nonce from key-object.\n * @param {string=} algo Encryption algorithm.\n * @return {buffer} Decrypted data.\n */\nfunction decrypt (ciphertext, key, nonce, algo) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new Error(algo + ' is not available')\n return CRYPTO_FUNCTIONS[algo].decrypt({ ciphertext, nonce, key })\n}\n\n/**\n * Derive secret key from password with key derivation function.\n * @param {string} password User-supplied password.\n * @param {buffer|Uint8Array} nonce Randomly generated nonce.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: DEFAULTS.crypto.kdf).\n * @param {Object=} options.kdf_params KDF parameters (default: DEFAULTS.crypto.kdf_params).\n * @return {buffer} Secret key derived from password.\n */\nasync function deriveKey (password, nonce, options = {\n kdf_params: DEFAULTS.crypto.kdf_params,\n kdf: DEFAULTS.crypto.kdf\n}) {\n if (typeof password === 'undefined' || password === null || !nonce) {\n throw new Error('Must provide password and nonce to derive a key')\n }\n\n if (!Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) throw new Error('Unsupported kdf type')\n\n return DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options)\n}\n\n/**\n * Assemble key data object in secret-storage format.\n * @param {buffer} name Key name.\n * @param {buffer} derivedKey Password-derived secret key.\n * @param {buffer} privateKey Private key.\n * @param {buffer} nonce Randomly generated 24byte nonce.\n * @param {buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: argon2id).\n * @param {string=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdf_params KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nfunction marshal (name, derivedKey, privateKey, nonce, salt, options = {}) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return Object.assign(\n { name, version: 1, public_key: getAddressFromPriv(privateKey), id: uuid() },\n {\n crypto: Object.assign(\n {\n secret_type: opt.secret_type,\n symmetric_alg: opt.symmetric_alg,\n ciphertext: Buffer.from(encrypt(Buffer.from(privateKey), derivedKey, nonce, opt.symmetric_alg)).toString('hex'),\n cipher_params: { nonce: Buffer.from(nonce).toString('hex') }\n },\n { kdf: opt.kdf, kdf_params: { ...opt.kdf_params, salt: Buffer.from(salt).toString('hex') } }\n )\n }\n )\n}\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 * Recover plaintext private key from secret-storage key object.\n * @param {String} password Keystore object password.\n * @param {Object} keyObject Keystore object.\n * @return {Buffer} Plaintext private key.\n */\nexport async function recover (password, keyObject) {\n validateKeyObj(keyObject)\n const nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce))\n const salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt))\n const kdfParams = keyObject.crypto.kdf_params\n const kdf = keyObject.crypto.kdf\n\n const key = await decrypt(\n Uint8Array.from(str2buf(keyObject.crypto.ciphertext)),\n await deriveKey(password, salt, { kdf, kdf_params: kdfParams }),\n nonce,\n keyObject.crypto.symmetric_alg\n )\n if (!key) throw new Error('Invalid password')\n\n if (Buffer.from(key).length === 64) return Buffer.from(key).toString('hex')\n return Buffer.from(key).toString('utf-8')\n}\n\n/**\n * Export private key to keystore secret-storage format.\n * @param {String} name Key name.\n * @param {String} password User-supplied password.\n * @param {String} privateKey Private key.\n * @param {Buffer} nonce Randomly generated 24byte nonce.\n * @param {Buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {String=} options.kdf Key derivation function (default: pbkdf2).\n * @param {String=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdfparams KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nexport async function dump (name, password, privateKey, nonce = nacl.randomBytes(24), salt = nacl.randomBytes(16), options = {}) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return marshal(\n name,\n await deriveKey(password, salt, opt),\n privateKey,\n nonce,\n salt,\n opt\n )\n}\n\nexport function validateKeyObj (obj) {\n const root = ['crypto', 'id', 'version', 'public_key']\n const cryptoKeys = ['cipher_params', 'ciphertext', 'symmetric_alg', 'kdf', 'kdf_params']\n\n const missingRootKeys = root.filter(key => !Object.prototype.hasOwnProperty.call(obj, key))\n if (missingRootKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingRootKeys}`)\n\n const missingCryptoKeys = cryptoKeys.filter(key => !Object.prototype.hasOwnProperty.call(obj.crypto, key))\n if (missingCryptoKeys.length) throw new Error(`Invalid key file format. Require properties: ${missingCryptoKeys}`)\n\n return true\n}\n"],"file":"keystore.js"}
|