leviathan-crypto 2.0.1 → 3.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 (312) hide show
  1. package/CLAUDE.md +88 -281
  2. package/LICENSE +4 -0
  3. package/README.md +275 -87
  4. package/dist/aes/aes-cbc.d.ts +40 -0
  5. package/dist/aes/aes-cbc.js +158 -0
  6. package/dist/aes/aes-ctr.d.ts +50 -0
  7. package/dist/aes/aes-ctr.js +141 -0
  8. package/dist/aes/aes-gcm-siv.d.ts +67 -0
  9. package/dist/aes/aes-gcm-siv.js +217 -0
  10. package/dist/aes/aes-gcm.d.ts +61 -0
  11. package/dist/aes/aes-gcm.js +226 -0
  12. package/dist/aes/cipher-suite.d.ts +21 -0
  13. package/dist/aes/cipher-suite.js +179 -0
  14. package/dist/aes/embedded.d.ts +1 -0
  15. package/dist/aes/embedded.js +26 -0
  16. package/dist/aes/generator.d.ts +14 -0
  17. package/dist/aes/generator.js +103 -0
  18. package/dist/aes/index.d.ts +58 -0
  19. package/dist/aes/index.js +125 -0
  20. package/dist/aes/ops.d.ts +60 -0
  21. package/dist/aes/ops.js +164 -0
  22. package/dist/aes/pool-worker.d.ts +1 -0
  23. package/dist/aes/pool-worker.js +92 -0
  24. package/dist/aes/types.d.ts +1 -0
  25. package/dist/aes/types.js +23 -0
  26. package/dist/aes.wasm +0 -0
  27. package/dist/blake3/embedded.d.ts +1 -0
  28. package/dist/blake3/embedded.js +26 -0
  29. package/dist/blake3/index.d.ts +143 -0
  30. package/dist/blake3/index.js +620 -0
  31. package/dist/blake3/types.d.ts +102 -0
  32. package/dist/blake3/types.js +31 -0
  33. package/dist/blake3/validate.d.ts +29 -0
  34. package/dist/blake3/validate.js +80 -0
  35. package/dist/blake3.wasm +0 -0
  36. package/dist/chacha20/cipher-suite.d.ts +10 -0
  37. package/dist/chacha20/cipher-suite.js +98 -13
  38. package/dist/chacha20/generator.d.ts +12 -0
  39. package/dist/chacha20/generator.js +91 -0
  40. package/dist/chacha20/index.d.ts +100 -3
  41. package/dist/chacha20/index.js +169 -35
  42. package/dist/chacha20/ops.d.ts +57 -6
  43. package/dist/chacha20/ops.js +107 -27
  44. package/dist/chacha20/pool-worker.js +14 -0
  45. package/dist/chacha20/types.d.ts +1 -32
  46. package/dist/cte-wasm.d.ts +1 -0
  47. package/dist/cte-wasm.js +3 -0
  48. package/dist/cte.wasm +0 -0
  49. package/dist/curve25519.wasm +0 -0
  50. package/dist/ecdsa/der.d.ts +23 -0
  51. package/dist/ecdsa/der.js +192 -0
  52. package/dist/ecdsa/ecprivatekey-der.d.ts +32 -0
  53. package/dist/ecdsa/ecprivatekey-der.js +230 -0
  54. package/dist/ecdsa/embedded.d.ts +1 -0
  55. package/dist/ecdsa/embedded.js +25 -0
  56. package/dist/ecdsa/index.d.ts +124 -0
  57. package/dist/ecdsa/index.js +366 -0
  58. package/dist/ecdsa/types.d.ts +31 -0
  59. package/dist/ecdsa/types.js +28 -0
  60. package/dist/ecdsa/validate.d.ts +18 -0
  61. package/dist/ecdsa/validate.js +92 -0
  62. package/dist/ed25519/embedded.d.ts +1 -0
  63. package/dist/ed25519/embedded.js +31 -0
  64. package/dist/ed25519/index.d.ts +70 -0
  65. package/dist/ed25519/index.js +308 -0
  66. package/dist/ed25519/types.d.ts +27 -0
  67. package/dist/ed25519/types.js +27 -0
  68. package/dist/ed25519/validate.d.ts +7 -0
  69. package/dist/ed25519/validate.js +77 -0
  70. package/dist/embedded/aes-pool-worker.d.ts +1 -0
  71. package/dist/embedded/aes-pool-worker.js +5 -0
  72. package/dist/embedded/aes.d.ts +1 -0
  73. package/dist/embedded/aes.js +3 -0
  74. package/dist/embedded/blake3.d.ts +1 -0
  75. package/dist/embedded/blake3.js +3 -0
  76. package/dist/embedded/chacha20-pool-worker.d.ts +1 -0
  77. package/dist/embedded/chacha20-pool-worker.js +5 -0
  78. package/dist/embedded/chacha20.d.ts +1 -1
  79. package/dist/embedded/chacha20.js +2 -2
  80. package/dist/embedded/curve25519.d.ts +1 -0
  81. package/dist/embedded/curve25519.js +3 -0
  82. package/dist/embedded/mldsa.d.ts +1 -0
  83. package/dist/embedded/mldsa.js +3 -0
  84. package/dist/embedded/mlkem.d.ts +1 -0
  85. package/dist/embedded/mlkem.js +3 -0
  86. package/dist/embedded/p256.d.ts +1 -0
  87. package/dist/embedded/p256.js +3 -0
  88. package/dist/embedded/serpent-pool-worker.d.ts +1 -0
  89. package/dist/embedded/serpent-pool-worker.js +5 -0
  90. package/dist/embedded/serpent.d.ts +1 -1
  91. package/dist/embedded/serpent.js +2 -2
  92. package/dist/embedded/sha2.d.ts +1 -1
  93. package/dist/embedded/sha2.js +2 -2
  94. package/dist/embedded/sha3.d.ts +1 -1
  95. package/dist/embedded/sha3.js +2 -2
  96. package/dist/embedded/slhdsa.d.ts +1 -0
  97. package/dist/embedded/slhdsa.js +3 -0
  98. package/dist/errors.d.ts +92 -1
  99. package/dist/errors.js +111 -1
  100. package/dist/fortuna.d.ts +18 -12
  101. package/dist/fortuna.js +166 -99
  102. package/dist/index.d.ts +42 -11
  103. package/dist/index.js +65 -20
  104. package/dist/init.d.ts +1 -3
  105. package/dist/init.js +73 -7
  106. package/dist/keccak/embedded.js +1 -1
  107. package/dist/keccak/index.d.ts +2 -0
  108. package/dist/keccak/index.js +4 -2
  109. package/dist/loader.d.ts +1 -19
  110. package/dist/loader.js +26 -32
  111. package/dist/merkle/blake3-tree.d.ts +35 -0
  112. package/dist/merkle/blake3-tree.js +187 -0
  113. package/dist/merkle/checkpoint.d.ts +58 -0
  114. package/dist/merkle/checkpoint.js +217 -0
  115. package/dist/merkle/index.d.ts +19 -0
  116. package/dist/merkle/index.js +37 -0
  117. package/dist/merkle/merkle-log.d.ts +130 -0
  118. package/dist/merkle/merkle-log.js +207 -0
  119. package/dist/merkle/merkle-verifier.d.ts +126 -0
  120. package/dist/merkle/merkle-verifier.js +296 -0
  121. package/dist/merkle/proof.d.ts +70 -0
  122. package/dist/merkle/proof.js +300 -0
  123. package/dist/merkle/sha256-tree.d.ts +33 -0
  124. package/dist/merkle/sha256-tree.js +145 -0
  125. package/dist/merkle/signed-log.d.ts +156 -0
  126. package/dist/merkle/signed-log.js +356 -0
  127. package/dist/merkle/signed-note.d.ts +309 -0
  128. package/dist/merkle/signed-note.js +648 -0
  129. package/dist/merkle/sth.d.ts +31 -0
  130. package/dist/merkle/sth.js +31 -0
  131. package/dist/merkle/storage.d.ts +40 -0
  132. package/dist/merkle/storage.js +71 -0
  133. package/dist/merkle/tree.d.ts +68 -0
  134. package/dist/merkle/tree.js +94 -0
  135. package/dist/mldsa/embedded.d.ts +1 -0
  136. package/dist/{kyber → mldsa}/embedded.js +5 -5
  137. package/dist/mldsa/expand.d.ts +53 -0
  138. package/dist/mldsa/expand.js +188 -0
  139. package/dist/mldsa/format.d.ts +16 -0
  140. package/dist/mldsa/format.js +68 -0
  141. package/dist/mldsa/hashvariant.d.ts +32 -0
  142. package/dist/mldsa/hashvariant.js +248 -0
  143. package/dist/mldsa/index.d.ts +142 -0
  144. package/dist/mldsa/index.js +463 -0
  145. package/dist/mldsa/keygen.d.ts +16 -0
  146. package/dist/mldsa/keygen.js +232 -0
  147. package/dist/mldsa/params.d.ts +21 -0
  148. package/dist/mldsa/params.js +55 -0
  149. package/dist/mldsa/sha3-helpers.d.ts +30 -0
  150. package/dist/mldsa/sha3-helpers.js +124 -0
  151. package/dist/mldsa/sign.d.ts +36 -0
  152. package/dist/mldsa/sign.js +380 -0
  153. package/dist/mldsa/types.d.ts +91 -0
  154. package/dist/mldsa/types.js +25 -0
  155. package/dist/mldsa/validate.d.ts +55 -0
  156. package/dist/mldsa/validate.js +125 -0
  157. package/dist/mldsa/verify.d.ts +29 -0
  158. package/dist/mldsa/verify.js +269 -0
  159. package/dist/mldsa.wasm +0 -0
  160. package/dist/mlkem/embedded.d.ts +1 -0
  161. package/dist/mlkem/embedded.js +27 -0
  162. package/dist/mlkem/indcpa.d.ts +49 -0
  163. package/dist/{kyber → mlkem}/indcpa.js +48 -48
  164. package/dist/mlkem/index.d.ts +37 -0
  165. package/dist/{kyber → mlkem}/index.js +41 -31
  166. package/dist/mlkem/kem.d.ts +21 -0
  167. package/dist/{kyber → mlkem}/kem.js +48 -13
  168. package/dist/{kyber → mlkem}/params.d.ts +4 -4
  169. package/dist/{kyber → mlkem}/params.js +2 -2
  170. package/dist/mlkem/suite.d.ts +12 -0
  171. package/dist/{kyber → mlkem}/suite.js +17 -12
  172. package/dist/{kyber → mlkem}/types.d.ts +4 -3
  173. package/dist/{kyber → mlkem}/types.js +1 -1
  174. package/dist/mlkem/validate.d.ts +23 -0
  175. package/dist/{kyber → mlkem}/validate.js +24 -20
  176. package/dist/{kyber.wasm → mlkem.wasm} +0 -0
  177. package/dist/p256.wasm +0 -0
  178. package/dist/ratchet/index.d.ts +8 -0
  179. package/dist/ratchet/index.js +38 -0
  180. package/dist/ratchet/kdf-chain.d.ts +13 -0
  181. package/dist/ratchet/kdf-chain.js +85 -0
  182. package/dist/ratchet/ratchet-keypair.d.ts +9 -0
  183. package/dist/ratchet/ratchet-keypair.js +61 -0
  184. package/dist/ratchet/root-kdf.d.ts +4 -0
  185. package/dist/ratchet/root-kdf.js +124 -0
  186. package/dist/ratchet/skipped-key-store.d.ts +14 -0
  187. package/dist/ratchet/skipped-key-store.js +154 -0
  188. package/dist/ratchet/types.d.ts +36 -0
  189. package/dist/ratchet/types.js +26 -0
  190. package/dist/serpent/cipher-suite.d.ts +10 -0
  191. package/dist/serpent/cipher-suite.js +144 -56
  192. package/dist/serpent/generator.d.ts +12 -0
  193. package/dist/serpent/generator.js +97 -0
  194. package/dist/serpent/index.d.ts +62 -1
  195. package/dist/serpent/index.js +97 -21
  196. package/dist/serpent/pool-worker.js +28 -102
  197. package/dist/serpent/serpent-cbc.d.ts +16 -6
  198. package/dist/serpent/serpent-cbc.js +58 -37
  199. package/dist/serpent/shared-ops.d.ts +63 -0
  200. package/dist/serpent/shared-ops.js +178 -0
  201. package/dist/serpent/types.d.ts +1 -5
  202. package/dist/serpent.wasm +0 -0
  203. package/dist/sha2/hash.d.ts +2 -0
  204. package/dist/sha2/hash.js +53 -0
  205. package/dist/sha2/hkdf.js +5 -5
  206. package/dist/sha2/index.d.ts +22 -1
  207. package/dist/sha2/index.js +80 -11
  208. package/dist/sha2/types.d.ts +41 -2
  209. package/dist/sha2.wasm +0 -0
  210. package/dist/sha3/hash.d.ts +2 -0
  211. package/dist/sha3/hash.js +53 -0
  212. package/dist/sha3/index.d.ts +87 -3
  213. package/dist/sha3/index.js +317 -19
  214. package/dist/sha3/kmac.d.ts +121 -0
  215. package/dist/sha3/kmac.js +800 -0
  216. package/dist/sha3.wasm +0 -0
  217. package/dist/shared/pkcs7.d.ts +22 -0
  218. package/dist/shared/pkcs7.js +84 -0
  219. package/dist/sign/ctx.d.ts +41 -0
  220. package/dist/sign/ctx.js +102 -0
  221. package/dist/sign/envelope.d.ts +45 -0
  222. package/dist/sign/envelope.js +152 -0
  223. package/dist/sign/hasher.d.ts +9 -0
  224. package/dist/sign/hasher.js +132 -0
  225. package/dist/sign/index.d.ts +11 -0
  226. package/dist/sign/index.js +34 -0
  227. package/dist/sign/sign-stream.d.ts +25 -0
  228. package/dist/sign/sign-stream.js +112 -0
  229. package/dist/sign/suites/ecdsa-p256.d.ts +2 -0
  230. package/dist/sign/suites/ecdsa-p256.js +120 -0
  231. package/dist/sign/suites/ed25519.d.ts +3 -0
  232. package/dist/sign/suites/ed25519.js +165 -0
  233. package/dist/sign/suites/hybrid-classical.d.ts +23 -0
  234. package/dist/sign/suites/hybrid-classical.js +526 -0
  235. package/dist/sign/suites/hybrid-pq.d.ts +4 -0
  236. package/dist/sign/suites/hybrid-pq.js +234 -0
  237. package/dist/sign/suites/mldsa.d.ts +7 -0
  238. package/dist/sign/suites/mldsa.js +161 -0
  239. package/dist/sign/suites/slhdsa.d.ts +7 -0
  240. package/dist/sign/suites/slhdsa.js +176 -0
  241. package/dist/sign/types.d.ts +106 -0
  242. package/dist/sign/types.js +28 -0
  243. package/dist/sign/verify-stream.d.ts +30 -0
  244. package/dist/sign/verify-stream.js +227 -0
  245. package/dist/slhdsa/embedded.d.ts +1 -0
  246. package/dist/slhdsa/embedded.js +26 -0
  247. package/dist/slhdsa/index.d.ts +149 -0
  248. package/dist/slhdsa/index.js +493 -0
  249. package/dist/slhdsa/params.d.ts +26 -0
  250. package/dist/slhdsa/params.js +70 -0
  251. package/dist/slhdsa/prehash.d.ts +68 -0
  252. package/dist/slhdsa/prehash.js +307 -0
  253. package/dist/slhdsa/sign.d.ts +39 -0
  254. package/dist/slhdsa/sign.js +116 -0
  255. package/dist/slhdsa/types.d.ts +129 -0
  256. package/dist/slhdsa/types.js +27 -0
  257. package/dist/slhdsa/validate.d.ts +60 -0
  258. package/dist/slhdsa/validate.js +127 -0
  259. package/dist/slhdsa/verify.d.ts +32 -0
  260. package/dist/slhdsa/verify.js +107 -0
  261. package/dist/slhdsa.wasm +0 -0
  262. package/dist/stream/header.js +8 -8
  263. package/dist/stream/index.d.ts +1 -0
  264. package/dist/stream/index.js +1 -0
  265. package/dist/stream/open-stream.js +65 -22
  266. package/dist/stream/seal-stream-pool.d.ts +2 -0
  267. package/dist/stream/seal-stream-pool.js +100 -33
  268. package/dist/stream/seal-stream.d.ts +1 -1
  269. package/dist/stream/seal-stream.js +48 -19
  270. package/dist/stream/seal.js +6 -6
  271. package/dist/stream/types.d.ts +3 -1
  272. package/dist/stream/types.js +1 -1
  273. package/dist/types.d.ts +22 -1
  274. package/dist/types.js +1 -1
  275. package/dist/utils.d.ts +9 -10
  276. package/dist/utils.js +84 -59
  277. package/dist/wasm-source.d.ts +9 -8
  278. package/dist/wasm-source.js +1 -1
  279. package/dist/x25519/embedded.d.ts +1 -0
  280. package/dist/x25519/embedded.js +31 -0
  281. package/dist/x25519/index.d.ts +43 -0
  282. package/dist/x25519/index.js +159 -0
  283. package/dist/x25519/types.d.ts +25 -0
  284. package/dist/x25519/types.js +27 -0
  285. package/dist/x25519/validate.d.ts +2 -0
  286. package/dist/x25519/validate.js +39 -0
  287. package/package.json +123 -64
  288. package/SECURITY.md +0 -276
  289. package/dist/ct-wasm.d.ts +0 -1
  290. package/dist/ct-wasm.js +0 -3
  291. package/dist/ct.wasm +0 -0
  292. package/dist/docs/aead.md +0 -323
  293. package/dist/docs/architecture.md +0 -932
  294. package/dist/docs/argon2id.md +0 -302
  295. package/dist/docs/chacha20.md +0 -674
  296. package/dist/docs/exports.md +0 -241
  297. package/dist/docs/fortuna.md +0 -313
  298. package/dist/docs/init.md +0 -302
  299. package/dist/docs/loader.md +0 -161
  300. package/dist/docs/serpent.md +0 -519
  301. package/dist/docs/sha2.md +0 -613
  302. package/dist/docs/sha3.md +0 -546
  303. package/dist/docs/types.md +0 -276
  304. package/dist/docs/utils.md +0 -367
  305. package/dist/embedded/kyber.d.ts +0 -1
  306. package/dist/embedded/kyber.js +0 -3
  307. package/dist/kyber/embedded.d.ts +0 -1
  308. package/dist/kyber/indcpa.d.ts +0 -49
  309. package/dist/kyber/index.d.ts +0 -38
  310. package/dist/kyber/kem.d.ts +0 -21
  311. package/dist/kyber/suite.d.ts +0 -13
  312. package/dist/kyber/validate.d.ts +0 -19
