crystals-kyber-js
Version:
An ML-KEM/CRYSTALS-KYBER implementation written in TypeScript for various JavaScript runtimes
138 lines (137 loc) • 5.05 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
(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", "../_dnt.shims.js", "./deps.js"], factory);
}
})(function (require, exports) {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
Object.defineProperty(exports, "__esModule", { value: true });
exports.byte = byte;
exports.int16 = int16;
exports.uint16 = uint16;
exports.int32 = int32;
exports.uint32 = uint32;
exports.constantTimeCompare = constantTimeCompare;
exports.equalUint8Array = equalUint8Array;
exports.loadCrypto = loadCrypto;
exports.prf = prf;
exports.byteopsLoad24 = byteopsLoad24;
exports.byteopsLoad32 = byteopsLoad32;
const dntShim = __importStar(require("../_dnt.shims.js"));
const deps_js_1 = require("./deps.js");
function byte(n) {
return n & 0xFF;
}
function int16(n) {
return (n << 16) >> 16;
}
function uint16(n) {
return n & 0xFFFF;
}
function int32(n) {
return n | 0;
}
// any bit operations to be done in uint32 must have >>> 0
// javascript calculates bitwise in SIGNED 32 bit so you need to convert
function uint32(n) {
return n >>> 0;
}
/**
* compares two arrays
* @returns 1 if they are the same or 0 if not
*/
function constantTimeCompare(x, y) {
// check array lengths
if (x.length != y.length) {
return 0;
}
let v = 0;
for (let i = 0; i < x.length; i++) {
v |= x[i] ^ y[i];
}
// constantTimeByteEq
let z = (~v) & 0xFF;
z &= z >> 4;
z &= z >> 2;
z &= z >> 1;
return z & 1;
}
function equalUint8Array(x, y) {
if (x.length != y.length) {
return false;
}
for (let i = 0; i < x.length; i++) {
if (x[i] !== y[i]) {
return false;
}
}
return true;
}
async function loadCrypto() {
if (typeof dntShim.dntGlobalThis !== "undefined" && globalThis.crypto !== undefined) {
// Browsers, Node.js >= v19, Cloudflare Workers, Bun, etc.
return globalThis.crypto;
}
// Node.js <= v18
try {
// @ts-ignore: to ignore "crypto"
const { webcrypto } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("crypto"))) : new Promise((resolve_1, reject_1) => { require(["crypto"], resolve_1, reject_1); }).then(__importStar)); // node:crypto
return webcrypto;
}
catch (_e) {
throw new Error("failed to load Crypto");
}
}
// prf provides a pseudo-random function (PRF) which returns
// a byte array of length `l`, using the provided key and nonce
// to instantiate the PRF's underlying hash function.
function prf(len, seed, nonce) {
return deps_js_1.shake256.create({ dkLen: len }).update(seed).update(new Uint8Array([nonce])).digest();
}
// byteopsLoad24 returns a 32-bit unsigned integer loaded from byte x at offset o.
function byteopsLoad24(x, o = 0) {
return x[o] | (x[o + 1] << 8) | (x[o + 2] << 16);
}
// byteopsLoad32 returns a 32-bit unsigned integer loaded from byte x at offset o.
function byteopsLoad32(x, o = 0) {
return (x[o] | (x[o + 1] << 8) | (x[o + 2] << 16) | (x[o + 3] << 24)) >>>
0;
}
});