leviathan-crypto 1.3.1 → 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 (124) hide show
  1. package/CLAUDE.md +129 -76
  2. package/README.md +166 -221
  3. package/SECURITY.md +89 -37
  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 -7
  9. package/dist/chacha20/index.js +41 -14
  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 +218 -150
  20. package/dist/docs/exports.md +241 -0
  21. package/dist/docs/fortuna.md +65 -74
  22. package/dist/docs/init.md +172 -178
  23. package/dist/docs/loader.md +87 -132
  24. package/dist/docs/serpent.md +134 -565
  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 +114 -41
  29. package/dist/embedded/chacha20.d.ts +1 -1
  30. package/dist/embedded/chacha20.js +2 -1
  31. package/dist/embedded/kyber.d.ts +1 -0
  32. package/dist/embedded/kyber.js +3 -0
  33. package/dist/embedded/serpent.d.ts +1 -1
  34. package/dist/embedded/serpent.js +2 -1
  35. package/dist/embedded/sha2.d.ts +1 -1
  36. package/dist/embedded/sha2.js +2 -1
  37. package/dist/embedded/sha3.d.ts +1 -1
  38. package/dist/embedded/sha3.js +2 -1
  39. package/dist/errors.d.ts +10 -0
  40. package/dist/{serpent/seal.js → errors.js} +14 -46
  41. package/dist/fortuna.d.ts +2 -8
  42. package/dist/fortuna.js +11 -9
  43. package/dist/index.d.ts +25 -9
  44. package/dist/index.js +36 -7
  45. package/dist/init.d.ts +3 -7
  46. package/dist/init.js +18 -35
  47. package/dist/keccak/embedded.d.ts +1 -0
  48. package/dist/keccak/embedded.js +27 -0
  49. package/dist/keccak/index.d.ts +4 -0
  50. package/dist/keccak/index.js +31 -0
  51. package/dist/kyber/embedded.d.ts +1 -0
  52. package/dist/kyber/embedded.js +27 -0
  53. package/dist/kyber/indcpa.d.ts +49 -0
  54. package/dist/kyber/indcpa.js +352 -0
  55. package/dist/kyber/index.d.ts +38 -0
  56. package/dist/kyber/index.js +150 -0
  57. package/dist/kyber/kem.d.ts +21 -0
  58. package/dist/kyber/kem.js +160 -0
  59. package/dist/kyber/params.d.ts +14 -0
  60. package/dist/kyber/params.js +37 -0
  61. package/dist/kyber/suite.d.ts +13 -0
  62. package/dist/kyber/suite.js +93 -0
  63. package/dist/kyber/types.d.ts +98 -0
  64. package/dist/kyber/types.js +25 -0
  65. package/dist/kyber/validate.d.ts +19 -0
  66. package/dist/kyber/validate.js +68 -0
  67. package/dist/kyber.wasm +0 -0
  68. package/dist/loader.d.ts +19 -4
  69. package/dist/loader.js +91 -25
  70. package/dist/serpent/cipher-suite.d.ts +4 -0
  71. package/dist/serpent/cipher-suite.js +121 -0
  72. package/dist/serpent/embedded.d.ts +1 -0
  73. package/dist/serpent/embedded.js +27 -0
  74. package/dist/serpent/index.d.ts +6 -37
  75. package/dist/serpent/index.js +9 -118
  76. package/dist/serpent/pool-worker.d.ts +1 -0
  77. package/dist/serpent/pool-worker.js +202 -0
  78. package/dist/serpent/serpent-cbc.d.ts +30 -0
  79. package/dist/serpent/serpent-cbc.js +136 -0
  80. package/dist/sha2/embedded.d.ts +1 -0
  81. package/dist/sha2/embedded.js +27 -0
  82. package/dist/sha2/hkdf.js +6 -2
  83. package/dist/sha2/index.d.ts +3 -2
  84. package/dist/sha2/index.js +3 -4
  85. package/dist/sha3/embedded.d.ts +1 -0
  86. package/dist/sha3/embedded.js +27 -0
  87. package/dist/sha3/index.d.ts +3 -2
  88. package/dist/sha3/index.js +3 -4
  89. package/dist/stream/constants.d.ts +6 -0
  90. package/dist/stream/constants.js +30 -0
  91. package/dist/stream/header.d.ts +9 -0
  92. package/dist/stream/header.js +77 -0
  93. package/dist/stream/index.d.ts +7 -0
  94. package/dist/stream/index.js +27 -0
  95. package/dist/stream/open-stream.d.ts +21 -0
  96. package/dist/stream/open-stream.js +146 -0
  97. package/dist/stream/seal-stream-pool.d.ts +38 -0
  98. package/dist/stream/seal-stream-pool.js +391 -0
  99. package/dist/stream/seal-stream.d.ts +20 -0
  100. package/dist/stream/seal-stream.js +142 -0
  101. package/dist/stream/seal.d.ts +9 -0
  102. package/dist/stream/seal.js +75 -0
  103. package/dist/stream/types.d.ts +24 -0
  104. package/dist/stream/types.js +26 -0
  105. package/dist/utils.d.ts +12 -7
  106. package/dist/utils.js +75 -19
  107. package/dist/wasm-source.d.ts +12 -0
  108. package/dist/wasm-source.js +26 -0
  109. package/package.json +13 -5
  110. package/dist/chacha20/pool.d.ts +0 -52
  111. package/dist/chacha20/pool.js +0 -188
  112. package/dist/chacha20/pool.worker.js +0 -37
  113. package/dist/docs/chacha20_pool.md +0 -309
  114. package/dist/docs/wasm.md +0 -194
  115. package/dist/serpent/seal.d.ts +0 -8
  116. package/dist/serpent/stream-pool.d.ts +0 -48
  117. package/dist/serpent/stream-pool.js +0 -285
  118. package/dist/serpent/stream-sealer.d.ts +0 -50
  119. package/dist/serpent/stream-sealer.js +0 -341
  120. package/dist/serpent/stream.d.ts +0 -28
  121. package/dist/serpent/stream.js +0 -205
  122. package/dist/serpent/stream.worker.d.ts +0 -32
  123. package/dist/serpent/stream.worker.js +0 -117
  124. /package/dist/chacha20/{pool.worker.d.ts → pool-worker.d.ts} +0 -0
