Skip to content

Commit

Permalink
Added PMNEOpt2Verifier2 (#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
KyrylR authored Sep 17, 2024
1 parent b24d8ee commit 1ebd385
Show file tree
Hide file tree
Showing 5 changed files with 233 additions and 0 deletions.
225 changes: 225 additions & 0 deletions contracts/passport/verifiers2/mne/PMNEOpt2Verifier2.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
// SPDX-License-Identifier: GPL-3.0
/*
Copyright 2021 0KIMS association.
This file is generated with [snarkJS](https://github.com/iden3/snarkjs).
snarkJS is a free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
snarkJS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with snarkJS. If not, see <https://www.gnu.org/licenses/>.
*/

pragma solidity >=0.7.0 <0.9.0;

contract PMNEOpt2Verifier2 {
// Scalar field size
uint256 constant r =
21888242871839275222246405745257275088548364400416034343698204186575808495617;
// Base field size
uint256 constant q =
21888242871839275222246405745257275088696311157297823662689037894645226208583;

// Verification Key data
uint256 constant alphax =
20491192805390485299153009773594534940189261866228447918068658471970481763042;
uint256 constant alphay =
9383485363053290200918347156157836566562967994039712273449902621266178545958;
uint256 constant betax1 =
4252822878758300859123897981450591353533073413197771768651442665752259397132;
uint256 constant betax2 =
6375614351688725206403948262868962793625744043794305715222011528459656738731;
uint256 constant betay1 =
21847035105528745403288232691147584728191162732299865338377159692350059136679;
uint256 constant betay2 =
10505242626370262277552901082094356697409835680220590971873171140371331206856;
uint256 constant gammax1 =
11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 constant gammax2 =
10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 constant gammay1 =
4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 constant gammay2 =
8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 constant deltax1 =
19484524335462019341378416921315268325210903175320307054308708800504372009877;
uint256 constant deltax2 =
3680027869724098502980767019876040948142302193847857383041313321918984837290;
uint256 constant deltay1 =
11540647392878963292339604772639991973699523818740282287379481587106055336191;
uint256 constant deltay2 =
6675713881723496150057209508773352751097793107742241188537955172570335976629;

uint256 constant IC0x =
10032064685549173325662610058707084202512847744512120211382780665741141078262;
uint256 constant IC0y =
17417324569368772028319583950154258664588380858177916776666734175895343599840;

uint256 constant IC1x =
1140910774619075569104685306135178356060035546964139713694970173836299704748;
uint256 constant IC1y =
2348933249983899680547085680749969045164121384439813966026217488112301238877;

uint256 constant IC2x =
17331689126957356334349359398356442905134716151922462938270150774114689115943;
uint256 constant IC2y =
5088930689924209474541910882615958763907702825000420010910765073392199606376;

uint256 constant IC3x =
9634445201649234246683123434545974656072498629317000674956793993179361214698;
uint256 constant IC3y =
6731939726549893499947379478593769463834525449830284348624938069013518555815;

uint256 constant IC4x =
4335212990295266407871990284622188899632501438665773754469526208239098092051;
uint256 constant IC4y =
21268024059527578545842352192089225100717127580676019830766086489124307441559;

uint256 constant IC5x =
15780995396140346604134311722038835872296707099821808617697242402223090791885;
uint256 constant IC5y =
6455310990522558695204193864016830645646215301175593809153774355010036058651;

// Memory data
uint16 constant pVk = 0;
uint16 constant pPairing = 128;

uint16 constant pLastMem = 896;

function verifyProof(
uint[2] calldata _pA,
uint[2][2] calldata _pB,
uint[2] calldata _pC,
uint[5] calldata _pubSignals
) public view returns (bool) {
assembly {
function checkField(v) {
if iszero(lt(v, q)) {
mstore(0, 0)
return(0, 0x20)
}
}

// G1 function to multiply a G1 value(x,y) to value in an address
function g1_mulAccC(pR, x, y, s) {
let success
let mIn := mload(0x40)
mstore(mIn, x)
mstore(add(mIn, 32), y)
mstore(add(mIn, 64), s)

success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)

if iszero(success) {
mstore(0, 0)
return(0, 0x20)
}

mstore(add(mIn, 64), mload(pR))
mstore(add(mIn, 96), mload(add(pR, 32)))

success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)

if iszero(success) {
mstore(0, 0)
return(0, 0x20)
}
}

function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {
let _pPairing := add(pMem, pPairing)
let _pVk := add(pMem, pVk)

mstore(_pVk, IC0x)
mstore(add(_pVk, 32), IC0y)

// Compute the linear combination vk_x

g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))

g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))

g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))

g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))

g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))

// -A
mstore(_pPairing, calldataload(pA))
mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))

// B
mstore(add(_pPairing, 64), calldataload(pB))
mstore(add(_pPairing, 96), calldataload(add(pB, 32)))
mstore(add(_pPairing, 128), calldataload(add(pB, 64)))
mstore(add(_pPairing, 160), calldataload(add(pB, 96)))

// alpha1
mstore(add(_pPairing, 192), alphax)
mstore(add(_pPairing, 224), alphay)

// beta2
mstore(add(_pPairing, 256), betax1)
mstore(add(_pPairing, 288), betax2)
mstore(add(_pPairing, 320), betay1)
mstore(add(_pPairing, 352), betay2)