@@ -22,23 +22,15 @@
22
22
  // src/ts/sha2/index.ts
23
23
  //
24
24
  // Public API classes for the SHA-2 WASM module.
25
- // Uses the init() module cache call sha2Init(source) before constructing.
26
- import { getInstance, initModule } from '../init.js';
25
+ // Uses the init() module cache, call sha2Init(source) before constructing.
26
+ import { getInstance, initModule, _assertNotOwned } from '../init.js';
27
27
  export async function sha2Init(source) {
28
28
  return initModule('sha2', source);
29
29
  }
30
+ export { isInitialized } from '../init.js';
30
31
  function getExports() {
31
32
  return getInstance('sha2').exports;
32
33
  }
33
- export function _sha2Ready() {
34
- try {
35
- getInstance('sha2');
36
- return true;
37
- }
38
- catch {
39
- return false;
40
- }
41
- }
42
34
  // Write msg into input buffer in chunks, calling update for each chunk.
43
35
  function feedHash(x, msg, inputOff, chunkSize, updateFn) {
44
36
  const mem = new Uint8Array(x.memory.buffer);
@@ -57,6 +49,7 @@ export class SHA256 {
57
49
  this.x = getExports();
58
50
  }
59
51
  hash(msg) {
52
+ _assertNotOwned('sha2');
60
53
  this.x.sha256Init();
61
54
  feedHash(this.x, msg, this.x.getSha256InputOffset(), 64, this.x.sha256Update);
62
55
  this.x.sha256Final();
@@ -64,6 +57,7 @@ export class SHA256 {
64
57
  return mem.slice(this.x.getSha256OutOffset(), this.x.getSha256OutOffset() + 32);
65
58
  }
66
59
  dispose() {
60
+ _assertNotOwned('sha2');
67
61
  this.x.wipeBuffers();
68
62
  }
69
63
  }
@@ -74,6 +68,7 @@ export class SHA512 {
74
68
  this.x = getExports();
75
69
  }
76
70
  hash(msg) {
71
+ _assertNotOwned('sha2');
77
72
  this.x.sha512Init();
78
73
  feedHash(this.x, msg, this.x.getSha512InputOffset(), 128, this.x.sha512Update);
79
74
  this.x.sha512Final();
@@ -81,6 +76,7 @@ export class SHA512 {
81
76
  return mem.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 64);
82
77
  }
83
78
  dispose() {
79
+ _assertNotOwned('sha2');
84
80
  this.x.wipeBuffers();
85
81
  }
86
82
  }
