quick implementation of register verification in sdk

This commit is contained in:
turnoffthiscomputer
2024-09-11 15:51:29 +02:00
parent 8d6ebda748
commit c7519529d0
3 changed files with 170 additions and 113 deletions

View File

@@ -1143,12 +1143,12 @@ export const vkey_register_rsa_65537_sha256 = {
],
"vk_delta_2": [
[
"21182393167972591273455147563369337795073350434017385192366270853512506753102",
"2071831760676455870153009479612967260589793000680985854892539181867080218526"
"1124638411902620169466576413279023013079941848031189737373401145179064175131",
"11042506291684538543163058007070234250742130743320994825498455463446390608250"
],
[
"9414151256024424170783214599878709311755786901057832906385538051324855247655",
"13559645894070952079667053251415563467042594123001715585133414678689973068873"
"18315399375161980085822397708125344893837704162318050180364038493391815848346",
"20239422196318607619167405265372518240697286446334094911839560216145893619955"
],
[
"1",
@@ -1253,12 +1253,12 @@ export const vkey_register_rsa_65537_sha1 = {
],
"vk_delta_2": [
[
"14835859102271567093487916425015395254579053004952201364631711434014996342432",
"542140370389814734541813638215608253648163125957601180219965576235849241559"
"6107106525061880820652953504764910783821269535782598660504894157466531912810",
"21240680390083613445109376571991098030882417326374771212109739714012694808129"
],
[
"866312939934285873155708896851400291666751279600126688954870626093620770617",
"9700221573827861360235735194260767536093790840462779681735605133701729170490"
"13709037010649495763805514997078675535263381246710391830233605208989652598432",
"4779492782232458203655819148789853161621108383817600545721921036218507128530"
],
[
"1",
@@ -1363,12 +1363,12 @@ export const vkey_register_rsapss_65537_sha256 = {
],
"vk_delta_2": [
[
"5454518381678730335341150000326001439137316575647770900282600740854378701173",
"12591130554090955243595985913496159970039266544972369911957619054315206774975"
"13601641790628163286314285492591604872054750259226382274832074635259763202459",
"18156458143200342424720969036384030392505735056324919104384719152362354961329"
],
[
"18221897710266663065561142011914521495915038609974119613344983817380001168342",
"8710804365416807739784753797956517537938023381194489435368386688208890256097"
"18648047682520251476843465974883245469308242680719256188767231938001829717946",
"12297302087314992637483015610314802379278176751599289194986180320939472940038"
],
[
"1",

View File

@@ -47,14 +47,34 @@ export class OpenPassport1StepVerifier {
}
async verify(
openPassport1StepInputs: OpenPassport1StepInputs
openPassport1StepInputs: OpenPassport1StepInputs | any
): Promise<OpenPassportVerifierReport> {
// Ensure openPassport1StepInputs is an instance of OpenPassport1StepInputs
if (!(openPassport1StepInputs instanceof OpenPassport1StepInputs)) {
openPassport1StepInputs = new OpenPassport1StepInputs(openPassport1StepInputs);
}
const { signatureAlgorithm, hashFunction } = getSignatureAlgorithm(openPassport1StepInputs.dsc);
const vkey = getVkey(openPassport1StepInputs.circuit, signatureAlgorithm, hashFunction);
const parsedPublicSignals = parsePublicSignals1Step(
openPassport1StepInputs.dscProof.publicSignals
const parsedPublicSignals: any = openPassport1StepInputs.getParsedPublicSignals();
//0. Verify the proof
const verified_prove = await groth16.verify(
vkey,
openPassport1StepInputs.dscProof.publicSignals,
openPassport1StepInputs.dscProof.proof as any
);
if (!verified_prove) {
this.report.exposeAttribute('proof');
}
console.log('\x1b[32m%s\x1b[0m', `- proof verified`);
if (openPassport1StepInputs.circuit === 'register') {
return this.report;
}
//1. Verify the scope
if (castToScope(parsedPublicSignals.scope) !== this.scope) {
this.report.exposeAttribute('scope', parsedPublicSignals.scope, this.scope);
}
@@ -111,17 +131,7 @@ export class OpenPassport1StepVerifier {
console.log('\x1b[32m%s\x1b[0m', `- requirement ${attribute} verified`);
}
//6. Verify the proof
const verified_prove = await groth16.verify(
vkey,
openPassport1StepInputs.dscProof.publicSignals,
openPassport1StepInputs.dscProof.proof as any
);
if (!verified_prove) {
this.report.exposeAttribute('proof');
}
console.log('\x1b[32m%s\x1b[0m', `- proof verified`);
//7 Verify the dsc
const dscCertificate = forge.pki.certificateFromPem(openPassport1StepInputs.dsc);
@@ -169,11 +179,16 @@ export class OpenPassport1StepInputs {
}
getParsedPublicSignals() {
return parsePublicSignals1Step(this.dscProof.publicSignals);
switch (this.circuit) {
case 'prove':
return parsePublicSignalsProve(this.dscProof.publicSignals);
case 'register':
return parsePublicSignalsRegister(this.dscProof.publicSignals);
}
}
getUserId() {
const rawUserId = this.getParsedPublicSignals().user_identifier;
const rawUserId = (this.getParsedPublicSignals() as any).user_identifier;
switch (this.userIdType) {
case 'ascii':
return castToScope(BigInt(rawUserId));
@@ -189,7 +204,7 @@ export class OpenPassport1StepInputs {
}
}
export function parsePublicSignals1Step(publicSignals) {
export function parsePublicSignalsProve(publicSignals) {
return {
signature_algorithm: publicSignals[0],
revealedData_packed: [publicSignals[1], publicSignals[2], publicSignals[3]],
@@ -200,3 +215,12 @@ export function parsePublicSignals1Step(publicSignals) {
user_identifier: publicSignals[44],
};
}
export function parsePublicSignalsRegister(publicSignals) {
return {
nullifier: publicSignals[0],
blinded_dsc_commitment: publicSignals[1],
commitment: publicSignals[2],
attestation_id: publicSignals[3],
};
}

View File

@@ -1,35 +1,31 @@
import { assert, expect } from 'chai';
import { describe, it } from 'mocha';
import { groth16 } from 'snarkjs';
import { generateCircuitInputsProve } from '../../common/src/utils/generateInputs';
import { generateCircuitInputsProve, generateCircuitInputsRegister } from '../../common/src/utils/generateInputs';
import { OpenPassport1StepVerifier, OpenPassport1StepInputs } from '../src/OpenPassport1Step';
import { genMockPassportData } from '../../common/src/utils/genMockPassportData';
import { OpenPassportVerifierReport } from '../src/OpenPassportVerifierReport';
import crypto from 'crypto';
import { n_dsc, k_dsc, DEFAULT_MAJORITY, PASSPORT_ATTESTATION_ID } from '../../common/src/constants/constants';
describe('\x1b[95mOpenPassport1Step\x1b[0m', function () {
this.timeout(0);
/// Define common variables
const user_identifier = crypto.randomUUID();
const scope = '@spaceShips';
const majority = '18';
const bitmap = Array(90).fill('1');
const n_dsc = 64;
const k_dsc = 32;
it('OpenPassport1Step - rsa sha256', async function () {
const path_prove_wasm = '../circuits/build/fromAWS/prove_rsa_65537_sha256.wasm';
const path_prove_zkey = '../circuits/build/fromAWS/prove_rsa_65537_sha256.zkey';
it('OpenPassport1Step - register - rsa sha256', async function () {
const path_prove_wasm = '../circuits/build/fromAWS/register_rsa_65537_sha256.wasm';
const path_prove_zkey = '../circuits/build/fromAWS/register_rsa_65537_sha256.zkey';
const passportData = genMockPassportData('rsa_sha256', 'FRA', '000101', '300101');
const inputs = generateCircuitInputsProve(
const inputs = generateCircuitInputsRegister(
BigInt(0).toString(),
BigInt(0).toString(),
PASSPORT_ATTESTATION_ID,
passportData,
n_dsc,
k_dsc,
scope,
bitmap,
majority,
user_identifier
);
const { proof, publicSignals } = await groth16.fullProve(
inputs,
@@ -48,83 +44,120 @@ describe('\x1b[95mOpenPassport1Step\x1b[0m', function () {
proof: proof as any,
},
dsc: passportData.dsc as string,
circuit: 'prove',
circuit: 'register',
});
const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
verifyResult(result, openPassportProverInputs);
console.log(result);
// verifyResult(result, openPassportProverInputs);
});
it('OpenPassport1Step - rsa sha1', async function () {
const path_prove_wasm = '../circuits/build/fromAWS/prove_rsa_65537_sha1.wasm';
const path_prove_zkey = '../circuits/build/fromAWS/prove_rsa_65537_sha1.zkey';
const passportData = genMockPassportData('rsa_sha1', 'FRA', '000101', '300101');
const inputs = generateCircuitInputsProve(
passportData,
n_dsc,
k_dsc,
scope,
bitmap,
majority,
user_identifier
);
const { proof, publicSignals } = await groth16.fullProve(
inputs,
path_prove_wasm,
path_prove_zkey
);
const openPassport1StepVerifier = new OpenPassport1StepVerifier({
scope: scope,
olderThan: '18',
nationality: 'France',
dev_mode: true,
});
const openPassportProverInputs = new OpenPassport1StepInputs({
dscProof: {
publicSignals: publicSignals,
proof: proof as any,
},
dsc: passportData.dsc as string,
circuit: 'prove',
});
const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
verifyResult(result, openPassportProverInputs);
});
// it('OpenPassport1Step - rsa sha256', async function () {
// const path_prove_wasm = '../circuits/build/fromAWS/prove_rsa_65537_sha256.wasm';
// const path_prove_zkey = '../circuits/build/fromAWS/prove_rsa_65537_sha256.zkey';
// const passportData = genMockPassportData('rsa_sha256', 'FRA', '000101', '300101');
// const inputs = generateCircuitInputsProve(
// passportData,
// n_dsc,
// k_dsc,
// scope,
// bitmap,
// majority,
// user_identifier
// );
// const { proof, publicSignals } = await groth16.fullProve(
// inputs,
// path_prove_wasm,
// path_prove_zkey
// );
// const openPassport1StepVerifier = new OpenPassport1StepVerifier({
// scope: scope,
// olderThan: '18',
// nationality: 'France',
// dev_mode: true,
// });
// const openPassportProverInputs = new OpenPassport1StepInputs({
// dscProof: {
// publicSignals: publicSignals,
// proof: proof as any,
// },
// dsc: passportData.dsc as string,
// circuit: 'prove',
// });
// const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
// verifyResult(result, openPassportProverInputs);
// });
it('OpenPassport1Step - rsapss sha256', async function () {
const path_prove_wasm = '../circuits/build/fromAWS/prove_rsapss_65537_sha256.wasm';
const path_prove_zkey = '../circuits/build/fromAWS/prove_rsapss_65537_sha256.zkey';
const passportData = genMockPassportData('rsapss_sha256', 'FRA', '000101', '300101');
const inputs = generateCircuitInputsProve(
passportData,
n_dsc,
k_dsc,
scope,
bitmap,
majority,
user_identifier
);
const { proof, publicSignals } = await groth16.fullProve(
inputs,
path_prove_wasm,
path_prove_zkey
);
const openPassport1StepVerifier = new OpenPassport1StepVerifier({
scope: scope,
olderThan: '18',
nationality: 'France',
dev_mode: true,
});
const openPassportProverInputs = new OpenPassport1StepInputs({
dscProof: {
publicSignals: publicSignals,
proof: proof as any,
},
dsc: passportData.dsc as string,
circuit: 'prove',
});
const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
verifyResult(result, openPassportProverInputs);
});
// it('OpenPassport1Step - rsa sha1', async function () {
// const path_prove_wasm = '../circuits/build/fromAWS/prove_rsa_65537_sha1.wasm';
// const path_prove_zkey = '../circuits/build/fromAWS/prove_rsa_65537_sha1.zkey';
// const passportData = genMockPassportData('rsa_sha1', 'FRA', '000101', '300101');
// const inputs = generateCircuitInputsProve(
// passportData,
// n_dsc,
// k_dsc,
// scope,
// bitmap,
// majority,
// user_identifier
// );
// const { proof, publicSignals } = await groth16.fullProve(
// inputs,
// path_prove_wasm,
// path_prove_zkey
// );
// const openPassport1StepVerifier = new OpenPassport1StepVerifier({
// scope: scope,
// olderThan: '18',
// nationality: 'France',
// dev_mode: true,
// });
// const openPassportProverInputs = new OpenPassport1StepInputs({
// dscProof: {
// publicSignals: publicSignals,
// proof: proof as any,
// },
// dsc: passportData.dsc as string,
// circuit: 'prove',
// });
// const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
// verifyResult(result, openPassportProverInputs);
// });
// it('OpenPassport1Step - rsapss sha256', async function () {
// const path_prove_wasm = '../circuits/build/fromAWS/prove_rsapss_65537_sha256.wasm';
// const path_prove_zkey = '../circuits/build/fromAWS/prove_rsapss_65537_sha256.zkey';
// const passportData = genMockPassportData('rsapss_sha256', 'FRA', '000101', '300101');
// const inputs = generateCircuitInputsProve(
// passportData,
// n_dsc,
// k_dsc,
// scope,
// bitmap,
// majority,
// user_identifier
// );
// const { proof, publicSignals } = await groth16.fullProve(
// inputs,
// path_prove_wasm,
// path_prove_zkey
// );
// const openPassport1StepVerifier = new OpenPassport1StepVerifier({
// scope: scope,
// olderThan: '18',
// nationality: 'France',
// dev_mode: true,
// });
// const openPassportProverInputs = new OpenPassport1StepInputs({
// dscProof: {
// publicSignals: publicSignals,
// proof: proof as any,
// },
// dsc: passportData.dsc as string,
// circuit: 'prove',
// });
// const result = await openPassport1StepVerifier.verify(openPassportProverInputs);
// verifyResult(result, openPassportProverInputs);
// });
const verifyResult = (
result: OpenPassportVerifierReport,