react-native-quick-crypto
Version:
A fast implementation of Node's `crypto` module written in C/C++ JSI
84 lines (83 loc) • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.checkPrime = checkPrime;
exports.checkPrimeSync = checkPrimeSync;
exports.generatePrime = generatePrime;
exports.generatePrimeSync = generatePrimeSync;
var _reactNativeNitroModules = require("react-native-nitro-modules");
var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
var _utils = require("./utils");
let native;
function getNative() {
if (native == null) {
native = _reactNativeNitroModules.NitroModules.createHybridObject('Prime');
}
return native;
}
function toOptionalArrayBuffer(value) {
if (value == null) return undefined;
if (value instanceof ArrayBuffer) return value;
return (0, _utils.binaryLikeToArrayBuffer)(value);
}
function bufferToBigInt(buf) {
let result = 0n;
for (let i = 0; i < buf.length; i++) {
result = result << 8n | BigInt(buf[i]);
}
return result;
}
function bigIntToBuffer(value) {
if (value === 0n) return new Uint8Array([0]).buffer;
const hex = value.toString(16);
const paddedHex = hex.length % 2 ? '0' + hex : hex;
const bytes = new Uint8Array(paddedHex.length / 2);
for (let i = 0; i < bytes.length; i++) {
bytes[i] = parseInt(paddedHex.substring(i * 2, i * 2 + 2), 16);
}
return bytes.buffer;
}
function generatePrimeSync(size, options) {
const safe = options?.safe ?? false;
const add = toOptionalArrayBuffer(options?.add);
const rem = toOptionalArrayBuffer(options?.rem);
const result = _reactNativeBuffer.Buffer.from(getNative().generatePrimeSync(size, safe, add, rem));
if (options?.bigint) {
return bufferToBigInt(result);
}
return result;
}
function generatePrime(size, options, callback) {
if (typeof options === 'function') {
callback = options;
options = {};
}
const safe = options?.safe ?? false;
const add = toOptionalArrayBuffer(options?.add);
const rem = toOptionalArrayBuffer(options?.rem);
const wantBigint = options?.bigint ?? false;
getNative().generatePrime(size, safe, add, rem).then(ab => {
const result = _reactNativeBuffer.Buffer.from(ab);
if (wantBigint) {
callback?.(null, bufferToBigInt(result));
} else {
callback?.(null, result);
}
}).catch(err => callback?.(err, _reactNativeBuffer.Buffer.alloc(0)));
}
function checkPrimeSync(candidate, options) {
const checks = options?.checks ?? 0;
const buf = typeof candidate === 'bigint' ? bigIntToBuffer(candidate) : (0, _utils.binaryLikeToArrayBuffer)(candidate);
return getNative().checkPrimeSync(buf, checks);
}
function checkPrime(candidate, options, callback) {
if (typeof options === 'function') {
callback = options;
options = {};
}
const checks = options.checks ?? 0;
const buf = typeof candidate === 'bigint' ? bigIntToBuffer(candidate) : (0, _utils.binaryLikeToArrayBuffer)(candidate);
getNative().checkPrime(buf, checks).then(result => callback?.(null, result)).catch(err => callback?.(err, false));
}
//# sourceMappingURL=prime.js.map