@@ -91,6 +87,7 @@ export class SHA384 {
91
87
  this.x = getExports();
92
88
  }
93
89
  hash(msg) {
90
+ _assertNotOwned('sha2');
94
91
  this.x.sha384Init();
95
92
  feedHash(this.x, msg, this.x.getSha512InputOffset(), 128, this.x.sha512Update);
96
93
  this.x.sha384Final();
@@ -98,6 +95,70 @@ export class SHA384 {
98
95
  return mem.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 48);
99
96
  }
100
97
  dispose() {
98
+ _assertNotOwned('sha2');
99
+ this.x.wipeBuffers();
100
+ }
101
+ }
102
+ // ── SHA224 ──────────────────────────────────────────────────────────────────
103
+ // FIPS 180-4 §6.3, SHA-256 round logic with the §5.3.2 IV; output is the
104
+ // leftmost 224 bits (28 bytes) of the SHA-256 state.
105
+ export class SHA224 {
106
+ x;
107
+ constructor() {
108
+ this.x = getExports();
109
+ }
110
+ hash(msg) {
111
+ _assertNotOwned('sha2');
112
+ this.x.sha224Init();
113
+ feedHash(this.x, msg, this.x.getSha256InputOffset(), 64, this.x.sha256Update);
114
+ this.x.sha224Final();
115
+ const mem = new Uint8Array(this.x.memory.buffer);
116
+ return mem.slice(this.x.getSha256OutOffset(), this.x.getSha256OutOffset() + 28);
117
+ }
118
+ dispose() {
119
+ _assertNotOwned('sha2');
120
+ this.x.wipeBuffers();
121
+ }
122
+ }
123
+ // ── SHA512_224 ──────────────────────────────────────────────────────────────
124
+ // FIPS 180-4 §6.7.1, SHA-512 round logic with the §5.3.6.1 IV; output is the
125
+ // leftmost 224 bits (28 bytes) of the SHA-512 state.
126
+ export class SHA512_224 {
127
+ x;
128
+ constructor() {
129
+ this.x = getExports();
130
+ }
131
+ hash(msg) {
132
+ _assertNotOwned('sha2');
133
+ this.x.sha512_224Init();
134
+ feedHash(this.x, msg, this.x.getSha512InputOffset(), 128, this.x.sha512Update);
135
+ this.x.sha512_224Final();
136
+ const mem = new Uint8Array(this.x.memory.buffer);
137
+ return mem.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 28);
138
+ }
139
+ dispose() {
140
+ _assertNotOwned('sha2');
141
+ this.x.wipeBuffers();
142
+ }
143
+ }
144
+ // ── SHA512_256 ──────────────────────────────────────────────────────────────
145
+ // FIPS 180-4 §6.7.2, SHA-512 round logic with the §5.3.6.2 IV; output is the
146
+ // leftmost 256 bits (32 bytes) of the SHA-512 state.
147
+ export class SHA512_256 {
148
+ x;
149
+ constructor() {
150
+ this.x = getExports();
151
+ }
152
+ hash(msg) {
153
+ _assertNotOwned('sha2');
154
+ this.x.sha512_256Init();
155
+ feedHash(this.x, msg, this.x.getSha512InputOffset(), 128, this.x.sha512Update);
156
+ this.x.sha512_256Final();
157
+ const mem = new Uint8Array(this.x.memory.buffer);
158
+ return mem.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 32);
159
+ }
160
+ dispose() {
161
+ _assertNotOwned('sha2');
101
162
  this.x.wipeBuffers();
102
163
  }
