UNPKG

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
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