mirror of
https://github.com/selfxyz/self.git
synced 2026-04-27 03:01:15 -04:00
quick implementation of register verification in sdk
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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],
|
||||
};
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user