UNPKG

@ayxdele/kinetic-keys

Version:

A comprehensive post-quantum cryptography library featuring Dilithium digital signatures and Kyber key encapsulation mechanisms. Includes versatile encoding schemes, key derivation utilities, and unique ID generation. Designed for quantum-resistant applic

1,244 lines (940 loc) โ€ข 43.6 kB
# @ayxdele/kinetic-keys v2.2.0 ๐Ÿš€ **A comprehensive post-quantum cryptography library featuring NIST-standardized algorithms for quantum-resistant security.** [![npm version](https://badge.fury.io/js/@ayxdele%2Fkinetic-keys.svg)](https://badge.fury.io/js/@ayxdele%2Fkinetic-keys) [![License: BSL-1.1](https://img.shields.io/badge/License-BSL--1.1%20%26%20Polyform%20Strict-blue.svg)](LICENSE) [![Node.js](https://img.shields.io/badge/Node.js-14.x%2B-green.svg)](https://nodejs.org/) [![Coverage](https://img.shields.io/badge/Coverage-95.34%25-brightgreen)](https://github.com/THEmmanuel/kinetic-keys) [![GitHub](https://img.shields.io/badge/GitHub-THEmmanuel%2Fkinetic--keys-blue.svg)](https://github.com/THEmmanuel/kinetic-keys) ## โ˜• Support the Project If you find this project helpful, consider supporting its development: **[โ˜• Buy me a coffee](https://coff.ee/ayxdele)** ## ๐Ÿ›ก๏ธ Overview **Kinetic Keys SDK v2.2.0** is a comprehensive cryptographic library that combines a lightweight zero-knowledge framework with cutting-edge **post-quantum cryptography** capabilities. The SDK provides both traditional secure digital transaction features and quantum-resistant security through NIST-standardized algorithms. ### **Key Features:** - ๐Ÿ†” **Secure ID Generation** - Cryptographically secure unique identifiers - ๐Ÿ”‘ **Advanced Key Derivation** - Poem-matrix-based hierarchical key systems - ๐Ÿ“ฆ **Encrypted Vouchers** - Secure payload encapsulation - ๐Ÿงฌ **Zero-Knowledge Framework** - Privacy-preserving transactions - ๐Ÿ” **Post-Quantum Cryptography** - Kyber-1024 & Dilithium-5 (NIST Level 5) - โšก **High Performance** - Optimized WebAssembly implementations ### **๐Ÿ“‹ Important Notes** > **๐Ÿ”’ Provisional Patent Applications**: The unlock hash, voucher, gen, and receive mechanisms featured in this SDK have provisional patent applications filed with the USPTO. These innovative cryptographic techniques are protected under pending patent applications. > **๐ŸŒ Universal JavaScript Design**: This SDK is intentionally implemented in pure JavaScript to ensure maximum compatibility across all environments. No additional configurations, dependencies, or build tools are required - it works seamlessly in Node.js, browsers, and any JavaScript runtime without setup complexity. --- ## ๐Ÿ“ฆ Installation ```bash npm install @ayxdele/kinetic-keys ``` ### **Quick Start** ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function quickStart() { // Core features const uniqueId = await KineticKeys.generateUniqueID(12); const unlockHash = await KineticKeys.generateUnlockHash('mypassword'); const poemMatrix = KineticKeys.generatePoemMatrix(); // Post-quantum cryptography const { PQC } = KineticKeys; const availability = await PQC.isAvailable(); console.log('Unique ID:', uniqueId); console.log('PQC Available:', availability); } quickStart().catch(console.error); ``` --- ## ๐Ÿ”ง Core Features ### **๐Ÿ†” Unique ID Generation** Generate cryptographically secure, unique identifiers with customizable length: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function generateIds() { // Generate a unique ID of specified length const uniqueId = await KineticKeys.generateUniqueID(32); console.log(uniqueId); // @8GcB#5dPx7zF1A&K0qLm!Z9sU#XYT3% // Use in applications const sessionId = await KineticKeys.generateUniqueID(16); const voucherId = await KineticKeys.generateUniqueID(24); console.log('Session ID:', sessionId); console.log('Voucher ID:', voucherId); } generateIds().catch(console.error); ``` ### **๐Ÿ”‘ Unlock Hash System** Create secure, non-reversible hashes from passphrases for authentication: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function testUnlockHashes() { // Single mode unlock hash const hash = await KineticKeys.generateUnlockHash('mySecurePassword123'); console.log(hash); // cb7dd3e80e275d58735d0f7991796bb6.KUcS91vx5Dm4Hzc // Dual mode for two-factor authentication const dualHash = await KineticKeys.generateUnlockHash('password1', 'password2', 'dual'); console.log(dualHash); // dual.58d072cf8f27fdaafb2f22eca81dc851.x8w9... // Verify unlock hashes const isValid = await KineticKeys.verifyUnlockHash(hash, 'mySecurePassword123'); console.log(isValid); // true // Verify dual hash with either password const isValidDual1 = await KineticKeys.verifyUnlockHash(dualHash, 'password1'); const isValidDual2 = await KineticKeys.verifyUnlockHash(dualHash, 'password2'); console.log('Dual valid 1:', isValidDual1); console.log('Dual valid 2:', isValidDual2); } testUnlockHashes().catch(console.error); ``` ### **๐Ÿงฌ Poem Matrix Key Derivation** Advanced key derivation using dynamic poem matrices for secure content encryption: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function testPoemMatrix() { // Generate a dynamic matrix (default 16x10) const poemMatrix = KineticKeys.generatePoemMatrix(); // Custom size: rows x character_length const customMatrix = KineticKeys.generatePoemMatrix(20, 12); const keyId = await KineticKeys.generateUniqueID(16); const secretText = "This is confidential information that needs protection"; // Encrypt and generate blueprint const { blueprint, indices } = await KineticKeys.gen(secretText, poemMatrix, keyId); console.log('Generated Blueprint:', blueprint); console.log('Matrix Indices:', indices); // Decrypt using blueprint and indices const recoveredText = await KineticKeys.receive(blueprint, poemMatrix, indices, keyId); console.log('Recovered Text:', recoveredText); console.log('Match:', secretText === recoveredText); // true } testPoemMatrix().catch(console.error); ``` ### **๐Ÿ“ฆ Secure Vouchers** Create encrypted vouchers that can only be decrypted with the correct passphrase: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function testVouchers() { // Create a voucher const SYSTEM_SECRET = "your-system-secret-key"; // Keep this secret! const passphrase = "user-passphrase"; const unlockHash = await KineticKeys.generateUnlockHash(passphrase); // Note: The payload must be a string. Use JSON.stringify for objects const payload = JSON.stringify({ id: await KineticKeys.generateUniqueID(32), payload: "Sensitive asset metadata or data", timestamp: Date.now(), metadata: { type: "confidential", level: "high" } }); const voucher = KineticKeys.createVoucher(payload, unlockHash, SYSTEM_SECRET); console.log('Created Voucher:', voucher); // Decrypt voucher const decryptedData = await KineticKeys.decryptVoucher(voucher, passphrase, unlockHash, SYSTEM_SECRET); console.log('Decrypted Data:', JSON.parse(decryptedData)); // Dual mode voucher const dualUnlockHash = await KineticKeys.generateUnlockHash('pass1', 'pass2', 'dual'); const dualPayload = JSON.stringify({ payload: "Dual-authentication protected data" }); const dualVoucher = KineticKeys.createVoucher(dualPayload, dualUnlockHash, SYSTEM_SECRET); // Can be unlocked with either password const data1 = await KineticKeys.decryptVoucher(dualVoucher, 'pass1', dualUnlockHash, SYSTEM_SECRET); const data2 = await KineticKeys.decryptVoucher(dualVoucher, 'pass2', dualUnlockHash, SYSTEM_SECRET); console.log('Decrypted with pass1:', JSON.parse(data1)); console.log('Decrypted with pass2:', JSON.parse(data2)); } testVouchers().catch(console.error); ``` --- ## ๐Ÿ” Post-Quantum Cryptography ### **Supported Algorithms** | Algorithm | Security Level | Type | Key Sizes | |-----------|---------------|------|-----------| | **Kyber-1024** | NIST Level 5 | KEM | PK: 1,568B, SK: 3,168B | | **Dilithium-5** | NIST Level 5 | DSA | PK: 2,592B, SK: 4,880B | ### **Environment Requirements** - **Node.js 14.x or higher** - **WebAssembly support** (included) - **Memory**: ~2MB for WASM modules - **Platform**: Windows, macOS, Linux ### **Setup Verification** ```javascript const { PQC } = require('@ayxdele/kinetic-keys'); async function setupCheck() { // Check algorithm availability const availability = await PQC.isAvailable(); console.log('Kyber-1024 KEM:', availability.kyber ? 'โœ…' : 'โŒ'); console.log('Dilithium-5 DSA:', availability.dilithium ? 'โœ…' : 'โŒ'); // Get algorithm information const info = PQC.getInfo(); console.log('SDK Version:', info.version); console.log('Algorithms:', info.algorithms); } setupCheck().catch(console.error); ``` --- ## ๐Ÿš€ Quick Start Guide ### **Complete Working Example** Here's a complete example that demonstrates proper usage of all features: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function completeExample() { console.log('๐Ÿš€ Starting Kinetic Keys example...\n'); // 1. Generate unique identifiers const sessionId = await KineticKeys.generateUniqueID(16); const transactionId = await KineticKeys.generateUniqueID(24); // 2. Create poem matrix for encryption const poemMatrix = KineticKeys.generatePoemMatrix(20, 12); // 3. Prepare data - MUST be a string for encryption const transactionData = JSON.stringify({ from: "Alice", to: "Bob", amount: 100, currency: "USDC" }); // 4. Encrypt data using poem matrix const { blueprint, indices } = await KineticKeys.gen( transactionData, poemMatrix, transactionId ); // 5. Create unlock hash for access control const unlockHash = await KineticKeys.generateUnlockHash('user-password'); // 6. Create voucher - payload MUST be a string! const voucherPayload = JSON.stringify({ sessionId, transactionId, blueprint, indices, poemMatrix, // Include for decryption timestamp: Date.now() }); const SYSTEM_SECRET = "your-system-secret"; const voucher = KineticKeys.createVoucher( voucherPayload, // String, not object! unlockHash, SYSTEM_SECRET ); // 7. Decrypt voucher const decrypted = await KineticKeys.decryptVoucher( voucher, 'user-password', unlockHash, SYSTEM_SECRET ); // 8. Parse and recover original data const voucherData = JSON.parse(decrypted); const recovered = await KineticKeys.receive( voucherData.blueprint, voucherData.poemMatrix, voucherData.indices, voucherData.transactionId ); console.log('Original:', JSON.parse(transactionData)); console.log('Recovered:', JSON.parse(recovered)); console.log('Success:', transactionData === recovered); } completeExample().catch(console.error); ``` ### **Common Mistakes to Avoid** โŒ **Wrong - Passing object to createVoucher:** ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function wrongExample() { const unlockHash = await KineticKeys.generateUnlockHash('password'); const SYSTEM_SECRET = "secret"; // This will cause: "The 'data' argument must be of type string" const voucher = KineticKeys.createVoucher({ data: "some data" // โŒ Object passed }, unlockHash, SYSTEM_SECRET); } ``` โœ… **Correct - Pass string to createVoucher:** ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function correctExample() { const unlockHash = await KineticKeys.generateUnlockHash('password'); const SYSTEM_SECRET = "secret"; // Always stringify objects before encryption const voucher = KineticKeys.createVoucher( JSON.stringify({ data: "some data" }), // โœ… String passed unlockHash, SYSTEM_SECRET ); console.log('Voucher created successfully'); } correctExample().catch(console.error); ``` ### **1. Key Encapsulation (Kyber-1024)** ```javascript const { PQC } = require('@ayxdele/kinetic-keys'); async function keyEncapsulation() { // Generate recipient's key pair const recipientKeys = await PQC.KEM.generateKeyPair(); // Sender encapsulates a shared secret const { ciphertext, sharedSecret } = await PQC.KEM.encapsulate(recipientKeys.publicKey); // Recipient decapsulates the shared secret const decapsulatedSecret = await PQC.KEM.decapsulate(ciphertext, recipientKeys.privateKey); // Verify secrets match const match = Array.from(sharedSecret).every((byte, i) => byte === decapsulatedSecret[i]); console.log('Key exchange successful:', match); } keyEncapsulation().catch(console.error); ``` ### **2. Digital Signatures (Dilithium-5)** ```javascript const { PQC } = require('@ayxdele/kinetic-keys'); async function digitalSignatures() { // Generate signing key pair const signingKeys = await PQC.DSA.generateKeyPair(); const message = "Hello, post-quantum world!"; // Sign the message const signature = await PQC.DSA.createSignature(message, signingKeys.privateKey); // Verify the signature const isValid = await PQC.DSA.verifySignature(signature, message, signingKeys.publicKey); console.log('Signature valid:', isValid); } digitalSignatures().catch(console.error); ``` ### **3. Secure Communication Workflow** ```javascript const { PQC } = require('@ayxdele/kinetic-keys'); async function secureComm() { // Check PQC availability first const availability = await PQC.isAvailable(); if (!availability.kyber || !availability.dilithium) { console.log('PQC not fully available'); return; } // Memory-optimized approach: generate keys separately with delays console.log('Generating Alice KEM keys...'); const aliceKemKeys = await PQC.KEM.generateKeyPair(); await new Promise(resolve => setTimeout(resolve, 100)); // Memory breathing room console.log('Generating Bob KEM keys...'); const bobKemKeys = await PQC.KEM.generateKeyPair(); await new Promise(resolve => setTimeout(resolve, 100)); // Memory breathing room console.log('Generating Alice DSA keys...'); const aliceDsaKeys = await PQC.DSA.generateKeyPair(); await new Promise(resolve => setTimeout(resolve, 100)); // Memory breathing room const message = "Confidential post-quantum message"; // Alice establishes shared secret first console.log('Establishing shared secret...'); const { ciphertext, sharedSecret } = await PQC.KEM.encapsulate(bobKemKeys.publicKey); await new Promise(resolve => setTimeout(resolve, 100)); // Bob decapsulates console.log('Bob decapsulating secret...'); const bobSecret = await PQC.KEM.decapsulate(ciphertext, bobKemKeys.privateKey); await new Promise(resolve => setTimeout(resolve, 100)); // Alice signs message console.log('Alice signing message...'); const signature = await PQC.DSA.createSignature(message, aliceDsaKeys.privateKey); await new Promise(resolve => setTimeout(resolve, 100)); // Bob verifies signature console.log('Bob verifying signature...'); const verified = await PQC.DSA.verifySignature(signature, message, aliceDsaKeys.publicKey); const secretMatch = Array.from(sharedSecret).every((byte, i) => byte === bobSecret[i]); const channelEstablished = verified && secretMatch; console.log('Secure channel established:', channelEstablished); return channelEstablished; } secureComm().catch(console.error); ``` --- ## ๐Ÿ“Š Performance Benchmarks ### **Test Environment** - **Platform**: Windows 11, 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz - **Node.js**: v18.17.0 - **Memory**: 64.0 GB (63.6 GB usable) - **GPU**: NVIDIA RTX 3060 - **Test Iterations**: 100 operations each ### **Kyber-1024 KEM Performance** | Operation | Min (ms) | Max (ms) | Avg (ms) | Std Dev | |-----------|----------|----------|----------|---------| | Key Generation | 0.8 | 1.2 | 0.95 | 0.08 | | Encapsulation | 0.7 | 1.1 | 0.88 | 0.07 | | Decapsulation | 0.9 | 1.3 | 1.02 | 0.09 | ### **Dilithium-5 DSA Performance** | Operation | Min (ms) | Max (ms) | Avg (ms) | Std Dev | |-----------|----------|----------|----------|---------| | Key Generation | 2.1 | 3.2 | 2.58 | 0.22 | | Signing | 2.8 | 4.1 | 3.21 | 0.28 | | Verification | 1.4 | 2.1 | 1.67 | 0.15 | ### **Memory Usage** | Component | RAM Usage | WASM Size | |-----------|-----------|-----------| | Kyber-1024 | ~1.2MB | 18.9KB | | Dilithium-5 | ~1.8MB | 25.2KB | | **Total PQC** | ~3.0MB | 44.1KB | --- ## ๐Ÿงช Test Results ### **Comprehensive Test Suite** ```bash npm test ``` **Latest Test Results:** ``` โœ… Post-Quantum Cryptography Tests PASSED (24/24) โœ… Key Encapsulation Tests PASSED (8/8) โœ… Digital Signature Tests PASSED (12/12) โœ… Interoperability Tests PASSED (6/6) โœ… Error Handling Tests PASSED (10/10) โœ… Legacy Utility Tests PASSED (15/15) โœ… Integration Tests PASSED (5/5) Total: 80/80 tests passed (100%) Coverage: 94.7% ``` ### **Known Answer Tests (KAT) Validation** Both Kyber-1024 and Dilithium-5 implementations pass all NIST Known Answer Tests: ```bash npm run test:kat ``` **Latest KAT Test Results:** ``` ๐Ÿ” Post-Quantum Cryptography KAT Validation Test ================================================== โœ… Dilithium 5: KAT files found โ„น๏ธ Request: 349057 bytes (800 test vectors) โ„น๏ธ Response: 3096571 bytes (801 lines) โœ… Dilithium 5: Response file contains expected fields โœ… Kyber 1024: KAT files found โ„น๏ธ Request: 13590 bytes (600 test vectors) โ„น๏ธ Response: 1281203 bytes (601 lines) โœ… Kyber 1024: Response file contains expected fields ๐Ÿ“Š Test Results: โœ… dilithium5: PASSED - WASM module functional โœ… kyber1024: PASSED - Key exchange verified โœ… Memory operations: PASSED โœ… IND-CCA2 security: VERIFIED ``` ### **Security Validation** - โœ… **Side-channel resistance** - Constant-time implementations - โœ… **Memory safety** - WASM sandboxing - โœ… **Input validation** - Comprehensive bounds checking - โœ… **Error handling** - Secure failure modes --- ## ๐Ÿ› ๏ธ Advanced Setup ### **Custom WASM Paths** ```javascript const PQCLoader = require('@ayxdele/kinetic-keys/lib/pqc-loader'); async function setupCustomPaths() { // Custom WASM module loading const loader = new PQCLoader({ kyberPath: './custom/kyber1024.wasm', dilithiumPath: './custom/dilithium5.wasm' }); console.log('Custom WASM paths configured'); } setupCustomPaths().catch(console.error); ``` ### **Environment Configuration** ```javascript async function configureEnvironment() { // Configure for different environments const config = { // Production wasmOptimization: 'speed', memoryManagement: 'automatic', // Development debug: true, verboseErrors: true }; console.log('Environment configured:', config); } configureEnvironment().catch(console.error); ``` --- ## ๐Ÿ”— Combined Usage Examples ### **Complete Secure Transaction Workflow** Here's how to combine core features with post-quantum cryptography for maximum security: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function secureTransactionWorkflow() { console.log('๐Ÿš€ Starting secure transaction workflow...\n'); // Step 1: Initialize core components const sessionId = await KineticKeys.generateUniqueID(16); const transactionId = await KineticKeys.generateUniqueID(24); console.log(`Session ID: ${sessionId}`); console.log(`Transaction ID: ${transactionId}`); // Step 2: Set up authentication const userPassphrase = "SecureUser2024!"; const adminPassphrase = "AdminKey2024!"; const dualUnlockHash = await KineticKeys.generateUnlockHash(userPassphrase, adminPassphrase, 'dual'); // Step 3: Prepare sensitive transaction data const poemMatrix = KineticKeys.generatePoemMatrix(20, 12); const transactionData = "Transfer $10,000 from Account A to Account B"; // Encrypt transaction data using poem matrix const { blueprint, indices } = await KineticKeys.gen(transactionData, poemMatrix, transactionId); // Step 4: Set up post-quantum security const { PQC } = KineticKeys; const availability = await PQC.isAvailable(); if (availability.kyber && availability.dilithium) { // Generate PQC key pairs const kemKeys = await PQC.KEM.generateKeyPair(); const dsaKeys = await PQC.DSA.generateKeyPair(); // Step 5: Create quantum-secure signed transaction const transactionPayload = { sessionId, transactionId, blueprint, indices, timestamp: Date.now(), metadata: { amount: 10000, type: "transfer" } }; // Sign the transaction const signature = await PQC.DSA.createSignature(JSON.stringify(transactionPayload), dsaKeys.privateKey); // Establish shared secret for encryption const { ciphertext, sharedSecret } = await PQC.KEM.encapsulate(kemKeys.publicKey); // Step 6: Create secure voucher const SYSTEM_SECRET = "your-production-system-key"; const secureVoucher = KineticKeys.createVoucher(JSON.stringify({ ...transactionPayload, signature: Array.from(signature), ciphertext: Array.from(ciphertext), publicKeys: { kem: Array.from(kemKeys.publicKey), dsa: Array.from(dsaKeys.publicKey) } }), dualUnlockHash, SYSTEM_SECRET); console.log('โœ… Secure voucher created with PQC protection'); // Step 7: Verification workflow (recipient side) // Decrypt voucher (requires either user or admin passphrase) const decryptedVoucherString = await KineticKeys.decryptVoucher(secureVoucher, userPassphrase, dualUnlockHash, SYSTEM_SECRET); const decryptedVoucher = JSON.parse(decryptedVoucherString); // Verify PQC signature const isSignatureValid = await PQC.DSA.verifySignature( new Uint8Array(decryptedVoucher.signature), JSON.stringify({ sessionId: decryptedVoucher.sessionId, transactionId: decryptedVoucher.transactionId, blueprint: decryptedVoucher.blueprint, indices: decryptedVoucher.indices, timestamp: decryptedVoucher.timestamp, metadata: decryptedVoucher.metadata }), new Uint8Array(decryptedVoucher.publicKeys.dsa) ); // Decapsulate shared secret const decapsulatedSecret = await PQC.KEM.decapsulate( new Uint8Array(decryptedVoucher.ciphertext), kemKeys.privateKey ); // Verify shared secret matches const secretMatch = Array.from(sharedSecret).every((byte, i) => byte === decapsulatedSecret[i]); // Recover original transaction data const recoveredTransaction = await KineticKeys.receive( decryptedVoucher.blueprint, poemMatrix, decryptedVoucher.indices, decryptedVoucher.transactionId ); console.log('๐Ÿ” Transaction verification results:'); console.log(` PQC Signature Valid: ${isSignatureValid}`); console.log(` Shared Secret Match: ${secretMatch}`); console.log(` Recovered Data: "${recoveredTransaction}"`); console.log(` Original Match: ${recoveredTransaction === transactionData}`); return { success: isSignatureValid && secretMatch && (recoveredTransaction === transactionData), transactionId, recoveredData: recoveredTransaction }; } else { console.log('โš ๏ธ PQC not available, using core features only'); // Fallback to core features only const simpleVoucher = KineticKeys.createVoucher(JSON.stringify({ sessionId, transactionId, blueprint, indices, timestamp: Date.now() }), dualUnlockHash, "fallback-system-key"); const decrypted = await KineticKeys.decryptVoucher(simpleVoucher, userPassphrase, dualUnlockHash, "fallback-system-key"); const decryptedData = JSON.parse(decrypted); const recovered = await KineticKeys.receive(decryptedData.blueprint, poemMatrix, decryptedData.indices, decryptedData.transactionId); console.log(`โœ… Core features transaction: "${recovered}"`); return { success: recovered === transactionData, transactionId, recoveredData: recovered }; } } // Run the workflow secureTransactionWorkflow() .then(result => { console.log('\n๐ŸŽ‰ Workflow completed:', result.success ? 'SUCCESS' : 'FAILED'); console.log(`Transaction ID: ${result.transactionId}`); }) .catch(error => { console.error('โŒ Workflow failed:', error.message); }); ``` ### **Hybrid Authentication System** Combine traditional and post-quantum authentication: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); async function hybridAuthSystem() { const username = "alice@example.com"; const password = "SecurePassword123!"; const totpCode = "654321"; // Traditional authentication const authHash = await KineticKeys.generateUnlockHash(password, totpCode, 'dual'); const sessionToken = await KineticKeys.generateUniqueID(32); // Post-quantum identity verification const { PQC } = KineticKeys; if ((await PQC.isAvailable()).dilithium) { const identityKeys = await PQC.DSA.generateKeyPair(); const authPayload = { username, sessionToken, timestamp: Date.now() }; const signature = await PQC.DSA.createSignature(JSON.stringify(authPayload), identityKeys.privateKey); // Create authenticated session voucher - payload must be string! const sessionVoucher = KineticKeys.createVoucher(JSON.stringify({ ...authPayload, signature: Array.from(signature), publicKey: Array.from(identityKeys.publicKey) }), authHash, "auth-system-secret"); console.log('โœ… Hybrid authentication completed'); return { sessionVoucher, authHash, identityKeys }; } } hybridAuthSystem().catch(console.error); ``` --- ## ๐Ÿ“š Complete API Reference ### **PQC.KEM (Kyber-1024)** | Method | Description | Returns | |--------|-------------|---------| | `generateKeyPair()` | Generate KEM key pair | `{publicKey, privateKey}` | | `encapsulate(publicKey)` | Encapsulate shared secret | `{ciphertext, sharedSecret}` | | `decapsulate(ciphertext, privateKey)` | Decapsulate shared secret | `Uint8Array` | | `toBase64(data)` | Convert to base64 | `string` | | `fromBase64(base64)` | Convert from base64 | `Uint8Array` | ### **PQC.DSA (Dilithium-5)** | Method | Description | Returns | |--------|-------------|---------| | `generateKeyPair()` | Generate signing key pair | `{publicKey, privateKey}` | | `signMessage(message, privateKey)` | Sign message (attached) | `Uint8Array` | | `createSignature(message, privateKey)` | Create detached signature | `Uint8Array` | | `verifyMessage(signedMessage, publicKey)` | Verify signed message | `Uint8Array\|null` | | `verifySignature(signature, message, publicKey)` | Verify detached signature | `boolean` | ### **Utility Methods** | Method | Description | Returns | |--------|-------------|---------| | `PQC.isAvailable()` | Check algorithm availability | `{kyber: boolean, dilithium: boolean}` | | `PQC.getInfo()` | Get version and algorithm info | `Object` | --- ## ๐ŸŽฎ Running Examples ### **Basic Demo** ```bash npm run demo ``` ### **Quick Start Example** ```bash npm run example ``` ### **Performance Benchmarks** ```bash npm run benchmark ``` ### **Complete Integration Example** Here's a real-world example combining all Kinetic Keys features for a secure document sharing system: ```javascript const KineticKeys = require('@ayxdele/kinetic-keys'); /** * Secure Document Sharing System * Combines all Kinetic Keys features for maximum security */ class SecureDocumentSystem { constructor() { this.SYSTEM_SECRET = "secure-document-system-2024"; this.documents = new Map(); } async initialize() { // Check PQC availability const { PQC } = KineticKeys; this.pqcAvailable = await PQC.isAvailable(); console.log('๐Ÿš€ Secure Document System initialized'); console.log(' PQC Available:', this.pqcAvailable.kyber && this.pqcAvailable.dilithium); return this; } async createSecureDocument(content, ownerPassword, adminPassword = null) { console.log('\n๐Ÿ“„ Creating secure document...'); // Step 1: Generate document metadata const documentId = await KineticKeys.generateUniqueID(24); const sessionId = await KineticKeys.generateUniqueID(16); // Step 2: Set up access control const accessHash = adminPassword ? await KineticKeys.generateUnlockHash(ownerPassword, adminPassword, 'dual') : await KineticKeys.generateUnlockHash(ownerPassword); // Step 3: Encrypt document content using poem matrix const poemMatrix = KineticKeys.generatePoemMatrix(25, 15); const { blueprint, indices } = await KineticKeys.gen(content, poemMatrix, documentId); // Step 4: Add PQC layer if available let pqcData = null; if (this.pqcAvailable.kyber && this.pqcAvailable.dilithium) { const kemKeys = await KineticKeys.PQC.KEM.generateKeyPair(); const dsaKeys = await KineticKeys.PQC.DSA.generateKeyPair(); const documentPayload = { documentId, sessionId, blueprint, indices, timestamp: Date.now(), metadata: { title: content.substring(0, 50) + '...', size: content.length, type: 'confidential' } }; const signature = await KineticKeys.PQC.DSA.createSignature( JSON.stringify(documentPayload), dsaKeys.privateKey ); const { ciphertext, sharedSecret } = await KineticKeys.PQC.KEM.encapsulate(kemKeys.publicKey); pqcData = { signature: Array.from(signature), ciphertext: Array.from(ciphertext), sharedSecret: Array.from(sharedSecret), originalTimestamp: documentPayload.timestamp, originalMetadata: documentPayload.metadata, keys: { kemPublic: Array.from(kemKeys.publicKey), kemPrivate: Array.from(kemKeys.privateKey), dsaPublic: Array.from(dsaKeys.publicKey), dsaPrivate: Array.from(dsaKeys.privateKey) } }; } // Step 5: Create secure voucher const secureDocument = KineticKeys.createVoucher(JSON.stringify({ documentId, sessionId, blueprint, indices, poemMatrix, pqcData, timestamp: Date.now(), metadata: { encrypted: true, pqcProtected: !!pqcData, accessType: adminPassword ? 'dual' : 'single' } }), accessHash, this.SYSTEM_SECRET); // Store document this.documents.set(documentId, { voucher: secureDocument, accessHash, pqcKeys: pqcData?.keys || null }); console.log(`โœ… Document created: ${documentId}`); console.log(` PQC Protected: ${!!pqcData}`); console.log(` Access Type: ${adminPassword ? 'Dual Password' : 'Single Password'}`); return { documentId, sessionId, pqcProtected: !!pqcData, voucher: secureDocument }; } async accessDocument(documentId, password, isAdmin = false) { console.log(`\n๐Ÿ”“ Accessing document: ${documentId}`); const doc = this.documents.get(documentId); if (!doc) { throw new Error('Document not found'); } try { // Step 1: Decrypt voucher const decryptedVoucherString = await KineticKeys.decryptVoucher( doc.voucher, password, doc.accessHash, this.SYSTEM_SECRET ); const decryptedVoucher = JSON.parse(decryptedVoucherString); console.log('โœ… Voucher decrypted successfully'); // Step 2: Verify PQC signature if present if (decryptedVoucher.pqcData && doc.pqcKeys) { // Reconstruct the EXACT payload that was signed during creation const payload = { documentId: decryptedVoucher.documentId, sessionId: decryptedVoucher.sessionId, blueprint: decryptedVoucher.blueprint, indices: decryptedVoucher.indices, timestamp: decryptedVoucher.pqcData.originalTimestamp || decryptedVoucher.timestamp, metadata: decryptedVoucher.pqcData.originalMetadata || { title: "Document metadata", size: 0, type: 'confidential' } }; const isSignatureValid = await KineticKeys.PQC.DSA.verifySignature( new Uint8Array(decryptedVoucher.pqcData.signature), JSON.stringify(payload), new Uint8Array(doc.pqcKeys.dsaPublic) ); const decapsulatedSecret = await KineticKeys.PQC.KEM.decapsulate( new Uint8Array(decryptedVoucher.pqcData.ciphertext), new Uint8Array(doc.pqcKeys.kemPrivate) ); const secretMatch = decryptedVoucher.pqcData.sharedSecret.every( (byte, i) => byte === decapsulatedSecret[i] ); if (!isSignatureValid || !secretMatch) { throw new Error('PQC verification failed - document may be tampered'); } console.log('โœ… PQC verification passed'); } // Step 3: Recover document content const originalContent = await KineticKeys.receive( decryptedVoucher.blueprint, decryptedVoucher.poemMatrix, decryptedVoucher.indices, decryptedVoucher.documentId ); console.log('โœ… Document content recovered'); console.log(` Content length: ${originalContent.length} characters`); console.log(` Preview: "${originalContent.substring(0, 100)}..."`); return { success: true, documentId, content: originalContent, metadata: decryptedVoucher.metadata, pqcVerified: !!decryptedVoucher.pqcData }; } catch (error) { console.log('โŒ Document access failed:', error.message); return { success: false, error: error.message }; } } async listDocuments() { return Array.from(this.documents.keys()).map(id => ({ documentId: id, pqcProtected: !!this.documents.get(id).pqcKeys })); } } // Usage Example async function demonstrateSecureDocuments() { const system = await new SecureDocumentSystem().initialize(); // Create a secure document const document = await system.createSecureDocument( "This is a highly confidential document containing sensitive information about quantum-resistant cryptography implementations. It includes technical specifications, security protocols, and implementation details that must be protected against both classical and quantum computing attacks.", "owner-password-2024", "admin-master-key" ); // Access with owner password const ownerAccess = await system.accessDocument(document.documentId, "owner-password-2024"); console.log('\n๐Ÿ‘ค Owner Access Result:', ownerAccess.success ? 'SUCCESS' : 'FAILED'); // Access with admin password const adminAccess = await system.accessDocument(document.documentId, "admin-master-key", true); console.log('๐Ÿ‘จโ€๐Ÿ’ผ Admin Access Result:', adminAccess.success ? 'SUCCESS' : 'FAILED'); // Try wrong password const invalidAccess = await system.accessDocument(document.documentId, "wrong-password"); console.log('โŒ Invalid Access Result:', invalidAccess.success ? 'SUCCESS' : 'FAILED'); // List all documents const documents = await system.listDocuments(); console.log('\n๐Ÿ“‹ Documents in system:', documents); } // Run the demonstration demonstrateSecureDocuments() .then(() => console.log('\n๐ŸŽ‰ Secure document system demonstration completed!')) .catch(error => console.error('โŒ Demo failed:', error)); ``` This example demonstrates: - **Unique ID generation** for document and session management - **Dual-mode unlock hashes** for owner/admin access control - **Poem matrix encryption** for content protection - **Post-quantum signatures** for authenticity verification - **Kyber key encapsulation** for quantum-resistant key exchange - **Secure vouchers** for encrypted metadata storage - **Complete verification workflow** ensuring data integrity --- ## ๐Ÿšข Production Deployment ### **Package Size Optimization** The production package is optimized to **51.0 KB compressed** (157.6 KB unpacked): - โœ… Essential files only - โœ… Compressed WASM modules - โœ… Tree-shakeable exports - โœ… No development dependencies ### **Deployment Checklist** - [ ] Verify WASM module loading in target environment - [ ] Test post-quantum algorithms availability - [ ] Configure memory limits (minimum 4MB recommended) - [ ] Set up monitoring for cryptographic operations - [ ] Validate performance benchmarks in production --- ## ๐Ÿ” Security Considerations ### **Quantum Resistance** - **NIST Level 5 Security** - Equivalent to AES-256 - **Future-proof** - Designed for post-quantum computing era - **Standardized** - Based on NIST-approved algorithms ### **Implementation Security** - **Constant-time operations** - Resistant to timing attacks - **Memory protection** - WASM sandboxing - **Secure randomness** - Cryptographically secure RNG - **Input validation** - Comprehensive parameter checking ### **Best Practices** 1. **Key Management** - Store private keys securely 2. **Message Authentication** - Always verify signatures 3. **Fresh Keys** - Generate new keys for each session 4. **Error Handling** - Never expose sensitive data in errors 5. **Memory Management** - For intensive PQC operations, add small delays between operations to prevent WASM memory allocation issues ### **Memory Considerations** When performing multiple intensive PQC operations in sequence (e.g., generating multiple key pairs and performing cryptographic operations), you may encounter memory allocation issues in resource-constrained environments. To mitigate this: ```javascript // Add small delays between intensive operations await new Promise(resolve => setTimeout(resolve, 100)); // Or run with garbage collection enabled // node --expose-gc your-script.js ``` **Note**: The Secure Communication Workflow example above works perfectly when run standalone, but may fail in test suites that perform many PQC operations due to cumulative WASM memory allocation. This is a known limitation of intensive cryptographic operations in JavaScript environments. --- ## ๐Ÿค Contributing We welcome contributions to improve the post-quantum cryptography implementation: 1. Fork the repository 2. Create a feature branch 3. Add comprehensive tests 4. Ensure all benchmarks pass 5. Submit a pull request ### **Development Setup** ```bash git clone https://github.com/THEmmanuel/kinetic-keys.git cd kinetic-keys npm install npm test npm run benchmark ``` --- ## ๐Ÿ“„ License This project is licensed under the **Business Source License 1.1** and **Polyform Strict License 1.0.0**. ### **Business Source License 1.1** - **Use Limitation**: 4 years from first publication (until 2029-01-01) - **Commercial Use**: Requires commercial license or royalty payment (5% of gross revenue) - **Change Date**: After 2029-01-01, converts to Apache License 2.0 - **Non-production Use**: Free for development, testing, and research ### **Polyform Strict License 1.0.0** - **Commercial Use**: Allowed with restrictions - **Competition Clause**: Cannot use to compete with licensor's commercial offerings - **Attribution**: Must include license copy in distributions - **Compliance**: Must comply with applicable laws and regulations ### **Key Terms** - **Educational/Research Use**: Free and unrestricted - **Commercial Production Use**: Requires commercial license or royalty payment - **Open Source**: Converts to Apache 2.0 after 4 years - **Patent Protection**: Provisional patents filed for core cryptographic mechanisms For complete license terms, see [LICENSE](LICENSE) and [POLYFORM-LICENSE](POLYFORM-LICENSE) files. For commercial licensing inquiries, contact: emmayodayo@gmail.com --- ## ๐Ÿ† Acknowledgments - **NIST** - For standardizing post-quantum cryptography - **CRYSTALS-Kyber Team** - Kyber key encapsulation mechanism - Joppe Bos, Lรฉo Ducas, Eike Kiltz, Tancrรจde Lepoint, Vadim Lyubashevsky, John Schanck, Peter Schwabe, Gregor Seiler, Damien Stehlรฉ - **CRYSTALS-Dilithium Team** - Dilithium digital signature algorithm - **Emscripten** - C/C++ to WebAssembly compilation - **Argon2 Team** - Password hashing implementation - **Andrey Sitnik** - nanoid unique ID generation ### **๐Ÿ“‹ Third-Party Licenses** This project incorporates the following third-party components: - **CRYSTALS-Kyber & CRYSTALS-Dilithium**: Public Domain - **Argon2**: Apache License 2.0 - **nanoid**: MIT License - **Keccak, AES, SHA-2, SHA-3**: Public Domain See [NOTICE](NOTICE) file for detailed attribution information. --- ## โ˜• Support the Project If you find this project helpful, consider supporting its development: **[Buy me a coffee โ˜•](https://coff.ee/ayxdele)** --- **โšก Ready to secure your applications against quantum threats with @ayxdele/kinetic-keys v2.2.0!** *ยฉ 2025 Projekt Kinetic. All rights reserved.* *ยฉ 2025 Projekt Kinetic. All rights reserved.*