Skip to content

Commit 9f6b184

Browse files
committed
[zklogin] add support for v2 vk
1 parent ff39c4b commit 9f6b184

6 files changed

Lines changed: 439 additions & 39 deletions

File tree

fastcrypto-zkp/benches/zklogin.rs

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ mod zklogin_benches {
1717
use fastcrypto_zkp::bn254::zk_login::ZkLoginInputs;
1818
use fastcrypto_zkp::bn254::zk_login::JWK;
1919
use fastcrypto_zkp::bn254::zk_login::{JwkId, OIDCProvider};
20-
use fastcrypto_zkp::bn254::zk_login_api::ZkLoginEnv;
20+
use fastcrypto_zkp::bn254::zk_login_api::{CircuitVersion, ZkLoginEnv};
2121
use im::hashmap::HashMap as ImHashMap;
2222

2323
/// Benchmark the `fastcrypto_zkp::bn254::zk_login_api::verify_zk_login` function and it's main
@@ -40,7 +40,7 @@ mod zklogin_benches {
4040
"25769832374-famecqrhe2gkebt5fvqms2263046lj96.apps.googleusercontent.com",
4141
)
4242
.unwrap();
43-
let input = ZkLoginInputs::from_json("{\"proofPoints\":{\"a\":[\"8247215875293406890829839156897863742504615191361518281091302475904551111016\",\"6872980335748205979379321982220498484242209225765686471076081944034292159666\",\"1\"],\"b\":[[\"21419680064642047510915171723230639588631899775315750803416713283740137406807\",\"21566716915562037737681888858382287035712341650647439119820808127161946325890\"],[\"17867714710686394159919998503724240212517838710399045289784307078087926404555\",\"21812769875502013113255155836896615164559280911997219958031852239645061854221\"],[\"1\",\"0\"]],\"c\":[\"7530826803702928198368421787278524256623871560746240215547076095911132653214\",\"16244547936249959771862454850485726883972969173921727256151991751860694123976\",\"1\"]},\"issBase64Details\":{\"value\":\"yJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLC\",\"indexMod4\":1},\"headerBase64\":\"eyJhbGciOiJSUzI1NiIsImtpZCI6IjZmNzI1NDEwMWY1NmU0MWNmMzVjOTkyNmRlODRhMmQ1NTJiNGM2ZjEiLCJ0eXAiOiJKV1QifQ\"}", &address_seed.to_string()).unwrap();
43+
let input = ZkLoginInputs::from_json("{\"proofPoints\":{\"a\":[\"8247215875293406890829839156897863742504615191361518281091302475904551111016\",\"6872980335748205979379321982220498484242209225765686471076081944034292159666\",\"1\"],\"b\":[[\"21419680064642047510915171723230639588631899775315750803416713283740137406807\",\"21566716915562037737681888858382287035712341650647439119820808127161946325890\"],[\"17867714710686394159919998503724240212517838710399045289784307078087926404555\",\"21812769875502013113255155836896615164559280911997219958031852239645061854221\"],[\"1\",\"0\"]],\"c\":[\"7530826803702928198368421787278524256623871560746240215547076095911132653214\",\"16244547936249959771862454850485726883972969173921727256151991751860694123976\",\"1\"]},\"issBase64Details\":{\"value\":\"yJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLC\",\"indexMod4\":1},\"headerBase64\":\"eyJhbGciOiJSUzI1NiIsImtpZCI6IjZmNzI1NDEwMWY1NmU0MWNmMzVjOTkyNmRlODRhMmQ1NTJiNGM2ZjEiLCJ0eXAiOiJKV1QifQ\"}", &address_seed.to_string(), CircuitVersion::V1).unwrap();
4444
let kp = Ed25519KeyPair::generate(&mut StdRng::from_seed([0; 32]));
4545
let mut eph_pubkey = vec![0x00];
4646
eph_pubkey.extend(kp.public().as_ref());
@@ -95,6 +95,7 @@ mod zklogin_benches {
9595
&ZkLoginEnv::Prod,
9696
&proof,
9797
&[input_hashes],
98+
CircuitVersion::V1,
9899
)
99100
})
100101
},
@@ -114,10 +115,100 @@ mod zklogin_benches {
114115
});
115116
}
116117