103
164
  }
@@ -108,6 +169,7 @@ export class HMAC_SHA256 {
108
169
  this.x = getExports();
109
170
  }
110
171
  hash(key, msg) {
172
+ _assertNotOwned('sha2');
111
173
  let k = key;
112
174
  // RFC 2104 §3: keys longer than block size are pre-hashed
113
175
  if (k.length > 64) {
@@ -126,6 +188,7 @@ export class HMAC_SHA256 {
126
188
  return out.slice(this.x.getSha256OutOffset(), this.x.getSha256OutOffset() + 32);
127
189
  }
128
190
  dispose() {
191
+ _assertNotOwned('sha2');
129
192
  this.x.wipeBuffers();
130
193
  }
131
194
  }
@@ -136,6 +199,7 @@ export class HMAC_SHA512 {
136
199
  this.x = getExports();
137
200
  }
138
201
  hash(key, msg) {
202
+ _assertNotOwned('sha2');
139
203
  let k = key;
140
204
  // RFC 2104 §3: keys longer than block size (128) are pre-hashed
141
205
  if (k.length > 128) {
@@ -154,6 +218,7 @@ export class HMAC_SHA512 {
154
218
  return out.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 64);
155
219
  }
156
220
  dispose() {
221
+ _assertNotOwned('sha2');
157
222
  this.x.wipeBuffers();
158
223
  }
159
224
  }
@@ -164,6 +229,7 @@ export class HMAC_SHA384 {
164
229
  this.x = getExports();
165
230
  }
166
231
  hash(key, msg) {
232
+ _assertNotOwned('sha2');
167
233
  let k = key;
168
234
  // RFC 2104 §3: keys longer than block size (128) are pre-hashed with SHA-384
169
235
  if (k.length > 128) {
@@ -182,8 +248,11 @@ export class HMAC_SHA384 {
182
248
  return out.slice(this.x.getSha512OutOffset(), this.x.getSha512OutOffset() + 48);
183
249
  }
184
250
  dispose() {
251
+ _assertNotOwned('sha2');
185
252
  this.x.wipeBuffers();
186
253
  }
187
254
  }
188
255
  // ── HKDF ────────────────────────────────────────────────────────────────────
189
256
  export { HKDF_SHA256, HKDF_SHA512 } from './hkdf.js';
257
+ // ── SHA256Hash ──────────────────────────────────────────────────────────────
258
+ export { SHA256Hash } from './hash.js';
@@ -1,5 +1,44 @@
1
- /** WASM exports for the sha2 module */
1
+ /** WASM exports for the sha2 module, full FIPS 180-4 surface plus
2
+ * HMAC variants. Importable from cross-module wrappers (e.g. mldsa's
3
+ * HashML-DSA pre-hash dispatcher) that need to drive sha2 directly
4
+ * without going through the public class API. */
2
5
  export interface Sha2Exports {
3
6
  memory: WebAssembly.Memory;
4
- getModuleId(): number;
7
+ getModuleId: () => number;
8
+ getSha256InputOffset: () => number;
9
+ getSha256OutOffset: () => number;
10
+ getSha256HOffset: () => number;
11
+ getSha512InputOffset: () => number;
12
+ getSha512OutOffset: () => number;
13
+ getSha512HOffset: () => number;
14
+ getHmac256IpadOffset: () => number;
15
+ getHmac256OpadOffset: () => number;
16
+ getHmac256InnerOffset: () => number;
17
+ getHmac512IpadOffset: () => number;
18
+ getHmac512OpadOffset: () => number;
19
+ getHmac512InnerOffset: () => number;
20
+ sha256Init: () => void;
21
+ sha256Update: (len: number) => void;
22
+ sha256Final: () => void;
23
+ sha224Init: () => void;
24
+ sha224Final: () => void;
25
+ sha512Init: () => void;
26
+ sha384Init: () => void;
27
+ sha512_224Init: () => void;
28
+ sha512_256Init: () => void;
29
+ sha512Update: (len: number) => void;
30
+ sha512Final: () => void;
31
+ sha384Final: () => void;
32
+ sha512_224Final: () => void;
33
+ sha512_256Final: () => void;
34
+ hmac256Init: (keyLen: number) => void;
35
+ hmac256Update: (len: number) => void;
36
+ hmac256Final: () => void;
37
+ hmac512Init: (keyLen: number) => void;
38
+ hmac512Update: (len: number) => void;
39
+ hmac512Final: () => void;
40
+ hmac384Init: (keyLen: number) => void;
41
+ hmac384Update: (len: number) => void;
42
+ hmac384Final: () => void;
43
+ wipeBuffers: () => void;
5
44
  }
package/dist/sha2.wasm CHANGED
Binary file
@@ -0,0 +1,2 @@
1
+ import type { HashFn } from '../types.js';
2
+ export declare const SHA3_256Hash: HashFn;
@@ -0,0 +1,53 @@
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/sha3/hash.ts
23
+ //
24
+ // Stateless SHA3-256 HashFn for Fortuna's accumulator and reseed slots.
25
+ import { _assertNotOwned, getInstance } from '../init.js';
26
+ export const SHA3_256Hash = {
27
+ outputSize: 32,
28
+ wasmModules: ['sha3'],
29
+ digest(msg) {
30
+ _assertNotOwned('sha3');
31
+ const x = getInstance('sha3').exports;
32
+ const mem = new Uint8Array(x.memory.buffer);
33
+ try {
34
+ x.sha3_256Init();
35
+ const inOff = x.getInputOffset();
36
+ let pos = 0;
37
+ while (pos < msg.length) {
38
+ const n = Math.min(msg.length - pos, 168);
39
+ mem.set(msg.subarray(pos, pos + n), inOff);
40
+ x.keccakAbsorb(n);
41
+ pos += n;
42
+ }
43
+ x.sha3_256Final();
44
+ const outOff = x.getOutOffset();
45
+ return mem.slice(outOff, outOff + 32);
46
+ }
47
+ finally {
48
+ // Wipe the keccak input/output/sponge state so secret-derived
49
+ // inputs (e.g. Fortuna pool entropy) do not outlive this call.
50
+ x.wipeBuffers();
51
+ }
52
+ },
53
+ };
@@ -1,7 +1,7 @@
1
1
  import type { WasmSource } from '../wasm-source.js';
2
2
  export declare function sha3Init(source: WasmSource): Promise<void>;
3
3
  export type { WasmSource };
4
- export declare function _sha3Ready(): boolean;
4
+ export { isInitialized } from '../init.js';
5
5
  export declare class SHA3_256 {
6
6
  private readonly x;
7
7
  constructor();
@@ -26,13 +26,20 @@ export declare class SHA3_224 {
26
26
  hash(msg: Uint8Array): Uint8Array;
27
27
  dispose(): void;
28
28
  }
29
- /** SHAKE128 XOF — extendable output, multi-squeeze capable. */
29
+ /**
30
+ * SHAKE128 XOF, extendable output, multi-squeeze capable.
31
+ *
32
+ * Holds exclusive access to the `sha3` WASM module from construction until
33
+ * `dispose()`. Constructing a second SHAKE128/SHAKE256 or any other sha3
34
+ * user while this instance is live throws. Call `dispose()` when done.
35
+ */
30
36
  export declare class SHAKE128 {
31
37
  private readonly x;
32
38
  private readonly _rate;
33
39
  private _squeezing;
34
40
  private _block;
35
41
  private _blockPos;
42
+ private _tok;
36
43
  constructor();
37
44
  reset(): this;
38
45
  absorb(msg: Uint8Array): this;
@@ -40,13 +47,20 @@ export declare class SHAKE128 {
40
47
  hash(msg: Uint8Array, outputLength: number): Uint8Array;
41
48
  dispose(): void;
42
49
  }
43
- /** SHAKE256 XOF — extendable output, multi-squeeze capable. */
50
+ /**
51
+ * SHAKE256 XOF, extendable output, multi-squeeze capable.
52
+ *
53
+ * Holds exclusive access to the `sha3` WASM module from construction until
54
+ * `dispose()`. Constructing a second SHAKE128/SHAKE256 or any other sha3
55
+ * user while this instance is live throws. Call `dispose()` when done.
56
+ */
44
57
  export declare class SHAKE256 {
45
58
  private readonly x;
46
59
  private readonly _rate;
47
60
  private _squeezing;
48
61
  private _block;
49
62
  private _blockPos;
63
+ private _tok;
50
64
  constructor();
51
65
  reset(): this;
52
66
  absorb(msg: Uint8Array): this;
@@ -54,3 +68,73 @@ export declare class SHAKE256 {
54
68
  hash(msg: Uint8Array, outputLength: number): Uint8Array;
55
69
  dispose(): void;
56
70
  }
71
+ /**
72
+ * Incremental SHA3-256. Construct, `update()` chunks (any size), `finalize()`
73
+ * to get the 32-byte digest. Finalize disposes the instance.
74
+ *
75
+ * Holds exclusive access to the `sha3` WASM module from construction until
76
+ * `dispose()` or `finalize()`. Mirrors SHAKE128 lifecycle.
77
+ */
78
+ export declare class SHA3_256Stream {
79
+ private readonly x;
80
+ private _tok;
81
+ constructor();
82
+ update(chunk: Uint8Array): this;
83
+ finalize(): Uint8Array;
84
+ dispose(): void;
85
+ }
86
+ /**
87
+ * Incremental SHA3-512. Construct, `update()` chunks (any size), `finalize()`
88
+ * to get the 64-byte digest. Finalize disposes the instance.
89
+ *
90
+ * Holds exclusive access to the `sha3` WASM module from construction until
91
+ * `dispose()` or `finalize()`. Mirrors SHAKE128 lifecycle.
92
+ */
93
+ export declare class SHA3_512Stream {
94
+ private readonly x;
95
+ private _tok;
96
+ constructor();
97
+ update(chunk: Uint8Array): this;
98
+ finalize(): Uint8Array;
99
+ dispose(): void;
100
+ }
101
+ /**
102
+ * Single-shot streaming SHAKE128. `outputLen` is bound at construction;
103
+ * `update()` absorbs chunks of any size, `finalize()` pads and squeezes
104
+ * exactly `outputLen` bytes, then disposes the instance.
105
+ *
106
+ * Used by `createRunningHash` in the sign layer: each StreamableSignatureSuite
107
+ * with `prehashAlgorithm: 'shake-128'` declares its `prehashSize` and that
108
+ * value is passed in here at construction time. The multi-squeeze
109
+ * `SHAKE128` class above remains for the XOF surface; this class is the
110
+ * fixed-output cousin that matches the RunningHash contract.
111
+ *
112
+ * Holds exclusive access to the `sha3` WASM module from construction until
113
+ * `dispose()` or `finalize()`. Mirrors `SHA3_256Stream` lifecycle.
114
+ */
115
+ export declare class SHAKE128Stream {
116
+ private readonly x;
117
+ private readonly _rate;
118
+ private readonly outputLen;
119
+ private _tok;
120
+ constructor(outputLen: number);
121
+ update(chunk: Uint8Array): this;
122
+ finalize(): Uint8Array;
123
+ dispose(): void;
124
+ }
125
+ /**
126
+ * Single-shot streaming SHAKE256. `outputLen` is bound at construction;
127
+ * mirrors `SHAKE128Stream`. See that class for usage notes.
128
+ */
129
+ export declare class SHAKE256Stream {
130
+ private readonly x;
131
+ private readonly _rate;
132
+ private readonly outputLen;
133
+ private _tok;
134
+ constructor(outputLen: number);
135
+ update(chunk: Uint8Array): this;
136
+ finalize(): Uint8Array;
137
+ dispose(): void;
138
+ }
139
+ export { SHA3_256Hash } from './hash.js';
140
+ export { CSHAKE128, CSHAKE256, KMAC128, KMAC256, KMACXOF128, KMACXOF256 } from './kmac.js';