refactor disclose circuits

This commit is contained in:
turnoffthiscomputer
2024-08-19 16:50:33 +01:00
parent 5da4f78e20
commit 2b5724e7b4
3 changed files with 94 additions and 22 deletions

View File

@@ -5,31 +5,27 @@ include "@zk-email/circuits/utils/bytes.circom";
include "../utils/isOlderThan.circom";
include "../utils/isValid.circom";
include "binary-merkle-root.circom";
include "../utils/validatePassport.circom";
template Disclose(nLevels) {
signal input secret;
signal input attestation_id;
signal input pubkey_leaf;
include "../utils/isValid.circom";
template DISCLOSE() {
signal input mrz[93];
signal input merkle_root;
signal input merkletree_size;
signal input path[nLevels];
signal input siblings[nLevels];
signal input bitmap[90];
signal input scope;
signal input current_date[6]; // YYMMDD - num
signal input majority[2]; // YY - ASCII
signal input user_identifier; // can be address for onchain usage, any user id for offchain usage
signal output nullifier; // Poseidon(secret, scope)
signal input user_identifier;
signal input scope;
signal input secret;
signal output revealedData_packed[3];
signal output nullifier;
// Validate Passport
ValidatePassport(nLevels)(secret, attestation_id, pubkey_leaf, mrz, merkle_root, merkletree_size, path, siblings, current_date);
// Verify validity of the passport
component isValid = IsValid();
isValid.currDate <== current_date;
for (var i = 0; i < 6; i++) {
isValid.validityDateASCII[i] <== mrz[70 + i];
}
1 === isValid.out;
// Disclose optional data
component isOlderThan = IsOlderThan();
@@ -38,6 +34,7 @@ template Disclose(nLevels) {
isOlderThan.currDate[i] <== current_date[i];
isOlderThan.birthDateASCII[i] <== mrz[62 + i];
}
signal older_than[2];
older_than[0] <== isOlderThan.out * majority[0];
older_than[1] <== isOlderThan.out * majority[1];
@@ -55,12 +52,14 @@ template Disclose(nLevels) {
revealedData[89] <== older_than[1] * bitmap[89];
revealedData_packed <== PackBytes(90)(revealedData);
// Generate scope nullifier
component poseidon_nullifier = Poseidon(2);
// generate scope nullifier
component poseidon_nullifier = Poseidon(2);
poseidon_nullifier.inputs[0] <== secret;
poseidon_nullifier.inputs[1] <== scope;
nullifier <== poseidon_nullifier.out;
}
component main { public [ merkle_root, scope, user_identifier, current_date, attestation_id] } = Disclose(16);
// component { public [ user_identifier, current_date] } = DISCLOSE();

View File

@@ -0,0 +1,42 @@
pragma circom 2.1.5;
include "./verify_commitment.circom";
include "./disclose.circom";
template VC_AND_DISCLOSE(nLevels) {
signal input secret;
signal input attestation_id;
signal input pubkey_leaf;
signal input mrz[93];
signal input merkle_root;
signal input merkletree_size;
signal input path[nLevels];
signal input siblings[nLevels];
signal input bitmap[90];
signal input scope;
signal input current_date[6]; // YYMMDD - num
signal input majority[2]; // YY - ASCII
signal input user_identifier;
// verify commitment is part of the merkle tree
VERIFY_COMMITMENT(nLevels)(secret, attestation_id, pubkey_leaf, mrz, merkle_root, merkletree_size, path, siblings);
// verify passport validity and disclose optional data
component disclose = DISCLOSE();
disclose.mrz <== mrz;
disclose.bitmap <== bitmap;
disclose.secret <== secret;
disclose.scope <== scope;
disclose.current_date <== current_date;
disclose.majority <== majority;
disclose.user_identifier <== user_identifier;
signal output revealedData_packed[3] <== disclose.revealedData_packed;
signal output nullifier <== disclose.nullifier;
}
component main { public [ merkle_root, scope, user_identifier, current_date, attestation_id] } = VC_AND_DISCLOSE(16);

View File

@@ -0,0 +1,31 @@
pragma circom 2.1.5;
include "circomlib/circuits/poseidon.circom";
include "@zk-email/circuits/utils/bytes.circom";
include "binary-merkle-root.circom";
template VERIFY_COMMITMENT(nLevels) {
signal input secret;
signal input attestation_id;
signal input pubkey_leaf;
signal input mrz[93];
signal input merkle_root;
signal input merkletree_size;
signal input path[nLevels];
signal input siblings[nLevels];
// Compute the commitment
component poseidon_hasher = Poseidon(6);
poseidon_hasher.inputs[0] <== secret;
poseidon_hasher.inputs[1] <== attestation_id;
poseidon_hasher.inputs[2] <== pubkey_leaf;
signal mrz_packed[3] <== PackBytes(93)(mrz);
for (var i = 0; i < 3; i++) {
poseidon_hasher.inputs[i + 3] <== mrz_packed[i];
}
// Verify commitment inclusion
signal computedRoot <== BinaryMerkleRoot(nLevels)(poseidon_hasher.out, merkletree_size, path, siblings);
merkle_root === computedRoot;
}