118+
/// Benchmark V2 proof verification for 8192-bit RSA keys
119+
fn verify_zk_login_v2(c: &mut Criterion) {
120+
// Test values captured from test_zklogin_v2
121+
let max_epoch = 10;
122+
let address_seed =
123+
"1930628255822123795956154519923524356793387287437090556144422698180443693114";
124+
125+
let input = ZkLoginInputs::from_json(
126+
r#"{"proofPoints":{"a":["4913491815640002925508764814861178584881454035317776104347888483537912573177","17464247119089096977765585378460061328465709176842125201639874369409917083365","1"],"b":[["13623903508208593385147109129252793918112295419570003309520868038720322470557","21609423682403605552756457705069928412495291852654002331866073641632927420027"],["21392198638402084688930318789933313022805249822640479452861513428525783839707","1188996632803951473949030842369314644349566079256879538309939741515182911983"],["1","0"]],"c":["8847019028968200963788057481027139711885570926967685201543612972187276716667","14579483098715294861159755601821797996287919909580326110060065627124968449243","1"]},"issBase64Details":{"value":"wiaXNzIjoiaHR0cHM6Ly9qd3QtdGVzdGVyLm15c3RlbmxhYnMuY29tIiw","indexMod4":2},"headerBase64":"eyJraWQiOiJzdWkta2V5LWlkLTgxOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9","addressSeed":"1930628255822123795956154519923524356793387287437090556144422698180443693114"}"#,
127+
address_seed,
128+
CircuitVersion::V2
129+
).unwrap();
130+
131+
let kp = Ed25519KeyPair::generate(&mut StdRng::from_seed([0; 32]));
132+
let mut eph_pubkey = vec![0x00];
133+
eph_pubkey.extend(kp.public().as_ref());
134+
135+
let mut map = ImHashMap::new();
136+
let content = JWK {
137+
kty: "RSA".to_string(),
138+
e: "AQAB".to_string(),
139+
n: "lViYJOuLB6EZenCimgyWrwOH_QBEkCZxSIEfcQgP5MrZkRlohbrTAN1YpXGRaqugp9A4mRzCmi9ddXscpRBSsLefdPJJLG8lQZ2qrw6X2-6HD5kDFd6-K7JZS-_GOEfr5xGEDm8_MS_SorbmneKspL0n4MPYWH8qke4OBFCwL6WzGBU9rqDuvhYmafmkvVvOtHIqekBxNrCud7Spv43BHdiBM0V-jUquuNM3oK97i_GVLjGfwrGRpR3tK4nva_ryiHh9Ajs68If7-ZhIoLJ05lRsHJJpqsloiEqlCZwhge9zEMnNkoaIzdQr-xLy0GPnr5W0gikjlSGYiInfx9ITADwK3W33xdOB7npM7lqJY73Njbuw8hBQicU8t0M0gvvWfmh1KDeA5IqffZgue-ka9Jj1nrYmZtd0JimQpPDUiGbLv69gQJZcLVQWf9z6mVC4gNm8VU2OafssnolrvNndC3wIm8AgqzVzn_DIOcMQdhIe8jTF3hu1_6R4Id3KoA5Hb3uI2H86-8RjhSG2wKb3zi44yKSmxEDhzl7i450PQX64JK4ftv5jb9vSw5unpikmVvGlGsuvrqWFuWKBcrcXLgyar8pGvRO8fR9ifDHSj-D2fBiLnhK0-iqsJeU8XnfJhUvKxSjXejwsoQeLqlgq9-PgCDP3dE61fkqGpJ1UZjZ44Q9Vh4YLCPAO6oX8btXSkwreuP5m0UtWgFsc-ynWbt6NYS7JlsMtJNWybM4_auqRdil_cPMwFsUgjocztGLeG304YH-GehmyBJyGKuDIiXL9RfLoZ35jKawrWJb4UqckKWV5kOKeXsXdKtMw96ABFumcnhrzxAsqwshS5a2lT8P7Cdd9g3T1JXI7JM1AnJU9_gPXmJoc3yEFNf-JxEf00URoy2xUusyyxYdTswLJp3NQP4VjrAGwnsp7gHKC-V-mJ21FpQCHsV0JQ-1x-E3du9hkpsjTtGkffetEsV8k9enbkudox7WIlsnPcA8y7aY4lnaBqLLSzaj2GOf4KTN4cRpcPzOmSvgcVVYYQXDjRw45X86P1WJG8UDl6Wkl044tAdQRuIxW8QVzBFWWxeXcoagOBKn1_DV0RKUX9Ud4LLauy81rUNfoAcnolz9nippTBEZA_4OOBvXhdngCYaoZyjAkmYdPhKIkghGhKoVVKiEJ1Ua6nUr3zB9WFlTO9lODeV9h0tgKGtKGu3UBeaRCQSMv9gZK-eGIpcqjsqK_rEf4htdDZUBzfOJ0VtCiFYUUBPiuJNuIf9xQGVDE7qZufK1irvGug8jvWSWzB4pGLP75PnPH7B9axnXrxssaIR90Y3Vr9ih_ptzcfNrwD_wiGHUTy698FHu2fXp51HbSEQ".to_string(),
140+
alg: "RS256".to_string(),
141+
};
142+
143+
map.insert(
144+
JwkId::new(
145+
OIDCProvider::TestIssuerKey8192.get_config().iss,
146+
"sui-key-id-8192".to_string(),
147+
),
148+
content.clone(),
149+
);
150+
151+
let modulus = Base64UrlUnpadded::decode_vec(&content.n)
152+
.map_err(|_| {
153+
FastCryptoError::GeneralError("Invalid Base64 encoded jwk modulus".to_string())
154+
})
155+
.unwrap();
156+
157+
// Benchmark the `as_arkworks` function called by `verify_zk_login`.
158+
let input_clone = input.clone();
159+
c.bench_function("verify_zk_login_v2/as_arkworks", move |b| {
160+
b.iter(|| input_clone.get_proof().as_arkworks().unwrap())
161+
});
162+
163+
// Benchmark the `calculate_all_inputs_hash` function called by `verify_zk_login`.
164+
let eph_pubkey_clone = eph_pubkey.clone();
165+
let input_clone = input.clone();
166+
let modulus_clone = modulus.clone();
167+
c.bench_function("verify_zk_login_v2/calculate_all_inputs_hash", move |b| {
168+
b.iter(|| {
169+
input_clone
170+
.calculate_all_inputs_hash(&eph_pubkey_clone, &modulus_clone, max_epoch)
171+
.unwrap()
172+
});
173+
});
174+
let input_hashes = input
175+
.calculate_all_inputs_hash(&eph_pubkey, &modulus, max_epoch)
176+
.unwrap();
177+
178+
// Benchmark the `verify_zk_login_proof_with_fixed_vk` function called by `verify_zk_login`.
179+
let proof = input.get_proof().as_arkworks().unwrap();
180+
c.bench_function(
181+
"verify_zk_login_v2/verify_zk_login_proof_with_fixed_vk",
182+
move |b| {
183+
b.iter(|| {
184+
fastcrypto_zkp::bn254::zk_login_api::verify_zk_login_proof_with_fixed_vk(
185+
&ZkLoginEnv::Test,
186+
&proof,
187+
&[input_hashes],
188+
CircuitVersion::V2,
189+
)
190+
})
191+
},
192+
);
193+
194+
// Benchmark the entire `verify_zk_login` function.
195+
c.bench_function("verify_zk_login_v2", move |b| {
196+
b.iter(|| {
197+
fastcrypto_zkp::bn254::zk_login_api::verify_zk_login(
198+
&input,
199+
max_epoch,
200+
&eph_pubkey,
201+
&map,
202+
&ZkLoginEnv::Test,
203+
)
204+
})
205+
});
206+
}
207+
117208
criterion_group! {
118209
name = zklogin_benches;
119210
config = Criterion::default();
120-
targets = verify_zk_login,
211+
targets = verify_zk_login, verify_zk_login_v2,
121212
}
122213
}
123214

