# CRYSTALS-KYBER JavaScript

**CRYSTALS-KYBER** is a post-quantum key exchange protocol. This protocol is used to securely establish symmetric keys between two parties. This JavaScript implementation is intended for client-side web browser applications and server-side backends in Node.js frameworks. Most of this code was translated from a Go implementation of Kyber which can be found [here](https://github.com/symbolicsoft/kyber-k2so). Original code (written in C) can be found [here](https://github.com/pq-crystals/kyber). Kyber comes in 512, 768, 1024 security strengths. This code is the most up to date version based off the [NIST PQC Round 3 Submissions](https://csrc.nist.gov/projects/post-quantum-cryptography/round-3-submissions). ## Functionality **KYBER** will securely distribute a 256 bit symmetric key between two parties. To safely transmit data over a channel using the key, an AEAD is advised (such as AES-256-GCM). The exchange can be visualised below: ![](./diagram.svg) ## Usage Using Node.js (v16.17.0) or React: ```bash npm install crystals-kyber ``` Import the module at the top of your js file. ```js const kyber = require('crystals-kyber'); ``` To use in your code (768 can be replaced with 512 or 1024). ```js // To generate a public and private key pair (pk, sk) let pk_sk = kyber.KeyGen768(); let pk = pk_sk[0]; let sk = pk_sk[1]; // To generate a random 256 bit symmetric key (ss) and its encapsulation (c) let c_ss = kyber.Encrypt768(pk); let c = c_ss[0]; let ss1 = c_ss[1]; // To decapsulate and obtain the same symmetric key let ss2 = kyber.Decrypt768(c,sk); // Test function with KATs kyber.Test768(); ``` ## Running Tests Output from function `kyber.Test768()` that tests compatibility with the C implementation based on run cases in `PQCkemKAT_2400.rsp`. ``` Test run [ 0 ] success Test run [ 1 ] success Test run [ 2 ] success Test run [ 3 ] success Test run [ 4 ] success Test run [ 5 ] success . . . Test run [ 95 ] success Test run [ 96 ] success Test run [ 97 ] success Test run [ 98 ] success Test run [ 99 ] success All test runs successful. ss1 ss2 1 ``` ## Further Information More details about CRYSTALS-KYBER, lattice-based cryptography and a real-life use of this algorithm can be read here [Active Implementation of Post-Quantum End-to-End Encryption](https://eprint.iacr.org/2021/356.pdf) [20 Apr 2021].