hsynchronous
Version:
Hybrid synchronous encryption protocol using NIST approved post-quantum algorithms.
142 lines (97 loc) • 7.12 kB
Markdown
Hybrid synchronous encryption protocol using NIST approved post-quantum algorithms.
```ts
import { encrypt, decrypt, generateKeys } from "./src";
const key = generateKeys();
const message = "The quick brown fox jumps over the lazy dog";
const encrypted = await encrypt(message, key);
const decrypted = await decrypt(encrypted, key);
console.log(decrypted)
// {
// message: "The quick brown fox jumps over the lazy dog",
// createdAt: 2025-06-30T15:14:33.663Z,
// decryptedAt: 2025-06-30T15:14:33.719Z,
// nonce: "3e4bc82b144728126bb0145d678f7a3153..."
// }
```
Component | Algorithm/Strength | Security Level | Notes
----------------------------|-------------------------------|---------------------------------------|-----------------------------------------------------------------
Key Encapsulation (KEM) | ML-KEM-1024 (Kyber) | NIST Level 3 (PQC Standard) | Post-quantum secure, IND-CCA2
Digital Signature | Falcon-1024 | NIST Level 3 (PQC Standard) | Post-quantum secure, EUF-CMA
Symmetric Encryption | AES-256-GCM | 256-bit (NIST-approved) | Quantum-resistant key size, provides confidentiality + integrity
Key Derivation | HKDF-SHA256 | 256-bit (NIST SP 800-56C) | Proper key separation with context binding
Random Number Generation | crypto.randomBytes() | Cryptographically secure (CSPRNG) | Uses OS entropy source
## Resistance Against Attacks
Attack Type | Protection Mechanism | Additional Notes
------------------------|-------------------------------------------------------------------|----------------------------------------
Quantum computing | ML-KEM-1024 (IND-CCA2) + Falcon-1024 (EUF-CMA) | Full PQC resistance
MITM attacks | Falcon-1024 signatures + protocol binding | Non-repudiation
Key compromise | Ephemeral KEM keys (per message) + HKDF with unique salts | No long-term key reuse
Replay attacks | 64-byte random salts + 12-byte IVs (2¹²⁸ uniqueness) | Statistically negligible collision risk
CRIME/BREACH | No compression (removed in v2) + encryption before any encoding | Mitigates compression oracles
Key derivation attacks | HKDF-SHA256 with protocol-specific info binding | Prevents cross-context reuse
Timing attacks | timingSafeEqual + constant-time HMAC (padded inputs) | Resists timing leaks
Memory scraping | Explicit secureZero for sensitive buffers | Prevents cold-boot attacks
Error oracles | Unified error paths (generic "decryption failed" messages) | Hides cryptographic faults
Side-channel leaks | Minimum processing time (MIN_PROCESSING_TIME) | Obscures operation timing
Metadata leakage | Fixed block padding (1024-byte chunks) | Hides true message size
## Benchmarking
```
clk: ~2.51 GHz
cpu: 13th Gen Intel(R) Core(TM) i5-13420H
runtime: node 22.13.1 (x64-win32)
benchmark avg (min … max) p75 / p99
------------------------------------------- ---------
GenKeys 47.33 ms/iter 53.51 ms
(35.52 ms … 64.85 ms) 58.01 ms
( 2.71 kb … 20.49 kb) 4.53 kb
Encrypt 13.08 ms/iter 14.28 ms
(9.73 ms … 25.82 ms) 24.94 ms
( 23.41 kb … 39.29 kb) 24.86 kb
Decrypt 622.42 µs/iter 878.20 µs
(259.30 µs … 2.62 ms) 1.87 ms
(472.00 b … 493.76 kb) 16.20 kb
```
## API
### `await generateKeys(KEM_ALGORITHM*, SIG_ALGORITHM*)`
Asynchronously generates a pair of cryptographic keys for Key Encapsulation Mechanism (KEM)
and digital signatures using post-quantum algorithms (default: ML-KEM-1024 and Falcon-1024).
- param `string` [KEM_ALGORITHM='ml-kem-1024'] - KEM algorithm identifier (e.g., 'ml-kem-1024', 'kyber-768').
- param `string` [SIG_ALGORITHM='falcon-1024'] - Digital signature algorithm identifier (e.g., 'falcon-1024', 'dilithium-3').
- returns `Promise<{ kemKeyPair: CryptoKeyPair; sigKeyPair: CryptoKeyPair }>` Object containing KEM and signature key pairs.
- throws `Error` If key generation fails (e.g., unsupported algorithm or cryptographic backend error).
### `await encrypt(message, keypair, options, nonce)`
Encrypts a message using a hybrid post-quantum encryption scheme combining: Key Encapsulation Mechanism (KEM) for key exchange, AES-GCM for symmetric encryption, Digital signatures for authentication
- param `string` message - Plaintext message to encrypt
- param `Object` keypair - Contains KEM and signature key pairs (from generateKeys())
- param `Object` [options] - Encryption options (merged with defaults)
- param `string` [nonce] - Optional nonce for replay protection (auto-generated if omitted)
- returns `Promise<string>` Encrypted payload (hex string with metadata)
- throws `Error` If inputs are invalid or cryptographic operations fail
### `await decrypt(payload, keypair, options)`
Decrypts a payload encrypted by the `encrypt` function using hybrid post-quantum cryptography.
Performs signature verification, key decapsulation, and AES-GCM decryption.
- param `string` payload - Encrypted payload (hex string with metadata)
- param `Object` keypair - Contains KEM and signature key pairs (from generateKeys())
- param `Object` [options] - Decryption options (merged with defaults)
- returns `Promise<{message: string, createdAt: Date, decryptedAt: Date, nonce: string}>` Decrypted data with metadata
- throws {Error} If:
- Signature verification fails
- Nonce reuse detected
- Decryption fails (invalid tag, corrupted data, etc.)
### `await exportKeys(keypair)`
Serializes cryptographic key pairs into a secure string format for storage/transmission.
Format: "PROTOCOL:VERSION:METADATA_HEX:PAYLOAD_HEX"
- param `keypair` - Contains KEM and signature key pairs (from generateKeys() or importKeys())
- returns `string` Serialized keys in protocol-defined format
- throws `Error` If key export fails (e.g., invalid key material)
### `await importKeys(key)`
Imports cryptographic keys from a serialized string format, verifying protocol compatibility
and algorithm support before reconstructing key pairs.
- param `string` key - Serialized keys in format "PROTOCOL:VERSION:METADATA_HEX:PAYLOAD_HEX"
- returns `Promise<{kemKeyPair: KeyPair, sigKeyPair: KeyPair}>` Reconstructed key pairs
- throws `Error` If:
- Protocol/version mismatch
- Unsupported algorithms detected
- Malformed key data