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.
- package/CLAUDE.md +88 -281
- package/LICENSE +4 -0
- package/README.md +275 -87
- package/dist/aes/aes-cbc.d.ts +40 -0
- package/dist/aes/aes-cbc.js +158 -0
- package/dist/aes/aes-ctr.d.ts +50 -0
- package/dist/aes/aes-ctr.js +141 -0
- package/dist/aes/aes-gcm-siv.d.ts +67 -0
- package/dist/aes/aes-gcm-siv.js +217 -0
- package/dist/aes/aes-gcm.d.ts +61 -0
- package/dist/aes/aes-gcm.js +226 -0
- package/dist/aes/cipher-suite.d.ts +21 -0
- package/dist/aes/cipher-suite.js +179 -0
- package/dist/aes/embedded.d.ts +1 -0
- package/dist/aes/embedded.js +26 -0
- package/dist/aes/generator.d.ts +14 -0
- package/dist/aes/generator.js +103 -0
- package/dist/aes/index.d.ts +58 -0
- package/dist/aes/index.js +125 -0
- package/dist/aes/ops.d.ts +60 -0
- package/dist/aes/ops.js +164 -0
- package/dist/aes/pool-worker.d.ts +1 -0
- package/dist/aes/pool-worker.js +92 -0
- package/dist/aes/types.d.ts +1 -0
- package/dist/aes/types.js +23 -0
- package/dist/aes.wasm +0 -0
- package/dist/blake3/embedded.d.ts +1 -0
- package/dist/blake3/embedded.js +26 -0
- package/dist/blake3/index.d.ts +143 -0
- package/dist/blake3/index.js +620 -0
- package/dist/blake3/types.d.ts +102 -0
- package/dist/blake3/types.js +31 -0
- package/dist/blake3/validate.d.ts +29 -0
- package/dist/blake3/validate.js +80 -0
- package/dist/blake3.wasm +0 -0
- package/dist/chacha20/cipher-suite.d.ts +10 -0
- package/dist/chacha20/cipher-suite.js +98 -13
- package/dist/chacha20/generator.d.ts +12 -0
- package/dist/chacha20/generator.js +91 -0
- package/dist/chacha20/index.d.ts +100 -3
- package/dist/chacha20/index.js +169 -35
- package/dist/chacha20/ops.d.ts +57 -6
- package/dist/chacha20/ops.js +107 -27
- package/dist/chacha20/pool-worker.js +14 -0
- package/dist/chacha20/types.d.ts +1 -32
- package/dist/cte-wasm.d.ts +1 -0
- package/dist/cte-wasm.js +3 -0
- package/dist/cte.wasm +0 -0
- package/dist/curve25519.wasm +0 -0
- package/dist/ecdsa/der.d.ts +23 -0
- package/dist/ecdsa/der.js +192 -0
- package/dist/ecdsa/ecprivatekey-der.d.ts +32 -0
- package/dist/ecdsa/ecprivatekey-der.js +230 -0
- package/dist/ecdsa/embedded.d.ts +1 -0
- package/dist/ecdsa/embedded.js +25 -0
- package/dist/ecdsa/index.d.ts +124 -0
- package/dist/ecdsa/index.js +366 -0
- package/dist/ecdsa/types.d.ts +31 -0
- package/dist/ecdsa/types.js +28 -0
- package/dist/ecdsa/validate.d.ts +18 -0
- package/dist/ecdsa/validate.js +92 -0
- package/dist/ed25519/embedded.d.ts +1 -0
- package/dist/ed25519/embedded.js +31 -0
- package/dist/ed25519/index.d.ts +70 -0
- package/dist/ed25519/index.js +308 -0
- package/dist/ed25519/types.d.ts +27 -0
- package/dist/ed25519/types.js +27 -0
- package/dist/ed25519/validate.d.ts +7 -0
- package/dist/ed25519/validate.js +77 -0
- package/dist/embedded/aes-pool-worker.d.ts +1 -0
- package/dist/embedded/aes-pool-worker.js +5 -0
- package/dist/embedded/aes.d.ts +1 -0
- package/dist/embedded/aes.js +3 -0
- package/dist/embedded/blake3.d.ts +1 -0
- package/dist/embedded/blake3.js +3 -0
- package/dist/embedded/chacha20-pool-worker.d.ts +1 -0
- package/dist/embedded/chacha20-pool-worker.js +5 -0
- package/dist/embedded/chacha20.d.ts +1 -1
- package/dist/embedded/chacha20.js +2 -2
- package/dist/embedded/curve25519.d.ts +1 -0
- package/dist/embedded/curve25519.js +3 -0
- package/dist/embedded/mldsa.d.ts +1 -0
- package/dist/embedded/mldsa.js +3 -0
- package/dist/embedded/mlkem.d.ts +1 -0
- package/dist/embedded/mlkem.js +3 -0
- package/dist/embedded/p256.d.ts +1 -0
- package/dist/embedded/p256.js +3 -0
- package/dist/embedded/serpent-pool-worker.d.ts +1 -0
- package/dist/embedded/serpent-pool-worker.js +5 -0
- package/dist/embedded/serpent.d.ts +1 -1
- package/dist/embedded/serpent.js +2 -2
- package/dist/embedded/sha2.d.ts +1 -1
- package/dist/embedded/sha2.js +2 -2
- package/dist/embedded/sha3.d.ts +1 -1
- package/dist/embedded/sha3.js +2 -2
- package/dist/embedded/slhdsa.d.ts +1 -0
- package/dist/embedded/slhdsa.js +3 -0
- package/dist/errors.d.ts +92 -1
- package/dist/errors.js +111 -1
- package/dist/fortuna.d.ts +18 -12
- package/dist/fortuna.js +166 -99
- package/dist/index.d.ts +42 -11
- package/dist/index.js +65 -20
- package/dist/init.d.ts +1 -3
- package/dist/init.js +73 -7
- package/dist/keccak/embedded.js +1 -1
- package/dist/keccak/index.d.ts +2 -0
- package/dist/keccak/index.js +4 -2
- package/dist/loader.d.ts +1 -19
- package/dist/loader.js +26 -32
- package/dist/merkle/blake3-tree.d.ts +35 -0
- package/dist/merkle/blake3-tree.js +187 -0
- package/dist/merkle/checkpoint.d.ts +58 -0
- package/dist/merkle/checkpoint.js +217 -0
- package/dist/merkle/index.d.ts +19 -0
- package/dist/merkle/index.js +37 -0
- package/dist/merkle/merkle-log.d.ts +130 -0
- package/dist/merkle/merkle-log.js +207 -0
- package/dist/merkle/merkle-verifier.d.ts +126 -0
- package/dist/merkle/merkle-verifier.js +296 -0
- package/dist/merkle/proof.d.ts +70 -0
- package/dist/merkle/proof.js +300 -0
- package/dist/merkle/sha256-tree.d.ts +33 -0
- package/dist/merkle/sha256-tree.js +145 -0
- package/dist/merkle/signed-log.d.ts +156 -0
- package/dist/merkle/signed-log.js +356 -0
- package/dist/merkle/signed-note.d.ts +309 -0
- package/dist/merkle/signed-note.js +648 -0
- package/dist/merkle/sth.d.ts +31 -0
- package/dist/merkle/sth.js +31 -0
- package/dist/merkle/storage.d.ts +40 -0
- package/dist/merkle/storage.js +71 -0
- package/dist/merkle/tree.d.ts +68 -0
- package/dist/merkle/tree.js +94 -0
- package/dist/mldsa/embedded.d.ts +1 -0
- package/dist/{kyber → mldsa}/embedded.js +5 -5
- package/dist/mldsa/expand.d.ts +53 -0
- package/dist/mldsa/expand.js +188 -0
- package/dist/mldsa/format.d.ts +16 -0
- package/dist/mldsa/format.js +68 -0
- package/dist/mldsa/hashvariant.d.ts +32 -0
- package/dist/mldsa/hashvariant.js +248 -0
- package/dist/mldsa/index.d.ts +142 -0
- package/dist/mldsa/index.js +463 -0
- package/dist/mldsa/keygen.d.ts +16 -0
- package/dist/mldsa/keygen.js +232 -0
- package/dist/mldsa/params.d.ts +21 -0
- package/dist/mldsa/params.js +55 -0
- package/dist/mldsa/sha3-helpers.d.ts +30 -0
- package/dist/mldsa/sha3-helpers.js +124 -0
- package/dist/mldsa/sign.d.ts +36 -0
- package/dist/mldsa/sign.js +380 -0
- package/dist/mldsa/types.d.ts +91 -0
- package/dist/mldsa/types.js +25 -0
- package/dist/mldsa/validate.d.ts +55 -0
- package/dist/mldsa/validate.js +125 -0
- package/dist/mldsa/verify.d.ts +29 -0
- package/dist/mldsa/verify.js +269 -0
- package/dist/mldsa.wasm +0 -0
- package/dist/mlkem/embedded.d.ts +1 -0
- package/dist/mlkem/embedded.js +27 -0
- package/dist/mlkem/indcpa.d.ts +49 -0
- package/dist/{kyber → mlkem}/indcpa.js +48 -48
- package/dist/mlkem/index.d.ts +37 -0
- package/dist/{kyber → mlkem}/index.js +41 -31
- package/dist/mlkem/kem.d.ts +21 -0
- package/dist/{kyber → mlkem}/kem.js +48 -13
- package/dist/{kyber → mlkem}/params.d.ts +4 -4
- package/dist/{kyber → mlkem}/params.js +2 -2
- package/dist/mlkem/suite.d.ts +12 -0
- package/dist/{kyber → mlkem}/suite.js +17 -12
- package/dist/{kyber → mlkem}/types.d.ts +4 -3
- package/dist/{kyber → mlkem}/types.js +1 -1
- package/dist/mlkem/validate.d.ts +23 -0
- package/dist/{kyber → mlkem}/validate.js +24 -20
- package/dist/{kyber.wasm → mlkem.wasm} +0 -0
- package/dist/p256.wasm +0 -0
- package/dist/ratchet/index.d.ts +8 -0
- package/dist/ratchet/index.js +38 -0
- package/dist/ratchet/kdf-chain.d.ts +13 -0
- package/dist/ratchet/kdf-chain.js +85 -0
- package/dist/ratchet/ratchet-keypair.d.ts +9 -0
- package/dist/ratchet/ratchet-keypair.js +61 -0
- package/dist/ratchet/root-kdf.d.ts +4 -0
- package/dist/ratchet/root-kdf.js +124 -0
- package/dist/ratchet/skipped-key-store.d.ts +14 -0
- package/dist/ratchet/skipped-key-store.js +154 -0
- package/dist/ratchet/types.d.ts +36 -0
- package/dist/ratchet/types.js +26 -0
- package/dist/serpent/cipher-suite.d.ts +10 -0
- package/dist/serpent/cipher-suite.js +144 -56
- package/dist/serpent/generator.d.ts +12 -0
- package/dist/serpent/generator.js +97 -0
- package/dist/serpent/index.d.ts +62 -1
- package/dist/serpent/index.js +97 -21
- package/dist/serpent/pool-worker.js +28 -102
- package/dist/serpent/serpent-cbc.d.ts +16 -6
- package/dist/serpent/serpent-cbc.js +58 -37
- package/dist/serpent/shared-ops.d.ts +63 -0
- package/dist/serpent/shared-ops.js +178 -0
- package/dist/serpent/types.d.ts +1 -5
- package/dist/serpent.wasm +0 -0
- package/dist/sha2/hash.d.ts +2 -0
- package/dist/sha2/hash.js +53 -0
- package/dist/sha2/hkdf.js +5 -5
- package/dist/sha2/index.d.ts +22 -1
- package/dist/sha2/index.js +80 -11
- package/dist/sha2/types.d.ts +41 -2
- package/dist/sha2.wasm +0 -0
- package/dist/sha3/hash.d.ts +2 -0
- package/dist/sha3/hash.js +53 -0
- package/dist/sha3/index.d.ts +87 -3
- package/dist/sha3/index.js +317 -19
- package/dist/sha3/kmac.d.ts +121 -0
- package/dist/sha3/kmac.js +800 -0
- package/dist/sha3.wasm +0 -0
- package/dist/shared/pkcs7.d.ts +22 -0
- package/dist/shared/pkcs7.js +84 -0
- package/dist/sign/ctx.d.ts +41 -0
- package/dist/sign/ctx.js +102 -0
- package/dist/sign/envelope.d.ts +45 -0
- package/dist/sign/envelope.js +152 -0
- package/dist/sign/hasher.d.ts +9 -0
- package/dist/sign/hasher.js +132 -0
- package/dist/sign/index.d.ts +11 -0
- package/dist/sign/index.js +34 -0
- package/dist/sign/sign-stream.d.ts +25 -0
- package/dist/sign/sign-stream.js +112 -0
- package/dist/sign/suites/ecdsa-p256.d.ts +2 -0
- package/dist/sign/suites/ecdsa-p256.js +120 -0
- package/dist/sign/suites/ed25519.d.ts +3 -0
- package/dist/sign/suites/ed25519.js +165 -0
- package/dist/sign/suites/hybrid-classical.d.ts +23 -0
- package/dist/sign/suites/hybrid-classical.js +526 -0
- package/dist/sign/suites/hybrid-pq.d.ts +4 -0
- package/dist/sign/suites/hybrid-pq.js +234 -0
- package/dist/sign/suites/mldsa.d.ts +7 -0
- package/dist/sign/suites/mldsa.js +161 -0
- package/dist/sign/suites/slhdsa.d.ts +7 -0
- package/dist/sign/suites/slhdsa.js +176 -0
- package/dist/sign/types.d.ts +106 -0
- package/dist/sign/types.js +28 -0
- package/dist/sign/verify-stream.d.ts +30 -0
- package/dist/sign/verify-stream.js +227 -0
- package/dist/slhdsa/embedded.d.ts +1 -0
- package/dist/slhdsa/embedded.js +26 -0
- package/dist/slhdsa/index.d.ts +149 -0
- package/dist/slhdsa/index.js +493 -0
- package/dist/slhdsa/params.d.ts +26 -0
- package/dist/slhdsa/params.js +70 -0
- package/dist/slhdsa/prehash.d.ts +68 -0
- package/dist/slhdsa/prehash.js +307 -0
- package/dist/slhdsa/sign.d.ts +39 -0
- package/dist/slhdsa/sign.js +116 -0
- package/dist/slhdsa/types.d.ts +129 -0
- package/dist/slhdsa/types.js +27 -0
- package/dist/slhdsa/validate.d.ts +60 -0
- package/dist/slhdsa/validate.js +127 -0
- package/dist/slhdsa/verify.d.ts +32 -0
- package/dist/slhdsa/verify.js +107 -0
- package/dist/slhdsa.wasm +0 -0
- package/dist/stream/header.js +8 -8
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.js +1 -0
- package/dist/stream/open-stream.js +65 -22
- package/dist/stream/seal-stream-pool.d.ts +2 -0
- package/dist/stream/seal-stream-pool.js +100 -33
- package/dist/stream/seal-stream.d.ts +1 -1
- package/dist/stream/seal-stream.js +48 -19
- package/dist/stream/seal.js +6 -6
- package/dist/stream/types.d.ts +3 -1
- package/dist/stream/types.js +1 -1
- package/dist/types.d.ts +22 -1
- package/dist/types.js +1 -1
- package/dist/utils.d.ts +9 -10
- package/dist/utils.js +84 -59
- package/dist/wasm-source.d.ts +9 -8
- package/dist/wasm-source.js +1 -1
- package/dist/x25519/embedded.d.ts +1 -0
- package/dist/x25519/embedded.js +31 -0
- package/dist/x25519/index.d.ts +43 -0
- package/dist/x25519/index.js +159 -0
- package/dist/x25519/types.d.ts +25 -0
- package/dist/x25519/types.js +27 -0
- package/dist/x25519/validate.d.ts +2 -0
- package/dist/x25519/validate.js +39 -0
- package/package.json +123 -64
- package/SECURITY.md +0 -276
- package/dist/ct-wasm.d.ts +0 -1
- package/dist/ct-wasm.js +0 -3
- package/dist/ct.wasm +0 -0
- package/dist/docs/aead.md +0 -323
- package/dist/docs/architecture.md +0 -932
- package/dist/docs/argon2id.md +0 -302
- package/dist/docs/chacha20.md +0 -674
- package/dist/docs/exports.md +0 -241
- package/dist/docs/fortuna.md +0 -313
- package/dist/docs/init.md +0 -302
- package/dist/docs/loader.md +0 -161
- package/dist/docs/serpent.md +0 -519
- package/dist/docs/sha2.md +0 -613
- package/dist/docs/sha3.md +0 -546
- package/dist/docs/types.md +0 -276
- package/dist/docs/utils.md +0 -367
- package/dist/embedded/kyber.d.ts +0 -1
- package/dist/embedded/kyber.js +0 -3
- package/dist/kyber/embedded.d.ts +0 -1
- package/dist/kyber/indcpa.d.ts +0 -49
- package/dist/kyber/index.d.ts +0 -38
- package/dist/kyber/kem.d.ts +0 -21
- package/dist/kyber/suite.d.ts +0 -13
- package/dist/kyber/validate.d.ts +0 -19
package/dist/sha2/index.js
CHANGED
|
@@ -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
|
|
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';
|
package/dist/sha2/types.d.ts
CHANGED
|
@@ -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()
|
|
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,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
|
+
};
|
package/dist/sha3/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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';
|