ox 0.7.2 → 0.8.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/CHANGELOG.md +43 -0
- package/_cjs/core/Keystore.js +84 -28
- package/_cjs/core/Keystore.js.map +1 -1
- package/_cjs/index.js.map +1 -1
- package/_cjs/version.js +1 -1
- package/_esm/core/Keystore.js +131 -37
- package/_esm/core/Keystore.js.map +1 -1
- package/_esm/index.js +21 -5
- package/_esm/index.js.map +1 -1
- package/_esm/version.js +1 -1
- package/_types/core/Keystore.d.ts +90 -35
- package/_types/core/Keystore.d.ts.map +1 -1
- package/_types/index.d.ts +21 -5
- package/_types/index.d.ts.map +1 -1
- package/_types/version.d.ts +1 -1
- package/core/Keystore.ts +190 -59
- package/index.ts +21 -5
- package/package.json +1 -1
- package/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# ox
|
|
2
2
|
|
|
3
|
+
## 0.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`74e47c5`](https://github.com/wevm/ox/commit/74e47c5df471a48f4fb389f0684ca52f841fbc11) Thanks [@jxom](https://github.com/jxom)! - Added `Keystore.toKey` and `Keystore.toKeyAsync` to derive a key from a JSON Keystore using a password.
|
|
8
|
+
|
|
9
|
+
## 0.8.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`7fc1da0`](https://github.com/wevm/ox/commit/7fc1da0717a17dbac0e4effed2ea3911c7ca3236) Thanks [@jxom](https://github.com/jxom)! - **Breaking(`Keystore`):** Keystore derivation functions (e.g. `Keystore.pbkdf2`) now return a tuple of the key and derivation options,
|
|
14
|
+
instead of an object with the key and options.
|
|
15
|
+
|
|
16
|
+
```diff
|
|
17
|
+
import { Keystore } from 'ox'
|
|
18
|
+
|
|
19
|
+
- const key = Keystore.pbkdf2({ password: 'testpassword' })
|
|
20
|
+
+ const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- [`7fc1da0`](https://github.com/wevm/ox/commit/7fc1da0717a17dbac0e4effed2ea3911c7ca3236) Thanks [@jxom](https://github.com/jxom)! - **Breaking(`Keystore`):** `Keystore.decrypt` function interface no longer requires an object as the second parameter, now it only requires the key itself.
|
|
24
|
+
|
|
25
|
+
```diff
|
|
26
|
+
import { Keystore } from 'ox'
|
|
27
|
+
|
|
28
|
+
const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
29
|
+
|
|
30
|
+
const encrypted = await Keystore.encrypt(secret, key, opts)
|
|
31
|
+
|
|
32
|
+
+ const decrypted = await Keystore.decrypt(encrypted, key)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- [`7fc1da0`](https://github.com/wevm/ox/commit/7fc1da0717a17dbac0e4effed2ea3911c7ca3236) Thanks [@jxom](https://github.com/jxom)! - **Breaking(`Keystore`):** `Keystore.encrypt` function interface has changed to require derivation options (`opts`).
|
|
36
|
+
|
|
37
|
+
```diff
|
|
38
|
+
import { Keystore } from 'ox'
|
|
39
|
+
|
|
40
|
+
const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
41
|
+
|
|
42
|
+
- const encrypted = await Keystore.encrypt(secret, key)
|
|
43
|
+
+ const encrypted = await Keystore.encrypt(secret, key, opts)
|
|
44
|
+
```
|
|
45
|
+
|
|
3
46
|
## 0.7.2
|
|
4
47
|
|
|
5
48
|
### Patch Changes
|
package/_cjs/core/Keystore.js
CHANGED
|
@@ -6,41 +6,43 @@ exports.pbkdf2 = pbkdf2;
|
|
|
6
6
|
exports.pbkdf2Async = pbkdf2Async;
|
|
7
7
|
exports.scrypt = scrypt;
|
|
8
8
|
exports.scryptAsync = scryptAsync;
|
|
9
|
+
exports.toKey = toKey;
|
|
10
|
+
exports.toKeyAsync = toKeyAsync;
|
|
9
11
|
const aes_1 = require("@noble/ciphers/aes");
|
|
10
12
|
const pbkdf2_1 = require("@noble/hashes/pbkdf2");
|
|
11
13
|
const scrypt_1 = require("@noble/hashes/scrypt");
|
|
12
14
|
const sha2_1 = require("@noble/hashes/sha2");
|
|
13
15
|
const Bytes = require("./Bytes.js");
|
|
14
16
|
const Hash = require("./Hash.js");
|
|
15
|
-
|
|
17
|
+
function decrypt(keystore, key, options = {}) {
|
|
16
18
|
const { as = 'Hex' } = options;
|
|
17
|
-
const key_ = Bytes.from(
|
|
19
|
+
const key_ = Bytes.from(typeof key === 'function' ? key() : key);
|
|
18
20
|
const encKey = Bytes.slice(key_, 0, 16);
|
|
19
21
|
const macKey = Bytes.slice(key_, 16, 32);
|
|
20
22
|
const ciphertext = Bytes.from(`0x${keystore.crypto.ciphertext}`);
|
|
21
23
|
const mac = Hash.keccak256(Bytes.concat(macKey, ciphertext));
|
|
22
24
|
if (!Bytes.isEqual(mac, Bytes.from(`0x${keystore.crypto.mac}`)))
|
|
23
25
|
throw new Error('corrupt keystore');
|
|
24
|
-
const data = (0, aes_1.ctr)(encKey,
|
|
26
|
+
const data = (0, aes_1.ctr)(encKey, Bytes.from(`0x${keystore.crypto.cipherparams.iv}`)).decrypt(ciphertext);
|
|
25
27
|
if (as === 'Hex')
|
|
26
28
|
return Bytes.toHex(data);
|
|
27
29
|
return data;
|
|
28
30
|
}
|
|
29
|
-
|
|
30
|
-
const { id = crypto.randomUUID() } = options;
|
|
31
|
-
const key_ = Bytes.from(
|
|
31
|
+
function encrypt(privateKey, key, options) {
|
|
32
|
+
const { id = crypto.randomUUID(), kdf, kdfparams, iv } = options;
|
|
33
|
+
const key_ = Bytes.from(typeof key === 'function' ? key() : key);
|
|
32
34
|
const value_ = Bytes.from(privateKey);
|
|
33
35
|
const encKey = Bytes.slice(key_, 0, 16);
|
|
34
36
|
const macKey = Bytes.slice(key_, 16, 32);
|
|
35
|
-
const ciphertext = (0, aes_1.ctr)(encKey,
|
|
37
|
+
const ciphertext = (0, aes_1.ctr)(encKey, iv).encrypt(value_);
|
|
36
38
|
const mac = Hash.keccak256(Bytes.concat(macKey, ciphertext));
|
|
37
39
|
return {
|
|
38
40
|
crypto: {
|
|
39
41
|
cipher: 'aes-128-ctr',
|
|
40
42
|
ciphertext: Bytes.toHex(ciphertext).slice(2),
|
|
41
|
-
cipherparams: { iv: Bytes.toHex(
|
|
42
|
-
kdf
|
|
43
|
-
kdfparams
|
|
43
|
+
cipherparams: { iv: Bytes.toHex(iv).slice(2) },
|
|
44
|
+
kdf,
|
|
45
|
+
kdfparams,
|
|
44
46
|
mac: Bytes.toHex(mac).slice(2),
|
|
45
47
|
},
|
|
46
48
|
id,
|
|
@@ -50,10 +52,9 @@ async function encrypt(privateKey, key, options = {}) {
|
|
|
50
52
|
function pbkdf2(options) {
|
|
51
53
|
const { iv, iterations = 262_144, password } = options;
|
|
52
54
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
53
|
-
const key = Bytes.toHex((0, pbkdf2_1.pbkdf2)(sha2_1.sha256, password, salt, { c: iterations, dkLen: 32 }))
|
|
54
|
-
return defineKey({
|
|
55
|
+
const key = Bytes.toHex((0, pbkdf2_1.pbkdf2)(sha2_1.sha256, password, salt, { c: iterations, dkLen: 32 }));
|
|
56
|
+
return defineKey(() => key, {
|
|
55
57
|
iv,
|
|
56
|
-
key: () => key,
|
|
57
58
|
kdfparams: {
|
|
58
59
|
c: iterations,
|
|
59
60
|
dklen: 32,
|
|
@@ -69,10 +70,9 @@ async function pbkdf2Async(options) {
|
|
|
69
70
|
const key = Bytes.toHex(await (0, pbkdf2_1.pbkdf2Async)(sha2_1.sha256, password, salt, {
|
|
70
71
|
c: iterations,
|
|
71
72
|
dkLen: 32,
|
|
72
|
-
}))
|
|
73
|
-
return defineKey({
|
|
73
|
+
}));
|
|
74
|
+
return defineKey(() => key, {
|
|
74
75
|
iv,
|
|
75
|
-
key: () => key,
|
|
76
76
|
kdfparams: {
|
|
77
77
|
c: iterations,
|
|
78
78
|
dklen: 32,
|
|
@@ -83,14 +83,11 @@ async function pbkdf2Async(options) {
|
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
function scrypt(options) {
|
|
86
|
-
const { iv, n = 262_144, password } = options;
|
|
87
|
-
const p = 8;
|
|
88
|
-
const r = 1;
|
|
86
|
+
const { iv, n = 262_144, password, p = 8, r = 1 } = options;
|
|
89
87
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
90
|
-
const key = Bytes.toHex((0, scrypt_1.scrypt)(password, salt, { N: n, dkLen: 32, r, p }))
|
|
91
|
-
return defineKey({
|
|
88
|
+
const key = Bytes.toHex((0, scrypt_1.scrypt)(password, salt, { N: n, dkLen: 32, r, p }));
|
|
89
|
+
return defineKey(() => key, {
|
|
92
90
|
iv,
|
|
93
|
-
key: () => key,
|
|
94
91
|
kdfparams: {
|
|
95
92
|
dklen: 32,
|
|
96
93
|
n,
|
|
@@ -106,10 +103,9 @@ async function scryptAsync(options) {
|
|
|
106
103
|
const p = 8;
|
|
107
104
|
const r = 1;
|
|
108
105
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
109
|
-
const key = Bytes.toHex(await (0, scrypt_1.scryptAsync)(password, salt, { N: n, dkLen: 32, r, p }))
|
|
110
|
-
return defineKey({
|
|
106
|
+
const key = Bytes.toHex(await (0, scrypt_1.scryptAsync)(password, salt, { N: n, dkLen: 32, r, p }));
|
|
107
|
+
return defineKey(() => key, {
|
|
111
108
|
iv,
|
|
112
|
-
key: () => key,
|
|
113
109
|
kdfparams: {
|
|
114
110
|
dklen: 32,
|
|
115
111
|
n,
|
|
@@ -120,8 +116,68 @@ async function scryptAsync(options) {
|
|
|
120
116
|
kdf: 'scrypt',
|
|
121
117
|
});
|
|
122
118
|
}
|
|
123
|
-
function
|
|
124
|
-
const
|
|
125
|
-
|
|
119
|
+
function toKey(keystore, options) {
|
|
120
|
+
const { crypto } = keystore;
|
|
121
|
+
const { password } = options;
|
|
122
|
+
const { cipherparams, kdf, kdfparams } = crypto;
|
|
123
|
+
const { iv } = cipherparams;
|
|
124
|
+
const { c, n, p, r, salt } = kdfparams;
|
|
125
|
+
const [key] = (() => {
|
|
126
|
+
switch (kdf) {
|
|
127
|
+
case 'scrypt':
|
|
128
|
+
return scrypt({
|
|
129
|
+
iv: Bytes.from(`0x${iv}`),
|
|
130
|
+
n,
|
|
131
|
+
p,
|
|
132
|
+
r,
|
|
133
|
+
salt: Bytes.from(`0x${salt}`),
|
|
134
|
+
password,
|
|
135
|
+
});
|
|
136
|
+
case 'pbkdf2':
|
|
137
|
+
return pbkdf2({
|
|
138
|
+
iv: Bytes.from(`0x${iv}`),
|
|
139
|
+
iterations: c,
|
|
140
|
+
password,
|
|
141
|
+
salt: Bytes.from(`0x${salt}`),
|
|
142
|
+
});
|
|
143
|
+
default:
|
|
144
|
+
throw new Error('unsupported kdf');
|
|
145
|
+
}
|
|
146
|
+
})();
|
|
147
|
+
return key;
|
|
148
|
+
}
|
|
149
|
+
async function toKeyAsync(keystore, options) {
|
|
150
|
+
const { crypto } = keystore;
|
|
151
|
+
const { password } = options;
|
|
152
|
+
const { cipherparams, kdf, kdfparams } = crypto;
|
|
153
|
+
const { iv } = cipherparams;
|
|
154
|
+
const { c, n, p, r, salt } = kdfparams;
|
|
155
|
+
const [key] = await (async () => {
|
|
156
|
+
switch (kdf) {
|
|
157
|
+
case 'scrypt':
|
|
158
|
+
return await scryptAsync({
|
|
159
|
+
iv: Bytes.from(`0x${iv}`),
|
|
160
|
+
n,
|
|
161
|
+
p,
|
|
162
|
+
r,
|
|
163
|
+
salt: Bytes.from(`0x${salt}`),
|
|
164
|
+
password,
|
|
165
|
+
});
|
|
166
|
+
case 'pbkdf2':
|
|
167
|
+
return await pbkdf2({
|
|
168
|
+
iv: Bytes.from(`0x${iv}`),
|
|
169
|
+
iterations: c,
|
|
170
|
+
password,
|
|
171
|
+
salt: Bytes.from(`0x${salt}`),
|
|
172
|
+
});
|
|
173
|
+
default:
|
|
174
|
+
throw new Error('unsupported kdf');
|
|
175
|
+
}
|
|
176
|
+
})();
|
|
177
|
+
return key;
|
|
178
|
+
}
|
|
179
|
+
function defineKey(key, options) {
|
|
180
|
+
const iv = options.iv ? Bytes.from(options.iv) : Bytes.random(16);
|
|
181
|
+
return [key, { ...options, iv }];
|
|
126
182
|
}
|
|
127
183
|
//# sourceMappingURL=Keystore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Keystore.js","sourceRoot":"","sources":["../../core/Keystore.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Keystore.js","sourceRoot":"","sources":["../../core/Keystore.ts"],"names":[],"mappings":"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"}
|
package/_cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;AAuHA,uCAAoC;AA4EpC,6DAA0D;AAwE1D,iDAA8C;AAmH9C,iDAA8C;AA8F9C,uDAAoD;AA8EpD,+CAA4C;AAwG5C,2DAAwD;AAOxD,qDAAkD;AAOlD,yDAAsD;AAuDtD,+CAA4C;AAqC5C,6CAA0C;AA0E1C,2DAAwD;AAuDxD,6CAA0C;AAsD1C,6CAA0C;AAO1C,+DAA4D;AAO5D,2CAAwC;AAgCxC,2CAAwC;AAOxC,6DAA0D;AAO1D,2CAAwC;AAoHxC,uCAAoC;AA6CpC,iDAA8C;AAgI9C,2CAAwC;AAExC,6CAA0C;AAsC1C,+DAA4D;AA+B5D,uCAAoC;AAEpC,6CAA0C;AAO1C,6CAA0C;AAe1C,yCAAsC;AActC,2CAAwC;AAmHxC,uCAAoC;AAKpC,uCAAoC;AAkCpC,yCAAsC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;AAuHA,uCAAoC;AA4EpC,6DAA0D;AAwE1D,iDAA8C;AAmH9C,iDAA8C;AA8F9C,uDAAoD;AA8EpD,+CAA4C;AAwG5C,2DAAwD;AAOxD,qDAAkD;AAOlD,yDAAsD;AAuDtD,+CAA4C;AAqC5C,6CAA0C;AA0E1C,2DAAwD;AAuDxD,6CAA0C;AAsD1C,6CAA0C;AAO1C,+DAA4D;AAO5D,2CAAwC;AAgCxC,2CAAwC;AAOxC,6DAA0D;AAO1D,2CAAwC;AAoHxC,uCAAoC;AA6CpC,iDAA8C;AAgI9C,2CAAwC;AAExC,6CAA0C;AAsC1C,+DAA4D;AA+B5D,uCAAoC;AAEpC,6CAA0C;AAO1C,6CAA0C;AAe1C,yCAAsC;AActC,2CAAwC;AAmHxC,uCAAoC;AAKpC,uCAAoC;AAkCpC,yCAAsC;AAgEtC,iDAA8C;AAS9C,uCAAoC;AA2DpC,uCAAoC;AA6DpC,iDAA8C;AAoB9C,+DAA4D;AAqF5D,iDAA8C;AAyC9C,mDAAgD;AAoBhD,uCAAoC;AAOpC,mDAAgD;AAmChD,qDAAkD;AAmFlD,uDAAoD;AA0BpD,yDAAsD;AAyEtD,mDAAgD;AAyEhD,yCAAsC;AAmCtC,mDAAgD;AAqGhD,yCAAsC;AAEtC,iDAA8C;AAO9C,6DAA0D;AAuC1D,uDAAoD;AAgBpD,uEAAoE;AA2JpE,mFAAgF;AAuKhF,qFAAkF;AA+JlF,qFAAkF;AAwLlF,qFAAkF;AAqIlF,qFAAkF;AA6ClF,qEAAkE;AAyBlE,qEAAkE;AAkDlE,mDAAgD;AAOhD,2DAAwD;AAsBxD,2CAAwC;AAkFxC,yDAAsD;AAiEtD,2DAAwD;AAOxD,qDAAkD"}
|
package/_cjs/version.js
CHANGED
package/_esm/core/Keystore.js
CHANGED
|
@@ -20,11 +20,11 @@ import * as Hash from './Hash.js';
|
|
|
20
20
|
* // JSON keystore.
|
|
21
21
|
* const keystore = { crypto: { ... }, id: '...', version: 3 }
|
|
22
22
|
*
|
|
23
|
-
* // Derive key
|
|
24
|
-
* const key = Keystore.
|
|
23
|
+
* // Derive the key using your password.
|
|
24
|
+
* const key = Keystore.toKey(keystore, { password: 'hunter2' })
|
|
25
25
|
*
|
|
26
26
|
* // Decrypt the private key.
|
|
27
|
-
* const privateKey =
|
|
27
|
+
* const privateKey = Keystore.decrypt(keystore, key)
|
|
28
28
|
* // @log: "0x..."
|
|
29
29
|
* ```
|
|
30
30
|
*
|
|
@@ -33,16 +33,16 @@ import * as Hash from './Hash.js';
|
|
|
33
33
|
* @param options - Decryption options.
|
|
34
34
|
* @returns Decrypted private key.
|
|
35
35
|
*/
|
|
36
|
-
export
|
|
36
|
+
export function decrypt(keystore, key, options = {}) {
|
|
37
37
|
const { as = 'Hex' } = options;
|
|
38
|
-
const key_ = Bytes.from(
|
|
38
|
+
const key_ = Bytes.from(typeof key === 'function' ? key() : key);
|
|
39
39
|
const encKey = Bytes.slice(key_, 0, 16);
|
|
40
40
|
const macKey = Bytes.slice(key_, 16, 32);
|
|
41
41
|
const ciphertext = Bytes.from(`0x${keystore.crypto.ciphertext}`);
|
|
42
42
|
const mac = Hash.keccak256(Bytes.concat(macKey, ciphertext));
|
|
43
43
|
if (!Bytes.isEqual(mac, Bytes.from(`0x${keystore.crypto.mac}`)))
|
|
44
44
|
throw new Error('corrupt keystore');
|
|
45
|
-
const data = ctr(encKey,
|
|
45
|
+
const data = ctr(encKey, Bytes.from(`0x${keystore.crypto.cipherparams.iv}`)).decrypt(ciphertext);
|
|
46
46
|
if (as === 'Hex')
|
|
47
47
|
return Bytes.toHex(data);
|
|
48
48
|
return data;
|
|
@@ -63,10 +63,10 @@ export async function decrypt(keystore, key, options = {}) {
|
|
|
63
63
|
* const privateKey = Secp256k1.randomPrivateKey()
|
|
64
64
|
*
|
|
65
65
|
* // Derive key from password.
|
|
66
|
-
* const key = Keystore.pbkdf2({ password: 'testpassword' })
|
|
66
|
+
* const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
67
67
|
*
|
|
68
68
|
* // Encrypt the private key.
|
|
69
|
-
* const encrypted =
|
|
69
|
+
* const encrypted = Keystore.encrypt(privateKey, key, opts)
|
|
70
70
|
* // @log: {
|
|
71
71
|
* // @log: "crypto": {
|
|
72
72
|
* // @log: "cipher": "aes-128-ctr",
|
|
@@ -93,21 +93,21 @@ export async function decrypt(keystore, key, options = {}) {
|
|
|
93
93
|
* @param options - Encryption options.
|
|
94
94
|
* @returns Encrypted keystore.
|
|
95
95
|
*/
|
|
96
|
-
export
|
|
97
|
-
const { id = crypto.randomUUID() } = options;
|
|
98
|
-
const key_ = Bytes.from(
|
|
96
|
+
export function encrypt(privateKey, key, options) {
|
|
97
|
+
const { id = crypto.randomUUID(), kdf, kdfparams, iv } = options;
|
|
98
|
+
const key_ = Bytes.from(typeof key === 'function' ? key() : key);
|
|
99
99
|
const value_ = Bytes.from(privateKey);
|
|
100
100
|
const encKey = Bytes.slice(key_, 0, 16);
|
|
101
101
|
const macKey = Bytes.slice(key_, 16, 32);
|
|
102
|
-
const ciphertext = ctr(encKey,
|
|
102
|
+
const ciphertext = ctr(encKey, iv).encrypt(value_);
|
|
103
103
|
const mac = Hash.keccak256(Bytes.concat(macKey, ciphertext));
|
|
104
104
|
return {
|
|
105
105
|
crypto: {
|
|
106
106
|
cipher: 'aes-128-ctr',
|
|
107
107
|
ciphertext: Bytes.toHex(ciphertext).slice(2),
|
|
108
|
-
cipherparams: { iv: Bytes.toHex(
|
|
109
|
-
kdf
|
|
110
|
-
kdfparams
|
|
108
|
+
cipherparams: { iv: Bytes.toHex(iv).slice(2) },
|
|
109
|
+
kdf,
|
|
110
|
+
kdfparams,
|
|
111
111
|
mac: Bytes.toHex(mac).slice(2),
|
|
112
112
|
},
|
|
113
113
|
id,
|
|
@@ -121,7 +121,7 @@ export async function encrypt(privateKey, key, options = {}) {
|
|
|
121
121
|
* ```ts twoslash
|
|
122
122
|
* import { Keystore } from 'ox'
|
|
123
123
|
*
|
|
124
|
-
* const key = Keystore.pbkdf2({ password: 'testpassword' })
|
|
124
|
+
* const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
125
125
|
* ```
|
|
126
126
|
*
|
|
127
127
|
* @param options - PBKDF2 options.
|
|
@@ -130,10 +130,9 @@ export async function encrypt(privateKey, key, options = {}) {
|
|
|
130
130
|
export function pbkdf2(options) {
|
|
131
131
|
const { iv, iterations = 262_144, password } = options;
|
|
132
132
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
133
|
-
const key = Bytes.toHex(pbkdf2_noble(sha256, password, salt, { c: iterations, dkLen: 32 }))
|
|
134
|
-
return defineKey({
|
|
133
|
+
const key = Bytes.toHex(pbkdf2_noble(sha256, password, salt, { c: iterations, dkLen: 32 }));
|
|
134
|
+
return defineKey(() => key, {
|
|
135
135
|
iv,
|
|
136
|
-
key: () => key,
|
|
137
136
|
kdfparams: {
|
|
138
137
|
c: iterations,
|
|
139
138
|
dklen: 32,
|
|
@@ -150,7 +149,7 @@ export function pbkdf2(options) {
|
|
|
150
149
|
* ```ts twoslash
|
|
151
150
|
* import { Keystore } from 'ox'
|
|
152
151
|
*
|
|
153
|
-
* const key = await Keystore.pbkdf2Async({ password: 'testpassword' })
|
|
152
|
+
* const [key, opts] = await Keystore.pbkdf2Async({ password: 'testpassword' })
|
|
154
153
|
* ```
|
|
155
154
|
*
|
|
156
155
|
* @param options - PBKDF2 options.
|
|
@@ -162,10 +161,9 @@ export async function pbkdf2Async(options) {
|
|
|
162
161
|
const key = Bytes.toHex(await pbkdf2Async_noble(sha256, password, salt, {
|
|
163
162
|
c: iterations,
|
|
164
163
|
dkLen: 32,
|
|
165
|
-
}))
|
|
166
|
-
return defineKey({
|
|
164
|
+
}));
|
|
165
|
+
return defineKey(() => key, {
|
|
167
166
|
iv,
|
|
168
|
-
key: () => key,
|
|
169
167
|
kdfparams: {
|
|
170
168
|
c: iterations,
|
|
171
169
|
dklen: 32,
|
|
@@ -182,21 +180,18 @@ export async function pbkdf2Async(options) {
|
|
|
182
180
|
* ```ts twoslash
|
|
183
181
|
* import { Keystore } from 'ox'
|
|
184
182
|
*
|
|
185
|
-
* const key = Keystore.scrypt({ password: 'testpassword' })
|
|
183
|
+
* const [key, opts] = Keystore.scrypt({ password: 'testpassword' })
|
|
186
184
|
* ```
|
|
187
185
|
*
|
|
188
186
|
* @param options - Scrypt options.
|
|
189
187
|
* @returns Scrypt key.
|
|
190
188
|
*/
|
|
191
189
|
export function scrypt(options) {
|
|
192
|
-
const { iv, n = 262_144, password } = options;
|
|
193
|
-
const p = 8;
|
|
194
|
-
const r = 1;
|
|
190
|
+
const { iv, n = 262_144, password, p = 8, r = 1 } = options;
|
|
195
191
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
196
|
-
const key = Bytes.toHex(scrypt_noble(password, salt, { N: n, dkLen: 32, r, p }))
|
|
197
|
-
return defineKey({
|
|
192
|
+
const key = Bytes.toHex(scrypt_noble(password, salt, { N: n, dkLen: 32, r, p }));
|
|
193
|
+
return defineKey(() => key, {
|
|
198
194
|
iv,
|
|
199
|
-
key: () => key,
|
|
200
195
|
kdfparams: {
|
|
201
196
|
dklen: 32,
|
|
202
197
|
n,
|
|
@@ -214,7 +209,7 @@ export function scrypt(options) {
|
|
|
214
209
|
* ```ts twoslash
|
|
215
210
|
* import { Keystore } from 'ox'
|
|
216
211
|
*
|
|
217
|
-
* const key = await Keystore.scryptAsync({ password: 'testpassword' })
|
|
212
|
+
* const [key, opts] = await Keystore.scryptAsync({ password: 'testpassword' })
|
|
218
213
|
* ```
|
|
219
214
|
*
|
|
220
215
|
* @param options - Scrypt options.
|
|
@@ -225,10 +220,9 @@ export async function scryptAsync(options) {
|
|
|
225
220
|
const p = 8;
|
|
226
221
|
const r = 1;
|
|
227
222
|
const salt = options.salt ? Bytes.from(options.salt) : Bytes.random(32);
|
|
228
|
-
const key = Bytes.toHex(await scryptAsync_noble(password, salt, { N: n, dkLen: 32, r, p }))
|
|
229
|
-
return defineKey({
|
|
223
|
+
const key = Bytes.toHex(await scryptAsync_noble(password, salt, { N: n, dkLen: 32, r, p }));
|
|
224
|
+
return defineKey(() => key, {
|
|
230
225
|
iv,
|
|
231
|
-
key: () => key,
|
|
232
226
|
kdfparams: {
|
|
233
227
|
dklen: 32,
|
|
234
228
|
n,
|
|
@@ -239,10 +233,110 @@ export async function scryptAsync(options) {
|
|
|
239
233
|
kdf: 'scrypt',
|
|
240
234
|
});
|
|
241
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Extracts a Key from a JSON Keystore to use for decryption.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```ts twoslash
|
|
241
|
+
* // @noErrors
|
|
242
|
+
* import { Keystore } from 'ox'
|
|
243
|
+
*
|
|
244
|
+
* // JSON keystore.
|
|
245
|
+
* const keystore = { crypto: { ... }, id: '...', version: 3 }
|
|
246
|
+
*
|
|
247
|
+
* const key = Keystore.toKey(keystore, { password: 'hunter2' }) // [!code focus]
|
|
248
|
+
*
|
|
249
|
+
* const decrypted = Keystore.decrypt(keystore, key)
|
|
250
|
+
* ```
|
|
251
|
+
*
|
|
252
|
+
* @param keystore - JSON Keystore
|
|
253
|
+
* @param options - Options
|
|
254
|
+
* @returns Key
|
|
255
|
+
*/
|
|
256
|
+
export function toKey(keystore, options) {
|
|
257
|
+
const { crypto } = keystore;
|
|
258
|
+
const { password } = options;
|
|
259
|
+
const { cipherparams, kdf, kdfparams } = crypto;
|
|
260
|
+
const { iv } = cipherparams;
|
|
261
|
+
const { c, n, p, r, salt } = kdfparams;
|
|
262
|
+
const [key] = (() => {
|
|
263
|
+
switch (kdf) {
|
|
264
|
+
case 'scrypt':
|
|
265
|
+
return scrypt({
|
|
266
|
+
iv: Bytes.from(`0x${iv}`),
|
|
267
|
+
n,
|
|
268
|
+
p,
|
|
269
|
+
r,
|
|
270
|
+
salt: Bytes.from(`0x${salt}`),
|
|
271
|
+
password,
|
|
272
|
+
});
|
|
273
|
+
case 'pbkdf2':
|
|
274
|
+
return pbkdf2({
|
|
275
|
+
iv: Bytes.from(`0x${iv}`),
|
|
276
|
+
iterations: c,
|
|
277
|
+
password,
|
|
278
|
+
salt: Bytes.from(`0x${salt}`),
|
|
279
|
+
});
|
|
280
|
+
default:
|
|
281
|
+
throw new Error('unsupported kdf');
|
|
282
|
+
}
|
|
283
|
+
})();
|
|
284
|
+
return key;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Extracts a Key asynchronously from a JSON Keystore to use for decryption.
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```ts twoslash
|
|
291
|
+
* // @noErrors
|
|
292
|
+
* import { Keystore } from 'ox'
|
|
293
|
+
*
|
|
294
|
+
* // JSON keystore.
|
|
295
|
+
* const keystore = { crypto: { ... }, id: '...', version: 3 }
|
|
296
|
+
*
|
|
297
|
+
* const key = await Keystore.toKeyAsync(keystore, { password: 'hunter2' }) // [!code focus]
|
|
298
|
+
*
|
|
299
|
+
* const decrypted = Keystore.decrypt(keystore, key)
|
|
300
|
+
* ```
|
|
301
|
+
*
|
|
302
|
+
* @param keystore - JSON Keystore
|
|
303
|
+
* @param options - Options
|
|
304
|
+
* @returns Key
|
|
305
|
+
*/
|
|
306
|
+
export async function toKeyAsync(keystore, options) {
|
|
307
|
+
const { crypto } = keystore;
|
|
308
|
+
const { password } = options;
|
|
309
|
+
const { cipherparams, kdf, kdfparams } = crypto;
|
|
310
|
+
const { iv } = cipherparams;
|
|
311
|
+
const { c, n, p, r, salt } = kdfparams;
|
|
312
|
+
const [key] = await (async () => {
|
|
313
|
+
switch (kdf) {
|
|
314
|
+
case 'scrypt':
|
|
315
|
+
return await scryptAsync({
|
|
316
|
+
iv: Bytes.from(`0x${iv}`),
|
|
317
|
+
n,
|
|
318
|
+
p,
|
|
319
|
+
r,
|
|
320
|
+
salt: Bytes.from(`0x${salt}`),
|
|
321
|
+
password,
|
|
322
|
+
});
|
|
323
|
+
case 'pbkdf2':
|
|
324
|
+
return await pbkdf2({
|
|
325
|
+
iv: Bytes.from(`0x${iv}`),
|
|
326
|
+
iterations: c,
|
|
327
|
+
password,
|
|
328
|
+
salt: Bytes.from(`0x${salt}`),
|
|
329
|
+
});
|
|
330
|
+
default:
|
|
331
|
+
throw new Error('unsupported kdf');
|
|
332
|
+
}
|
|
333
|
+
})();
|
|
334
|
+
return key;
|
|
335
|
+
}
|
|
242
336
|
///////////////////////////////////////////////////////////////////////////
|
|
243
337
|
/** @internal */
|
|
244
|
-
function defineKey(key) {
|
|
245
|
-
const iv =
|
|
246
|
-
return { ...
|
|
338
|
+
function defineKey(key, options) {
|
|
339
|
+
const iv = options.iv ? Bytes.from(options.iv) : Bytes.random(16);
|
|
340
|
+
return [key, { ...options, iv }];
|
|
247
341
|
}
|
|
248
342
|
//# sourceMappingURL=Keystore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Keystore.js","sourceRoot":"","sources":["../../core/Keystore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,MAAM,IAAI,YAAY,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,MAAM,IAAI,YAAY,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"Keystore.js","sourceRoot":"","sources":["../../core/Keystore.ts"],"names":[],"mappings":"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"}
|
package/_esm/index.js
CHANGED
|
@@ -1527,9 +1527,9 @@ export * as Json from './core/Json.js';
|
|
|
1527
1527
|
* Utilities & types for working with [Keystores](https://ethereum.org/en/developers/docs/data-structures-and-encoding/web3-secret-storage).
|
|
1528
1528
|
*
|
|
1529
1529
|
* @example
|
|
1530
|
-
* ### Encrypting
|
|
1530
|
+
* ### Encrypting Private Keys
|
|
1531
1531
|
*
|
|
1532
|
-
* Private keys can be encrypted into a JSON keystore using {@link ox#Keystore.(encrypt:function)}
|
|
1532
|
+
* Private keys can be encrypted into a JSON keystore using {@link ox#Keystore.(encrypt:function)}:
|
|
1533
1533
|
*
|
|
1534
1534
|
* ```ts twoslash
|
|
1535
1535
|
* import { Keystore, Secp256k1 } from 'ox'
|
|
@@ -1538,10 +1538,10 @@ export * as Json from './core/Json.js';
|
|
|
1538
1538
|
* const privateKey = Secp256k1.randomPrivateKey()
|
|
1539
1539
|
*
|
|
1540
1540
|
* // Derive a key from a password.
|
|
1541
|
-
* const key = Keystore.pbkdf2({ password: 'testpassword' })
|
|
1541
|
+
* const [key, opts] = Keystore.pbkdf2({ password: 'testpassword' })
|
|
1542
1542
|
*
|
|
1543
1543
|
* // Encrypt the private key.
|
|
1544
|
-
* const
|
|
1544
|
+
* const keystore = Keystore.encrypt(privateKey, key, opts)
|
|
1545
1545
|
* // @log: {
|
|
1546
1546
|
* // @log: "crypto": {
|
|
1547
1547
|
* // @log: "cipher": "aes-128-ctr",
|
|
@@ -1561,10 +1561,26 @@ export * as Json from './core/Json.js';
|
|
|
1561
1561
|
* // @log: "id": "...",
|
|
1562
1562
|
* // @log: "version": 3,
|
|
1563
1563
|
* // @log: }
|
|
1564
|
+
* ```
|
|
1565
|
+
*
|
|
1566
|
+
* @example
|
|
1567
|
+
* ### Decrypting Private Keys
|
|
1568
|
+
*
|
|
1569
|
+
* Private keys can be decrypted from a JSON keystore using {@link ox#Keystore.(decrypt:function)}:
|
|
1570
|
+
*
|
|
1571
|
+
* ```ts twoslash
|
|
1572
|
+
* // @noErrors
|
|
1573
|
+
* import { Keystore, Secp256k1 } from 'ox'
|
|
1574
|
+
*
|
|
1575
|
+
* const keystore = { crypto: { ... }, id: '...', version: 3 }
|
|
1576
|
+
*
|
|
1577
|
+
* // Derive the key.
|
|
1578
|
+
* const key = Keystore.toKey(keystore, { password: 'testpassword' })
|
|
1564
1579
|
*
|
|
1565
1580
|
* // Decrypt the private key.
|
|
1566
|
-
* const decrypted =
|
|
1581
|
+
* const decrypted = Keystore.decrypt(keystore, key)
|
|
1567
1582
|
* // @log: "0x..."
|
|
1583
|
+
*
|
|
1568
1584
|
* ```
|
|
1569
1585
|
*
|
|
1570
1586
|
* @category Crypto
|