ml-kem.netcore.browser
v0.1.0
Published
Pure JavaScript browser companion package for ML-KEM.NetCore (ML-KEM-768).
Downloads
94
Maintainers
Readme
ML-KEM.NetCore.Browser
ML-KEM.NetCore.Browser is a pure JavaScript companion package to ML-KEM.NetCore, focused on ML-KEM-768 compatibility in browser and Node.js runtimes.
The package includes high-level KEM APIs (generateKeyPair, encapsulate, decapsulate) and lower-level modules for polynomial math, packing, NTT, and CPA-PKE internals.
Table of contents
- Requirements
- Installation
- Quick start
- API reference
- Deterministic/vector workflows
- Validation and testing
- Development
- Interoperability notes
- Security notes
- License
Requirements
- Runtime: modern browser or Node.js with ES modules.
- No native addons required.
- Project package type:
"module".
Installation
npm
npm install ml-kem.netcore.browserNuGet
dotnet add package ML-KEM.NetCore.BrowserBrowser script bundle
Build the one-file bundle:
npm run build:bundleThen include it in your page:
<script src="./dist/ML-KEM.NetCore.Browser.js"></script>
<script>
const { generateKeyPair, encapsulate, decapsulate } = window.MLKEMNetCoreBrowser;
</script>Quick start
ESM usage
import { generateKeyPair, encapsulate, decapsulate } from 'ml-kem.netcore.browser';
const { publicKey, secretKey } = await generateKeyPair();
const { ciphertext, sharedSecret: senderSecret } = await encapsulate(publicKey);
const { sharedSecret: receiverSecret } = await decapsulate(secretKey, ciphertext);
console.log(senderSecret.length, receiverSecret.length); // 32, 32Browser global usage
<script src="./dist/ML-KEM.NetCore.Browser.js"></script>
<script>
(async () => {
const { generateKeyPair, encapsulate, decapsulate } = window.MLKEMNetCoreBrowser;
const { publicKey, secretKey } = await generateKeyPair();
const { ciphertext, sharedSecret: senderSecret } = await encapsulate(publicKey);
const { sharedSecret: receiverSecret } = await decapsulate(secretKey, ciphertext);
console.log(senderSecret, receiverSecret);
})();
</script>API reference
All binary values are Uint8Array.
generateKeyPair(seed64?)
async function generateKeyPair(seed64?: Uint8Array): Promise<{
publicKey: Uint8Array;
secretKey: Uint8Array;
}>;- Without
seed64, key generation uses the configured random source. - With
seed64, deterministic derivation is used (intended for vectors/tests).
encapsulate(publicKey, seed32?)
async function encapsulate(publicKey: Uint8Array, seed32?: Uint8Array): Promise<{
ciphertext: Uint8Array;
sharedSecret: Uint8Array;
}>;publicKeymust be aUint8Arraywith ML-KEM-768 public key length.- Optional
seed32enables deterministic encapsulation for vector scenarios.
decapsulate(secretKey, ciphertext)
async function decapsulate(secretKey: Uint8Array, ciphertext: Uint8Array): Promise<{
sharedSecret: Uint8Array;
}>;- Both arguments must be
Uint8Arrayvalues. - Returns the receiver shared secret.
setRandomBytesProvider(provider)
function setRandomBytesProvider(provider: (length: number) => Uint8Array): void;- Overrides random byte generation used internally.
- Useful for deterministic testing harnesses and controlled environments.
MLKEM_768 parameter sizes
const MLKEM_768 = {
publicKeyBytes: 1184,
secretKeyBytes: 2400,
ciphertextBytes: 1088,
sharedSecretBytes: 32,
// ...other structural parameters
};Import from:
import { MLKEM_768 } from 'ml-kem.netcore.browser';
// or: import { MLKEM_768 } from 'ml-kem.netcore.browser/params';Deterministic/vector workflows
This package supports deterministic pathways used for fixture generation and cross-language verification:
generateKeyPair(seed64)for deterministic key derivation.encapsulate(publicKey, seed32)for deterministic encapsulation.
Reference fixture:
test/vectors/mlkem768-fixture.json
Validation and testing
Run the test suite:
npm testDry-run publish contents:
npm run pack:checkTests include:
- ML-KEM round-trip behavior
- CPA-PKE layer checks
- Cross-language deterministic vector validation
Development
Build browser bundle
npm run build:bundleMain implementation modules
- High-level API:
src/index.jssrc/mlkem.js
- Core primitives:
src/params.jssrc/random.jssrc/sha3.jssrc/shake.jssrc/keccak-f1600.jssrc/sponge.jssrc/utils.jssrc/modq.jssrc/poly.jssrc/polyvec.jssrc/ntt.jssrc/packing.jssrc/cpapke.js
- Vendored core:
src/vendor/mlkem/*
Interoperability notes
- This package is intended to maintain byte-level interoperability with
ML-KEM.NetCorefor ML-KEM-768 workflows. - Keep parameter set and serialized sizes aligned between communicating peers.
- Prefer deterministic methods only for test vectors and reproducibility.
Security notes
- Treat secret material (
secretKey,sharedSecret) as sensitive and keep lifetimes short. - Clear transient buffers in application code when possible.
- Validate all external key/ciphertext lengths before calling KEM operations.
- For high-assurance use, perform an independent cryptographic and implementation review.
License
MIT. See LICENSE.