@@ -1,117 +0,0 @@
1
- "use strict";
2
- // / <reference lib="webworker" />
3
- // src/ts/serpent/stream.worker.ts
4
- //
5
- // Worker entry point for SerpentStreamPool. Runs in a Web Worker —
6
- // no access to the main thread's module cache. Owns its own
7
- // serpent.wasm and sha2.wasm instances with isolated linear memory.
8
- // Implements sealChunk/openChunk inline using raw WASM exports.
9
- let sx;
10
- let hx;
11
- const ZERO_IV = new Uint8Array(16);
12
- // ── Inline chunk ops ──────────────────────────────────────────────────────────
13
- function hmacSha256(hx, key, msg) {
14
- // RFC 2104 §3: keys longer than block size (64 bytes) are pre-hashed.
15
- // mac_key is always 32 bytes in normal usage (half of HKDF 64-byte output),
16
- // but this guard must match the main-thread HMAC_SHA256.hash() behaviour
17
- // exactly — any divergence would cause authentication failures if key sizes
18
- // ever change.
19
- let k = key;
20
- if (k.length > 64) {
21
- hx.sha256Init();
22
- let pos = 0;
23
- while (pos < k.length) {
24
- const n = Math.min(k.length - pos, 64);
25
- new Uint8Array(hx.memory.buffer).set(k.subarray(pos, pos + n), hx.getSha256InputOffset());
26
- hx.sha256Update(n);
27
- pos += n;
28
- }
29
- hx.sha256Final();
30
- const out = new Uint8Array(hx.memory.buffer);
31
- k = out.slice(hx.getSha256OutOffset(), hx.getSha256OutOffset() + 32);
32
- }
33
- const mem = new Uint8Array(hx.memory.buffer);
34
- const inputOff = hx.getSha256InputOffset();
35
- mem.set(k, inputOff);
36
- hx.hmac256Init(k.length);
37
- let pos = 0;
38
- while (pos < msg.length) {
39
- const n = Math.min(msg.length - pos, 64);
40
- new Uint8Array(hx.memory.buffer).set(msg.subarray(pos, pos + n), inputOff);
41
- hx.hmac256Update(n);
42
- pos += n;
43
- }
44
- hx.hmac256Final();
45
- const out = new Uint8Array(hx.memory.buffer);
46
- return out.slice(hx.getSha256OutOffset(), hx.getSha256OutOffset() + 32);
47
- }
48
- function ctrEncrypt(sx, key, chunk) {
49
- const mem = new Uint8Array(sx.memory.buffer);
50
- mem.set(key, sx.getKeyOffset());
51
- mem.set(ZERO_IV, sx.getNonceOffset());
52
- sx.loadKey(key.length);
53
- sx.resetCounter();
54
- new Uint8Array(sx.memory.buffer).set(chunk, sx.getChunkPtOffset());
55
- sx.encryptChunk(chunk.length);
56
- const out = new Uint8Array(sx.memory.buffer);
57
- return out.slice(sx.getChunkCtOffset(), sx.getChunkCtOffset() + chunk.length);
58
- }
59
- function constantTimeEqual(a, b) {
60
- if (a.length !== b.length)
61
- return false;
62
- let diff = 0;
63
- for (let i = 0; i < a.length; i++)
64
- diff |= a[i] ^ b[i];
65
- return diff === 0;
66
- }
67
- function workerSealChunk(encKey, macKey, chunk) {
68
- const ciphertext = ctrEncrypt(sx, encKey, chunk);
69
- const tag = hmacSha256(hx, macKey, ciphertext);
70
- const out = new Uint8Array(ciphertext.length + 32);
71
- out.set(ciphertext, 0);
72
- out.set(tag, ciphertext.length);
73
- return out;
74
- }
75
- function workerOpenChunk(encKey, macKey, wire) {
76
- if (wire.length < 32)
77
- throw new RangeError('SerpentStream: chunk wire data too short');
78
- const ciphertext = wire.subarray(0, wire.length - 32);
79
- const tag = wire.subarray(wire.length - 32);
80
- const expectedTag = hmacSha256(hx, macKey, ciphertext);
81
- if (!constantTimeEqual(tag, expectedTag))
82
- throw new Error('SerpentStream: authentication failed');
83
- return ctrEncrypt(sx, encKey, ciphertext);
84
- }
85
- // ── Message handler ───────────────────────────────────────────────────────────
86
- self.onmessage = async (e) => {
87
- const msg = e.data;
88
- if (msg.type === 'init') {
89
- try {
90
- const serpentMem = new WebAssembly.Memory({ initial: 3, maximum: 3 });
91
- const sha2Mem = new WebAssembly.Memory({ initial: 3, maximum: 3 });
92
- const serpentInst = await WebAssembly.instantiate(msg.serpentModule, { env: { memory: serpentMem } });
93
- const sha2Inst = await WebAssembly.instantiate(msg.sha2Module, { env: { memory: sha2Mem } });
94
- sx = serpentInst.exports;
95
- hx = sha2Inst.exports;
96
- self.postMessage({ type: 'ready' });
97
- }
98
- catch (err) {
99
- self.postMessage({ type: 'error', id: -1, message: err.message });
100
- }
101
- return;
102
- }
103
- if (!sx || !hx) {
104
- self.postMessage({ type: 'error', id: msg.id, message: 'worker not initialized' });
105
- return;
106
- }
107
- try {
108
- const { id, op, encKey, macKey, data } = msg;
109
- const result = op === 'seal'
110
- ? workerSealChunk(encKey, macKey, data)
111
- : workerOpenChunk(encKey, macKey, data);
112
- self.postMessage({ type: 'result', id, data: result }, [result.buffer]);
113
- }
114
- catch (err) {
115
- self.postMessage({ type: 'error', id: msg.id, message: err.message });
116
- }
117
- };