crystals-kyber-js
Version:
An ML-KEM/CRYSTALS-KYBER implementation written in TypeScript for various JavaScript runtimes
141 lines (140 loc) • 4.59 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "./consts.js", "./errors.js", "./mlKemBase.js"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MlKem768Impl = void 0;
exports.createMlKem768 = createMlKem768;
const consts_js_1 = require("./consts.js");
const errors_js_1 = require("./errors.js");
const mlKemBase_js_1 = require("./mlKemBase.js");
/**
* Synchronous implementation of MlKem768.
*
* Use {@link createMlKem768} to create an initialized instance.
*
* @example
*
* ```ts
* // Using jsr:
* import { createMlKem768 } from "@dajiaji/mlkem";
* // Using npm:
* // import { createMlKem768 } from "mlkem"; // or "crystals-kyber-js"
*
* const recipient = await createMlKem768();
* const [pkR, skR] = recipient.generateKeyPair();
*
* const sender = await createMlKem768();
* const [ct, ssS] = sender.encap(pkR);
*
* const ssR = recipient.decap(ct, skR);
* // ssS === ssR
* ```
*/
class MlKem768Impl extends mlKemBase_js_1.MlKemBase {
constructor() {
super();
Object.defineProperty(this, "_k", {
enumerable: true,
configurable: true,
writable: true,
value: 3
});
Object.defineProperty(this, "_du", {
enumerable: true,
configurable: true,
writable: true,
value: 10
});
Object.defineProperty(this, "_dv", {
enumerable: true,
configurable: true,
writable: true,
value: 4
});
Object.defineProperty(this, "_eta1", {
enumerable: true,
configurable: true,
writable: true,
value: 2
});
Object.defineProperty(this, "_eta2", {
enumerable: true,
configurable: true,
writable: true,
value: 2
});
this._skSize = 12 * this._k * consts_js_1.N / 8;
this._pkSize = this._skSize + 32;
this._compressedUSize = this._k * this._du * consts_js_1.N / 8;
this._compressedVSize = this._dv * consts_js_1.N / 8;
this._initPool();
}
/** Generates a keypair [publicKey, privateKey]. */
generateKeyPair() {
try {
return this._generateKeyPairCore();
}
catch (e) {
throw new errors_js_1.MlKemError(e);
}
}
/** Derives a keypair [publicKey, privateKey] deterministically from a 64-octet seed. */
deriveKeyPair(seed) {
try {
return this._deriveKeyPairCore(seed);
}
catch (e) {
throw new errors_js_1.MlKemError(e);
}
}
/** Encapsulates: returns [ciphertext, sharedSecret]. */
encap(pk, seed) {
try {
return this._encapCore(pk, seed);
}
catch (e) {
throw new errors_js_1.MlKemError(e);
}
}
/** Decapsulates: returns sharedSecret. */
decap(ct, sk) {
try {
return this._decapCore(ct, sk);
}
catch (e) {
throw new errors_js_1.MlKemError(e);
}
}
/** @internal */
static async _create() {
const impl = new MlKem768Impl();
await impl._setup();
return impl;
}
}
exports.MlKem768Impl = MlKem768Impl;
/**
* Creates a pre-initialized MlKem768 instance with synchronous operations.
*
* @returns A promise that resolves to an {@link MlKemInterface} instance.
*
* @example
*
* ```ts
* const ctx = await createMlKem768();
* const [pk, sk] = ctx.generateKeyPair(); // sync
* const [ct, ssS] = ctx.encap(pk); // sync
* const ssR = ctx.decap(ct, sk); // sync
* ```
*/
function createMlKem768() {
return MlKem768Impl._create();
}
});