@evolu/common 6.0.1-preview.18 → 6.0.1-preview.19

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.
@@ -26,7 +26,13 @@ export declare const mnemonicToMnemonicSeed: (mnemonic: Mnemonic) => MnemonicSee
26
26
  *
27
27
  * https://github.com/satoshilabs/slips/blob/master/slip-0021.md
28
28
  */
29
- export declare const createSlip21: (seed: MnemonicSeed, path: ReadonlyArray<string>) => Uint8Array;
29
+ export declare const createSlip21: (seed: Uint8Array, path: ReadonlyArray<string>) => Uint8Array;
30
+ /**
31
+ * Derives a single node in the SLIP-21 hierarchical key derivation.
32
+ *
33
+ * @see {@link createSlip21}
34
+ */
35
+ export declare const deriveSlip21Node: (component: string, m: Uint8Array) => Uint8Array;
30
36
  /**
31
37
  * Creates a 21-character Base64URL ID (also known as nanoid) from a SLIP-21
32
38
  * derived key.
@@ -1 +1 @@
1
- {"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAc,MAAM,EAAW,MAAM,aAAa,CAAC;AAC1D,OAAO,EAEL,EAAE,EAEF,QAAQ,EACR,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C;AAED,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,iBACS,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,cACe,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,GAAI,UAAU,QAAQ,KAAG,YACR,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,YAAY,EAClB,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B,UAeF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B,EAUF,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,aAAa,8fAAiD,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,CAChB,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,aAAa,KACzB;QACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;KACjC,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,oBAAoB,KACzB,eAyBF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,cAAc,KAAG,cAO1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,cAE3D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C"}
1
+ {"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAc,MAAM,EAAW,MAAM,aAAa,CAAC;AAC1D,OAAO,EAEL,EAAE,EAEF,QAAQ,EACR,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInC,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C;AAED,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,iBACS,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,cACe,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,GAAI,UAAU,QAAQ,KAAG,YACR,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,UAAU,EAChB,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B,UAWF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,GAAG,UAAU,KACZ,UAMF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B,EAUF,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,aAAa,8fAAiD,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,CAChB,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,aAAa,KACzB;QACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;KACjC,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,oBAAoB,KACzB,eAyBF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,cAAc,KAAG,cAO1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,cAE3D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C"}
@@ -13,6 +13,7 @@ import { urlAlphabet } from "nanoid";
13
13
  import { getOrThrow, trySync } from "./Result.js";
14
14
  import { brand, length, NonNegativeInt, Uint8Array, } from "./Type.js";
15
15
  import { assert } from "./Assert.js";
16
+ import { utf8ToBytes } from "./Buffer.js";
16
17
  /** Cryptographically secure PRNG. Uses internal OS-level crypto.getRandomValues. */
17
18
  export const createRandomBytes = (bytesLength = 32) => randomBytes(bytesLength);
18
19
  export const createEnglishMnemonic = () => bip39.generateMnemonic(wordlist, 128);
@@ -24,16 +25,24 @@ export const mnemonicToMnemonicSeed = (mnemonic) => bip39.mnemonicToSeedSync(mne
24
25
  */
25
26
  export const createSlip21 = (seed, path) => {
26
27
  assert(seed.length >= 16 && seed.length <= 64, `Unusual SLIP-0021 seed length: ${seed.length} bytes`);
27
- let m = hmac(sha512, "Symmetric key seed", seed);
28
+ let m = hmac(sha512, utf8ToBytes("Symmetric key seed"), seed);
28
29
  for (const component of path) {
29
- const p = new TextEncoder().encode(component);
30
- const e = new globalThis.Uint8Array(p.byteLength + 1);
31
- e[0] = 0;
32
- e.set(p, 1);
33
- m = hmac(sha512, m.slice(0, 32), e);
30
+ m = deriveSlip21Node(component, m);
34
31
  }
35
32
  return m.slice(32, 64);
36
33
  };
34
+ /**
35
+ * Derives a single node in the SLIP-21 hierarchical key derivation.
36
+ *
37
+ * @see {@link createSlip21}
38
+ */
39
+ export const deriveSlip21Node = (component, m) => {
40
+ const p = utf8ToBytes(component);
41
+ const e = new globalThis.Uint8Array(p.byteLength + 1);
42
+ e[0] = 0;
43
+ e.set(p, 1);
44
+ return hmac(sha512, m.slice(0, 32), e);
45
+ };
37
46
  /**
38
47
  * Creates a 21-character Base64URL ID (also known as nanoid) from a SLIP-21
39
48
  * derived key.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evolu/common",
3
- "version": "6.0.1-preview.18",
3
+ "version": "6.0.1-preview.19",
4
4
  "description": "TypeScript library and local-first framework",
5
5
  "keywords": [
6
6
  "evolu",
package/src/Crypto.ts CHANGED
@@ -22,6 +22,7 @@ import {
22
22
  } from "./Type.js";
23
23
  import { Brand } from "./Brand.js";
24
24
  import { assert } from "./Assert.js";
25
+ import { utf8ToBytes } from "./Buffer.js";
25
26
 
26
27
  /** `Uint8Array` created by {@link createRandomBytes}. */
27
28
  export type RandomBytes = Uint8Array & Brand<"RandomBytes">;
@@ -56,7 +57,7 @@ export const mnemonicToMnemonicSeed = (mnemonic: Mnemonic): MnemonicSeed =>
56
57
  * https://github.com/satoshilabs/slips/blob/master/slip-0021.md
57
58
  */
58
59
  export const createSlip21 = (
59
- seed: MnemonicSeed,
60
+ seed: Uint8Array,
60
61
  path: ReadonlyArray<string>,
61
62
  ): Uint8Array => {
62
63
  assert(
@@ -64,17 +65,29 @@ export const createSlip21 = (
64
65
  `Unusual SLIP-0021 seed length: ${seed.length} bytes`,
65
66
  );
66
67
 
67
- let m = hmac(sha512, "Symmetric key seed", seed);
68
+ let m = hmac(sha512, utf8ToBytes("Symmetric key seed"), seed);
68
69
  for (const component of path) {
69
- const p = new TextEncoder().encode(component);
70
- const e = new globalThis.Uint8Array(p.byteLength + 1);
71
- e[0] = 0;
72
- e.set(p, 1);
73
- m = hmac(sha512, m.slice(0, 32), e);
70
+ m = deriveSlip21Node(component, m);
74
71
  }
75
72
  return m.slice(32, 64);
76
73
  };
77
74
 
75
+ /**
76
+ * Derives a single node in the SLIP-21 hierarchical key derivation.
77
+ *
78
+ * @see {@link createSlip21}
79
+ */
80
+ export const deriveSlip21Node = (
81
+ component: string,
82
+ m: Uint8Array,
83
+ ): Uint8Array => {
84
+ const p = utf8ToBytes(component);
85
+ const e = new globalThis.Uint8Array(p.byteLength + 1);
86
+ e[0] = 0;
87
+ e.set(p, 1);
88
+ return hmac(sha512, m.slice(0, 32), e);
89
+ };
90
+
78
91
  /**
79
92
  * Creates a 21-character Base64URL ID (also known as nanoid) from a SLIP-21
80
93
  * derived key.