@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
31 lines • 1.23 kB
JavaScript
import { Bool, Provable } from 'o1js';
import { FrC, FrU } from '../../towers/index.js';
export function shaToFr(hashDigest) {
let fields = hashDigest.toFields();
const shaBitRepr = [];
let bit255 = Bool(false);
let bit256 = Bool(false);
for (let i = 31; i >= 0; i--) {
const bits = fields[i].toBits();
for (let j = 0; j < 8; j++) {
// we skip last 2 bits
if (i == 0 && j == 6) {
bit255 = bits[j];
}
else if (i == 0 && j == 7) {
bit256 = bits[j];
}
else {
shaBitRepr.push(bits[j]);
}
}
}
const sh254 = FrC.from(7059779437489773633646340506914701874769131765994106666166191815402473914367n); // 2^254 % r
const sh255 = FrC.from(14119558874979547267292681013829403749538263531988213332332383630804947828734n); // 2^255 % r
let x = FrU.fromBits(shaBitRepr);
const a = Provable.if(bit255.equals(Bool(true)), FrC.provable, sh254, FrC.from(0n));
const b = Provable.if(bit256.equals(Bool(true)), FrC.provable, sh255, FrC.from(0n));
const res = x.add(a).add(b).assertCanonical();
return res;
}
//# sourceMappingURL=sha_to_fr.js.map