ox 0.14.34 → 0.14.36
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/CHANGELOG.md +14 -0
- package/_cjs/core/AesGcm.js +47 -1
- package/_cjs/core/AesGcm.js.map +1 -1
- package/_cjs/core/Ed25519.js +42 -1
- package/_cjs/core/Ed25519.js.map +1 -1
- package/_cjs/core/P256.js +44 -1
- package/_cjs/core/P256.js.map +1 -1
- package/_cjs/core/Secp256k1.js +38 -1
- package/_cjs/core/Secp256k1.js.map +1 -1
- package/_cjs/core/internal/keyDerivation.js +15 -0
- package/_cjs/core/internal/keyDerivation.js.map +1 -0
- package/_cjs/core/internal/mnemonic.js +18 -0
- package/_cjs/core/internal/mnemonic.js.map +1 -0
- package/_cjs/tempo/MultisigConfig.js +15 -4
- package/_cjs/tempo/MultisigConfig.js.map +1 -1
- package/_cjs/version.js +1 -1
- package/_esm/core/AesGcm.js +85 -0
- package/_esm/core/AesGcm.js.map +1 -1
- package/_esm/core/Ed25519.js +81 -0
- package/_esm/core/Ed25519.js.map +1 -1
- package/_esm/core/P256.js +83 -0
- package/_esm/core/P256.js.map +1 -1
- package/_esm/core/Secp256k1.js +77 -0
- package/_esm/core/Secp256k1.js.map +1 -1
- package/_esm/core/internal/keyDerivation.js +13 -0
- package/_esm/core/internal/keyDerivation.js.map +1 -0
- package/_esm/core/internal/mnemonic.js +16 -0
- package/_esm/core/internal/mnemonic.js.map +1 -0
- package/_esm/tempo/MultisigConfig.js +17 -5
- package/_esm/tempo/MultisigConfig.js.map +1 -1
- package/_esm/version.js +1 -1
- package/_types/core/AesGcm.d.ts +66 -1
- package/_types/core/AesGcm.d.ts.map +1 -1
- package/_types/core/Ed25519.d.ts +82 -1
- package/_types/core/Ed25519.d.ts.map +1 -1
- package/_types/core/P256.d.ts +82 -1
- package/_types/core/P256.d.ts.map +1 -1
- package/_types/core/Secp256k1.d.ts +85 -1
- package/_types/core/Secp256k1.d.ts.map +1 -1
- package/_types/core/internal/keyDerivation.d.ts +12 -0
- package/_types/core/internal/keyDerivation.d.ts.map +1 -0
- package/_types/core/internal/mnemonic.d.ts +13 -0
- package/_types/core/internal/mnemonic.d.ts.map +1 -0
- package/_types/tempo/MultisigConfig.d.ts +4 -3
- package/_types/tempo/MultisigConfig.d.ts.map +1 -1
- package/_types/version.d.ts +1 -1
- package/core/AesGcm.ts +137 -1
- package/core/Ed25519.ts +133 -1
- package/core/P256.ts +135 -1
- package/core/Secp256k1.ts +134 -1
- package/core/internal/keyDerivation.ts +33 -0
- package/core/internal/mnemonic.ts +31 -0
- package/package.json +1 -1
- package/tempo/MultisigConfig.test.ts +40 -6
- package/tempo/MultisigConfig.ts +18 -5
- package/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# ox
|
|
2
2
|
|
|
3
|
+
## 0.14.36
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#402](https://github.com/wevm/ox/pull/402) [`8675963`](https://github.com/wevm/ox/commit/86759630ac8541dbc9b886bde08e8db8b1e14b3d) Thanks [@jxom](https://github.com/jxom)! - Reduced CommonJS bundles that import `P256` or `Secp256k1`.
|
|
8
|
+
|
|
9
|
+
## 0.14.35
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#396](https://github.com/wevm/ox/pull/396) [`f2d4427`](https://github.com/wevm/ox/commit/f2d4427b68b8d6b193315891f6fc0aec23aa4ee2) Thanks [@jxom](https://github.com/jxom)! - Added seed and mnemonic derivation for P256, Secp256k1, Ed25519, and AES-GCM keys.
|
|
14
|
+
|
|
15
|
+
- [#401](https://github.com/wevm/ox/pull/401) [`efc1d67`](https://github.com/wevm/ox/commit/efc1d6710518c9c26c65d1928f3d8bde944c09f1) Thanks [@jxom](https://github.com/jxom)! - Aligned configurable account owner and threshold validation with TIP-1061.
|
|
16
|
+
|
|
3
17
|
## 0.14.34
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/_cjs/core/AesGcm.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ivLength = void 0;
|
|
3
|
+
exports.InvalidSeedSizeError = exports.ivLength = void 0;
|
|
4
4
|
exports.decrypt = decrypt;
|
|
5
5
|
exports.encrypt = encrypt;
|
|
6
|
+
exports.fromMnemonic = fromMnemonic;
|
|
7
|
+
exports.fromSeed = fromSeed;
|
|
6
8
|
exports.getKey = getKey;
|
|
7
9
|
exports.randomSalt = randomSalt;
|
|
8
10
|
const Bytes = require("./Bytes.js");
|
|
11
|
+
const Errors = require("./Errors.js");
|
|
9
12
|
const Hex = require("./Hex.js");
|
|
13
|
+
const Mnemonic = require("./Mnemonic.js");
|
|
10
14
|
exports.ivLength = 16;
|
|
11
15
|
async function decrypt(value, key, options = {}) {
|
|
12
16
|
const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options;
|
|
@@ -34,6 +38,22 @@ async function encrypt(value, key, options = {}) {
|
|
|
34
38
|
return result;
|
|
35
39
|
return Hex.from(result);
|
|
36
40
|
}
|
|
41
|
+
async function fromMnemonic(mnemonic, options = {}) {
|
|
42
|
+
const { passphrase } = options;
|
|
43
|
+
const seed = Mnemonic.toSeed(mnemonic, { passphrase });
|
|
44
|
+
try {
|
|
45
|
+
return await fromSeed(seed);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
seed.fill(0);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function fromSeed(seed) {
|
|
52
|
+
const bytes = Bytes.from(seed);
|
|
53
|
+
if (bytes.length < 32)
|
|
54
|
+
throw new InvalidSeedSizeError({ size: bytes.length });
|
|
55
|
+
return deriveKey(bytes, fromSeedDomain);
|
|
56
|
+
}
|
|
37
57
|
async function getKey(options) {
|
|
38
58
|
const { iterations = 900_000, password, salt = randomSalt(32) } = options;
|
|
39
59
|
const baseKey = await globalThis.crypto.subtle.importKey('raw', Bytes.fromString(password), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
|
|
@@ -48,4 +68,30 @@ async function getKey(options) {
|
|
|
48
68
|
function randomSalt(size = 32) {
|
|
49
69
|
return Bytes.random(size);
|
|
50
70
|
}
|
|
71
|
+
class InvalidSeedSizeError extends Errors.BaseError {
|
|
72
|
+
constructor(options) {
|
|
73
|
+
super(`Seed must contain at least 32 bytes. Received ${options.size} bytes.`);
|
|
74
|
+
Object.defineProperty(this, "name", {
|
|
75
|
+
enumerable: true,
|
|
76
|
+
configurable: true,
|
|
77
|
+
writable: true,
|
|
78
|
+
value: 'AesGcm.InvalidSeedSizeError'
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.InvalidSeedSizeError = InvalidSeedSizeError;
|
|
83
|
+
async function deriveKey(seed, domain) {
|
|
84
|
+
const baseKey = await globalThis.crypto.subtle.importKey('raw', seed, {
|
|
85
|
+
name: 'HMAC',
|
|
86
|
+
hash: 'SHA-256',
|
|
87
|
+
}, false, ['sign']);
|
|
88
|
+
const key = new Uint8Array(await globalThis.crypto.subtle.sign('HMAC', baseKey, Bytes.concat(domain, Bytes.fromNumber(0, { size: 4 }))));
|
|
89
|
+
try {
|
|
90
|
+
return await globalThis.crypto.subtle.importKey('raw', key, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
key.fill(0);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const fromSeedDomain = Bytes.fromString('ox.aesGcm.fromSeed.v1');
|
|
51
97
|
//# sourceMappingURL=AesGcm.js.map
|
package/_cjs/core/AesGcm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AesGcm.js","sourceRoot":"","sources":["../../core/AesGcm.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AesGcm.js","sourceRoot":"","sources":["../../core/AesGcm.ts"],"names":[],"mappings":"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"}
|
package/_cjs/core/Ed25519.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noble = void 0;
|
|
3
|
+
exports.InvalidSeedSizeError = exports.noble = void 0;
|
|
4
4
|
exports.createKeyPair = createKeyPair;
|
|
5
|
+
exports.fromMnemonic = fromMnemonic;
|
|
6
|
+
exports.fromSeed = fromSeed;
|
|
5
7
|
exports.getPublicKey = getPublicKey;
|
|
6
8
|
exports.randomPrivateKey = randomPrivateKey;
|
|
7
9
|
exports.sign = sign;
|
|
@@ -10,7 +12,10 @@ exports.toX25519PublicKey = toX25519PublicKey;
|
|
|
10
12
|
exports.toX25519PrivateKey = toX25519PrivateKey;
|
|
11
13
|
const ed25519_1 = require("@noble/curves/ed25519");
|
|
12
14
|
const Bytes = require("./Bytes.js");
|
|
15
|
+
const Errors = require("./Errors.js");
|
|
13
16
|
const Hex = require("./Hex.js");
|
|
17
|
+
const keyDerivation = require("./internal/keyDerivation.js");
|
|
18
|
+
const Mnemonic = require("./Mnemonic.js");
|
|
14
19
|
exports.noble = ed25519_1.ed25519;
|
|
15
20
|
function createKeyPair(options = {}) {
|
|
16
21
|
const { as = 'Hex' } = options;
|
|
@@ -21,6 +26,29 @@ function createKeyPair(options = {}) {
|
|
|
21
26
|
publicKey: publicKey,
|
|
22
27
|
};
|
|
23
28
|
}
|
|
29
|
+
function fromMnemonic(mnemonic, options = {}) {
|
|
30
|
+
const { passphrase } = options;
|
|
31
|
+
const seed = Mnemonic.toSeed(mnemonic, { passphrase });
|
|
32
|
+
try {
|
|
33
|
+
return fromSeed(seed, options);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
seed.fill(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function fromSeed(seed, options = {}) {
|
|
40
|
+
const { as = 'Hex' } = options;
|
|
41
|
+
const bytes = Bytes.from(seed);
|
|
42
|
+
if (bytes.length < 32)
|
|
43
|
+
throw new InvalidSeedSizeError({ size: bytes.length });
|
|
44
|
+
const privateKey = keyDerivation.derive(bytes, fromSeedDomain);
|
|
45
|
+
if (as === 'Hex') {
|
|
46
|
+
const value = Hex.fromBytes(privateKey);
|
|
47
|
+
privateKey.fill(0);
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
return privateKey;
|
|
51
|
+
}
|
|
24
52
|
function getPublicKey(options) {
|
|
25
53
|
const { as = 'Hex', privateKey } = options;
|
|
26
54
|
const privateKeyBytes = Bytes.from(privateKey);
|
|
@@ -68,4 +96,17 @@ function toX25519PrivateKey(options) {
|
|
|
68
96
|
return Hex.fromBytes(x25519PrivateKeyBytes);
|
|
69
97
|
return x25519PrivateKeyBytes;
|
|
70
98
|
}
|
|
99
|
+
class InvalidSeedSizeError extends Errors.BaseError {
|
|
100
|
+
constructor(options) {
|
|
101
|
+
super(`Seed must contain at least 32 bytes. Received ${options.size} bytes.`);
|
|
102
|
+
Object.defineProperty(this, "name", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
configurable: true,
|
|
105
|
+
writable: true,
|
|
106
|
+
value: 'Ed25519.InvalidSeedSizeError'
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.InvalidSeedSizeError = InvalidSeedSizeError;
|
|
111
|
+
const fromSeedDomain = Bytes.fromString('ox.ed25519.fromSeed.v1');
|
|
71
112
|
//# sourceMappingURL=Ed25519.js.map
|
package/_cjs/core/Ed25519.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ed25519.js","sourceRoot":"","sources":["../../core/Ed25519.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Ed25519.js","sourceRoot":"","sources":["../../core/Ed25519.ts"],"names":[],"mappings":";;;AA2BA,sCAWC;AA8CD,oCAWC;AAyCD,4BAeC;AAoCD,oCAQC;AAsCD,4CAOC;AAkCD,oBASC;AAiDD,wBAMC;AAiCD,8CAQC;AAyCD,gDAQC;AA5aD,mDAI8B;AAC9B,oCAAmC;AACnC,sCAAqC;AACrC,gCAA+B;AAC/B,6DAA4D;AAC5D,0CAAyC;AAG5B,QAAA,KAAK,GAAG,iBAAO,CAAA;AAe5B,SAAgB,aAAa,CAC3B,UAAqC,EAAE;IAEvC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAC9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;IAElD,OAAO;QACL,UAAU,EAAE,UAAmB;QAC/B,SAAS,EAAE,SAAkB;KAC9B,CAAA;AACH,CAAC;AA8CD,SAAgB,YAAY,CAC1B,QAAgB,EAChB,UAAoC,EAAE;IAEtC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IACtD,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;AACH,CAAC;AAyCD,SAAgB,QAAQ,CACtB,IAA2B,EAC3B,UAAgC,EAAE;IAElC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,oBAAoB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IAE7E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IAC9D,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACvC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAClB,OAAO,KAAc,CAAA;IACvB,CAAC;IACD,OAAO,UAAmB,CAAA;AAC5B,CAAC;AAoCD,SAAgB,YAAY,CAC1B,OAAiC;IAEjC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,cAAc,GAAG,iBAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;IAC5D,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,cAAc,CAAU,CAAA;IAC/D,OAAO,cAAuB,CAAA;AAChC,CAAC;AAsCD,SAAgB,gBAAgB,CAC9B,UAAwC,EAAE;IAE1C,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAC9B,MAAM,KAAK,GAAG,iBAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAA;IAC9C,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,CAAU,CAAA;IACtD,OAAO,KAAc,CAAA;AACvB,CAAC;AAkCD,SAAgB,IAAI,CAClB,OAAyB;IAEzB,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IACnD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,cAAc,GAAG,iBAAO,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;IAClE,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,cAAc,CAAU,CAAA;IAC/D,OAAO,cAAuB,CAAA;AAChC,CAAC;AAiDD,SAAgB,MAAM,CAAC,OAAuB;IAC5C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,OAAO,iBAAO,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;AACrE,CAAC;AAiCD,SAAgB,iBAAiB,CAC/B,OAAsC;IAEtC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IACzC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,oBAAoB,GAAG,IAAA,gCAAsB,EAAC,cAAc,CAAC,CAAA;IACnE,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAU,CAAA;IACrE,OAAO,oBAA6B,CAAA;AACtC,CAAC;AAyCD,SAAgB,kBAAkB,CAChC,OAAuC;IAEvC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,qBAAqB,GAAG,IAAA,iCAAuB,EAAC,eAAe,CAAC,CAAA;IACtE,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAU,CAAA;IACtE,OAAO,qBAA8B,CAAA;AACvC,CAAC;AAwBD,MAAa,oBAAqB,SAAQ,MAAM,CAAC,SAAS;IAGxD,YAAY,OAAqC;QAC/C,KAAK,CACH,iDAAiD,OAAO,CAAC,IAAI,SAAS,CACvE,CAAA;QALe;;;;mBAAO,8BAA8B;WAAA;IAMvD,CAAC;CACF;AARD,oDAQC;AAUD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAA"}
|
package/_cjs/core/P256.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noble = void 0;
|
|
3
|
+
exports.InvalidSeedSizeError = exports.noble = void 0;
|
|
4
4
|
exports.createKeyPair = createKeyPair;
|
|
5
|
+
exports.fromMnemonic = fromMnemonic;
|
|
6
|
+
exports.fromSeed = fromSeed;
|
|
5
7
|
exports.getPublicKey = getPublicKey;
|
|
6
8
|
exports.getSharedSecret = getSharedSecret;
|
|
7
9
|
exports.randomPrivateKey = randomPrivateKey;
|
|
@@ -10,8 +12,11 @@ exports.sign = sign;
|
|
|
10
12
|
exports.verify = verify;
|
|
11
13
|
const p256_1 = require("@noble/curves/p256");
|
|
12
14
|
const Bytes = require("./Bytes.js");
|
|
15
|
+
const Errors = require("./Errors.js");
|
|
13
16
|
const Hex = require("./Hex.js");
|
|
14
17
|
const Entropy = require("./internal/entropy.js");
|
|
18
|
+
const keyDerivation = require("./internal/keyDerivation.js");
|
|
19
|
+
const internal = require("./internal/mnemonic.js");
|
|
15
20
|
const PublicKey = require("./PublicKey.js");
|
|
16
21
|
exports.noble = p256_1.secp256r1;
|
|
17
22
|
function createKeyPair(options = {}) {
|
|
@@ -23,6 +28,31 @@ function createKeyPair(options = {}) {
|
|
|
23
28
|
publicKey,
|
|
24
29
|
};
|
|
25
30
|
}
|
|
31
|
+
function fromMnemonic(mnemonic, options = {}) {
|
|
32
|
+
const { passphrase } = options;
|
|
33
|
+
const seed = internal.toSeed(mnemonic, { passphrase });
|
|
34
|
+
try {
|
|
35
|
+
return fromSeed(seed, options);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
seed.fill(0);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function fromSeed(seed, options = {}) {
|
|
42
|
+
const { as = 'Hex' } = options;
|
|
43
|
+
const bytes = Bytes.from(seed);
|
|
44
|
+
if (bytes.length < 32)
|
|
45
|
+
throw new InvalidSeedSizeError({ size: bytes.length });
|
|
46
|
+
const privateKey = keyDerivation.derive(bytes, fromSeedDomain, {
|
|
47
|
+
validate: exports.noble.utils.isValidPrivateKey,
|
|
48
|
+
});
|
|
49
|
+
if (as === 'Hex') {
|
|
50
|
+
const value = Hex.fromBytes(privateKey);
|
|
51
|
+
privateKey.fill(0);
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
return privateKey;
|
|
55
|
+
}
|
|
26
56
|
function getPublicKey(options) {
|
|
27
57
|
const { privateKey } = options;
|
|
28
58
|
const point = p256_1.secp256r1.ProjectivePoint.fromPrivateKey(typeof privateKey === 'string'
|
|
@@ -76,4 +106,17 @@ function verify(options) {
|
|
|
76
106
|
const { hash, payload, publicKey, signature } = options;
|
|
77
107
|
return p256_1.secp256r1.verify(signature, payload instanceof Uint8Array ? payload : Bytes.fromHex(payload), PublicKey.toHex(publicKey).substring(2), { lowS: true, ...(hash ? { prehash: true } : {}) });
|
|
78
108
|
}
|
|
109
|
+
class InvalidSeedSizeError extends Errors.BaseError {
|
|
110
|
+
constructor(options) {
|
|
111
|
+
super(`Seed must contain at least 32 bytes. Received ${options.size} bytes.`);
|
|
112
|
+
Object.defineProperty(this, "name", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
configurable: true,
|
|
115
|
+
writable: true,
|
|
116
|
+
value: 'P256.InvalidSeedSizeError'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.InvalidSeedSizeError = InvalidSeedSizeError;
|
|
121
|
+
const fromSeedDomain = Bytes.fromString('ox.p256.fromSeed.v1');
|
|
79
122
|
//# sourceMappingURL=P256.js.map
|
package/_cjs/core/P256.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"P256.js","sourceRoot":"","sources":["../../core/P256.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"P256.js","sourceRoot":"","sources":["../../core/P256.ts"],"names":[],"mappings":"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"}
|
package/_cjs/core/Secp256k1.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noble = void 0;
|
|
3
|
+
exports.InvalidSeedSizeError = exports.noble = void 0;
|
|
4
4
|
exports.createKeyPair = createKeyPair;
|
|
5
|
+
exports.fromMnemonic = fromMnemonic;
|
|
6
|
+
exports.fromSeed = fromSeed;
|
|
5
7
|
exports.getPublicKey = getPublicKey;
|
|
6
8
|
exports.getSharedSecret = getSharedSecret;
|
|
7
9
|
exports.randomPrivateKey = randomPrivateKey;
|
|
@@ -12,8 +14,11 @@ exports.verify = verify;
|
|
|
12
14
|
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
13
15
|
const Address = require("./Address.js");
|
|
14
16
|
const Bytes = require("./Bytes.js");
|
|
17
|
+
const Errors = require("./Errors.js");
|
|
15
18
|
const Hex = require("./Hex.js");
|
|
16
19
|
const Entropy = require("./internal/entropy.js");
|
|
20
|
+
const keyDerivation = require("./internal/keyDerivation.js");
|
|
21
|
+
const internal = require("./internal/mnemonic.js");
|
|
17
22
|
const PublicKey = require("./PublicKey.js");
|
|
18
23
|
exports.noble = secp256k1_1.secp256k1;
|
|
19
24
|
function createKeyPair(options = {}) {
|
|
@@ -25,6 +30,25 @@ function createKeyPair(options = {}) {
|
|
|
25
30
|
publicKey,
|
|
26
31
|
};
|
|
27
32
|
}
|
|
33
|
+
function fromMnemonic(mnemonic, options = {}) {
|
|
34
|
+
const { as = 'Hex', passphrase, path } = options;
|
|
35
|
+
return internal.toPrivateKey(mnemonic, { as, passphrase, path });
|
|
36
|
+
}
|
|
37
|
+
function fromSeed(seed, options = {}) {
|
|
38
|
+
const { as = 'Hex' } = options;
|
|
39
|
+
const bytes = Bytes.from(seed);
|
|
40
|
+
if (bytes.length < 32)
|
|
41
|
+
throw new InvalidSeedSizeError({ size: bytes.length });
|
|
42
|
+
const privateKey = keyDerivation.derive(bytes, fromSeedDomain, {
|
|
43
|
+
validate: exports.noble.utils.isValidPrivateKey,
|
|
44
|
+
});
|
|
45
|
+
if (as === 'Hex') {
|
|
46
|
+
const value = Hex.fromBytes(privateKey);
|
|
47
|
+
privateKey.fill(0);
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
return privateKey;
|
|
51
|
+
}
|
|
28
52
|
function getPublicKey(options) {
|
|
29
53
|
const { privateKey } = options;
|
|
30
54
|
const point = secp256k1_1.secp256k1.ProjectivePoint.fromPrivateKey(Hex.from(privateKey).slice(2));
|
|
@@ -77,4 +101,17 @@ function verify(options) {
|
|
|
77
101
|
return Address.isEqual(options.address, recoverAddress({ payload, signature: options.signature }));
|
|
78
102
|
return secp256k1_1.secp256k1.verify(options.signature, Bytes.from(payload), PublicKey.toBytes(options.publicKey), ...(hash ? [{ prehash: true, lowS: true }] : []));
|
|
79
103
|
}
|
|
104
|
+
class InvalidSeedSizeError extends Errors.BaseError {
|
|
105
|
+
constructor(options) {
|
|
106
|
+
super(`Seed must contain at least 32 bytes. Received ${options.size} bytes.`);
|
|
107
|
+
Object.defineProperty(this, "name", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: 'Secp256k1.InvalidSeedSizeError'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.InvalidSeedSizeError = InvalidSeedSizeError;
|
|
116
|
+
const fromSeedDomain = Bytes.fromString('ox.secp256k1.fromSeed.v1');
|
|
80
117
|
//# sourceMappingURL=Secp256k1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Secp256k1.js","sourceRoot":"","sources":["../../core/Secp256k1.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Secp256k1.js","sourceRoot":"","sources":["../../core/Secp256k1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.derive = derive;
|
|
4
|
+
const Bytes = require("../Bytes.js");
|
|
5
|
+
const Hash = require("../Hash.js");
|
|
6
|
+
function derive(seed, domain, options = {}) {
|
|
7
|
+
const { validate } = options;
|
|
8
|
+
for (let counter = 0;; counter++) {
|
|
9
|
+
const key = Hash.hmac256(seed, Bytes.concat(domain, Bytes.fromNumber(counter, { size: 4 })), { as: 'Bytes' });
|
|
10
|
+
if (!validate || validate(key))
|
|
11
|
+
return key;
|
|
12
|
+
key.fill(0);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=keyDerivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyDerivation.js","sourceRoot":"","sources":["../../../core/internal/keyDerivation.ts"],"names":[],"mappings":";;AAKA,wBAeC;AApBD,qCAAoC;AAEpC,mCAAkC;AAGlC,SAAgB,MAAM,CACpB,IAAiB,EACjB,MAAmB,EACnB,UAA0B,EAAE;IAE5B,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAC5B,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,IAAI,EACJ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5D,EAAE,EAAE,EAAE,OAAO,EAAE,CAChB,CAAA;QACD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAA;QAC1C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toPrivateKey = toPrivateKey;
|
|
4
|
+
exports.toSeed = toSeed;
|
|
5
|
+
const bip32_1 = require("@scure/bip32");
|
|
6
|
+
const bip39_1 = require("@scure/bip39");
|
|
7
|
+
const Hex = require("../Hex.js");
|
|
8
|
+
function toPrivateKey(mnemonic, options = {}) {
|
|
9
|
+
const { path = "m/44'/60'/0'/0/0", passphrase } = options;
|
|
10
|
+
const privateKey = bip32_1.HDKey.fromMasterSeed(toSeed(mnemonic, { passphrase })).derive(path).privateKey;
|
|
11
|
+
if (options.as === 'Bytes')
|
|
12
|
+
return privateKey;
|
|
13
|
+
return Hex.fromBytes(privateKey);
|
|
14
|
+
}
|
|
15
|
+
function toSeed(mnemonic, options = {}) {
|
|
16
|
+
return (0, bip39_1.mnemonicToSeedSync)(mnemonic, options.passphrase);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=mnemonic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mnemonic.js","sourceRoot":"","sources":["../../../core/internal/mnemonic.ts"],"names":[],"mappings":";;AAMA,oCAgBC;AAGD,wBAKC;AA9BD,wCAAoC;AACpC,wCAAiD;AAEjD,iCAAgC;AAGhC,SAAgB,YAAY,CAC1B,QAAgB,EAChB,UAII,EAAE;IAIN,MAAM,EAAE,IAAI,GAAG,kBAAkB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IACzD,MAAM,UAAU,GAAG,aAAK,CAAC,cAAc,CACrC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CACjC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAW,CAAA;IAC1B,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO;QAAE,OAAO,UAAmB,CAAA;IACtD,OAAO,GAAG,CAAC,SAAS,CAAC,UAAU,CAAU,CAAA;AAC3C,CAAC;AAGD,SAAgB,MAAM,CACpB,QAAgB,EAChB,UAA+C,EAAE;IAEjD,OAAO,IAAA,0BAAkB,EAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -12,9 +12,9 @@ const Address = require("../core/Address.js");
|
|
|
12
12
|
const Errors = require("../core/Errors.js");
|
|
13
13
|
const Hash = require("../core/Hash.js");
|
|
14
14
|
const Hex = require("../core/Hex.js");
|
|
15
|
-
exports.maxOwners =
|
|
16
|
-
exports.maxThreshold =
|
|
17
|
-
exports.maxSignatures =
|
|
15
|
+
exports.maxOwners = 48;
|
|
16
|
+
exports.maxThreshold = 0xff;
|
|
17
|
+
exports.maxSignatures = 8;
|
|
18
18
|
exports.maxNestingDepth = 2;
|
|
19
19
|
exports.maxOwnerSignatureBytes = 2049;
|
|
20
20
|
exports.signatureTypeByte = '0x05';
|
|
@@ -36,6 +36,7 @@ function assert(config) {
|
|
|
36
36
|
if (Number(threshold) > exports.maxThreshold)
|
|
37
37
|
throw new InvalidConfigError({ reason: 'threshold exceeds max threshold' });
|
|
38
38
|
let totalWeight = 0;
|
|
39
|
+
const weights = [];
|
|
39
40
|
let previous;
|
|
40
41
|
for (const owner of owners) {
|
|
41
42
|
if (!Address.validate(owner.owner) || Hex.toBigInt(owner.owner) === 0n)
|
|
@@ -52,7 +53,9 @@ function assert(config) {
|
|
|
52
53
|
reason: 'owners must be strictly ascending',
|
|
53
54
|
});
|
|
54
55
|
previous = current;
|
|
55
|
-
|
|
56
|
+
const weight = Number(owner.weight);
|
|
57
|
+
totalWeight += weight;
|
|
58
|
+
weights.push(weight);
|
|
56
59
|
}
|
|
57
60
|
if (totalWeight > 0xff)
|
|
58
61
|
throw new InvalidConfigError({
|
|
@@ -62,6 +65,14 @@ function assert(config) {
|
|
|
62
65
|
throw new InvalidConfigError({
|
|
63
66
|
reason: 'threshold exceeds total owner weight',
|
|
64
67
|
});
|
|
68
|
+
const reachableWeight = weights
|
|
69
|
+
.sort((a, b) => b - a)
|
|
70
|
+
.slice(0, exports.maxSignatures)
|
|
71
|
+
.reduce((sum, weight) => sum + weight, 0);
|
|
72
|
+
if (Number(threshold) > reachableWeight)
|
|
73
|
+
throw new InvalidConfigError({
|
|
74
|
+
reason: `threshold exceeds weight reachable by ${exports.maxSignatures} owner signatures`,
|
|
75
|
+
});
|
|
65
76
|
}
|
|
66
77
|
function from(config) {
|
|
67
78
|
const owners = [...config.owners].sort((a, b) => Hex.toBigInt(a.owner) < Hex.toBigInt(b.owner) ? -1 : 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultisigConfig.js","sourceRoot":"","sources":["../../tempo/MultisigConfig.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MultisigConfig.js","sourceRoot":"","sources":["../../tempo/MultisigConfig.ts"],"names":[],"mappings":"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"}
|
package/_cjs/version.js
CHANGED
package/_esm/core/AesGcm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as Bytes from './Bytes.js';
|
|
2
|
+
import * as Errors from './Errors.js';
|
|
2
3
|
import * as Hex from './Hex.js';
|
|
4
|
+
import * as Mnemonic from './Mnemonic.js';
|
|
3
5
|
export const ivLength = 16;
|
|
4
6
|
/**
|
|
5
7
|
* Decrypts encrypted data using AES-GCM.
|
|
@@ -67,6 +69,63 @@ export async function encrypt(value, key, options = {}) {
|
|
|
67
69
|
return result;
|
|
68
70
|
return Hex.from(result);
|
|
69
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Derives an AES-256-GCM key from a BIP-39 mnemonic.
|
|
74
|
+
*
|
|
75
|
+
* This is equivalent to passing `Mnemonic.toSeed(mnemonic, { passphrase })`
|
|
76
|
+
* to `AesGcm.fromSeed`.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts twoslash
|
|
80
|
+
* import { AesGcm } from 'ox'
|
|
81
|
+
*
|
|
82
|
+
* const key = await AesGcm.fromMnemonic(
|
|
83
|
+
* 'test test test test test test test test test test test junk'
|
|
84
|
+
* )
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @param mnemonic - BIP-39 mnemonic phrase.
|
|
88
|
+
* @param options - Options.
|
|
89
|
+
* @returns A nonextractable AES-256-GCM key for encryption and decryption.
|
|
90
|
+
*/
|
|
91
|
+
export async function fromMnemonic(mnemonic, options = {}) {
|
|
92
|
+
const { passphrase } = options;
|
|
93
|
+
const seed = Mnemonic.toSeed(mnemonic, { passphrase });
|
|
94
|
+
try {
|
|
95
|
+
return await fromSeed(seed);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
seed.fill(0);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Derives an AES-256-GCM key from a seed.
|
|
103
|
+
*
|
|
104
|
+
* The seed must contain at least 32 bytes of cryptographically strong key
|
|
105
|
+
* material. Do not pass a password directly; use a password KDF first.
|
|
106
|
+
*
|
|
107
|
+
* The permanent derivation contract uses the seed as the HMAC-SHA256
|
|
108
|
+
* key. The HMAC message uses the `ox.aesGcm.fromSeed.v1` domain followed by a
|
|
109
|
+
* 32-bit big-endian counter set to zero.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts twoslash
|
|
113
|
+
* import { AesGcm } from 'ox'
|
|
114
|
+
*
|
|
115
|
+
* const key = await AesGcm.fromSeed(
|
|
116
|
+
* '0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'
|
|
117
|
+
* )
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
* @param seed - Seed containing at least 32 bytes of cryptographically strong key material.
|
|
121
|
+
* @returns A nonextractable AES-256-GCM key for encryption and decryption.
|
|
122
|
+
*/
|
|
123
|
+
export async function fromSeed(seed) {
|
|
124
|
+
const bytes = Bytes.from(seed);
|
|
125
|
+
if (bytes.length < 32)
|
|
126
|
+
throw new InvalidSeedSizeError({ size: bytes.length });
|
|
127
|
+
return deriveKey(bytes, fromSeedDomain);
|
|
128
|
+
}
|
|
70
129
|
/**
|
|
71
130
|
* Derives an AES-GCM key from a password using PBKDF2.
|
|
72
131
|
*
|
|
@@ -109,4 +168,30 @@ export async function getKey(options) {
|
|
|
109
168
|
export function randomSalt(size = 32) {
|
|
110
169
|
return Bytes.random(size);
|
|
111
170
|
}
|
|
171
|
+
/** Thrown when a seed contains fewer than 32 bytes. */
|
|
172
|
+
export class InvalidSeedSizeError extends Errors.BaseError {
|
|
173
|
+
constructor(options) {
|
|
174
|
+
super(`Seed must contain at least 32 bytes. Received ${options.size} bytes.`);
|
|
175
|
+
Object.defineProperty(this, "name", {
|
|
176
|
+
enumerable: true,
|
|
177
|
+
configurable: true,
|
|
178
|
+
writable: true,
|
|
179
|
+
value: 'AesGcm.InvalidSeedSizeError'
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function deriveKey(seed, domain) {
|
|
184
|
+
const baseKey = await globalThis.crypto.subtle.importKey('raw', seed, {
|
|
185
|
+
name: 'HMAC',
|
|
186
|
+
hash: 'SHA-256',
|
|
187
|
+
}, false, ['sign']);
|
|
188
|
+
const key = new Uint8Array(await globalThis.crypto.subtle.sign('HMAC', baseKey, Bytes.concat(domain, Bytes.fromNumber(0, { size: 4 }))));
|
|
189
|
+
try {
|
|
190
|
+
return await globalThis.crypto.subtle.importKey('raw', key, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
key.fill(0);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const fromSeedDomain = Bytes.fromString('ox.aesGcm.fromSeed.v1');
|
|
112
197
|
//# sourceMappingURL=AesGcm.js.map
|
package/_esm/core/AesGcm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AesGcm.js","sourceRoot":"","sources":["../../core/AesGcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"AesGcm.js","sourceRoot":"","sources":["../../core/AesGcm.ts"],"names":[],"mappings":"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"}
|