fastcrypto-zkp/src/bn254/unit_tests/zk_login_e2e_tests.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::bn254::zk_login::fetch_jwks;
99
use crate::bn254::{
1010
utils::{gen_address_seed, get_proof},
1111
zk_login::{JwkId, OIDCProvider, ZkLoginInputs, JWK},
12-
zk_login_api::{verify_zk_login, ZkLoginEnv},
12+
zk_login_api::{verify_zk_login, CircuitVersion, ZkLoginEnv},
1313
};
1414
use ark_std::rand::{rngs::StdRng, SeedableRng};
1515
use fastcrypto::jwt_utils::parse_and_validate_jwt;
@@ -272,7 +272,8 @@ async fn get_test_inputs(parsed_token: &str) -> (u64, Vec<u8>, ZkLoginInputs) {
272272
let (sub, aud, _) = parse_and_validate_jwt(parsed_token).unwrap();
273273
// Get the address seed.
274274
let address_seed = gen_address_seed(user_salt, "sub", &sub, &aud).unwrap();
275-
let zk_login_inputs = ZkLoginInputs::from_reader(reader, &address_seed).unwrap();
275+
let zk_login_inputs =
276+
ZkLoginInputs::from_reader(reader, &address_seed, CircuitVersion::V1).unwrap();
276277
(max_epoch, eph_pubkey, zk_login_inputs)
277278
}
278279

@@ -345,7 +346,8 @@ async fn test_end_to_end_test_issuer(test_input: TestInputStruct) {
345346
// Get the address seed.
346347
let address_seed = gen_address_seed(&user_salt, "sub", &sub, &aud).unwrap();
347348
let zk_login_inputs =
348-
ZkLoginInputs::from_reader(reader, &address_seed.to_string()).unwrap();
349+
ZkLoginInputs::from_reader(reader, &address_seed.to_string(), CircuitVersion::V1)
350+
.unwrap();
349351

350352
// Make a map of jwk ids to jwks just for Microsoft.
351353
let iss = zk_login_inputs.get_iss();

0 commit comments

Comments
 (0)