leviathan-crypto 2.1.0 → 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 +86 -443
- package/README.md +198 -65
- 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.js +47 -25
- package/dist/chacha20/generator.d.ts +2 -2
- package/dist/chacha20/generator.js +4 -4
- package/dist/chacha20/index.d.ts +16 -15
- package/dist/chacha20/index.js +52 -46
- package/dist/chacha20/ops.d.ts +7 -7
- package/dist/chacha20/ops.js +34 -34
- package/dist/chacha20/pool-worker.js +5 -3
- package/dist/cte-wasm.d.ts +1 -0
- package/dist/cte-wasm.js +3 -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 -1
- package/dist/embedded/chacha20-pool-worker.js +2 -2
- 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 -1
- package/dist/embedded/serpent-pool-worker.js +2 -2
- 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 +5 -5
- package/dist/fortuna.js +37 -64
- package/dist/index.d.ts +38 -9
- package/dist/index.js +63 -19
- package/dist/init.d.ts +1 -1
- package/dist/init.js +11 -25
- 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 -24
- package/dist/loader.js +13 -16
- 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 +44 -44
- package/dist/mlkem/index.d.ts +37 -0
- package/dist/{kyber → mlkem}/index.js +24 -34
- package/dist/mlkem/kem.d.ts +21 -0
- package/dist/{kyber → mlkem}/kem.js +44 -64
- 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 +3 -3
- package/dist/{kyber → mlkem}/types.js +1 -1
- package/dist/{kyber → mlkem}/validate.d.ts +7 -7
- package/dist/{kyber → mlkem}/validate.js +7 -7
- package/dist/{kyber.wasm → mlkem.wasm} +0 -0
- package/dist/p256.wasm +0 -0
- package/dist/ratchet/index.d.ts +2 -0
- package/dist/ratchet/index.js +1 -0
- package/dist/ratchet/kdf-chain.js +3 -3
- package/dist/ratchet/ratchet-keypair.js +2 -2
- package/dist/ratchet/root-kdf.js +7 -7
- package/dist/ratchet/skipped-key-store.js +4 -4
- package/dist/ratchet/types.d.ts +1 -1
- package/dist/serpent/cipher-suite.js +20 -17
- package/dist/serpent/generator.d.ts +1 -1
- package/dist/serpent/generator.js +2 -2
- package/dist/serpent/index.d.ts +8 -7
- package/dist/serpent/index.js +18 -27
- package/dist/serpent/pool-worker.js +7 -5
- package/dist/serpent/serpent-cbc.d.ts +4 -4
- package/dist/serpent/serpent-cbc.js +11 -8
- package/dist/serpent/shared-ops.d.ts +3 -23
- package/dist/serpent/shared-ops.js +50 -85
- package/dist/serpent.wasm +0 -0
- package/dist/sha2/hkdf.js +5 -5
- package/dist/sha2/index.d.ts +21 -1
- package/dist/sha2/index.js +65 -10
- package/dist/sha2/types.d.ts +41 -2
- package/dist/sha2.wasm +0 -0
- package/dist/sha3/index.d.ts +72 -3
- package/dist/sha3/index.js +240 -14
- 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 +3 -3
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.js +1 -0
- package/dist/stream/open-stream.js +31 -10
- package/dist/stream/seal-stream-pool.d.ts +1 -0
- package/dist/stream/seal-stream-pool.js +63 -26
- package/dist/stream/seal-stream.d.ts +1 -1
- package/dist/stream/seal-stream.js +20 -9
- 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 +1 -1
- package/dist/types.js +1 -1
- package/dist/utils.d.ts +3 -3
- package/dist/utils.js +46 -54
- package/dist/wasm-source.d.ts +7 -7
- 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 +70 -26
- package/SECURITY.md +0 -163
- package/dist/ct-wasm.d.ts +0 -1
- package/dist/ct-wasm.js +0 -3
- package/dist/docs/aead.md +0 -363
- package/dist/docs/architecture.md +0 -1011
- package/dist/docs/argon2id.md +0 -305
- package/dist/docs/chacha20.md +0 -781
- package/dist/docs/exports.md +0 -277
- package/dist/docs/fortuna.md +0 -530
- package/dist/docs/init.md +0 -301
- package/dist/docs/loader.md +0 -256
- package/dist/docs/serpent.md +0 -617
- package/dist/docs/sha2.md +0 -671
- package/dist/docs/sha3.md +0 -612
- package/dist/docs/types.md +0 -416
- package/dist/docs/utils.md +0 -457
- 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 -12
- /package/dist/{ct.wasm → cte.wasm} +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
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/ed25519/index.ts
|
|
23
|
+
//
|
|
24
|
+
// Ed25519 public API. RFC 8032 §5.1 pure + §5.1.7 prehash. Strict
|
|
25
|
+
// verification per FIPS 186-5 §7.6.4. Ed25519 and X25519 share the
|
|
26
|
+
// curve25519 WASM module; `ed25519Init` and `x25519Init` both target it
|
|
27
|
+
// and de-dupe at the init() layer.
|
|
28
|
+
import { getInstance, initModule, isInitialized, _assertNotOwned } from '../init.js';
|
|
29
|
+
import { randomBytes, wipe } from '../utils.js';
|
|
30
|
+
import { SigningError } from '../errors.js';
|
|
31
|
+
import { validateSeed, validateSecretKey, validatePublicKey, validateMessage, validateSignature, validateContext, validateDigest, } from './validate.js';
|
|
32
|
+
/**
|
|
33
|
+
* Initialise the curve25519 WASM module under the `ed25519` alias.
|
|
34
|
+
* Equivalent to `x25519Init(source)`; both target the same WASM module
|
|
35
|
+
* and the init layer de-dupes when given identical sources.
|
|
36
|
+
*/
|
|
37
|
+
export async function ed25519Init(source) {
|
|
38
|
+
return initModule('curve25519', source);
|
|
39
|
+
}
|
|
40
|
+
export { isInitialized };
|
|
41
|
+
// ── I/O staging layout ─────────────────────────────────────────────────────
|
|
42
|
+
//
|
|
43
|
+
// The curve25519 module's own mutable buffer region ends at BUFFER_END
|
|
44
|
+
// = 7836 (see src/asm/curve25519/buffers.ts). The TS layer stages
|
|
45
|
+
// caller-supplied inputs and reads outputs from a fixed region above
|
|
46
|
+
// that. The module is allocated 2 pages (131072 bytes); the I/O region
|
|
47
|
+
// stretches from 8192 to the end of linear memory.
|
|
48
|
+
//
|
|
49
|
+
// The WASM functions read every input once at the start of execution
|
|
50
|
+
// before touching any of these slots, so co-locating sign's caller pk
|
|
51
|
+
// with the WASM's internal ED25519_PK_CHECK scratch slot is safe even
|
|
52
|
+
// though they are different addresses (pkOff is read before the WASM
|
|
53
|
+
// writes its own derived pk).
|
|
54
|
+
const IO_BASE = 8192;
|
|
55
|
+
const SEED_STAGE = IO_BASE; // 32 bytes
|
|
56
|
+
const PK_STAGE = IO_BASE + 32; // 32 bytes
|
|
57
|
+
const SIG_STAGE = IO_BASE + 64; // 64 bytes
|
|
58
|
+
const DIGEST_STAGE = IO_BASE + 128; // 64 bytes
|
|
59
|
+
const CTX_STAGE = IO_BASE + 192; // up to 255 bytes (round up to 256)
|
|
60
|
+
const MSG_STAGE = IO_BASE + 448; // remainder
|
|
61
|
+
function maxMsgLen(memory) {
|
|
62
|
+
return memory.buffer.byteLength - MSG_STAGE;
|
|
63
|
+
}
|
|
64
|
+
function ioWipe(mx) {
|
|
65
|
+
// Zero the entire TS-managed staging region. wipeBuffers covers
|
|
66
|
+
// MUTABLE_START..BUFFER_END only, the I/O region above lives outside
|
|
67
|
+
// that range and must be scrubbed by the wrapper.
|
|
68
|
+
new Uint8Array(mx.memory.buffer).fill(0, IO_BASE, mx.memory.buffer.byteLength);
|
|
69
|
+
}
|
|
70
|
+
function rethrowTrap(err, discriminator, message) {
|
|
71
|
+
// The WASM module's fault-injection check (sign's pk-mismatch path)
|
|
72
|
+
// terminates with `unreachable`, which surfaces as
|
|
73
|
+
// WebAssembly.RuntimeError. Re-throw any such trap as a typed
|
|
74
|
+
// SigningError so callers can branch on it.
|
|
75
|
+
if (err instanceof WebAssembly.RuntimeError)
|
|
76
|
+
throw new SigningError(discriminator, message);
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
export class Ed25519 {
|
|
80
|
+
constructor() {
|
|
81
|
+
if (!isInitialized('curve25519'))
|
|
82
|
+
throw new Error('leviathan-crypto: call init({ ed25519: ... }) before using Ed25519');
|
|
83
|
+
}
|
|
84
|
+
get mx() {
|
|
85
|
+
return getInstance('curve25519').exports;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Deterministic Ed25519 key generation, RFC 8032 §5.1.5.
|
|
89
|
+
* @param seed 32-byte secret seed
|
|
90
|
+
* @returns 32-byte verifying key and a fresh 32-byte secret-key copy
|
|
91
|
+
* of the supplied seed (the spec defines sk = seed).
|
|
92
|
+
*/
|
|
93
|
+
keygenDerand(seed) {
|
|
94
|
+
_assertNotOwned('curve25519');
|
|
95
|
+
validateSeed(seed);
|
|
96
|
+
const mx = this.mx;
|
|
97
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
98
|
+
mem.set(seed, SEED_STAGE);
|
|
99
|
+
try {
|
|
100
|
+
mx.ed25519Keygen(SEED_STAGE, PK_STAGE);
|
|
101
|
+
const publicKey = mem.slice(PK_STAGE, PK_STAGE + 32);
|
|
102
|
+
const secretKey = new Uint8Array(32);
|
|
103
|
+
secretKey.set(seed);
|
|
104
|
+
return { publicKey, secretKey };
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
ioWipe(mx);
|
|
108
|
+
mx.wipeBuffers();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Random Ed25519 key generation, wraps `keygenDerand` with `randomBytes(32)`. */
|
|
112
|
+
keygen() {
|
|
113
|
+
const seed = randomBytes(32);
|
|
114
|
+
try {
|
|
115
|
+
return this.keygenDerand(seed);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
wipe(seed);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Pure Ed25519 sign, RFC 8032 §5.1.6.
|
|
123
|
+
*
|
|
124
|
+
* The WASM re-derives pk from `sk` internally and compares it against
|
|
125
|
+
* the caller-supplied `pk`; a mismatch traps via `unreachable` and is
|
|
126
|
+
* rethrown as `SigningError('sig-ed25519-pk-mismatch')`. This defends
|
|
127
|
+
* against fault injection that bias the per-signature randomness
|
|
128
|
+
* derivation by forcing the caller to also know pk.
|
|
129
|
+
*/
|
|
130
|
+
sign(sk, pk, M) {
|
|
131
|
+
_assertNotOwned('curve25519');
|
|
132
|
+
validateSecretKey(sk);
|
|
133
|
+
validatePublicKey(pk);
|
|
134
|
+
validateMessage(M);
|
|
135
|
+
const mx = this.mx;
|
|
136
|
+
const cap = maxMsgLen(mx.memory);
|
|
137
|
+
if (M.length > cap)
|
|
138
|
+
throw new RangeError(`leviathan-crypto: ed25519 pure-mode message length ${M.length} exceeds the per-call `
|
|
139
|
+
+ `WASM input scratch (${cap} bytes); use Ed25519PreHashSuite or SignStream for larger payloads`);
|
|
140
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
141
|
+
mem.set(sk, SEED_STAGE);
|
|
142
|
+
mem.set(pk, PK_STAGE);
|
|
143
|
+
mem.set(M, MSG_STAGE);
|
|
144
|
+
try {
|
|
145
|
+
try {
|
|
146
|
+
mx.ed25519Sign(SEED_STAGE, PK_STAGE, MSG_STAGE, M.length, SIG_STAGE);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
rethrowTrap(err, 'sig-malformed-input', 'leviathan-crypto: ed25519 sign aborted, pk does not match the pk derived from sk '
|
|
150
|
+
+ '(likely fault injection or caller misuse)');
|
|
151
|
+
}
|
|
152
|
+
return mem.slice(SIG_STAGE, SIG_STAGE + 64);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
ioWipe(mx);
|
|
156
|
+
mx.wipeBuffers();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Ed25519ph sign, RFC 8032 §5.1.7 (prehash, dom2 phflag=1).
|
|
161
|
+
*
|
|
162
|
+
* Caller supplies the 64-byte SHA-512(M) digest; the library does not
|
|
163
|
+
* compute it. Same pk-mismatch fault-injection trap as `sign`.
|
|
164
|
+
*/
|
|
165
|
+
signPrehashed(sk, pk, digest, ctx) {
|
|
166
|
+
_assertNotOwned('curve25519');
|
|
167
|
+
validateSecretKey(sk);
|
|
168
|
+
validatePublicKey(pk);
|
|
169
|
+
validateDigest(digest);
|
|
170
|
+
validateContext(ctx);
|
|
171
|
+
const mx = this.mx;
|
|
172
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
173
|
+
mem.set(sk, SEED_STAGE);
|
|
174
|
+
mem.set(pk, PK_STAGE);
|
|
175
|
+
mem.set(digest, DIGEST_STAGE);
|
|
176
|
+
if (ctx.length > 0)
|
|
177
|
+
mem.set(ctx, CTX_STAGE);
|
|
178
|
+
try {
|
|
179
|
+
try {
|
|
180
|
+
mx.ed25519SignPrehashed(SEED_STAGE, PK_STAGE, DIGEST_STAGE, CTX_STAGE, ctx.length, SIG_STAGE);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
rethrowTrap(err, 'sig-malformed-input', 'leviathan-crypto: ed25519ph sign aborted, pk does not match the pk derived from sk '
|
|
184
|
+
+ '(likely fault injection or caller misuse)');
|
|
185
|
+
}
|
|
186
|
+
return mem.slice(SIG_STAGE, SIG_STAGE + 64);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
ioWipe(mx);
|
|
190
|
+
mx.wipeBuffers();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Suite-only: pure Ed25519 sign that derives pk internally and
|
|
195
|
+
* skips the fault-injection cross-check. See AGENTS.md
|
|
196
|
+
* "SignatureSuite lifecycle". Underscore-prefixed, not part of
|
|
197
|
+
* the public API.
|
|
198
|
+
*/
|
|
199
|
+
_signInternalPk(sk, M) {
|
|
200
|
+
_assertNotOwned('curve25519');
|
|
201
|
+
validateSecretKey(sk);
|
|
202
|
+
validateMessage(M);
|
|
203
|
+
const mx = this.mx;
|
|
204
|
+
const cap = maxMsgLen(mx.memory);
|
|
205
|
+
if (M.length > cap)
|
|
206
|
+
throw new RangeError(`leviathan-crypto: ed25519 message length ${M.length} exceeds the per-call `
|
|
207
|
+
+ `WASM input scratch (${cap} bytes); use Ed25519PreHashSuite or SignStream for larger payloads`);
|
|
208
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
209
|
+
mem.set(sk, SEED_STAGE);
|
|
210
|
+
mem.set(M, MSG_STAGE);
|
|
211
|
+
try {
|
|
212
|
+
mx.ed25519SignInternalPk(SEED_STAGE, MSG_STAGE, M.length, SIG_STAGE);
|
|
213
|
+
return mem.slice(SIG_STAGE, SIG_STAGE + 64);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
ioWipe(mx);
|
|
217
|
+
mx.wipeBuffers();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Suite-only: Ed25519ph mirror of `_signInternalPk`. See
|
|
222
|
+
* AGENTS.md "SignatureSuite lifecycle".
|
|
223
|
+
*/
|
|
224
|
+
_signPrehashedInternalPk(sk, digest, ctx) {
|
|
225
|
+
_assertNotOwned('curve25519');
|
|
226
|
+
validateSecretKey(sk);
|
|
227
|
+
validateDigest(digest);
|
|
228
|
+
validateContext(ctx);
|
|
229
|
+
const mx = this.mx;
|
|
230
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
231
|
+
mem.set(sk, SEED_STAGE);
|
|
232
|
+
mem.set(digest, DIGEST_STAGE);
|
|
233
|
+
if (ctx.length > 0)
|
|
234
|
+
mem.set(ctx, CTX_STAGE);
|
|
235
|
+
try {
|
|
236
|
+
mx.ed25519SignPrehashedInternalPk(SEED_STAGE, DIGEST_STAGE, CTX_STAGE, ctx.length, SIG_STAGE);
|
|
237
|
+
return mem.slice(SIG_STAGE, SIG_STAGE + 64);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
ioWipe(mx);
|
|
241
|
+
mx.wipeBuffers();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Strict pure Ed25519 verify, RFC 8032 §5.1.7 / FIPS 186-5 §7.6.4.
|
|
246
|
+
*
|
|
247
|
+
* Returns `true` on success, `false` on every signature failure mode:
|
|
248
|
+
* off-curve pk, non-canonical R, non-canonical S (>= L), small-order
|
|
249
|
+
* pk, or signature equation inequality. Throws only on caller-side
|
|
250
|
+
* contract violations (wrong-length pk / M / sig).
|
|
251
|
+
*/
|
|
252
|
+
verify(pk, M, sig) {
|
|
253
|
+
_assertNotOwned('curve25519');
|
|
254
|
+
validatePublicKey(pk);
|
|
255
|
+
validateMessage(M);
|
|
256
|
+
validateSignature(sig);
|
|
257
|
+
const mx = this.mx;
|
|
258
|
+
const cap = maxMsgLen(mx.memory);
|
|
259
|
+
if (M.length > cap)
|
|
260
|
+
throw new RangeError(`leviathan-crypto: ed25519 pure-mode message length ${M.length} exceeds the per-call `
|
|
261
|
+
+ `WASM input scratch (${cap} bytes); use Ed25519PreHashSuite or SignStream for larger payloads`);
|
|
262
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
263
|
+
mem.set(pk, PK_STAGE);
|
|
264
|
+
mem.set(sig, SIG_STAGE);
|
|
265
|
+
mem.set(M, MSG_STAGE);
|
|
266
|
+
try {
|
|
267
|
+
return mx.ed25519Verify(PK_STAGE, MSG_STAGE, M.length, SIG_STAGE) === 1;
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
ioWipe(mx);
|
|
271
|
+
mx.wipeBuffers();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Strict Ed25519ph verify, RFC 8032 §5.1.7 prehash. Same rejection
|
|
276
|
+
* conditions as {@link verify} plus the dom2(F=1, ctx) prefix on the
|
|
277
|
+
* per-spec SHA-512 inputs (handled inside the WASM).
|
|
278
|
+
*/
|
|
279
|
+
verifyPrehashed(pk, digest, ctx, sig) {
|
|
280
|
+
_assertNotOwned('curve25519');
|
|
281
|
+
validatePublicKey(pk);
|
|
282
|
+
validateDigest(digest);
|
|
283
|
+
validateContext(ctx);
|
|
284
|
+
validateSignature(sig);
|
|
285
|
+
const mx = this.mx;
|
|
286
|
+
const mem = new Uint8Array(mx.memory.buffer);
|
|
287
|
+
mem.set(pk, PK_STAGE);
|
|
288
|
+
mem.set(digest, DIGEST_STAGE);
|
|
289
|
+
mem.set(sig, SIG_STAGE);
|
|
290
|
+
if (ctx.length > 0)
|
|
291
|
+
mem.set(ctx, CTX_STAGE);
|
|
292
|
+
try {
|
|
293
|
+
return mx.ed25519VerifyPrehashed(PK_STAGE, DIGEST_STAGE, CTX_STAGE, ctx.length, SIG_STAGE) === 1;
|
|
294
|
+
}
|
|
295
|
+
finally {
|
|
296
|
+
ioWipe(mx);
|
|
297
|
+
mx.wipeBuffers();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
dispose() {
|
|
301
|
+
// Idempotent; per-method wipe runs anyway.
|
|
302
|
+
try {
|
|
303
|
+
this.mx.wipeBuffers();
|
|
304
|
+
ioWipe(this.mx);
|
|
305
|
+
}
|
|
306
|
+
catch { /* idempotent */ }
|
|
307
|
+
}
|
|
308
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Ed25519KeyPair {
|
|
2
|
+
/** 32-byte verifying key, encoded per RFC 8032 §5.1.2 (compressed y || x sign). */
|
|
3
|
+
publicKey: Uint8Array;
|
|
4
|
+
/** 32-byte secret seed, the RFC 8032 §5.1.5 input. */
|
|
5
|
+
secretKey: Uint8Array;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The Ed25519-relevant subset of the curve25519 WASM exports.
|
|
9
|
+
*
|
|
10
|
+
* The curve25519 module is shared between Ed25519 and X25519; this
|
|
11
|
+
* interface deliberately surfaces only the Ed25519 high-level entry
|
|
12
|
+
* points plus the layout / wipe primitives. The X25519 wrapper consumes
|
|
13
|
+
* a separate `X25519Exports` view over the same instance.
|
|
14
|
+
*/
|
|
15
|
+
export interface Ed25519Exports {
|
|
16
|
+
memory: WebAssembly.Memory;
|
|
17
|
+
getModuleId: () => number;
|
|
18
|
+
getMemoryPages: () => number;
|
|
19
|
+
ed25519Keygen: (seedOff: number, pkOff: number) => void;
|
|
20
|
+
ed25519Sign: (seedOff: number, pkOff: number, msgOff: number, msgLen: number, sigOff: number) => void;
|
|
21
|
+
ed25519Verify: (pkOff: number, msgOff: number, msgLen: number, sigOff: number) => number;
|
|
22
|
+
ed25519SignPrehashed: (seedOff: number, pkOff: number, digestOff: number, ctxOff: number, ctxLen: number, sigOff: number) => void;
|
|
23
|
+
ed25519VerifyPrehashed: (pkOff: number, digestOff: number, ctxOff: number, ctxLen: number, sigOff: number) => number;
|
|
24
|
+
ed25519SignInternalPk: (seedOff: number, msgOff: number, msgLen: number, sigOff: number) => void;
|
|
25
|
+
ed25519SignPrehashedInternalPk: (seedOff: number, digestOff: number, ctxOff: number, ctxLen: number, sigOff: number) => void;
|
|
26
|
+
wipeBuffers: () => void;
|
|
27
|
+
}
|
|
@@ -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/ed25519/types.ts
|
|
23
|
+
//
|
|
24
|
+
// Ed25519 type surface: the WASM export interface for the curve25519
|
|
25
|
+
// module (Ed25519-relevant subset) and the public key-pair shape returned
|
|
26
|
+
// by keygen / keygenDerand. RFC 8032 §5.1.
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function validateSeed(seed: Uint8Array): void;
|
|
2
|
+
export declare function validateSecretKey(sk: Uint8Array): void;
|
|
3
|
+
export declare function validatePublicKey(pk: Uint8Array): void;
|
|
4
|
+
export declare function validateMessage(M: Uint8Array): void;
|
|
5
|
+
export declare function validateSignature(sig: Uint8Array): void;
|
|
6
|
+
export declare function validateContext(ctx: Uint8Array): void;
|
|
7
|
+
export declare function validateDigest(digest: Uint8Array): void;
|
|
@@ -0,0 +1,77 @@
|
|
|
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/ed25519/validate.ts
|
|
23
|
+
//
|
|
24
|
+
// Ed25519 caller-side input validation. Pure length / type checks; curve
|
|
25
|
+
// membership, canonical-encoding rejection, and the fault-injection
|
|
26
|
+
// pk-mismatch trap all live inside the WASM layer.
|
|
27
|
+
//
|
|
28
|
+
// TypeError for non-Uint8Array, RangeError for wrong-length. Matches
|
|
29
|
+
// the mldsa / mlkem validation conventions.
|
|
30
|
+
export function validateSeed(seed) {
|
|
31
|
+
if (!(seed instanceof Uint8Array))
|
|
32
|
+
throw new TypeError('leviathan-crypto: ed25519 seed must be a Uint8Array');
|
|
33
|
+
if (seed.length !== 32)
|
|
34
|
+
throw new RangeError(`leviathan-crypto: ed25519 seed must be 32 bytes (got ${seed.length})`);
|
|
35
|
+
}
|
|
36
|
+
export function validateSecretKey(sk) {
|
|
37
|
+
// Ed25519 sk IS the seed per RFC 8032 §5.1.5.
|
|
38
|
+
if (!(sk instanceof Uint8Array))
|
|
39
|
+
throw new TypeError('leviathan-crypto: ed25519 secret key must be a Uint8Array');
|
|
40
|
+
if (sk.length !== 32)
|
|
41
|
+
throw new RangeError(`leviathan-crypto: ed25519 secret key must be 32 bytes (got ${sk.length})`);
|
|
42
|
+
}
|
|
43
|
+
export function validatePublicKey(pk) {
|
|
44
|
+
// Length-only at this layer; on-curve / canonical-y checks happen in
|
|
45
|
+
// edPointDecompress (verify) or via the fault-injection pk-mismatch
|
|
46
|
+
// trap (sign).
|
|
47
|
+
if (!(pk instanceof Uint8Array))
|
|
48
|
+
throw new TypeError('leviathan-crypto: ed25519 public key must be a Uint8Array');
|
|
49
|
+
if (pk.length !== 32)
|
|
50
|
+
throw new RangeError(`leviathan-crypto: ed25519 public key must be 32 bytes (got ${pk.length})`);
|
|
51
|
+
}
|
|
52
|
+
export function validateMessage(M) {
|
|
53
|
+
if (!(M instanceof Uint8Array))
|
|
54
|
+
throw new TypeError('leviathan-crypto: ed25519 message must be a Uint8Array');
|
|
55
|
+
// RFC 8032 places no upper bound on the message length; the WASM
|
|
56
|
+
// staging region imposes its own per-call ceiling enforced in the
|
|
57
|
+
// caller (Ed25519.sign / verify).
|
|
58
|
+
}
|
|
59
|
+
export function validateSignature(sig) {
|
|
60
|
+
if (!(sig instanceof Uint8Array))
|
|
61
|
+
throw new TypeError('leviathan-crypto: ed25519 signature must be a Uint8Array');
|
|
62
|
+
if (sig.length !== 64)
|
|
63
|
+
throw new RangeError(`leviathan-crypto: ed25519 signature must be 64 bytes (got ${sig.length})`);
|
|
64
|
+
}
|
|
65
|
+
export function validateContext(ctx) {
|
|
66
|
+
if (!(ctx instanceof Uint8Array))
|
|
67
|
+
throw new TypeError('leviathan-crypto: ed25519 context must be a Uint8Array');
|
|
68
|
+
// RFC 8032 §5.1 encodes |C| in a single octet, so 255 is the spec ceiling.
|
|
69
|
+
if (ctx.length > 255)
|
|
70
|
+
throw new RangeError(`leviathan-crypto: ed25519 context must be <= 255 bytes (got ${ctx.length})`);
|
|
71
|
+
}
|
|
72
|
+
export function validateDigest(digest) {
|
|
73
|
+
if (!(digest instanceof Uint8Array))
|
|
74
|
+
throw new TypeError('leviathan-crypto: ed25519 prehash digest must be a Uint8Array');
|
|
75
|
+
if (digest.length !== 64)
|
|
76
|
+
throw new RangeError(`leviathan-crypto: ed25519 prehash digest must be 64 bytes (got ${digest.length})`);
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WORKER_SOURCE = "\"use strict\";(()=>{var w=new Uint8Array([0,97,115,109,1,0,0,0,1,8,1,96,3,127,127,127,1,127,3,2,1,0,5,4,1,1,1,1,7,20,2,7,99,111,109,112,97,114,101,0,0,6,109,101,109,111,114,121,2,0,10,133,1,1,130,1,3,2,127,1,126,1,123,3,64,32,3,65,16,106,34,4,32,2,76,4,64,32,6,32,0,32,3,106,253,0,4,0,32,1,32,3,106,253,0,4,0,253,81,253,80,33,6,32,4,33,3,12,1,11,11,3,64,32,2,32,3,74,4,64,32,5,32,0,32,3,106,49,0,0,32,1,32,3,106,49,0,0,133,132,33,5,32,3,65,1,106,33,3,12,1,11,11,66,0,32,5,32,6,253,29,0,32,6,253,29,1,132,132,34,5,125,32,5,132,66,63,135,66,127,133,167,65,1,113,11]);var S=null,M=null,T=null,O=!1,A=null,v=32768;function I(){if(O){if(A)throw A;return}if(O=!0,!R())throw A=new Error(\"leviathan-crypto: constantTimeEqual requires WebAssembly SIMD, this runtime does not support it\"),A;try{let e=w.buffer.slice(w.byteOffset,w.byteOffset+w.byteLength),t=new WebAssembly.Module(e),n=new WebAssembly.Instance(t).exports;M=n.memory,T=new Uint8Array(M.buffer),S=n.compare}catch(e){throw A=new Error(`leviathan-crypto: cte WASM module failed to instantiate: ${e.message}`),A}}var x=(e,t)=>{if(e.length!==t.length)return!1;if(e.length>v)throw new RangeError(`constantTimeEqual: max ${v} bytes (got ${e.length})`);I();let r=T,n=S;if(!r||!n)throw new Error(\"leviathan-crypto: cte init invariant violated\");r.set(e,0),r.set(t,e.length);try{return n(0,e.length,e.length)===1}finally{r.fill(0,0,v*2)}};var C=e=>{e.fill(0)};var h=null;function R(){if(h!==null)return h;if(typeof WebAssembly>\"u\"||typeof WebAssembly.validate!=\"function\")return h=!1,h;try{h=WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}catch{h=!1}return h}var m=class e extends Error{constructor(t){super(`${t}: authentication failed`),this.name=\"AuthenticationError\",Object.setPrototypeOf(this,e.prototype)}};var d=32,b=12,E=16,U=65536;function $(e,t,r,n,s){if(t.length!==d)throw new RangeError(`AES-GCM-SIV: key must be ${d} bytes (got ${t.length})`);if(r.length!==b)throw new RangeError(`AES-GCM-SIV: nonce must be ${b} bytes (got ${r.length})`);let o=e.getChunkSize();if(n.length>o)throw new RangeError(`AES-GCM-SIV: plaintext exceeds ${o} bytes, split into smaller chunks`);if(s.length>U)throw new RangeError(`AES-GCM-SIV: AAD must be \\u2264 ${U} bytes (got ${s.length})`);let f=new Uint8Array(e.memory.buffer);if(f.set(t,e.getKeyOffset()),e.loadKey(d)!==0)throw e.wipeBuffers(),new Error(\"AES-GCM-SIV: loadKey failed\");f.set(r,e.getNonceOffset()),s.length>0&&f.set(s,e.getAadOffset()),f.set(n,e.getChunkPtOffset()),e.sivDeriveKeys(e.getNonceOffset()),e.sivSeal(s.length,n.length);let y=e.getChunkPtOffset(),a=e.getTagOffset(),i=new Uint8Array(e.memory.buffer),u=i.slice(y,y+n.length),l=i.slice(a,a+E);return{ciphertext:u,tag:l}}function B(e,t,r,n,s,o,f=\"aes-gcm-siv\"){if(t.length!==d)throw new RangeError(`AES-GCM-SIV: key must be ${d} bytes (got ${t.length})`);if(r.length!==b)throw new RangeError(`AES-GCM-SIV: nonce must be ${b} bytes (got ${r.length})`);if(s.length!==E)throw new RangeError(`AES-GCM-SIV: tag must be ${E} bytes (got ${s.length})`);let y=e.getChunkSize();if(n.length>y)throw new RangeError(`AES-GCM-SIV: ciphertext exceeds ${y} bytes, split into smaller chunks`);if(o.length>U)throw new RangeError(`AES-GCM-SIV: AAD must be \\u2264 ${U} bytes (got ${o.length})`);let a=new Uint8Array(e.memory.buffer);if(a.set(t,e.getKeyOffset()),e.loadKey(d)!==0)throw e.wipeBuffers(),new Error(\"AES-GCM-SIV: loadKey failed\");a.set(r,e.getNonceOffset()),o.length>0&&a.set(o,e.getAadOffset()),a.set(n,e.getChunkCtOffset()),a.set(s,e.getSivIcOffset()),e.sivDeriveKeys(e.getNonceOffset()),e.sivOpen(o.length,n.length);let i=new Uint8Array(e.memory.buffer),u=i.slice(e.getTagOffset(),e.getTagOffset()+E),l=new Uint8Array(s);if(!x(u,l))throw e.sivWipeOnFail(),C(u),C(l),new m(f);let p=e.getChunkPtOffset();return i.slice(p,p+n.length)}var c,g;self.onmessage=async e=>{let t=e.data;if(t.type===\"init\"){try{let r=new WebAssembly.Memory({initial:4,maximum:4}),n=t.modules.aes;if(c=(await WebAssembly.instantiate(n,{env:{memory:r}})).exports,g=new Uint8Array(t.derivedKeyBytes),g.length!==32)throw new Error(`expected 32 derived key bytes (got ${g.length})`);t.derivedKeyBytes.fill(0),self.postMessage({type:\"ready\"})}catch(r){t.derivedKeyBytes&&t.derivedKeyBytes.fill(0),self.postMessage({type:\"error\",id:-1,message:r.message,isAuthError:!1})}return}if(t.type===\"wipe\"){g&&g.fill(0),g=void 0,c&&c.wipeBuffers(),c=void 0,self.postMessage({type:\"wiped\"});return}if(!c||!g){self.postMessage({type:\"error\",id:t.id,message:\"worker not initialized\",isAuthError:!1});return}try{let{id:r,op:n,counterNonce:s,data:o,aad:f}=t,y=f??new Uint8Array(0),a=t.derivedKeyBytes??g,i;if(n===\"seal\"){let{ciphertext:l,tag:p}=$(c,a,s,o,y);i=new Uint8Array(l.length+16),i.set(l),i.set(p,l.length)}else{let l=o.subarray(0,o.length-16),p=o.subarray(o.length-16);i=B(c,a,s,l,p,y,\"aes-gcm-siv\")}let u=i.buffer instanceof ArrayBuffer?[i.buffer]:[];self.postMessage({type:\"result\",id:r,data:i},{transfer:u})}catch(r){let n=r instanceof m;self.postMessage({type:\"error\",id:t.id,message:r.message,cipher:n?\"aes-gcm-siv\":void 0,isAuthError:n})}finally{t.derivedKeyBytes&&t.derivedKeyBytes.fill(0),c&&c.wipeBuffers()}};})();\n";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Generated by scripts/embed-workers.ts, do not edit
|
|
2
|
+
// IIFE-bundled pool worker source. Spawned via blob URL by
|
|
3
|
+
// the cipher-suite.ts createPoolWorker; consumers do not
|
|
4
|
+
// import this directly.
|
|
5
|
+
export const WORKER_SOURCE = "\"use strict\";(()=>{var w=new Uint8Array([0,97,115,109,1,0,0,0,1,8,1,96,3,127,127,127,1,127,3,2,1,0,5,4,1,1,1,1,7,20,2,7,99,111,109,112,97,114,101,0,0,6,109,101,109,111,114,121,2,0,10,133,1,1,130,1,3,2,127,1,126,1,123,3,64,32,3,65,16,106,34,4,32,2,76,4,64,32,6,32,0,32,3,106,253,0,4,0,32,1,32,3,106,253,0,4,0,253,81,253,80,33,6,32,4,33,3,12,1,11,11,3,64,32,2,32,3,74,4,64,32,5,32,0,32,3,106,49,0,0,32,1,32,3,106,49,0,0,133,132,33,5,32,3,65,1,106,33,3,12,1,11,11,66,0,32,5,32,6,253,29,0,32,6,253,29,1,132,132,34,5,125,32,5,132,66,63,135,66,127,133,167,65,1,113,11]);var S=null,M=null,T=null,O=!1,A=null,v=32768;function I(){if(O){if(A)throw A;return}if(O=!0,!R())throw A=new Error(\"leviathan-crypto: constantTimeEqual requires WebAssembly SIMD, this runtime does not support it\"),A;try{let e=w.buffer.slice(w.byteOffset,w.byteOffset+w.byteLength),t=new WebAssembly.Module(e),n=new WebAssembly.Instance(t).exports;M=n.memory,T=new Uint8Array(M.buffer),S=n.compare}catch(e){throw A=new Error(`leviathan-crypto: cte WASM module failed to instantiate: ${e.message}`),A}}var x=(e,t)=>{if(e.length!==t.length)return!1;if(e.length>v)throw new RangeError(`constantTimeEqual: max ${v} bytes (got ${e.length})`);I();let r=T,n=S;if(!r||!n)throw new Error(\"leviathan-crypto: cte init invariant violated\");r.set(e,0),r.set(t,e.length);try{return n(0,e.length,e.length)===1}finally{r.fill(0,0,v*2)}};var C=e=>{e.fill(0)};var h=null;function R(){if(h!==null)return h;if(typeof WebAssembly>\"u\"||typeof WebAssembly.validate!=\"function\")return h=!1,h;try{h=WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}catch{h=!1}return h}var m=class e extends Error{constructor(t){super(`${t}: authentication failed`),this.name=\"AuthenticationError\",Object.setPrototypeOf(this,e.prototype)}};var d=32,b=12,E=16,U=65536;function $(e,t,r,n,s){if(t.length!==d)throw new RangeError(`AES-GCM-SIV: key must be ${d} bytes (got ${t.length})`);if(r.length!==b)throw new RangeError(`AES-GCM-SIV: nonce must be ${b} bytes (got ${r.length})`);let o=e.getChunkSize();if(n.length>o)throw new RangeError(`AES-GCM-SIV: plaintext exceeds ${o} bytes, split into smaller chunks`);if(s.length>U)throw new RangeError(`AES-GCM-SIV: AAD must be \\u2264 ${U} bytes (got ${s.length})`);let f=new Uint8Array(e.memory.buffer);if(f.set(t,e.getKeyOffset()),e.loadKey(d)!==0)throw e.wipeBuffers(),new Error(\"AES-GCM-SIV: loadKey failed\");f.set(r,e.getNonceOffset()),s.length>0&&f.set(s,e.getAadOffset()),f.set(n,e.getChunkPtOffset()),e.sivDeriveKeys(e.getNonceOffset()),e.sivSeal(s.length,n.length);let y=e.getChunkPtOffset(),a=e.getTagOffset(),i=new Uint8Array(e.memory.buffer),u=i.slice(y,y+n.length),l=i.slice(a,a+E);return{ciphertext:u,tag:l}}function B(e,t,r,n,s,o,f=\"aes-gcm-siv\"){if(t.length!==d)throw new RangeError(`AES-GCM-SIV: key must be ${d} bytes (got ${t.length})`);if(r.length!==b)throw new RangeError(`AES-GCM-SIV: nonce must be ${b} bytes (got ${r.length})`);if(s.length!==E)throw new RangeError(`AES-GCM-SIV: tag must be ${E} bytes (got ${s.length})`);let y=e.getChunkSize();if(n.length>y)throw new RangeError(`AES-GCM-SIV: ciphertext exceeds ${y} bytes, split into smaller chunks`);if(o.length>U)throw new RangeError(`AES-GCM-SIV: AAD must be \\u2264 ${U} bytes (got ${o.length})`);let a=new Uint8Array(e.memory.buffer);if(a.set(t,e.getKeyOffset()),e.loadKey(d)!==0)throw e.wipeBuffers(),new Error(\"AES-GCM-SIV: loadKey failed\");a.set(r,e.getNonceOffset()),o.length>0&&a.set(o,e.getAadOffset()),a.set(n,e.getChunkCtOffset()),a.set(s,e.getSivIcOffset()),e.sivDeriveKeys(e.getNonceOffset()),e.sivOpen(o.length,n.length);let i=new Uint8Array(e.memory.buffer),u=i.slice(e.getTagOffset(),e.getTagOffset()+E),l=new Uint8Array(s);if(!x(u,l))throw e.sivWipeOnFail(),C(u),C(l),new m(f);let p=e.getChunkPtOffset();return i.slice(p,p+n.length)}var c,g;self.onmessage=async e=>{let t=e.data;if(t.type===\"init\"){try{let r=new WebAssembly.Memory({initial:4,maximum:4}),n=t.modules.aes;if(c=(await WebAssembly.instantiate(n,{env:{memory:r}})).exports,g=new Uint8Array(t.derivedKeyBytes),g.length!==32)throw new Error(`expected 32 derived key bytes (got ${g.length})`);t.derivedKeyBytes.fill(0),self.postMessage({type:\"ready\"})}catch(r){t.derivedKeyBytes&&t.derivedKeyBytes.fill(0),self.postMessage({type:\"error\",id:-1,message:r.message,isAuthError:!1})}return}if(t.type===\"wipe\"){g&&g.fill(0),g=void 0,c&&c.wipeBuffers(),c=void 0,self.postMessage({type:\"wiped\"});return}if(!c||!g){self.postMessage({type:\"error\",id:t.id,message:\"worker not initialized\",isAuthError:!1});return}try{let{id:r,op:n,counterNonce:s,data:o,aad:f}=t,y=f??new Uint8Array(0),a=t.derivedKeyBytes??g,i;if(n===\"seal\"){let{ciphertext:l,tag:p}=$(c,a,s,o,y);i=new Uint8Array(l.length+16),i.set(l),i.set(p,l.length)}else{let l=o.subarray(0,o.length-16),p=o.subarray(o.length-16);i=B(c,a,s,l,p,y,\"aes-gcm-siv\")}let u=i.buffer instanceof ArrayBuffer?[i.buffer]:[];self.postMessage({type:\"result\",id:r,data:i},{transfer:u})}catch(r){let n=r instanceof m;self.postMessage({type:\"error\",id:t.id,message:r.message,cipher:n?\"aes-gcm-siv\":void 0,isAuthError:n})}finally{t.derivedKeyBytes&&t.derivedKeyBytes.fill(0),c&&c.wipeBuffers()}};})();\n";
|
|
@@ -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 @@
|
|
|
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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';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const WORKER_SOURCE = "\"use strict\";(()=>{var U=new Uint8Array([0,97,115,109,1,0,0,0,1,8,1,96,3,127,127,127,1,127,3,2,1,0,5,4,1,1,1,1,7,20,2,7,99,111,109,112,97,114,101,0,0,6,109,101,109,111,114,121,2,0,10,133,1,1,130,1,3,2,127,1,126,1,123,3,64,32,3,65,16,106,34,4,32,2,76,4,64,32,6,32,0,32,3,106,253,0,4,0,32,1,32,3,106,253,0,4,0,253,81,253,80,33,6,32,4,33,3,12,1,11,11,3,64,32,2,32,3,74,4,64,32,5,32,0,32,3,106,49,0,0,32,1,32,3,106,49,0,0,133,132,33,5,32,3,65,1,106,33,3,12,1,11,11,66,0,32,5,32,6,253,29,0,32,6,253,29,1,132,132,34,5,125,32,5,132,66,63,135,66,127,133,167,65,1,113,11]);var v=null,
|
|
1
|
+
export declare const WORKER_SOURCE = "\"use strict\";(()=>{var U=new Uint8Array([0,97,115,109,1,0,0,0,1,8,1,96,3,127,127,127,1,127,3,2,1,0,5,4,1,1,1,1,7,20,2,7,99,111,109,112,97,114,101,0,0,6,109,101,109,111,114,121,2,0,10,133,1,1,130,1,3,2,127,1,126,1,123,3,64,32,3,65,16,106,34,4,32,2,76,4,64,32,6,32,0,32,3,106,253,0,4,0,32,1,32,3,106,253,0,4,0,253,81,253,80,33,6,32,4,33,3,12,1,11,11,3,64,32,2,32,3,74,4,64,32,5,32,0,32,3,106,49,0,0,32,1,32,3,106,49,0,0,133,132,33,5,32,3,65,1,106,33,3,12,1,11,11,66,0,32,5,32,6,253,29,0,32,6,253,29,1,132,132,34,5,125,32,5,132,66,63,135,66,127,133,167,65,1,113,11]);var k=null,v=null,M=null,T=!1,A=null,w=32768;function S(){if(T){if(A)throw A;return}if(T=!0,!x())throw A=new Error(\"leviathan-crypto: constantTimeEqual requires WebAssembly SIMD, this runtime does not support it\"),A;try{let t=U.buffer.slice(U.byteOffset,U.byteOffset+U.byteLength),r=new WebAssembly.Module(t),e=new WebAssembly.Instance(r).exports;v=e.memory,M=new Uint8Array(v.buffer),k=e.compare}catch(t){throw A=new Error(`leviathan-crypto: cte WASM module failed to instantiate: ${t.message}`),A}}var B=(t,r)=>{if(t.length!==r.length)return!1;if(t.length>w)throw new RangeError(`constantTimeEqual: max ${w} bytes (got ${t.length})`);S();let n=M,e=k;if(!n||!e)throw new Error(\"leviathan-crypto: cte init invariant violated\");n.set(t,0),n.set(r,t.length);try{return e(0,t.length,t.length)===1}finally{n.fill(0,0,w*2)}};var m=null;function x(){if(m!==null)return m;if(typeof WebAssembly>\"u\"||typeof WebAssembly.validate!=\"function\")return m=!1,m;try{m=WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}catch{m=!1}return m}var d=class t extends Error{constructor(r){super(`${r}: authentication failed`),this.name=\"AuthenticationError\",Object.setPrototypeOf(this,t.prototype)}};function l(t,r){if(r.length===0)return;let n=new Uint8Array(t.memory.buffer),e=t.getPolyMsgOffset(),s=0;for(;s<r.length;){let o=Math.min(64,r.length-s);n.set(r.subarray(s,s+o),e),t.polyUpdate(o),s+=o}}function K(t,r){let n=new Uint8Array(16),e=new DataView(n.buffer);return e.setUint32(0,t>>>0,!0),e.setUint32(4,Math.floor(t/4294967296)>>>0,!0),e.setUint32(8,r>>>0,!0),e.setUint32(12,Math.floor(r/4294967296)>>>0,!0),n}function P(t,r,n,e,s){let o=t.getChunkSize();if(e.length>o)throw new RangeError(`plaintext exceeds ${o} bytes, split into smaller chunks`);let u=new Uint8Array(t.memory.buffer);u.set(r,t.getKeyOffset()),u.set(n,t.getChachaNonceOffset()),t.chachaLoadKey(),t.chachaGenPolyKey(),t.polyInit(),l(t,s);let y=(16-s.length%16)%16;y>0&&l(t,new Uint8Array(y)),t.chachaSetCounter(1),u.set(e,t.getChunkPtOffset()),t.chachaEncryptChunk_simd(e.length);let i=t.getChunkCtOffset(),a=new Uint8Array(t.memory.buffer).slice(i,i+e.length);l(t,a);let p=(16-e.length%16)%16;p>0&&l(t,new Uint8Array(p)),l(t,K(s.length,e.length)),t.polyFinal();let c=t.getPolyTagOffset(),g=new Uint8Array(t.memory.buffer).slice(c,c+16);return{ciphertext:a,tag:g}}function W(t,r,n,e,s,o,u=\"chacha20-poly1305\"){let y=t.getChunkSize();if(e.length>y)throw new RangeError(`ciphertext exceeds ${y} bytes, split into smaller chunks`);let i=new Uint8Array(t.memory.buffer);i.set(r,t.getKeyOffset()),i.set(n,t.getChachaNonceOffset()),t.chachaLoadKey(),t.chachaGenPolyKey(),t.polyInit(),l(t,o);let a=(16-o.length%16)%16;a>0&&l(t,new Uint8Array(a)),l(t,e);let p=(16-e.length%16)%16;p>0&&l(t,new Uint8Array(p)),l(t,K(o.length,e.length)),t.polyFinal();let c=t.getPolyTagOffset(),g=new Uint8Array(t.memory.buffer).slice(c,c+16);if(!B(g,s)){let C=t.getChunkCtOffset();i.fill(0,C,C+y);let E=t.getChachaBlockOffset();i.fill(0,E,E+64);let O=t.getPolyKeyOffset();throw i.fill(0,O,O+32),new d(u)}t.chachaSetCounter(1),t.chachaLoadKey(),new Uint8Array(t.memory.buffer).set(e,t.getChunkPtOffset()),t.chachaEncryptChunk_simd(e.length);let b=t.getChunkCtOffset();return new Uint8Array(t.memory.buffer).slice(b,b+e.length)}var f,h;self.onmessage=async t=>{let r=t.data;if(r.type===\"init\"){try{let n=new WebAssembly.Memory({initial:3,maximum:3}),e=r.modules.chacha20;if(f=(await WebAssembly.instantiate(e,{env:{memory:n}})).exports,h=new Uint8Array(r.derivedKeyBytes),h.length!==32)throw new Error(`expected 32 derived key bytes (got ${h.length})`);r.derivedKeyBytes.fill(0),self.postMessage({type:\"ready\"})}catch(n){r.derivedKeyBytes&&r.derivedKeyBytes.fill(0),self.postMessage({type:\"error\",id:-1,message:n.message,isAuthError:!1})}return}if(r.type===\"wipe\"){h&&h.fill(0),h=void 0,f&&f.wipeBuffers(),f=void 0,self.postMessage({type:\"wiped\"});return}if(!f||!h){self.postMessage({type:\"error\",id:r.id,message:\"worker not initialized\",isAuthError:!1});return}try{let{id:n,op:e,counterNonce:s,data:o,aad:u}=r,y=u??new Uint8Array(0),i=r.derivedKeyBytes??h,a;if(e===\"seal\"){let{ciphertext:c,tag:g}=P(f,i,s,o,y);a=new Uint8Array(c.length+16),a.set(c),a.set(g,c.length)}else{let c=o.subarray(0,o.length-16),g=o.subarray(o.length-16);a=W(f,i,s,c,g,y,\"xchacha20-poly1305\")}let p=a.buffer instanceof ArrayBuffer?[a.buffer]:[];self.postMessage({type:\"result\",id:n,data:a},{transfer:p})}catch(n){let e=n instanceof d;self.postMessage({type:\"error\",id:r.id,message:n.message,cipher:e?\"xchacha20-poly1305\":void 0,isAuthError:e})}finally{r.derivedKeyBytes&&r.derivedKeyBytes.fill(0),f&&f.wipeBuffers()}};})();\n";
|