o1js-rsa
Version:
This repository exposes the API from the [o1js RSA example](https://github.com/o1-labs/o1js/tree/main/src/examples/crypto/rsa), making it importable and enabling RSA65537 signature verification on the Mina blockchain across various projects that utilize [
45 lines • 1.58 kB
JavaScript
import { assert, Field, Provable } from 'o1js';
export { BigMultNoCarry };
function toNumber(x) {
return Number(x.toBigInt());
}
// a and b have n-bit registers
// a has ka registers, each with NONNEGATIVE ma-bit values (ma can be > n)
// b has kb registers, each with NONNEGATIVE mb-bit values (mb can be > n)
// out has ka + kb - 1 registers, each with (ma + mb + ceil(log(max(ka, kb))))-bit values
function BigMultNoCarry(n, ma, mb, ka, kb, a, b) {
assert(ma + mb <= 255);
const out = Provable.witness(Provable.Array(Field, ka + kb - 1), () => {
let prod_val = [];
for (let i = 0; i < ka + kb - 1; i++) {
prod_val[i] = 0;
}
for (let i = 0; i < ka; i++) {
for (let j = 0; j < kb; j++) {
prod_val[i + j] += toNumber(a[i]) * toNumber(b[j]);
}
}
return prod_val.map(Field);
});
let a_poly = [];
let b_poly = [];
let out_poly = [];
for (let i = 0; i < ka + kb - 1; i++) {
out_poly[i] = Field(0);
a_poly[i] = Field(0);
b_poly[i] = Field(0);
for (let j = 0; j < ka + kb - 1; j++) {
out_poly[i] = out_poly[i].add(out[j].mul(i ** j));
}
for (let j = 0; j < ka; j++) {
a_poly[i] = a_poly[i].add(a[j].mul(i ** j));
}
for (let j = 0; j < kb; j++) {
b_poly[i] = b_poly[i].add(b[j].mul(i ** j));
}
}
for (let i = 0; i < ka + kb - 1; i++) {
out_poly[i].assertEquals(a_poly[i].mul(b_poly[i]));
}
}
//# sourceMappingURL=bigint.js.map