@dashlane/pqc-kem-kyber1024-node
v1.0.0
Published
JavaScript wrapper generator of WebAssembly builds of each round-3 finalists of NIST Post-Quantum Cryptography Competition
Downloads
114
Readme
pqc.js
Overview
This project provides JS bindings and playground of post-quantum asymmetric cipher compiled to WebAssembly using emscripten with a fallback in plain JS.
The available methods are the finalists (and alternate candidates) of NIST Post-Quantum Cryptography Competition:
- Key Encapsulation Methods (KEM): NTRU, Kyber, SABER, McEliece-Classic, (NTRU Prime, FrodoKEM, HQC-RMRS).
- Signature methods: Dilithium, FALCON, RAINBOW, (SPHINCS+).
The C implementations used to create the bindings are the clean
versions provided by PQClean.
This project has been inspired by ntru.js that used to provide an NTRU JS binding.
Playground
It is possible to test the bindings, to compare them in real-world conditions on this playground.
How to download pre-built bindings and NPM packages
Pre-built bindings are available on the playground.
How to build
sudo apt install emscripten
npm ci
make clean
make kem-<the KEM algorithm you want to build>
ormake sign-<the signature algorithm you want to build>
- All bindings can be built using
make all
The output directory is docs/bin/
and each output binding is made of a JS module and its associated WebAssembly file,
a browser package, and a node package.
How to use
Key Encapsulation
import kemBuilder from 'pqc-kem-<algoName>.js'
async function run() {
const kem = await kemBuilder();
const { publicKey, privateKey } = await kem.keypair();
const { ciphertext, sharedSecret: sharedSecretA } = await kem.encapsulate(publicKey);
const { sharedSecret: sharedSecretB } = await kem.decapsulate(ciphertext, privateKey);
// sharedSecretA === sharedSecretB
}
run();
Signature
import signBuilder from 'pqc-sign-<algoName>.js'
async function run() {
const sign = await signBuilder();
const message = new Uint8Array([0x44, 0x61, 0x73, 0x68, 0x6c, 0x61, 0x6e, 0x65]);
const { publicKey, privateKey } = await sign.keypair();
const { signature } = await sign.sign(message, privateKey);
const validSignature = await sign.verify(signature, message, publicKey);
// validSignature === true
}
run();
Disable WebAssembly execution
The first optional parameter of the builders is set to true
is you want to disable WebAssembly execution.
If it is set to false, the fallback JavaScript may still be used if the WebAssembly fails.
Change the path of the WebAssembly
The second optional parameter of the builders is the path to the WebAssembly file.
Implementation notes
- Random generation is provided by libsodium that is using
crypto.randomBytes
. SHA-2
andAES
implementations are provided by SubtleCrypto that is an implementation of Web Crypto API. This may slow down the execution of the bindings because of the asynchronous calls to SubtleCrypto, even more when AES-ECB is used because in this case AES-CTR is called for each block.SHA-2
PQClean implementation is still used bysphincs-sha256-*
bindings because they are using incremental version ofsha256
that do not exist in Web Crypto API.SHA-3
PQClean implementation is still used by NTRU, Kyber, SABER, FrodoKEM and McEliece-Classic because there are no implementations in Web Crypto API.