Skip to content

Commit

Permalink
fix: assert error when using invalid base64 chars
Browse files Browse the repository at this point in the history
  • Loading branch information
javiersuweijie committed Sep 19, 2023
1 parent 9f68bc8 commit 961de04
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
16 changes: 16 additions & 0 deletions packages/circuits/helpers/base64.circom
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,22 @@ template Base64Lookup() {
signal sum_slash <== sum_plus + equal_slash.out * (in + 16);

out <== sum_slash;

// detect invalid characters
// only allow output to be 0 when input is A | =
component is_zero = IsZero();
is_zero.in <== out;

component is_A = IsEqual();
is_A.in[0] <== in;
is_A.in[1] <== 65;

// handle padding (=)
component is_eqsign = IsEqual();
is_eqsign.in[0] <== in;
is_eqsign.in[1] <== 61;

0 === (1 - is_A.out - is_eqsign.out) * is_zero.out;
}

template Base64Decode(N) {
Expand Down
5 changes: 5 additions & 0 deletions packages/circuits/tests/base64-test.circom
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pragma circom 2.1.5;

include "../helpers/base64.circom";

component main { public [ in ] } = Base64Lookup();
70 changes: 70 additions & 0 deletions packages/circuits/tests/base64.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import fs from "fs";
import { buildMimcSponge } from "circomlibjs";
import { wasm as wasm_tester } from "circom_tester";
import { Scalar } from "ffjavascript";
import path from "path";
import { DKIMVerificationResult } from "@zk-email/helpers/src/dkim";
import { generateCircuitInputs } from "@zk-email/helpers/src/input-helpers";
import { verifyDKIMSignature } from "@zk-email/helpers/src/dkim";

exports.p = Scalar.fromString(
"21888242871839275222246405745257275088548364400416034343698204186575808495617"
);

describe("Base64 Lookup", () => {
jest.setTimeout(10 * 60 * 1000); // 10 minutes

let circuit: any;

beforeAll(async () => {
circuit = await wasm_tester(
path.join(__dirname, "./base64-test.circom"),
{
// @dev During development recompile can be set to false if you are only making changes in the tests.
// This will save time by not recompiling the circuit every time.
// Compile: circom "./tests/email-verifier-test.circom" --r1cs --wasm --sym --c --wat --output "./tests/compiled-test-circuit"
recompile: true,
output: path.join(__dirname, "./compiled-test-circuit"),
include: path.join(__dirname, "../../../node_modules"),
}
);
});

it("should decode valid base64 chars", async function () {
const inputs = [
[65, 0], // A
[90, 25], // Z
[97, 26], // a
[122, 51], // z
[48, 52], // 0
[57, 61], // 9
[43, 62], // +
[47, 63], // /
[61, 0], // =
]

for (const [input, output] of inputs) {
const witness = await circuit.calculateWitness({
in: input
});
await circuit.checkConstraints(witness);
await circuit.assertOut(witness, { out: output })
}
});

it("should fail with invalid chars", async function () {
const inputs = [34, 64, 91,44];

expect.assertions(inputs.length);
for (const input of inputs) {
try {
const witness = await circuit.calculateWitness({
in: input
});
await circuit.checkConstraints(witness);
} catch (error) {
expect((error as Error).message).toMatch("Assert Failed");
}
}
});
});

0 comments on commit 961de04

Please sign in to comment.