leviathan-crypto 1.4.0 → 2.0.0

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.
Files changed (119) hide show
  1. package/CLAUDE.md +129 -94
  2. package/README.md +166 -223
  3. package/SECURITY.md +85 -45
  4. package/dist/chacha20/cipher-suite.d.ts +4 -0
  5. package/dist/chacha20/cipher-suite.js +78 -0
  6. package/dist/chacha20/embedded.d.ts +1 -0
  7. package/dist/chacha20/embedded.js +27 -0
  8. package/dist/chacha20/index.d.ts +20 -27
  9. package/dist/chacha20/index.js +40 -59
  10. package/dist/chacha20/ops.d.ts +1 -1
  11. package/dist/chacha20/ops.js +19 -18
  12. package/dist/chacha20/pool-worker.js +77 -0
  13. package/dist/ct-wasm.d.ts +1 -0
  14. package/dist/ct-wasm.js +3 -0
  15. package/dist/ct.wasm +0 -0
  16. package/dist/docs/aead.md +320 -0
  17. package/dist/docs/architecture.md +419 -285
  18. package/dist/docs/argon2id.md +42 -30
  19. package/dist/docs/chacha20.md +192 -266
  20. package/dist/docs/exports.md +241 -0
  21. package/dist/docs/fortuna.md +60 -69
  22. package/dist/docs/init.md +172 -178
  23. package/dist/docs/loader.md +87 -142
  24. package/dist/docs/serpent.md +134 -583
  25. package/dist/docs/sha2.md +91 -103
  26. package/dist/docs/sha3.md +70 -36
  27. package/dist/docs/types.md +93 -16
  28. package/dist/docs/utils.md +109 -32
  29. package/dist/embedded/kyber.d.ts +1 -0
  30. package/dist/embedded/kyber.js +3 -0
  31. package/dist/errors.d.ts +10 -0
  32. package/dist/errors.js +38 -0
  33. package/dist/fortuna.d.ts +0 -6
  34. package/dist/fortuna.js +5 -5
  35. package/dist/index.d.ts +25 -9
  36. package/dist/index.js +36 -7
  37. package/dist/init.d.ts +3 -7
  38. package/dist/init.js +18 -35
  39. package/dist/keccak/embedded.d.ts +1 -0
  40. package/dist/keccak/embedded.js +27 -0
  41. package/dist/keccak/index.d.ts +4 -0
  42. package/dist/keccak/index.js +31 -0
  43. package/dist/kyber/embedded.d.ts +1 -0
  44. package/dist/kyber/embedded.js +27 -0
  45. package/dist/kyber/indcpa.d.ts +49 -0
  46. package/dist/kyber/indcpa.js +352 -0
  47. package/dist/kyber/index.d.ts +38 -0
  48. package/dist/kyber/index.js +150 -0
  49. package/dist/kyber/kem.d.ts +21 -0
  50. package/dist/kyber/kem.js +160 -0
  51. package/dist/kyber/params.d.ts +14 -0
  52. package/dist/kyber/params.js +37 -0
  53. package/dist/kyber/suite.d.ts +13 -0
  54. package/dist/kyber/suite.js +93 -0
  55. package/dist/kyber/types.d.ts +98 -0
  56. package/dist/kyber/types.js +25 -0
  57. package/dist/kyber/validate.d.ts +19 -0
  58. package/dist/kyber/validate.js +68 -0
  59. package/dist/kyber.wasm +0 -0
  60. package/dist/loader.d.ts +15 -6
  61. package/dist/loader.js +65 -21
  62. package/dist/serpent/cipher-suite.d.ts +4 -0
  63. package/dist/serpent/cipher-suite.js +121 -0
  64. package/dist/serpent/embedded.d.ts +1 -0
  65. package/dist/serpent/embedded.js +27 -0
  66. package/dist/serpent/index.d.ts +6 -37
  67. package/dist/serpent/index.js +9 -118
  68. package/dist/serpent/pool-worker.d.ts +1 -0
  69. package/dist/serpent/pool-worker.js +202 -0
  70. package/dist/serpent/serpent-cbc.d.ts +30 -0
  71. package/dist/serpent/serpent-cbc.js +136 -0
  72. package/dist/sha2/embedded.d.ts +1 -0
  73. package/dist/sha2/embedded.js +27 -0
  74. package/dist/sha2/hkdf.js +6 -2
  75. package/dist/sha2/index.d.ts +3 -2
  76. package/dist/sha2/index.js +3 -4
  77. package/dist/sha3/embedded.d.ts +1 -0
  78. package/dist/sha3/embedded.js +27 -0
  79. package/dist/sha3/index.d.ts +3 -2
  80. package/dist/sha3/index.js +3 -4
  81. package/dist/stream/constants.d.ts +6 -0
  82. package/dist/stream/constants.js +30 -0
  83. package/dist/stream/header.d.ts +9 -0
  84. package/dist/stream/header.js +77 -0
  85. package/dist/stream/index.d.ts +7 -0
  86. package/dist/stream/index.js +27 -0
  87. package/dist/stream/open-stream.d.ts +21 -0
  88. package/dist/stream/open-stream.js +146 -0
  89. package/dist/stream/seal-stream-pool.d.ts +38 -0
  90. package/dist/stream/seal-stream-pool.js +391 -0
  91. package/dist/stream/seal-stream.d.ts +20 -0
  92. package/dist/stream/seal-stream.js +142 -0
  93. package/dist/stream/seal.d.ts +9 -0
  94. package/dist/stream/seal.js +75 -0
  95. package/dist/stream/types.d.ts +24 -0
  96. package/dist/stream/types.js +26 -0
  97. package/dist/utils.d.ts +7 -2
  98. package/dist/utils.js +49 -3
  99. package/dist/wasm-source.d.ts +12 -0
  100. package/dist/wasm-source.js +26 -0
  101. package/package.json +13 -5
  102. package/dist/chacha20/pool.d.ts +0 -52
  103. package/dist/chacha20/pool.js +0 -178
  104. package/dist/chacha20/pool.worker.js +0 -37
  105. package/dist/chacha20/stream-sealer.d.ts +0 -49
  106. package/dist/chacha20/stream-sealer.js +0 -327
  107. package/dist/docs/chacha20_pool.md +0 -309
  108. package/dist/docs/wasm.md +0 -194
  109. package/dist/serpent/seal.d.ts +0 -8
  110. package/dist/serpent/seal.js +0 -72
  111. package/dist/serpent/stream-pool.d.ts +0 -48
  112. package/dist/serpent/stream-pool.js +0 -275
  113. package/dist/serpent/stream-sealer.d.ts +0 -55
  114. package/dist/serpent/stream-sealer.js +0 -342
  115. package/dist/serpent/stream.d.ts +0 -28
  116. package/dist/serpent/stream.js +0 -205
  117. package/dist/serpent/stream.worker.d.ts +0 -32
  118. package/dist/serpent/stream.worker.js +0 -117
  119. /package/dist/chacha20/{pool.worker.d.ts → pool-worker.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ export declare const WASM_GZ_BASE64 = "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";
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/embed-wasm.ts — do not edit
2
+ // gzip-compressed WASM binary, base64-encoded. Decoded and decompressed by loadEmbedded().
3
+ export const WASM_GZ_BASE64 = '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';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Thrown when AEAD authentication fails.
3
+ *
4
+ * `cipher` is the cipher name passed by the call site (e.g. `'serpent'`,
5
+ * `'chacha20-poly1305'`, `'xchacha20-poly1305'`). The class appends
6
+ * `': authentication failed'` — do not include that text in the cipher name.
7
+ */
8
+ export declare class AuthenticationError extends Error {
9
+ constructor(cipher: string);
10
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,38 @@
1
+ // ▄▄▄▄▄▄▄▄▄▄
2
+ // ▄████████████████████▄▄ ▒ ▄▀▀ ▒ ▒ █ ▄▀▄ ▀█▀ █ ▒ ▄▀▄ █▀▄
3
+ // ▄██████████████████████ ▀████▄ ▓ ▓▀ ▓ ▓ ▓ ▓▄▓ ▓ ▓▀▓ ▓▄▓ ▓ ▓
4
+ // ▄█████████▀▀▀ ▀███████▄▄███████▌ ▀▄ ▀▄▄ ▀▄▀ ▒ ▒ ▒ ▒ ▒ █ ▒ ▒ ▒ █
5
+ // ▐████████▀ ▄▄▄▄ ▀████████▀██▀█▌
6
+ // ████████ ███▀▀ ████▀ █▀ █▀ Leviathan Crypto Library
7
+ // ███████▌ ▀██▀ ███
8
+ // ███████ ▀███ ▀██ ▀█▄ Repository & Mirror:
9
+ // ▀██████ ▄▄██ ▀▀ ██▄ github.com/xero/leviathan-crypto
10
+ // ▀█████▄ ▄██▄ ▄▀▄▀ unpkg.com/leviathan-crypto
11
+ // ▀████▄ ▄██▄
12
+ // ▐████ ▐███ Author: xero (https://x-e.ro)
13
+ // ▄▄██████████ ▐███ ▄▄ License: MIT
14
+ // ▄██▀▀▀▀▀▀▀▀▀▀ ▄████ ▄██▀
15
+ // ▄▀ ▄▄█████████▄▄ ▀▀▀▀▀ ▄███ This file is provided completely
16
+ // ▄██████▀▀▀▀▀▀██████▄ ▀▄▄▄▄████▀ free, "as is", and without
17
+ // ████▀ ▄▄▄▄▄▄▄ ▀████▄ ▀█████▀ ▄▄▄▄ warranty of any kind. The author
18
+ // █████▄▄█████▀▀▀▀▀▀▄ ▀███▄ ▄████ assumes absolutely no liability
19
+ // ▀██████▀ ▀████▄▄▄████▀ for its {ab,mis,}use.
20
+ // ▀█████▀▀
21
+ //
22
+ // src/ts/errors.ts
23
+ //
24
+ // Typed error classes for leviathan-crypto.
25
+ /**
26
+ * Thrown when AEAD authentication fails.
27
+ *
28
+ * `cipher` is the cipher name passed by the call site (e.g. `'serpent'`,
29
+ * `'chacha20-poly1305'`, `'xchacha20-poly1305'`). The class appends
30
+ * `': authentication failed'` — do not include that text in the cipher name.
31
+ */
32
+ export class AuthenticationError extends Error {
33
+ constructor(cipher) {
34
+ super(`${cipher}: authentication failed`);
35
+ this.name = 'AuthenticationError';
36
+ Object.setPrototypeOf(this, AuthenticationError.prototype);
37
+ }
38
+ }
package/dist/fortuna.d.ts CHANGED
@@ -38,12 +38,6 @@ export declare class Fortuna {
38
38
  getEntropy(): number;
39
39
  /** Permanently dispose this instance. Wipes key material, stops all collectors. */
40
40
  stop(): void;
41
- /** @internal — exposed for testing key replacement */
42
- _getGenKey(): Uint8Array;
43
- /** @internal — exposed for testing pool state */
44
- _getPoolEntropy(): number[];
45
- /** @internal — exposed for testing reseed count */
46
- _getReseedCnt(): number;
47
41
  /** Generate n blocks of 16 bytes each. — spec §9.4 */
48
42
  private generateBlocks;
49
43
  /** Get length pseudo-random bytes. — spec §9.4 */
package/dist/fortuna.js CHANGED
@@ -23,7 +23,7 @@
23
23
  //
24
24
  // Fortuna CSPRNG — Ferguson & Schneier, Practical Cryptography (2003), Chapter 9.
25
25
  // Backed by WASM Serpent-256 ECB (generator) and WASM SHA-256 (accumulator pools).
26
- // Requires init(['serpent', 'sha2']) before Fortuna.create().
26
+ // Requires init({ serpent: ..., sha2: ... }) before Fortuna.create().
27
27
  import { isInitialized } from './init.js';
28
28
  import { Serpent } from './serpent/index.js';
29
29
  import { SHA256 } from './sha2/index.js';
@@ -63,9 +63,9 @@ export class Fortuna {
63
63
  // ── Static factory ────────────────────────────────────────────────────
64
64
  static async create(opts) {
65
65
  if (!isInitialized('serpent'))
66
- throw new Error('leviathan-crypto: call init([\'serpent\', \'sha2\']) before using Fortuna');
66
+ throw new Error('leviathan-crypto: call init({ serpent: ..., sha2: ... }) before using Fortuna');
67
67
  if (!isInitialized('sha2'))
68
- throw new Error('leviathan-crypto: call init([\'serpent\', \'sha2\']) before using Fortuna');
68
+ throw new Error('leviathan-crypto: call init({ serpent: ..., sha2: ... }) before using Fortuna');
69
69
  const f = new Fortuna(opts?.msPerReseed ?? Fortuna.MS_PER_RESEED);
70
70
  f.initialize(opts?.entropy);
71
71
  // Force the first reseed — pool[0] is saturated by initialize(),
@@ -173,8 +173,8 @@ export class Fortuna {
173
173
  }
174
174
  /** Get length pseudo-random bytes. — spec §9.4 */
175
175
  pseudoRandomData(length) {
176
- // Generate ceil(length/16) + 1 blocks — +1 ensures extra block before key replacement
177
- const blocks = Math.ceil(length / 16) + 1;
176
+ // Generate ceil(length/16) blocks — spec §9.4
177
+ const blocks = Math.ceil(length / 16);
178
178
  const raw = this.generateBlocks(blocks);
179
179
  const output = raw.slice(0, length);
180
180
  // Key replacement — mandatory forward secrecy (spec §9.4)
package/dist/index.d.ts CHANGED
@@ -1,13 +1,29 @@
1
- import type { Module, Mode, InitOpts } from './init.js';
2
- export declare function init(modules: Module | Module[], mode?: Mode, opts?: InitOpts): Promise<void>;
3
- export { type Module, type Mode, type InitOpts, isInitialized, _resetForTesting } from './init.js';
4
- export { serpentInit, SerpentSeal, Serpent, SerpentCtr, SerpentCbc, SerpentStream, SerpentStreamPool, SerpentStreamSealer, SerpentStreamOpener, _serpentReady } from './serpent/index.js';
5
- export type { StreamPoolOpts } from './serpent/index.js';
6
- export { chacha20Init, ChaCha20, Poly1305, ChaCha20Poly1305, XChaCha20Poly1305, XChaCha20Seal, XChaCha20StreamSealer, XChaCha20StreamOpener, _chachaReady } from './chacha20/index.js';
7
- export { XChaCha20Poly1305Pool } from './chacha20/pool.js';
8
- export type { PoolOpts } from './chacha20/pool.js';
1
+ import type { Module } from './init.js';
2
+ import type { WasmSource } from './wasm-source.js';
3
+ /**
4
+ * Load one or more WASM modules. Each key is a module name; the value is the
5
+ * WasmSource to load it from (embedded blob, URL, ArrayBuffer, etc.).
6
+ *
7
+ * ```ts
8
+ * import { init } from 'leviathan-crypto';
9
+ * import { serpentWasm } from 'leviathan-crypto/serpent/embedded';
10
+ * import { sha2Wasm } from 'leviathan-crypto/sha2/embedded';
11
+ * await init({ serpent: serpentWasm, sha2: sha2Wasm });
12
+ * ```
13
+ */
14
+ export declare function init(sources: Partial<Record<Module, WasmSource>>): Promise<void>;
15
+ export type { Module, WasmSource };
16
+ export { isInitialized, _resetForTesting } from './init.js';
17
+ export { AuthenticationError } from './errors.js';
18
+ export { serpentInit, Serpent, SerpentCtr, SerpentCbc, SerpentCipher, _serpentReady } from './serpent/index.js';
19
+ export { chacha20Init, ChaCha20, Poly1305, ChaCha20Poly1305, XChaCha20Poly1305, XChaCha20Cipher, _chachaReady } from './chacha20/index.js';
9
20
  export { sha2Init, SHA256, SHA512, SHA384, HMAC_SHA256, HMAC_SHA512, HMAC_SHA384, HKDF_SHA256, HKDF_SHA512, _sha2Ready } from './sha2/index.js';
10
21
  export { sha3Init, SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256, _sha3Ready } from './sha3/index.js';
22
+ export { keccakInit } from './keccak/index.js';
23
+ export { kyberInit, MlKem512, MlKem768, MlKem1024, MlKemBase, KyberSuite, _kyberReady } from './kyber/index.js';
24
+ export type { KyberKeyPair, KyberEncapsulation, KyberParams } from './kyber/index.js';
25
+ export { SealStream, OpenStream, Seal, SealStreamPool, FLAG_FRAMED, TAG_DATA, TAG_FINAL, HEADER_SIZE, CHUNK_MIN, CHUNK_MAX } from './stream/index.js';
26
+ export type { CipherSuite, DerivedKeys, SealStreamOpts, PoolOpts } from './stream/index.js';
11
27
  export { Fortuna } from './fortuna.js';
12
28
  export type { Hash, KeyedHash, Blockcipher, Streamcipher, AEAD } from './types.js';
13
- export { hexToBytes, bytesToHex, utf8ToBytes, bytesToUtf8, base64ToBytes, bytesToBase64, constantTimeEqual, wipe, xor, concat, randomBytes, } from './utils.js';
29
+ export { hexToBytes, bytesToHex, utf8ToBytes, bytesToUtf8, base64ToBytes, bytesToBase64, constantTimeEqual, CT_MAX_BYTES, wipe, xor, concat, randomBytes, hasSIMD, } from './utils.js';
package/dist/index.js CHANGED
@@ -24,21 +24,50 @@ import { serpentInit } from './serpent/index.js';
24
24
  import { chacha20Init } from './chacha20/index.js';
25
25
  import { sha2Init } from './sha2/index.js';
26
26
  import { sha3Init } from './sha3/index.js';
27
+ import { keccakInit } from './keccak/index.js';
28
+ import { kyberInit } from './kyber/index.js';
29
+ import { hasSIMD } from './utils.js';
27
30
  const _dispatchers = {
28
31
  serpent: serpentInit,
29
32
  chacha20: chacha20Init,
30
33
  sha2: sha2Init,
31
34
  sha3: sha3Init,
35
+ keccak: keccakInit,
36
+ kyber: kyberInit,
32
37
  };
33
- export async function init(modules, mode = 'embedded', opts) {
34
- const list = Array.isArray(modules) ? modules : [modules];
35
- await Promise.all(list.map(mod => _dispatchers[mod](mode, opts)));
38
+ /**
39
+ * Load one or more WASM modules. Each key is a module name; the value is the
40
+ * WasmSource to load it from (embedded blob, URL, ArrayBuffer, etc.).
41
+ *
42
+ * ```ts
43
+ * import { init } from 'leviathan-crypto';
44
+ * import { serpentWasm } from 'leviathan-crypto/serpent/embedded';
45
+ * import { sha2Wasm } from 'leviathan-crypto/sha2/embedded';
46
+ * await init({ serpent: serpentWasm, sha2: sha2Wasm });
47
+ * ```
48
+ */
49
+ export async function init(sources) {
50
+ const entries = Object.entries(sources);
51
+ // SIMD preflight — serpent, chacha20, and kyber modules contain SIMD instructions
52
+ if (('serpent' in sources || 'chacha20' in sources || 'kyber' in sources) && !hasSIMD())
53
+ throw new Error('leviathan-crypto: serpent, chacha20, and kyber require WebAssembly SIMD — '
54
+ + 'this runtime does not support it');
55
+ for (const [mod, src] of entries) {
56
+ if (!Object.hasOwn(_dispatchers, mod))
57
+ throw new Error(`leviathan-crypto: unknown module "${mod}" — expected one of: ${Object.keys(_dispatchers).join(', ')}`);
58
+ if (src == null)
59
+ throw new TypeError(`leviathan-crypto: source for "${mod}" is null or undefined`);
60
+ }
61
+ await Promise.all(entries.map(([mod, src]) => _dispatchers[mod](src)));
36
62
  }
37
63
  export { isInitialized, _resetForTesting } from './init.js';
38
- export { serpentInit, SerpentSeal, Serpent, SerpentCtr, SerpentCbc, SerpentStream, SerpentStreamPool, SerpentStreamSealer, SerpentStreamOpener, _serpentReady } from './serpent/index.js';
39
- export { chacha20Init, ChaCha20, Poly1305, ChaCha20Poly1305, XChaCha20Poly1305, XChaCha20Seal, XChaCha20StreamSealer, XChaCha20StreamOpener, _chachaReady } from './chacha20/index.js';
40
- export { XChaCha20Poly1305Pool } from './chacha20/pool.js';
64
+ export { AuthenticationError } from './errors.js';
65
+ export { serpentInit, Serpent, SerpentCtr, SerpentCbc, SerpentCipher, _serpentReady } from './serpent/index.js';
66
+ export { chacha20Init, ChaCha20, Poly1305, ChaCha20Poly1305, XChaCha20Poly1305, XChaCha20Cipher, _chachaReady } from './chacha20/index.js';
41
67
  export { sha2Init, SHA256, SHA512, SHA384, HMAC_SHA256, HMAC_SHA512, HMAC_SHA384, HKDF_SHA256, HKDF_SHA512, _sha2Ready } from './sha2/index.js';
42
68
  export { sha3Init, SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256, _sha3Ready } from './sha3/index.js';
69
+ export { keccakInit } from './keccak/index.js';
70
+ export { kyberInit, MlKem512, MlKem768, MlKem1024, MlKemBase, KyberSuite, _kyberReady } from './kyber/index.js';
71
+ export { SealStream, OpenStream, Seal, SealStreamPool, FLAG_FRAMED, TAG_DATA, TAG_FINAL, HEADER_SIZE, CHUNK_MIN, CHUNK_MAX } from './stream/index.js';
43
72
  export { Fortuna } from './fortuna.js';
44
- export { hexToBytes, bytesToHex, utf8ToBytes, bytesToUtf8, base64ToBytes, bytesToBase64, constantTimeEqual, wipe, xor, concat, randomBytes, } from './utils.js';
73
+ export { hexToBytes, bytesToHex, utf8ToBytes, bytesToUtf8, base64ToBytes, bytesToBase64, constantTimeEqual, CT_MAX_BYTES, wipe, xor, concat, randomBytes, hasSIMD, } from './utils.js';
package/dist/init.d.ts CHANGED
@@ -1,10 +1,6 @@
1
- export type Module = 'serpent' | 'chacha20' | 'sha2' | 'sha3';
2
- export type Mode = 'embedded' | 'streaming' | 'manual';
3
- export interface InitOpts {
4
- wasmUrl?: URL | string;
5
- wasmBinary?: Partial<Record<Module, Uint8Array | ArrayBuffer>>;
6
- }
7
- export declare function initModule(mod: Module, embeddedThunk: () => Promise<string>, mode?: Mode, opts?: InitOpts): Promise<void>;
1
+ import type { WasmSource } from './wasm-source.js';
2
+ export type Module = 'serpent' | 'chacha20' | 'sha2' | 'sha3' | 'keccak' | 'kyber';
3
+ export declare function initModule(mod: Module, source: WasmSource): Promise<void>;
8
4
  export declare function getInstance(mod: Module): WebAssembly.Instance;
9
5
  export declare function isInitialized(mod: Module): boolean;
10
6
  /** Reset all cached instances — for testing only */
package/dist/init.js CHANGED
@@ -1,47 +1,30 @@
1
- // Module-scope cache: one WebAssembly.Instance per module
1
+ import { loadWasm } from './loader.js';
2
+ import { hasSIMD } from './utils.js';
3
+ // 'keccak' is an alias for 'sha3' — same WASM binary, same instance slot
4
+ const ALIASES = { keccak: 'sha3' };
5
+ function resolve(mod) {
6
+ return ALIASES[mod] ?? mod;
7
+ }
8
+ // Module-scope cache: one WebAssembly.Instance per canonical module
2
9
  const instances = new Map();
3
- // Map from public module name to WASM filename
4
- const WASM_FILES = {
5
- serpent: 'serpent.wasm',
6
- chacha20: 'chacha20.wasm',
7
- sha2: 'sha2.wasm',
8
- sha3: 'sha3.wasm',
9
- };
10
- export async function initModule(mod, embeddedThunk, mode = 'embedded', opts) {
11
- if (instances.has(mod))
10
+ export async function initModule(mod, source) {
11
+ const resolved = resolve(mod);
12
+ if (instances.has(resolved))
12
13
  return;
13
- let instance;
14
- if (mode === 'embedded') {
15
- const { loadEmbedded } = await import('./loader.js');
16
- instance = await loadEmbedded(embeddedThunk);
17
- }
18
- else if (mode === 'streaming') {
19
- if (!opts?.wasmUrl)
20
- throw new Error('leviathan-crypto: streaming mode requires wasmUrl');
21
- const { loadStreaming } = await import('./loader.js');
22
- instance = await loadStreaming(mod, opts.wasmUrl, WASM_FILES[mod]);
23
- }
24
- else if (mode === 'manual') {
25
- const binary = opts?.wasmBinary?.[mod];
26
- if (!binary)
27
- throw new Error(`leviathan-crypto: manual mode requires wasmBinary['${mod}']`);
28
- const { loadManual } = await import('./loader.js');
29
- instance = await loadManual(binary);
30
- }
31
- else {
32
- throw new Error(`leviathan-crypto: unknown mode '${mode}'`);
33
- }
34
- instances.set(mod, instance);
14
+ if ((resolved === 'serpent' || resolved === 'chacha20' || resolved === 'kyber') && !hasSIMD())
15
+ throw new Error('leviathan-crypto: serpent, chacha20, and kyber require WebAssembly SIMD — '
16
+ + 'this runtime does not support it');
17
+ instances.set(resolved, await loadWasm(source));
35
18
  }
36
19
  export function getInstance(mod) {
37
- const inst = instances.get(mod);
20
+ const inst = instances.get(resolve(mod));
38
21
  if (!inst) {
39
- throw new Error(`leviathan-crypto: call init(['${mod}']) before using this class`);
22
+ throw new Error(`leviathan-crypto: call init({ ${mod}: ... }) before using this class`);
40
23
  }
41
24
  return inst;
42
25
  }
43
26
  export function isInitialized(mod) {
44
- return instances.has(mod);
27
+ return instances.has(resolve(mod));
45
28
  }
46
29
  /** Reset all cached instances — for testing only */
47
30
  export function _resetForTesting() {
@@ -0,0 +1 @@
1
+ export { WASM_GZ_BASE64 as keccakWasm } from '../embedded/sha3.js';
@@ -0,0 +1,27 @@
1
+ // ▄▄▄▄▄▄▄▄▄▄
2
+ // ▄████████████████████▄▄ ▒ ▄▀▀ ▒ ▒ █ ▄▀▄ ▀█▀ █ ▒ ▄▀▄ █▀▄
3
+ // ▄██████████████████████ ▀████▄ ▓ ▓▀ ▓ ▓ ▓ ▓▄▓ ▓ ▓▀▓ ▓▄▓ ▓ ▓
4
+ // ▄█████████▀▀▀ ▀███████▄▄███████▌ ▀▄ ▀▄▄ ▀▄▀ ▒ ▒ ▒ ▒ ▒ █ ▒ ▒ ▒ █
5
+ // ▐████████▀ ▄▄▄▄ ▀████████▀██▀█▌
6
+ // ████████ ███▀▀ ████▀ █▀ █▀ Leviathan Crypto Library
7
+ // ███████▌ ▀██▀ ███
8
+ // ███████ ▀███ ▀██ ▀█▄ Repository & Mirror:
9
+ // ▀██████ ▄▄██ ▀▀ ██▄ github.com/xero/leviathan-crypto
10
+ // ▀█████▄ ▄██▄ ▄▀▄▀ unpkg.com/leviathan-crypto
11
+ // ▀████▄ ▄██▄
12
+ // ▐████ ▐███ Author: xero (https://x-e.ro)
13
+ // ▄▄██████████ ▐███ ▄▄ License: MIT
14
+ // ▄██▀▀▀▀▀▀▀▀▀▀ ▄████ ▄██▀
15
+ // ▄▀ ▄▄█████████▄▄ ▀▀▀▀▀ ▄███ This file is provided completely
16
+ // ▄██████▀▀▀▀▀▀██████▄ ▀▄▄▄▄████▀ free, "as is", and without
17
+ // ████▀ ▄▄▄▄▄▄▄ ▀████▄ ▀█████▀ ▄▄▄▄ warranty of any kind. The author
18
+ // █████▄▄█████▀▀▀▀▀▀▄ ▀███▄ ▄████ assumes absolutely no liability
19
+ // ▀██████▀ ▀████▄▄▄████▀ for its {ab,mis,}use.
20
+ // ▀█████▀▀
21
+ //
22
+ // src/ts/keccak/embedded.ts
23
+ //
24
+ // Re-exports the sha3 WASM blob under the keccak name.
25
+ // The keccak alias shares the sha3 binary — no separate keccak.wasm exists.
26
+ // Import via `leviathan-crypto/keccak/embedded`.
27
+ export { WASM_GZ_BASE64 as keccakWasm } from '../embedded/sha3.js';
@@ -0,0 +1,4 @@
1
+ import type { WasmSource } from '../wasm-source.js';
2
+ export declare function keccakInit(source: WasmSource): Promise<void>;
3
+ export type { WasmSource };
4
+ export { SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256 } from '../sha3/index.js';
@@ -0,0 +1,31 @@
1
+ // ▄▄▄▄▄▄▄▄▄▄
2
+ // ▄████████████████████▄▄ ▒ ▄▀▀ ▒ ▒ █ ▄▀▄ ▀█▀ █ ▒ ▄▀▄ █▀▄
3
+ // ▄██████████████████████ ▀████▄ ▓ ▓▀ ▓ ▓ ▓ ▓▄▓ ▓ ▓▀▓ ▓▄▓ ▓ ▓
4
+ // ▄█████████▀▀▀ ▀███████▄▄███████▌ ▀▄ ▀▄▄ ▀▄▀ ▒ ▒ ▒ ▒ ▒ █ ▒ ▒ ▒ █
5
+ // ▐████████▀ ▄▄▄▄ ▀████████▀██▀█▌
6
+ // ████████ ███▀▀ ████▀ █▀ █▀ Leviathan Crypto Library
7
+ // ███████▌ ▀██▀ ███
8
+ // ███████ ▀███ ▀██ ▀█▄ Repository & Mirror:
9
+ // ▀██████ ▄▄██ ▀▀ ██▄ github.com/xero/leviathan-crypto
10
+ // ▀█████▄ ▄██▄ ▄▀▄▀ unpkg.com/leviathan-crypto
11
+ // ▀████▄ ▄██▄
12
+ // ▐████ ▐███ Author: xero (https://x-e.ro)
13
+ // ▄▄██████████ ▐███ ▄▄ License: MIT
14
+ // ▄██▀▀▀▀▀▀▀▀▀▀ ▄████ ▄██▀
15
+ // ▄▀ ▄▄█████████▄▄ ▀▀▀▀▀ ▄███ This file is provided completely
16
+ // ▄██████▀▀▀▀▀▀██████▄ ▀▄▄▄▄████▀ free, "as is", and without
17
+ // ████▀ ▄▄▄▄▄▄▄ ▀████▄ ▀█████▀ ▄▄▄▄ warranty of any kind. The author
18
+ // █████▄▄█████▀▀▀▀▀▀▄ ▀███▄ ▄████ assumes absolutely no liability
19
+ // ▀██████▀ ▀████▄▄▄████▀ for its {ab,mis,}use.
20
+ // ▀█████▀▀
21
+ //
22
+ // src/ts/keccak/index.ts
23
+ //
24
+ // Keccak alias subpath — resolves to the sha3 WASM module slot.
25
+ // Consumers who prefer the Keccak name (e.g. Kyber/ML-KEM implementations)
26
+ // can import from `leviathan-crypto/keccak` instead of `leviathan-crypto/sha3`.
27
+ import { initModule } from '../init.js';
28
+ export async function keccakInit(source) {
29
+ return initModule('keccak', source);
30
+ }
31
+ export { SHA3_224, SHA3_256, SHA3_384, SHA3_512, SHAKE128, SHAKE256 } from '../sha3/index.js';
@@ -0,0 +1 @@
1
+ export { WASM_GZ_BASE64 as kyberWasm } from '../embedded/kyber.js';
@@ -0,0 +1,27 @@
1
+ // ▄▄▄▄▄▄▄▄▄▄
2
+ // ▄████████████████████▄▄ ▒ ▄▀▀ ▒ ▒ █ ▄▀▄ ▀█▀ █ ▒ ▄▀▄ █▀▄
3
+ // ▄██████████████████████ ▀████▄ ▓ ▓▀ ▓ ▓ ▓ ▓▄▓ ▓ ▓▀▓ ▓▄▓ ▓ ▓
4
+ // ▄█████████▀▀▀ ▀███████▄▄███████▌ ▀▄ ▀▄▄ ▀▄▀ ▒ ▒ ▒ ▒ ▒ █ ▒ ▒ ▒ █
5
+ // ▐████████▀ ▄▄▄▄ ▀████████▀██▀█▌
6
+ // ████████ ███▀▀ ████▀ █▀ █▀ Leviathan Crypto Library
7
+ // ███████▌ ▀██▀ ███
8
+ // ███████ ▀███ ▀██ ▀█▄ Repository & Mirror:
9
+ // ▀██████ ▄▄██ ▀▀ ██▄ github.com/xero/leviathan-crypto
10
+ // ▀█████▄ ▄██▄ ▄▀▄▀ unpkg.com/leviathan-crypto
11
+ // ▀████▄ ▄██▄
12
+ // ▐████ ▐███ Author: xero (https://x-e.ro)
13
+ // ▄▄██████████ ▐███ ▄▄ License: MIT
14
+ // ▄██▀▀▀▀▀▀▀▀▀▀ ▄████ ▄██▀
15
+ // ▄▀ ▄▄█████████▄▄ ▀▀▀▀▀ ▄███ This file is provided completely
16
+ // ▄██████▀▀▀▀▀▀██████▄ ▀▄▄▄▄████▀ free, "as is", and without
17
+ // ████▀ ▄▄▄▄▄▄▄ ▀████▄ ▀█████▀ ▄▄▄▄ warranty of any kind. The author
18
+ // █████▄▄█████▀▀▀▀▀▀▄ ▀███▄ ▄████ assumes absolutely no liability
19
+ // ▀██████▀ ▀████▄▄▄████▀ for its {ab,mis,}use.
20
+ // ▀█████▀▀
21
+ //
22
+ // src/ts/kyber/embedded.ts
23
+ //
24
+ // Exports the gzip+base64 kyber WASM blob for use as a WasmSource.
25
+ // This is the only file in the kyber subpath that references the embedded blob.
26
+ // Import via `leviathan-crypto/kyber/embedded`.
27
+ export { WASM_GZ_BASE64 as kyberWasm } from '../embedded/kyber.js';
@@ -0,0 +1,49 @@
1
+ import type { KyberExports, Sha3Exports } from './types.js';
2
+ import type { KyberParams } from './params.js';
3
+ /** SHA3-512(msg) → 64 bytes. Resets sha3 state. */
4
+ export declare function sha3_512Hash(sx: Sha3Exports, msg: Uint8Array): Uint8Array;
5
+ /** SHA3-256(msg) → 32 bytes. Resets sha3 state. */
6
+ export declare function sha3_256Hash(sx: Sha3Exports, msg: Uint8Array): Uint8Array;
7
+ /**
8
+ * SHAKE256(msg, n) → n bytes. Resets sha3 state.
9
+ * Used for J function (z || c) and PRF seeding in kem.ts.
10
+ */
11
+ export declare function shake256Hash(sx: Sha3Exports, msg: Uint8Array, n: number): Uint8Array;
12
+ /**
13
+ * K-PKE.KeyGen (FIPS 203 Algorithm 12) — deterministic.
14
+ *
15
+ * Slot map:
16
+ * pvec0 — current row of  (overwritten per row)
17
+ * pvec1 — ŝ (noise, persistent through dot products)
18
+ * pvec2 — ê (noise)
19
+ * pvec3 — t̂ = ·ŝ + ê (output)
20
+ */
21
+ export declare function indcpaKeypairDerand(kx: KyberExports, sx: Sha3Exports, params: KyberParams, d: Uint8Array): {
22
+ ekCpa: Uint8Array;
23
+ skCpa: Uint8Array;
24
+ };
25
+ /**
26
+ * K-PKE.Encrypt (FIPS 203 Algorithm 13) — deterministic.
27
+ *
28
+ * Slot map:
29
+ * pvec0 — current row of Â^T (transposed, overwritten per row)
30
+ * pvec1 — r̂ = NTT(r)
31
+ * pvec2 — e₁ (noise)
32
+ * pvec3 — u = invNTT(Â^T · r̂) + e₁
33
+ * pvec4 — t̂ (unpacked from ek)
34
+ * poly1 — e₂ (noise)
35
+ * poly2 — v = invNTT(t̂^T · r̂) + e₂ + msg
36
+ * poly3 — message polynomial
37
+ */
38
+ export declare function indcpaEncrypt(kx: KyberExports, sx: Sha3Exports, params: KyberParams, ek: Uint8Array, m: Uint8Array, coins: Uint8Array): Uint8Array;
39
+ /**
40
+ * K-PKE.Decrypt (FIPS 203 Algorithm 14).
41
+ *
42
+ * Slot map:
43
+ * pvec0 — û (decompressed from ct)
44
+ * pvec1 — ŝ (from sk)
45
+ * poly0 — v (decompressed from ct)
46
+ * poly1 — w = invNTT(ŝ^T · NTT(û))
47
+ * poly2 — m' = v - w
48
+ */
49
+ export declare function indcpaDecrypt(kx: KyberExports, params: KyberParams, skCpa: Uint8Array, ct: Uint8Array): Uint8Array;