// vk_x
mstore(add(_pPairing, 384), mload(add(pMem, pVk)))
mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))

// gamma2
mstore(add(_pPairing, 448), gammax1)
mstore(add(_pPairing, 480), gammax2)
mstore(add(_pPairing, 512), gammay1)
mstore(add(_pPairing, 544), gammay2)

// C
mstore(add(_pPairing, 576), calldataload(pC))
mstore(add(_pPairing, 608), calldataload(add(pC, 32)))

// delta2
mstore(add(_pPairing, 640), deltax1)
mstore(add(_pPairing, 672), deltax2)
mstore(add(_pPairing, 704), deltay1)
mstore(add(_pPairing, 736), deltay2)

let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)

isOk := and(success, mload(_pPairing))
}

let pMem := mload(0x40)
mstore(0x40, add(pMem, pLastMem))

// Validate that all evaluations ∈ F

checkField(calldataload(add(_pubSignals, 0)))

checkField(calldataload(add(_pubSignals, 32)))

checkField(calldataload(add(_pubSignals, 64)))

checkField(calldataload(add(_pubSignals, 96)))

checkField(calldataload(add(_pubSignals, 128)))

checkField(calldataload(add(_pubSignals, 160)))

// Validate all evaluations
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)

mstore(0, isValid)
return(0, 0x20)
}
}
}
1 change: 1 addition & 0 deletions contracts/registration/types.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ bytes32 constant Z_UNIVERSAL_PSS_2048_S64_E17 = keccak256("Z_UNIVERSAL_PSS_2048_
bytes32 constant Z_INTERNAL = keccak256("Z_INTERNAL");
bytes32 constant Z_INTERNAL_OPT = keccak256("Z_INTERNAL_OPT");
bytes32 constant Z_MNE_OPT = keccak256("Z_MNE_OPT");
bytes32 constant Z_MNE_OPT_2 = keccak256("Z_MNE_OPT_2");
4 changes: 4 additions & 0 deletions deploy/10_setup.migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
PMNEOptVerifier2__factory,
Registration2Mock__factory,
StateKeeperMock__factory,
PMNEOpt2Verifier2__factory,
} from "@ethers-v6";

import {
Expand All @@ -40,6 +41,7 @@ import {
Z_INTERNAL,
Z_INTERNAL_OPT,
Z_MNE_OPT,
Z_MNE_OPT_2,
} from "@/scripts/utils/types";

import { getConfig } from "./config/config";
Expand Down Expand Up @@ -77,6 +79,7 @@ export = async (deployer: Deployer) => {
const pInternalVerifier = await deployer.deployed(PInternalVerifier2__factory);
const pInternalOptVerifier = await deployer.deployed(PInternalOptVerifier2__factory);
const pMneOptVerifier = await deployer.deployed(PMNEOptVerifier2__factory);
const pMneOpt2Verifier = await deployer.deployed(PMNEOpt2Verifier2__factory);

await registration.mockAddCertificateDispatcher(C_RSA_SHA1_4096, await cRsa4096Sha1Dispatcher.getAddress());
await registration.mockAddCertificateDispatcher(C_RSA_SHA1_2048, await cRsa2048Sha1Dispatcher.getAddress());
Expand Down Expand Up @@ -115,6 +118,7 @@ export = async (deployer: Deployer) => {
await registration.mockAddPassportVerifier(Z_INTERNAL, await pInternalVerifier.getAddress());
await registration.mockAddPassportVerifier(Z_INTERNAL_OPT, await pInternalOptVerifier.getAddress());
await registration.mockAddPassportVerifier(Z_MNE_OPT, await pMneOptVerifier.getAddress());
await registration.mockAddPassportVerifier(Z_MNE_OPT_2, await pMneOpt2Verifier.getAddress());

await stateKeeper.mockAddRegistrations([config.registrationName], [await registration.getAddress()]);
};
2 changes: 2 additions & 0 deletions deploy/helpers/verifiers/passport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
PInternalVerifier2__factory,
PInternalOptVerifier2__factory,
PMNEOptVerifier2__factory,
PMNEOpt2Verifier2__factory,
} from "@ethers-v6";

export const deployPVerifiers = async (deployer: Deployer) => {
Expand All @@ -25,4 +26,5 @@ export const deployPVerifiers = async (deployer: Deployer) => {
await deployer.deploy(PInternalOptVerifier2__factory);

await deployer.deploy(PMNEOptVerifier2__factory);
await deployer.deploy(PMNEOpt2Verifier2__factory);
};
1 change: 1 addition & 0 deletions scripts/utils/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ export const Z_UNIVERSAL_PSS_2048_S64_E17 = keccak256(["string"], ["Z_UNIVERSAL_
export const Z_INTERNAL = keccak256(["string"], ["Z_INTERNAL"]);
export const Z_INTERNAL_OPT = keccak256(["string"], ["Z_INTERNAL_OPT"]);
export const Z_MNE_OPT = keccak256(["string"], ["Z_MNE_OPT"]);
export const Z_MNE_OPT_2 = keccak256(["string"], ["Z_MNE_OPT_2"]);

0 comments on commit 1ebd385

Please sign in to comment.