{"_id":"@oqs/liboqs-js","_rev":"3-66088319a1b5e69010efe3411ba7cbd0","name":"@oqs/liboqs-js","dist-tags":{"latest":"0.15.1"},"versions":{"0.15.0":{"name":"@oqs/liboqs-js","version":"0.15.0","keywords":["post-quantum","cryptography","pqc","liboqs","wasm","webassembly","quantum-resistant","nist","kem","signature","digital-signature","key-encapsulation","ml-kem","ml-dsa","kyber","dilithium","falcon","slh-dsa","classic-mceliece","frodokem","ntru","hqc","cross","mayo","uov","snova","lattice-based","code-based","hash-based"],"author":{"url":"https://github.com/open-quantum-safe","name":"Open Quantum Safe"},"license":"MIT","_id":"@oqs/liboqs-js@0.15.0","maintainers":[{"name":"pqca-oqs","email":"ry@pqca.org"},{"name":"ktufekcic","email":"kamal@lo.sh"}],"homepage":"https://open-quantum-safe.github.io/liboqs-js","bugs":{"url":"https://github.com/open-quantum-safe/liboqs-js/issues"},"bin":{"liboqs":"bin/cli.js"},"dist":{"shasum":"bf1c265280033c77f37ef8d5c456142768d5c305","tarball":"https://registry.npmjs.org/@oqs/liboqs-js/-/liboqs-js-0.15.0.tgz","fileCount":317,"integrity":"sha512-cZY5TfvZikl/9GWiGah6n+tfucrLYQw1nsIdnoULE1l0s49jQxZYdKc7OtgBmKkQEouWCCMjxCTC7tcTZF1uQg==","signatures":[{"sig":"MEYCIQDpSYxZfR7yC6IluuHc8ocHFrXZTNiZKjwWOJlgcnWnhQIhALBIKlTRn0xajt2vrhoRqTus1nGp0F6bH+YCg1NsGpQ2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@oqs%2fliboqs-js@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16955911},"main":"src/index.js","type":"module","types":"src/types/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./src/types/index.d.ts","import":"./src/index.js"},"./kem":{"types":"./src/types/index.d.ts","import":"./src/kem.js"},"./sig":{"types":"./src/types/index.d.ts","import":"./src/sig.js"},"./errors":{"types":"./src/types/errors.d.ts","import":"./src/core/errors.js"}},"gitHead":"238c82711a7e813d4f505d89999b340785fcc2e1","scripts":{"docs":"typedoc","test":"bun run typecheck && bun run test:node && bun run test:browser","build":"./build.sh","clean":"./build.sh --clean","test:cli":"vitest run tests/cli.test.ts","test:kem":"vitest run tests/kem.test.ts","test:sig":"vitest run tests/sig.test.ts","test:node":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest","build:single":"./build.sh","test:browser":"TEST_ENV=browser vitest run"},"_npmUser":{"name":"ktufekcic","email":"kamal@lo.sh"},"repository":{"url":"git+https://github.com/open-quantum-safe/liboqs-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Post-quantum cryptography for Node.js and browsers via WebAssembly bindings to liboqs","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typedoc":"^0.28.13","playwright":"^1.55.1","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/liboqs-js_0.15.0_1771310895366_0.8717144944515134","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"name":"@oqs/liboqs-js","version":"0.15.1","description":"Post-quantum cryptography for Node.js and browsers via WebAssembly bindings to liboqs","type":"module","main":"src/index.js","types":"src/types/index.d.ts","sideEffects":false,"bin":{"liboqs":"bin/cli.js"},"exports":{".":{"types":"./src/types/index.d.ts","import":"./src/index.js"},"./kem":{"types":"./src/types/index.d.ts","import":"./src/kem.js"},"./sig":{"types":"./src/types/index.d.ts","import":"./src/sig.js"},"./errors":{"types":"./src/types/errors.d.ts","import":"./src/core/errors.js"}},"scripts":{"build":"./build.sh","build:single":"./build.sh","docs":"typedoc","typecheck":"tsc --noEmit","test":"bun run typecheck && bun run test:node && bun run test:browser","test:node":"vitest run","test:browser":"TEST_ENV=browser vitest run","test:watch":"vitest","test:cli":"vitest run tests/cli.test.ts","test:kem":"vitest run tests/kem.test.ts","test:sig":"vitest run tests/sig.test.ts","clean":"./build.sh --clean"},"keywords":["post-quantum","cryptography","pqc","liboqs","wasm","webassembly","quantum-resistant","nist","kem","signature","digital-signature","key-encapsulation","ml-kem","ml-dsa","kyber","dilithium","falcon","slh-dsa","classic-mceliece","frodokem","ntru","hqc","cross","mayo","uov","snova","lattice-based","code-based","hash-based"],"author":{"name":"Open Quantum Safe","url":"https://github.com/open-quantum-safe"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/open-quantum-safe/liboqs-js.git"},"bugs":{"url":"https://github.com/open-quantum-safe/liboqs-js/issues"},"homepage":"https://open-quantum-safe.github.io/liboqs-js","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=22.0.0"},"devDependencies":{"@types/node":"^22.0.0","@vitest/browser":"^3.2.4","playwright":"^1.55.1","typedoc":"^0.28.13","typescript":"^5.9.3","vitest":"^3.2.4"},"gitHead":"f65a4985d88fa5252d5f3440b53363f7a1f3ce6a","_id":"@oqs/liboqs-js@0.15.1","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-nt1M2CuI4JC1FGoLeD0771C/BcisCuJqh8o/54dcUY0nU88Bf7Qv8vF05SA+wLAVf8UTuZD/l6FlS2LI8NjGbg==","shasum":"62971dbf038665fb67568763b9963bf2825e09ef","tarball":"https://registry.npmjs.org/@oqs/liboqs-js/-/liboqs-js-0.15.1.tgz","fileCount":317,"unpackedSize":16955911,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@oqs%2fliboqs-js@0.15.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC3KMDDSJJDL1ufIfISXFLLkMHRAqbEPI7h6hqCfHV9OgIgJHZwB0VHGmPxDQs1X5llD1ncuaxiQ3mO+eM2YlYfa9M="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cb30c6c-65ac-446f-b250-8ee296950750"}},"directories":{},"maintainers":[{"name":"pqca-oqs","email":"ry@pqca.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/liboqs-js_0.15.1_1771312509430_0.45301827881260626"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-17T06:48:15.272Z","modified":"2026-02-17T07:15:10.032Z","0.15.0":"2026-02-17T06:48:15.751Z","0.15.1":"2026-02-17T07:15:09.710Z"},"bugs":{"url":"https://github.com/open-quantum-safe/liboqs-js/issues"},"author":{"name":"Open Quantum Safe","url":"https://github.com/open-quantum-safe"},"license":"MIT","homepage":"https://open-quantum-safe.github.io/liboqs-js","keywords":["post-quantum","cryptography","pqc","liboqs","wasm","webassembly","quantum-resistant","nist","kem","signature","digital-signature","key-encapsulation","ml-kem","ml-dsa","kyber","dilithium","falcon","slh-dsa","classic-mceliece","frodokem","ntru","hqc","cross","mayo","uov","snova","lattice-based","code-based","hash-based"],"repository":{"type":"git","url":"git+https://github.com/open-quantum-safe/liboqs-js.git"},"description":"Post-quantum cryptography for Node.js and browsers via WebAssembly bindings to liboqs","maintainers":[{"name":"pqca-oqs","email":"ry@pqca.org"}],"readme":"# @oqs/liboqs-js\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Node.js](https://img.shields.io/badge/Node.js-22+-green.svg)](https://nodejs.org/)\n\nA JavaScript/TypeScript wrapper for [LibOQS](https://github.com/open-quantum-safe/liboqs), providing access to post-quantum cryptographic algorithms for key encapsulation mechanisms (KEM) and digital signatures.\n\n## Overview\n\nThis library provides WebAssembly bindings to LibOQS, part of the [Open Quantum Safe](https://openquantumsafe.org/) project. It includes:\n\n- Individual WASM modules per algorithm for optimal bundle sizes\n- TypeScript definitions for complete type safety\n- Support for Node.js and browser environments\n- SIMD-optimized builds for maximum performance\n- Tree-shakable ES module exports to minimize bundle size\n- Automatic memory management and secure cleanup\n\n## Status\n\n### ⚠️ Important Notice\n\n**This library is meant for research, prototyping, and experimentation.** While the underlying LibOQS library is well-maintained by the Open Quantum Safe project, both projects carry important caveats:\n\n- Most post-quantum algorithms have not received the same level of scrutiny as traditional cryptography\n- Algorithm support may change rapidly as research advances\n- Some algorithms may prove insecure against classical or quantum computers\n- This library has not received a formal security audit\n\n**If you must use post-quantum cryptography in production environments**, use **hybrid approaches** that combine post-quantum algorithms with traditional algorithms (e.g., ML-KEM with X25519, ML-DSA with Ed25519). This provides defense-in-depth during the transition period.\n\nFor production deployments, follow guidance from NIST's [Post-Quantum Cryptography Standardization](https://csrc.nist.gov/Projects/post-quantum-cryptography) project.\n\n### NIST Standardized Algorithms\n\nThe algorithms implementing NIST FIPS standards are:\n- **ML-KEM** (FIPS 203, formerly Kyber): ML-KEM-512, ML-KEM-768, ML-KEM-1024\n- **ML-DSA** (FIPS 204, formerly Dilithium): ML-DSA-44, ML-DSA-65, ML-DSA-87\n- **SLH-DSA** (FIPS 205, formerly SPHINCS+): 12 variants (SHA2 and SHAKE, 128/192/256-bit security, f/s modes)\n\nThese algorithm names are stable and will be maintained. If NIST updates implementation details, this library will track those changes as closely as possible.\n\n### Available Algorithms\n\nThe library provides JavaScript wrappers for **103 algorithms** including experimental and alternative post-quantum schemes:\n\n<details>\n<summary>Key Encapsulation Mechanisms (38 algorithms)</summary>\n\n- **Kyber** (legacy, use ML-KEM): `Kyber512`, `Kyber768`, `Kyber1024`\n- **Classic McEliece**: 10 variants (`Classic-McEliece-348864` through `Classic-McEliece-8192128f`)\n- **FrodoKEM**: 6 salted variants (AES and SHAKE, 640/976/1344-bit)\n- **eFrodoKEM**: 6 ephemeral variants (AES and SHAKE, 640/976/1344-bit)\n- **HQC**: `HQC-128`, `HQC-192`, `HQC-256`\n- **NTRU**: 6 variants (HPS and HRSS families)\n- **NTRU Prime**: `sntrup761`\n\n**Note**: BIKE family is not supported due to WASM incompatibility (requires platform-specific optimizations).\n\n</details>\n\n<details>\n<summary>Digital Signatures (65 algorithms)</summary>\n\n- **Falcon**: `Falcon-512`, `Falcon-1024`, `Falcon-padded-512`, `Falcon-padded-1024`\n- **SLH-DSA** (FIPS 205): 12 variants (SHA2 and SHAKE, 128/192/256-bit security, f/s modes)\n- **CROSS**: 18 variants (RSDP and RSDPG parameter sets with balanced/fast/small tradeoffs)\n- **MAYO**: `MAYO-1`, `MAYO-2`, `MAYO-3`, `MAYO-5`\n- **SNOVA**: 12 variants (various parameter sets)\n- **UOV**: 12 variants (Ip, Is, III, V with different optimization levels)\n\n</details>\n\nSee `algorithms.json` for the complete algorithm registry, or [the algorithms section](#available-algorithms-1). All 103 algorithms have WASM modules, JavaScript wrappers, TypeScript definitions, and test coverage.\n\n## Installation\n\nThis package works with all major JavaScript package managers:\n\n```bash\n# bun (recommended - fastest)\nbun add @oqs/liboqs-js\n\n# npm\nnpm install @oqs/liboqs-js\n\n# pnpm\npnpm add @oqs/liboqs-js\n\n# yarn\nyarn add @oqs/liboqs-js\n\n# deno (via npm: specifier - no install needed)\n# See \"Deno Usage\" section below\n```\n\nThis project uses **bun** by default for development, but all package managers are fully supported.\n\n### Deno Usage\n\n✅ **Fully Supported** - Available through **npm** only due to package size limitations on JSR:\n\n```typescript\n// Alternative: Import from npm\nimport { createMLKEM768 } from \"npm:@oqs/liboqs-js\";\n\nconst kem = await createMLKEM768();\nconst { publicKey, secretKey } = kem.generateKeyPair();\nkem.destroy();\n```\n\n**How it works:** The library automatically detects the Deno runtime and loads optimized WASM modules built for deno compatibility (`ENVIRONMENT='web'` Emscripten build).\n\n**Recommended Setup** - Create a `deno.json` for cleaner imports:\n```json\n{\n  \"imports\": {\n    \"liboqs\": \"npm:@oqs/liboqs-js@^0.15.1\"\n  }\n}\n```\n\nThen import like:\n```typescript\nimport { createMLKEM768 } from \"liboqs\";\n```\n\n**Using the CLI with Deno:**\n```bash\n# Run CLI directly (JSR)\ndeno run --allow-read npm:@oqs/liboqs-js/cli kem keygen ml-kem-768\n\n# Or from npm\ndeno run --allow-read npm:@oqs/liboqs-js/cli kem keygen ml-kem-768\n```\n\n```json\n# Or add to deno.json tasks:\n{\n  \"tasks\": {\n    \"liboqs\": \"deno run --allow-read npm:@oqs/liboqs-js/cli\"\n  }\n}\n```\n```bash\n# Then run:\ndeno task liboqs list --kem\n```\n\n**Permissions:**\n```bash\n# Library usage (cryptographic operations only)\ndeno run --allow-read your-script.ts\n\n# CLI usage (may need write for output files)\ndeno run --allow-read --allow-write npm:@oqs/liboqs-js/cli kem keygen ml-kem-768 --output-dir ./keys\n```\n\nDeno automatically caches packages on first run - no separate install step needed.\n\n## Requirements\n\n- **Node.js 22.0 or higher** (for WASM SIMD support)\n- **Package Managers**: Bun 1.0+, npm 10+, pnpm 8+, yarn 4+ (for Node.js)\n- **Deno 2.0+** (available only through npm)\n- **Modern browsers** with WebAssembly support (Chrome 91+, Firefox 89+, Edge 91+, Safari 16.4+ - Safari is untested)\n\n## Quick Start\n\n### Command Line Interface\n\nThe package includes a CLI for cryptographic operations without writing code:\n\n```bash\n# Generate ML-KEM-768 keypair\nnpx @oqs/liboqs-js kem keygen ml-kem-768 --output-dir ./keys\n\n# Encapsulate to create shared secret\nnpx @oqs/liboqs-js kem encapsulate ml-kem-768 ./keys/public.key --format base64\n\n# Sign a message\nnpx @oqs/liboqs-js sig sign ml-dsa-65 message.txt ./keys/secret.key -o signature.sig\n\n# Verify signature\nnpx @oqs/liboqs-js sig verify ml-dsa-65 message.txt signature.sig ./keys/public.key\n\n# List available algorithms\nnpx @oqs/liboqs-js list --kem\n\n# Get algorithm info\nnpx @oqs/liboqs-js info ml-kem-768\n```\n\n**Works with all package managers:**\n- `npx @oqs/liboqs-js` (npm)\n- `bunx @oqs/liboqs-js` (bun)\n- `pnpm dlx @oqs/liboqs-js` (pnpm)\n- `yarn dlx @oqs/liboqs-js` (yarn)\n\n**For full CLI documentation, run:**\n```bash\nnpx @oqs/liboqs-js --help\n```\n\n### Key Encapsulation (ML-KEM)\n\n```javascript\nimport { createMLKEM768 } from '@oqs/liboqs-js';\n\n// Alice generates keypair\nconst alice = await createMLKEM768();\nconst { publicKey, secretKey } = alice.generateKeyPair();\n\n// Bob encapsulates shared secret\nconst bob = await createMLKEM768();\nconst { ciphertext, sharedSecret } = bob.encapsulate(publicKey);\n\n// Alice decapsulates\nconst aliceSecret = alice.decapsulate(ciphertext, secretKey);\n\n// Verify shared secrets match\nconsole.log('Secrets match:', Buffer.compare(sharedSecret, aliceSecret) === 0);\n\n// Cleanup\nalice.destroy();\nbob.destroy();\n```\n\n### Digital Signatures (ML-DSA)\n\n```javascript\nimport { createMLDSA65 } from '@oqs/liboqs-js';\n\nconst signer = await createMLDSA65();\nconst { publicKey, secretKey } = signer.generateKeyPair();\n\nconst message = new TextEncoder().encode('Hello, quantum world!');\nconst signature = signer.sign(message, secretKey);\n\nconst isValid = signer.verify(message, signature, publicKey);\nconsole.log('Valid:', isValid); // true\n\nsigner.destroy();\n```\n\n## Available Algorithms\n\n### NIST Standardized (Recommended)\n\nThese are the officially standardized post-quantum cryptographic algorithms approved by NIST for production use.\n\n#### Key Encapsulation - ML-KEM (Module-Lattice-Based KEM)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| ML-KEM-512 | Level 1 (128-bit) | 800 B | 1,632 B | 768 B | `createMLKEM512()` |\n| ML-KEM-768 | Level 3 (192-bit) | 1,184 B | 2,400 B | 1,088 B | `createMLKEM768()` |\n| ML-KEM-1024 | Level 5 (256-bit) | 1,568 B | 3,168 B | 1,568 B | `createMLKEM1024()` |\n\n**Formerly known as**: CRYSTALS-Kyber\n\n#### Digital Signatures - ML-DSA (Module-Lattice-Based DSA)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| ML-DSA-44 | Level 2 (128-bit) | 1,312 B | 2,560 B | ~2,420 B | `createMLDSA44()` |\n| ML-DSA-65 | Level 3 (192-bit) | 1,952 B | 4,032 B | ~3,309 B | `createMLDSA65()` |\n| ML-DSA-87 | Level 5 (256-bit) | 2,592 B | 4,896 B | ~4,627 B | `createMLDSA87()` |\n\n**Formerly known as**: CRYSTALS-Dilithium\n\n#### Digital Signatures - SLH-DSA (Stateless Hash-Based DSA)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| SLH-DSA-SHA2-128f | Level 1 (128-bit) | 32 B | 64 B | 17,088 B | `createSLHDSASHA2128f()` |\n| SLH-DSA-SHA2-128s | Level 1 (128-bit) | 32 B | 64 B | 7,856 B | `createSLHDSASHA2128s()` |\n| SLH-DSA-SHA2-192f | Level 3 (192-bit) | 48 B | 96 B | 35,664 B | `createSLHDSASHA2192f()` |\n| SLH-DSA-SHA2-192s | Level 3 (192-bit) | 48 B | 96 B | 16,224 B | `createSLHDSASHA2192s()` |\n| SLH-DSA-SHA2-256f | Level 5 (256-bit) | 64 B | 128 B | 49,856 B | `createSLHDSASHA2256f()` |\n| SLH-DSA-SHA2-256s | Level 5 (256-bit) | 64 B | 128 B | 29,792 B | `createSLHDSASHA2256s()` |\n| SLH-DSA-SHAKE-128f | Level 1 (128-bit) | 32 B | 64 B | 17,088 B | `createSLHDSASHAKE128f()` |\n| SLH-DSA-SHAKE-128s | Level 1 (128-bit) | 32 B | 64 B | 7,856 B | `createSLHDSASHAKE128s()` |\n| SLH-DSA-SHAKE-192f | Level 3 (192-bit) | 48 B | 96 B | 35,664 B | `createSLHDSASHAKE192f()` |\n| SLH-DSA-SHAKE-192s | Level 3 (192-bit) | 48 B | 96 B | 16,224 B | `createSLHDSASHAKE192s()` |\n| SLH-DSA-SHAKE-256f | Level 5 (256-bit) | 64 B | 128 B | 49,856 B | `createSLHDSASHAKE256f()` |\n| SLH-DSA-SHAKE-256s | Level 5 (256-bit) | 64 B | 128 B | 29,792 B | `createSLHDSASHAKE256s()` |\n\n**Formerly known as**: SPHINCS+\n**Variants**: `f` = fast signing/slower verification, `s` = small signatures/slower signing\n\n### Additional Algorithms\n\nBeyond the NIST-standardized algorithms, this library includes experimental and alternative post-quantum schemes for research purposes.\n\n#### Legacy Kyber (Deprecated)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| Kyber512 | Level 1 (128-bit) | 800 B | 1,632 B | 768 B | `createKyber512()` |\n| Kyber768 | Level 3 (192-bit) | 1,184 B | 2,400 B | 1,088 B | `createKyber768()` |\n| Kyber1024 | Level 5 (256-bit) | 1,568 B | 3,168 B | 1,568 B | `createKyber1024()` |\n\n**Note**: Use ML-KEM instead. Kyber is the pre-standardization version.\n\n#### Key Encapsulation - Classic McEliece (10 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| Classic-McEliece-348864 | Level 1 (128-bit) | 261,120 B | 6,492 B | 96 B | `createClassicMcEliece348864()` |\n| Classic-McEliece-348864f | Level 1 (128-bit) | 261,120 B | 6,492 B | 96 B | `createClassicMcEliece348864f()` |\n| Classic-McEliece-460896 | Level 3 (192-bit) | 524,160 B | 13,608 B | 156 B | `createClassicMcEliece460896()` |\n| Classic-McEliece-460896f | Level 3 (192-bit) | 524,160 B | 13,608 B | 156 B | `createClassicMcEliece460896f()` |\n| Classic-McEliece-6688128 | Level 5 (256-bit) | 1,044,992 B | 13,932 B | 208 B | `createClassicMcEliece6688128()` |\n| Classic-McEliece-6688128f | Level 5 (256-bit) | 1,044,992 B | 13,932 B | 208 B | `createClassicMcEliece6688128f()` |\n| Classic-McEliece-6960119 | Level 5 (256-bit) | 1,047,319 B | 13,948 B | 194 B | `createClassicMcEliece6960119()` |\n| Classic-McEliece-6960119f | Level 5 (256-bit) | 1,047,319 B | 13,948 B | 194 B | `createClassicMcEliece6960119f()` |\n| Classic-McEliece-8192128 | Level 5 (256-bit) | 1,357,824 B | 14,120 B | 208 B | `createClassicMcEliece8192128()` |\n| Classic-McEliece-8192128f | Level 5 (256-bit) | 1,357,824 B | 14,120 B | 208 B | `createClassicMcEliece8192128f()` |\n\n#### Key Encapsulation - FrodoKEM (6 salted variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| FrodoKEM-640-AES | Level 1 (128-bit) | 9,616 B | 19,888 B | 9,752 B | `createFrodoKEM640AES()` |\n| FrodoKEM-640-SHAKE | Level 1 (128-bit) | 9,616 B | 19,888 B | 9,752 B | `createFrodoKEM640SHAKE()` |\n| FrodoKEM-976-AES | Level 3 (192-bit) | 15,632 B | 31,296 B | 15,792 B | `createFrodoKEM976AES()` |\n| FrodoKEM-976-SHAKE | Level 3 (192-bit) | 15,632 B | 31,296 B | 15,792 B | `createFrodoKEM976SHAKE()` |\n| FrodoKEM-1344-AES | Level 5 (256-bit) | 21,520 B | 43,088 B | 21,696 B | `createFrodoKEM1344AES()` |\n| FrodoKEM-1344-SHAKE | Level 5 (256-bit) | 21,520 B | 43,088 B | 21,696 B | `createFrodoKEM1344SHAKE()` |\n\n#### Key Encapsulation - eFrodoKEM (6 ephemeral variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| eFrodoKEM-640-AES | Level 1 (128-bit) | 9,616 B | 19,888 B | 9,720 B | `createEFrodoKEM640AES()` |\n| eFrodoKEM-640-SHAKE | Level 1 (128-bit) | 9,616 B | 19,888 B | 9,720 B | `createEFrodoKEM640SHAKE()` |\n| eFrodoKEM-976-AES | Level 3 (192-bit) | 15,632 B | 31,296 B | 15,744 B | `createEFrodoKEM976AES()` |\n| eFrodoKEM-976-SHAKE | Level 3 (192-bit) | 15,632 B | 31,296 B | 15,744 B | `createEFrodoKEM976SHAKE()` |\n| eFrodoKEM-1344-AES | Level 5 (256-bit) | 21,520 B | 43,088 B | 21,632 B | `createEFrodoKEM1344AES()` |\n| eFrodoKEM-1344-SHAKE | Level 5 (256-bit) | 21,520 B | 43,088 B | 21,632 B | `createEFrodoKEM1344SHAKE()` |\n\n#### Key Encapsulation - HQC (3 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| HQC-128 | Level 1 (128-bit) | 2,249 B | 2,305 B | 4,433 B | `createHQC128()` |\n| HQC-192 | Level 3 (192-bit) | 4,522 B | 4,586 B | 8,978 B | `createHQC192()` |\n| HQC-256 | Level 5 (256-bit) | 7,245 B | 7,317 B | 14,421 B | `createHQC256()` |\n\n#### Key Encapsulation - NTRU (6 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| NTRU-HPS-2048-509 | Level 1 (128-bit) | 699 B | 935 B | 699 B | `createNTRUHPS2048509()` |\n| NTRU-HPS-2048-677 | Level 3 (192-bit) | 930 B | 1,234 B | 930 B | `createNTRUHPS2048677()` |\n| NTRU-HPS-4096-821 | Level 5 (256-bit) | 1,230 B | 1,590 B | 1,230 B | `createNTRUHPS4096821()` |\n| NTRU-HPS-4096-1229 | Level 5 (256-bit) | 1,842 B | 2,366 B | 1,842 B | `createNTRUHPS40961229()` |\n| NTRU-HRSS-701 | Level 3 (192-bit) | 1,138 B | 1,450 B | 1,138 B | `createNTRUHRSS701()` |\n| NTRU-HRSS-1373 | Level 5 (256-bit) | 2,401 B | 2,983 B | 2,401 B | `createNTRUHRSS1373()` |\n\n#### Key Encapsulation - NTRU Prime\n\n| Algorithm | Security Level | Public Key | Secret Key | Ciphertext | Factory Function |\n|-----------|----------------|------------|------------|------------|------------------|\n| sntrup761 | Level 3 (192-bit) | 1,158 B | 1,763 B | 1,039 B | `createSntrup761()` |\n\n**Note**: `sntrup761` is included primarily for interoperability testing.\n\n#### Digital Signatures - Falcon (4 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| Falcon-512 | Level 1 (128-bit) | 897 B | 1,281 B | ~752 B | `createFalcon512()` |\n| Falcon-1024 | Level 5 (256-bit) | 1,793 B | 2,305 B | ~1,462 B | `createFalcon1024()` |\n| Falcon-padded-512 | Level 1 (128-bit) | 897 B | 1,281 B | 666 B | `createFalconPadded512()` |\n| Falcon-padded-1024 | Level 5 (256-bit) | 1,793 B | 2,305 B | 1,280 B | `createFalconPadded1024()` |\n\n#### Digital Signatures - CROSS (18 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| CROSS-rsdp-128-balanced | Level 1 (128-bit) | 77 B | 32 B | 13,152 B | `createCROSSRSDP128Balanced()` |\n| CROSS-rsdp-128-fast | Level 1 (128-bit) | 77 B | 32 B | 18,432 B | `createCROSSRSDP128Fast()` |\n| CROSS-rsdp-128-small | Level 1 (128-bit) | 77 B | 32 B | 12,432 B | `createCROSSRSDP128Small()` |\n| CROSS-rsdp-192-balanced | Level 3 (192-bit) | 115 B | 48 B | 29,853 B | `createCROSSRSDP192Balanced()` |\n| CROSS-rsdp-192-fast | Level 3 (192-bit) | 115 B | 48 B | 41,406 B | `createCROSSRSDP192Fast()` |\n| CROSS-rsdp-192-small | Level 3 (192-bit) | 115 B | 48 B | 28,391 B | `createCROSSRSDP192Small()` |\n| CROSS-rsdp-256-balanced | Level 5 (256-bit) | 153 B | 64 B | 53,527 B | `createCROSSRSDP256Balanced()` |\n| CROSS-rsdp-256-fast | Level 5 (256-bit) | 153 B | 64 B | 74,590 B | `createCROSSRSDP256Fast()` |\n| CROSS-rsdp-256-small | Level 5 (256-bit) | 153 B | 64 B | 50,818 B | `createCROSSRSDP256Small()` |\n| CROSS-rsdpg-128-balanced | Level 1 (128-bit) | 54 B | 32 B | 9,120 B | `createCROSSRSDPG128Balanced()` |\n| CROSS-rsdpg-128-fast | Level 1 (128-bit) | 54 B | 32 B | 11,980 B | `createCROSSRSDPG128Fast()` |\n| CROSS-rsdpg-128-small | Level 1 (128-bit) | 54 B | 32 B | 8,960 B | `createCROSSRSDPG128Small()` |\n| CROSS-rsdpg-192-balanced | Level 3 (192-bit) | 83 B | 48 B | 22,464 B | `createCROSSRSDPG192Balanced()` |\n| CROSS-rsdpg-192-fast | Level 3 (192-bit) | 83 B | 48 B | 26,772 B | `createCROSSRSDPG192Fast()` |\n| CROSS-rsdpg-192-small | Level 3 (192-bit) | 83 B | 48 B | 20,452 B | `createCROSSRSDPG192Small()` |\n| CROSS-rsdpg-256-balanced | Level 5 (256-bit) | 106 B | 64 B | 40,100 B | `createCROSSRSDPG256Balanced()` |\n| CROSS-rsdpg-256-fast | Level 5 (256-bit) | 106 B | 64 B | 48,102 B | `createCROSSRSDPG256Fast()` |\n| CROSS-rsdpg-256-small | Level 5 (256-bit) | 106 B | 64 B | 36,454 B | `createCROSSRSDPG256Small()` |\n\n#### Digital Signatures - MAYO (4 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| MAYO-1 | Level 1 (128-bit) | 1,420 B | 24 B | 454 B | `createMAYO1()` |\n| MAYO-2 | Level 1 (128-bit) | 4,912 B | 24 B | 186 B | `createMAYO2()` |\n| MAYO-3 | Level 3 (192-bit) | 2,986 B | 32 B | 681 B | `createMAYO3()` |\n| MAYO-5 | Level 5 (256-bit) | 5,554 B | 40 B | 964 B | `createMAYO5()` |\n\n#### Digital Signatures - SNOVA (12 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| SNOVA-24-5-4 | Level 1 (128-bit) | 1,016 B | 48 B | 248 B | `createSNOVA2454()` |\n| SNOVA-24-5-4-esk | Level 1 (128-bit) | 1,016 B | 36,848 B | 248 B | `createSNOVA2454ESK()` |\n| SNOVA-24-5-4-SHAKE | Level 1 (128-bit) | 1,016 B | 48 B | 248 B | `createSNOVA2454SHAKE()` |\n| SNOVA-24-5-4-SHAKE-esk | Level 1 (128-bit) | 1,016 B | 36,848 B | 248 B | `createSNOVA2454SHAKEESK()` |\n| SNOVA-24-5-5 | Level 1 (128-bit) | 1,579 B | 48 B | 379 B | `createSNOVA2455()` |\n| SNOVA-25-8-3 | Level 1 (128-bit) | 2,320 B | 48 B | 165 B | `createSNOVA2583()` |\n| SNOVA-29-6-5 | Level 3 (192-bit) | 2,716 B | 48 B | 454 B | `createSNOVA2965()` |\n| SNOVA-37-17-2 | Level 3 (192-bit) | 9,842 B | 48 B | 124 B | `createSNOVA37172()` |\n| SNOVA-37-8-4 | Level 3 (192-bit) | 4,112 B | 48 B | 376 B | `createSNOVA3784()` |\n| SNOVA-49-11-3 | Level 5 (256-bit) | 6,006 B | 48 B | 286 B | `createSNOVA49113()` |\n| SNOVA-56-25-2 | Level 5 (256-bit) | 31,266 B | 48 B | 178 B | `createSNOVA56252()` |\n| SNOVA-60-10-4 | Level 5 (256-bit) | 8,016 B | 48 B | 576 B | `createSNOVA60104()` |\n\n#### Digital Signatures - UOV (12 variants)\n\n| Algorithm | Security Level | Public Key | Secret Key | Signature | Factory Function |\n|-----------|----------------|------------|------------|-----------|------------------|\n| OV-Ip | Level 1 (128-bit) | 278,432 B | 237,896 B | 128 B | `createOVIp()` |\n| OV-Ip-pkc | Level 1 (128-bit) | 43,576 B | 237,896 B | 128 B | `createOVIpPKC()` |\n| OV-Ip-pkc-skc | Level 1 (128-bit) | 43,576 B | 32 B | 128 B | `createOVIpPKCSKC()` |\n| OV-Is | Level 1 (128-bit) | 412,160 B | 348,704 B | 96 B | `createOVIs()` |\n| OV-Is-pkc | Level 1 (128-bit) | 66,576 B | 348,704 B | 96 B | `createOVIsPKC()` |\n| OV-Is-pkc-skc | Level 1 (128-bit) | 66,576 B | 32 B | 96 B | `createOVIsPKCSKC()` |\n| OV-III | Level 3 (192-bit) | 1,225,440 B | 1,044,320 B | 200 B | `createOVIII()` |\n| OV-III-pkc | Level 3 (192-bit) | 189,232 B | 1,044,320 B | 200 B | `createOVIIIPKC()` |\n| OV-III-pkc-skc | Level 3 (192-bit) | 189,232 B | 32 B | 200 B | `createOVIIIPKCSKC()` |\n| OV-V | Level 5 (256-bit) | 2,869,440 B | 2,436,704 B | 260 B | `createOVV()` |\n| OV-V-pkc | Level 5 (256-bit) | 446,992 B | 2,436,704 B | 260 B | `createOVVPKC()` |\n| OV-V-pkc-skc | Level 5 (256-bit) | 446,992 B | 32 B | 260 B | `createOVVPKCSKC()` |\n\n**Notes:**\n- UOV variants with `-pkc` (public key compression) have smaller public keys\n- UOV variants with `-skc` (secret key compression) have smaller secret keys\n- `-esk` SNOVA variants use expanded secret keys for faster signing\n\n## Bundle Size Optimization\n\nEach algorithm is compiled separately into individual WASM modules, so you only bundle what you use:\n\n```javascript\n// Single algorithm (~80-160KB depending on algorithm complexity)\nimport { createMLKEM768 } from '@oqs/liboqs-js';\nconst kem = await createMLKEM768();\n\n// Multiple algorithms - each adds its own WASM module\nimport { createMLKEM768, createMLDSA65 } from '@oqs/liboqs-js';\nconst kem = await createMLKEM768();\nconst sig = await createMLDSA65();\n```\n\nTree-shaking ensures unused algorithms are never included in your bundle. Each algorithm's WASM is embedded in its module and loaded when you import the factory function.\n\n## Package Structure\n\n### Exports\n\n```javascript\n// Main entry - all 103 algorithm factory functions, classes, and metadata\nimport { createMLKEM768, MLKEM768, ML_KEM_768_INFO } from '@oqs/liboqs-js';\n\n// KEM-only exports (32 algorithms)\nimport {\n  createMLKEM512,\n  createClassicMcEliece348864,\n  createFrodoKEM640AES\n} from '@oqs/liboqs-js/kem';\n\n// Signature-only exports (65 algorithms)\nimport {\n  createMLDSA44,\n  createFalcon512,\n  createSphincsSha2128fSimple\n} from '@oqs/liboqs-js/sig';\n\n// Error classes only\nimport { LibOQSError, LibOQSInitError } from '@oqs/liboqs-js/errors';\n```\n\n### File Structure\n\n```\n@oqs/liboqs-js/\n├── src/\n│   ├── algorithms/\n│   │   ├── kem/\n│   │   │   ├── ml-kem/           # ML-KEM (3 variants)\n│   │   │   ├── kyber/            # Legacy Kyber (3 variants)\n│   │   │   ├── classic-mceliece/ # Classic McEliece (10 variants)\n│   │   │   ├── frodokem/         # FrodoKEM (6 variants)\n│   │   │   ├── hqc/              # HQC (3 variants)\n│   │   │   └── ntru/             # NTRU + sntrup761 (7 variants)\n│   │   └── sig/\n│   │       ├── ml-dsa/           # ML-DSA (3 variants)\n│   │       ├── falcon/           # Falcon (4 variants)\n│   │       ├── slh-dsa/          # SLH-DSA (12 variants)\n│   │       ├── cross/            # CROSS (18 variants)\n│   │       ├── mayo/             # MAYO (4 variants)\n│   │       ├── snova/            # SNOVA (12 variants)\n│   │       └── uov/              # UOV (12 variants)\n│   ├── cli/\n│   │   ├── commands/             # CLI command implementations\n│   │   │   ├── info.js           # Algorithm information\n│   │   │   ├── kem.js            # KEM operations (keygen, encaps, decaps)\n│   │   │   ├── sig.js            # Signature operations (keygen, sign, verify)\n│   │   │   └── list.js           # List available algorithms\n│   │   ├── algorithms.js         # Algorithm registry\n│   │   ├── index.js              # CLI entry point\n│   │   ├── io.js                 # File I/O utilities\n│   │   └── parser.js             # Command parser\n│   ├── core/\n│   │   ├── errors.js             # Error classes\n│   │   └── validation.js         # Input validation utilities\n│   ├── types/                    # TypeScript definitions\n│   │   ├── algorithms.d.ts\n│   │   ├── errors.d.ts\n│   │   └── index.d.ts\n│   ├── index.js                  # Main entry (all 103 algorithms)\n│   ├── kem.js                    # KEM exports (38 algorithms)\n│   └── sig.js                    # Signature exports (65 algorithms)\n├── bin/\n│   └── cli.js                    # CLI executable entry point\n├── tests/\n│   ├── kem.test.ts\n│   ├── sig.test.ts\n│   ├── cli.test.ts\n│   └── deno/                     # Deno-specific tests\n│       ├── kem.test.ts\n│       ├── sig.test.ts\n│       └── cli.test.ts\n├── dist/                         # WASM modules (97 × 2 = 194 files, ~100-500KB each)\n│   ├── ml-kem-512.min.js         # Node.js/Browser module\n│   ├── ml-kem-512.deno.js        # Deno module\n│   ├── falcon-512.min.js\n│   ├── falcon-512.deno.js\n│   └── ... (and 190 others)\n├── algorithms.json               # Algorithm registry and metadata\n└── build.sh                      # WASM build script\n```\n\n## Architecture\n\nThe library is organized in layers:\n\n1. **WASM Modules**: Emscripten-compiled LibOQS binaries (one per algorithm)\n2. **Low-level Bindings**: Direct WASM function calls (`_OQS_KEM_*`, `_OQS_SIG_*`)\n3. **High-level Wrappers**: User-friendly classes (`MLKEM768`, `MLDSA65`)\n4. **Public API**: Factory functions and exports\n\n### Memory Management\n\n**IMPORTANT**: Always call `destroy()` when finished with an algorithm instance. WASM memory is not garbage-collected by JavaScript.\n\n#### Why This Matters\n\nWebAssembly modules allocate native memory outside the JavaScript heap. When you create an algorithm instance, LibOQS allocates C structures that JavaScript's garbage collector cannot reclaim. Without calling `destroy()`, this memory leaks permanently.\n\n**Long-running applications** (servers, single-page apps, daemons) that don't call `destroy()` will experience:\n- Increasing memory usage over time\n- Eventually: allocation failures or crashes when the 256MB WASM heap limit is reached\n\n**Short-lived scripts** are less affected since the OS reclaims all memory when the process exits.\n\n#### Best Practices\n\n```javascript\n// Pattern 1: Simple cleanup\nconst kem = await createMLKEM768();\nconst { publicKey, secretKey } = kem.generateKeyPair();\nkem.destroy();\n\n// Pattern 2: Error-safe cleanup (recommended)\nconst kem = await createMLKEM768();\ntry {\n  const { publicKey, secretKey } = kem.generateKeyPair();\n  const { ciphertext, sharedSecret } = kem.encapsulate(publicKey);\n  // ... use results ...\n} finally {\n  kem.destroy(); // Always runs, even if errors occur\n}\n\n// Pattern 3: Multiple operations\nconst sig = await createMLDSA65();\ntry {\n  const { publicKey, secretKey } = sig.generateKeyPair();\n  const message = new TextEncoder().encode('Hello!');\n  const signature = sig.sign(message, secretKey);\n  const isValid = sig.verify(message, signature, publicKey);\n  return isValid;\n} finally {\n  sig.destroy();\n}\n```\n\n#### Additional Notes\n\n- Secret keys, shared secrets, and signatures are handled via WASM memory\n- Keys and secrets are not automatically zeroed (limitation of JavaScript/WASM)\n- Each algorithm instance must be destroyed individually\n- After calling `destroy()`, the instance cannot be reused\n\n### Thread Safety\n\n- Individual algorithm instances are **not** thread-safe\n- For concurrent operations, create separate instances per worker/thread\n- WASM modules can be instantiated multiple times safely\n\n## Security Considerations\n\n1. **Use NIST Standardized Algorithms**: ML-KEM, ML-DSA, and SLH-DSA are recommended for production\n2. **Hybrid Cryptography**: We, as well as OQS, strongly recommend combining with traditional algorithms (X25519/Ed25519) during transition\n3. **Key Storage**: Store secret keys securely, never in plain text or localStorage\n4. **Stay Updated**: Monitor NIST guidance and update regularly\n5. **Audit Your Deployment**: Consult cryptographic experts for production use\n6. **Random Number Generation**: This library uses system entropy (Node.js `crypto.randomBytes()`, browser `crypto.getRandomValues()`)\n\n### Reporting Security Issues\n\nSee [SECURITY.md](SECURITY.md) for our vulnerability disclosure policy. Issues specific to the LibOQS C library should be reported to the [LibOQS project](https://github.com/open-quantum-safe/liboqs/security).\n\n## Building from Source\n\n### Prerequisites\n\n- **Node.js 22+**\n- **Emscripten** (latest stable release)\n- **Git**\n- **CMake 3.20+**\n- **Python 3** (for Emscripten)\n- **jq** (for JSON parsing in build.sh)\n\n### Build Steps\n\n```bash\n# Clone repository\ngit clone https://github.com/open-quantum-safe/liboqs-js.git\ncd liboqs-js\n\n# Build all algorithms\n./build.sh\n\n# Build specific algorithm\n./build.sh ml-kem-768\n\n# Setup only (clone liboqs without building)\n./build.sh --setup-only\n\n# Clean build artifacts\n./build.sh --clean\n```\n\n### Build System\n\nThe build system is **data-driven** using `algorithms.json`:\n\n```json\n{\n  \"kem\": {\n    \"ml-kem\": {\n      \"ML-KEM-768\": {\n        \"slug\": \"ml-kem-768\",\n        \"cmake_var\": \"ML_KEM_768\",\n        \"security\": 3,\n        \"standardized\": true\n      }\n    }\n  }\n}\n```\n\nThe `build.sh` script:\n1. Parses `algorithms.json` with jq\n2. Dynamically generates CMake flags to build single-algorithm WASM modules\n3. Compiles with Emscripten optimizations (Closure compiler, WASM SIMD)\n4. Outputs standalone `.min.js` files with embedded WASM\n\n**No build script changes needed to add new algorithms** - just update the JSON registry.\n\n### Adding New Algorithms\n\n#### Quick Start\n\n```bash\n# 1. Add algorithm metadata to algorithms.json\n# 2. Create the algorithm wrapper file (see existing files for patterns)\n# 3. Build WASM module\n./build.sh <algorithm-slug>\n\n# 4. Export from src/index.js, src/kem.js, or src/sig.js\n```\n\n#### Key Size Management\n\nThe `fetch-key-sizes.js` script extracts key sizes from existing algorithm files and updates `algorithms.json`:\n\n```bash\nnode scripts/fetch-key-sizes.js\n# Scans src/algorithms/**/*.js for keySize data\n# Updates algorithms.json with found key sizes\n```\n\nThis is useful when:\n- Updating key sizes after LibOQS version changes\n- Ensuring consistency across the codebase\n- Adding new algorithms\n\n#### Steps\n\n1. **Add to `algorithms.json`**: Include the algorithm metadata (slug, cmake_var, security level, key sizes)\n2. **Create wrapper file**: Follow patterns in existing files under `src/algorithms/kem/` or `src/algorithms/sig/`\n3. **Export in index files**: Add to `src/index.js`, `src/kem.js`, or `src/sig.js`\n4. **Add tests**: Follow patterns in `tests/kem.test.ts` or `tests/sig.test.ts`\n5. **Update TypeScript definitions**: If needed, update `src/types/algorithms.d.ts`\n\nAll 103 algorithms maintain consistent APIs, documentation, and error handling patterns.\n\n## Testing\n\nThe library includes comprehensive test coverage using Vitest:\n\n```bash\n# Run all tests (1400+ tests across 103 algorithms for both node and browser environments)\nbun test\n\n# Or use your preferred package manager\nnpm test\npnpm test\nyarn test\n\n# Or with Deno:\ndeno test --allow-read --allow-write --allow-run --allow-env --no-check tests/deno/\n```\n\nTest coverage includes:\n- **Algorithm correctness**: All algorithms tested for basic functionality\n- **Round-trip verification**: KEM encapsulation/decapsulation, signature sign/verify\n- **Key generation**: Validates key sizes match specifications\n- **Cross-environment**: Node.js and browser (jsdom) compatibility\n- **Error handling**: Validates proper error messages and types\n- **Memory safety**: Ensures cleanup via destroy() methods\n- **Edge cases**: Empty messages, invalid signatures, destroyed instances\n\n## Contributing\n\nContributions are welcome! Please:\n\n- **Tests must pass**: Run `bun run test` (or `npm run test`) and `deno test --allow-read --allow-write --allow-run --allow-env --no-check tests/deno/` before submitting\n- **Follow existing code style**: Use ESM, async/await, JSDoc comments\n- **Document public APIs**: Add comprehensive JSDoc for all exported functions and classes\n- **Security first**: Consider security implications, especially for cryptographic operations\n- **Consistency matters**: Follow established patterns in existing wrappers\n\nFor larger changes, open an issue first to discuss the approach.\n\n### Development Workflow\n\n1. Fork the repository\n2. Create a feature branch\n3. Install dependencies: `bun install` (or `npm install`, `pnpm install`, etc.)\n4. Make your changes (add tests if applicable)\n5. Run tests: `bun run test` (or `npm run test`)\n6. Build and test locally\n7. Submit a pull request\n\n### Package Manager Notes\n\n```bash\n# Using bun (recommended/default for contributors)\nbun install\nbun run test\nbun run build\n\n# Using npm\nnpm install\nnpm run test\nnpm run build\n\n# Using pnpm\npnpm install\npnpm runtest\npnpm run build\n\n# Using yarn\nyarn install\nyarn run test\nyarn run build\n```\n\nContributions that add new algorithm wrappers, improve documentation, add tests, or enhance the build system are especially appreciated.\n\n## Documentation\n\n- **[Security Policy](SECURITY.md)** - Vulnerability reporting and security guidance\n- **[LibOQS Documentation](https://github.com/open-quantum-safe/liboqs)** - Underlying C library\n\n## License\n\nMIT License - see [LICENSE.md](LICENSE.md) for details.\n\n## Acknowledgments\n\n- [Open Quantum Safe](https://openquantumsafe.org/) project for LibOQS\n- [NIST Post-Quantum Cryptography Standardization](https://csrc.nist.gov/Projects/post-quantum-cryptography)\n- The cryptographic research community\n- Emscripten team for excellent WASM tooling\n\n## Versioning\n\nThis library's version tracks the bundled LibOQS version:\n- `@oqs/liboqs-js 0.15.x` includes `LibOQS 0.15.1`\n\n## Disclaimer\n\nThis library provides access to cryptographic algorithms believed to be quantum-resistant based on current research. The field of post-quantum cryptography is evolving. Algorithm support may change as research advances. Always consult with cryptographic experts for production deployments and follow NIST recommendations.\n\nThe LibOQS project states: **\"WE DO NOT CURRENTLY RECOMMEND RELYING ON THIS LIBRARY IN A PRODUCTION ENVIRONMENT OR TO PROTECT ANY SENSITIVE DATA.\"** This guidance applies to this JavaScript/WebAssembly wrapper as well.\n","readmeFilename":"README.md"}