Add BigInt utility functions for number theory operations
This commit is contained in:
parent
3dbeee1f11
commit
888f16b335
53
src/core/lib/BigIntUtils.mjs
Normal file
53
src/core/lib/BigIntUtils.mjs
Normal file
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* @author p-leriche [philip.leriche@cantab.net]
|
||||
* @copyright Crown Copyright 2025
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
|
||||
/**
|
||||
* Number theory utilities used by cryptographic operations.
|
||||
*
|
||||
* Currently provides:
|
||||
* - parseBigInt
|
||||
* - Extended Euclidean Algorithm
|
||||
*
|
||||
* Additional algorithms may be added as required.
|
||||
*/
|
||||
|
||||
/**
|
||||
* parseBigInt helper operation
|
||||
*/
|
||||
export function parseBigInt(value, param) {
|
||||
const v = (value ?? "").trim();
|
||||
if (/^0x[0-9a-f]+$/i.test(v)) return BigInt(v);
|
||||
if (/^[+-]?[0-9]+$/.test(v)) return BigInt(v);
|
||||
throw new OperationError(param + " must be decimal or hex (0x...)");
|
||||
}
|
||||
|
||||
/**
|
||||
* Extended Euclidean Algorithm
|
||||
*
|
||||
* Returns [g, x, y] such that:
|
||||
* a*x + b*y = g = gcd(a, b)
|
||||
*
|
||||
* (Uses an iterative algorithm to avoid possible stack overflow)
|
||||
*/
|
||||
export function egcd(a, b) {
|
||||
let oldR = a, r = b;
|
||||
let oldS = 1n, s = 0n;
|
||||
let oldT = 0n, t = 1n;
|
||||
|
||||
while (r !== 0n) {
|
||||
const quotient = oldR / r;
|
||||
|
||||
[oldR, r] = [r, oldR - quotient * r];
|
||||
[oldS, s] = [s, oldS - quotient * s];
|
||||
[oldT, t] = [t, oldT - quotient * t];
|
||||
}
|
||||
|
||||
// oldR is the gcd
|
||||
// oldS and oldT are the Bézout coefficients
|
||||
return [oldR, oldS, oldT];
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user