|
| 1 | +import sinon from "sinon"; |
| 2 | +import { expect } from "chai"; |
| 3 | +import { Field, Group, Scalar, BHP256, BHP512, BHP768, BHP1024, Pedersen64, Pedersen128, Poseidon2, Poseidon4, Poseidon8 } from "@provablehq/sdk/%%NETWORK%%.js"; |
| 4 | +import * as algebraicData from "./data/algebra"; |
| 5 | + |
| 6 | +const Fg = Field.fromString(algebraicData.FieldGenerator); |
| 7 | +const F2 = Fg.multiply(Fg); |
| 8 | +const F3 = F2.multiply(Fg); |
| 9 | +const F4 = F3.multiply(Fg); |
| 10 | +const SFg = Scalar.fromString(algebraicData.ScalarGenerator); |
| 11 | +const fieldArray = [Fg, F2, F3, F4]; |
| 12 | +const finiteFieldBytes = fieldArray.map(field => field.toBitsLe()).flat(); |
| 13 | + |
| 14 | +function deepCopyFieldArray(array: Field[]): Field[] { |
| 15 | + return array.map(item => item.clone()); |
| 16 | +} |
| 17 | + |
| 18 | +describe('Hash Function Export Tests', () => { |
| 19 | + afterEach(() => { |
| 20 | + sinon.restore(); |
| 21 | + }); |
| 22 | + |
| 23 | + describe('BHP Hasher Tests', () => { |
| 24 | + it('Check BHP Hashers hash to expected values.', () => { |
| 25 | + // Create all BHP hashers. |
| 26 | + const BHP256Hasher = new BHP256(); |
| 27 | + const BHP512Hasher = new BHP512(); |
| 28 | + const BHP768Hasher = new BHP768(); |
| 29 | + const BHP1024Hasher = new BHP1024(); |
| 30 | + |
| 31 | + // Run all possible operations for BHP256. |
| 32 | + expect(BHP256Hasher.hash(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP256Hash); |
| 33 | + expect(BHP256Hasher.hashToGroup(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP256HashToGroup); |
| 34 | + expect(BHP256Hasher.commit(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP256Commit); |
| 35 | + expect(BHP256Hasher.commitToGroup(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP256CommitToGroup); |
| 36 | + |
| 37 | + // Run all possible operations for BHP512. |
| 38 | + expect(BHP512Hasher.hash(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP512Hash); |
| 39 | + expect(BHP512Hasher.hashToGroup(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP512HashToGroup); |
| 40 | + expect(BHP512Hasher.commit(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP512Commit); |
| 41 | + expect(BHP512Hasher.commitToGroup(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP512CommitToGroup); |
| 42 | + |
| 43 | + // Run all possible operations for BHP768. |
| 44 | + expect(BHP768Hasher.hash(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP768Hash); |
| 45 | + expect(BHP768Hasher.hashToGroup(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP768HashToGroup); |
| 46 | + expect(BHP768Hasher.commit(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP768Commit); |
| 47 | + expect(BHP768Hasher.commitToGroup(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP768CommitToGroup); |
| 48 | + |
| 49 | + // Run all possible operations for BHP1024. |
| 50 | + expect(BHP1024Hasher.hash(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP1024Hash); |
| 51 | + expect(BHP1024Hasher.hashToGroup(finiteFieldBytes).toString()).equals(algebraicData.expectedBHP1024HashToGroup); |
| 52 | + expect(BHP1024Hasher.commit(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP1024Commit); |
| 53 | + expect(BHP1024Hasher.commitToGroup(finiteFieldBytes, SFg.clone()).toString()).equals(algebraicData.expectedBHP1024CommitToGroup); |
| 54 | + }); |
| 55 | + |
| 56 | + it('Check Pedersen hashers hash to expected values', () => { |
| 57 | + // Create all Pedersen hashers. |
| 58 | + const Pedersen64Hasher = new Pedersen64(); |
| 59 | + const Pedersen128Hasher = new Pedersen128(); |
| 60 | + |
| 61 | + // Create a bit array which is 2 2u32 elements concatenated. |
| 62 | + const bitArray = [true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; |
| 63 | + |
| 64 | + // Run all possible operations for Pedersen64. |
| 65 | + expect(Pedersen64Hasher.hash(bitArray).toString()).equals(algebraicData.expectedPedersen64Hash); |
| 66 | + expect(Pedersen64Hasher.commit(bitArray, SFg.clone()).toString()).equals(algebraicData.expectedPedersen64Commit); |
| 67 | + expect(Pedersen64Hasher.commitToGroup(bitArray, SFg.clone()).toString()).equals(algebraicData.expectedPedersen64CommitToGroup); |
| 68 | + |
| 69 | + // Run all possible operations for Pedersen128. |
| 70 | + expect(Pedersen128Hasher.hash(bitArray).toString()).equals(algebraicData.expectedPedersen128Hash); |
| 71 | + expect(Pedersen128Hasher.commit(bitArray, SFg.clone()).toString()).equals(algebraicData.expectedPedersen128Commit); |
| 72 | + expect(Pedersen128Hasher.commitToGroup(bitArray, SFg.clone()).toString()).equals(algebraicData.expectedPedersen128CommitToGroup); |
| 73 | + }); |
| 74 | + |
| 75 | + it('Check Poseidon hashers hash to expected values', () => { |
| 76 | + // Create all Poseidon hashers. |
| 77 | + const Poseidon2Hasher = new Poseidon2(); |
| 78 | + const Poseidon4Hasher = new Poseidon4(); |
| 79 | + const Poseidon8Hasher = new Poseidon8(); |
| 80 | + |
| 81 | + // Run all possible operations for Poseidon2. |
| 82 | + expect(Poseidon2Hasher.hash(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon2Hash); |
| 83 | + expect(Poseidon2Hasher.hashToScalar(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon2HashToScalar); |
| 84 | + expect(Poseidon2Hasher.hashToGroup(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon2HashToGroup); |
| 85 | + expect(Poseidon2Hasher.hashMany(deepCopyFieldArray(fieldArray), 2).map(field => field.toString())).deep.equals(algebraicData.expectedPoseidon2HashMany); |
| 86 | + |
| 87 | + // Run all possible operations for Poseidon4. |
| 88 | + expect(Poseidon4Hasher.hash(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon4Hash); |
| 89 | + expect(Poseidon4Hasher.hashToScalar(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon4HashToScalar); |
| 90 | + expect(Poseidon4Hasher.hashToGroup(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon4HashToGroup); |
| 91 | + expect(Poseidon4Hasher.hashMany(deepCopyFieldArray(fieldArray), 2).map(field => field.toString())).deep.equals(algebraicData.expectedPoseidon4HashMany); |
| 92 | + |
| 93 | + // Run all possible operations for Poseidon8. |
| 94 | + expect(Poseidon8Hasher.hash(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon8Hash); |
| 95 | + expect(Poseidon8Hasher.hashToScalar(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon8HashToScalar); |
| 96 | + expect(Poseidon8Hasher.hashToGroup(deepCopyFieldArray(fieldArray)).toString()).equals(algebraicData.expectedPoseidon8HashToGroup); |
| 97 | + expect(Poseidon8Hasher.hashMany(deepCopyFieldArray(fieldArray), 2).map(field => field.toString())).deep.equals(algebraicData.expectedPoseidon8HashMany); |
| 98 | + }); |
| 99 | + }); |
| 100 | +}); |
0 commit comments