world_id_primitives/
circuit_inputs.rs1use std::collections::HashMap;
6
7use groth16_material::circom::ProofInput;
8use ruint::aliases::U256;
9
10use crate::authenticator::MAX_AUTHENTICATOR_KEYS;
11
12type BaseField = ark_babyjubjub::Fq;
13type ScalarField = ark_babyjubjub::Fr;
14type Affine = ark_babyjubjub::EdwardsAffine;
15
16#[inline]
17pub(crate) fn fq_to_u256_vec(f: ark_babyjubjub::Fq) -> Vec<U256> {
18 vec![f.into()]
19}
20
21#[inline]
22pub(crate) fn fq_seq_to_u256_vec(fs: &[ark_babyjubjub::Fq]) -> Vec<U256> {
23 fs.iter().copied().map(Into::into).collect()
24}
25
26#[inline]
27pub(crate) fn fr_to_u256_vec(f: ark_babyjubjub::Fr) -> Vec<U256> {
28 vec![f.into()]
29}
30
31#[inline]
32pub(crate) fn affine_to_u256_vec(p: ark_babyjubjub::EdwardsAffine) -> Vec<U256> {
33 vec![p.x.into(), p.y.into()]
34}
35
36#[inline]
37pub(crate) fn affine_seq_to_u256_vec(ps: &[ark_babyjubjub::EdwardsAffine]) -> Vec<U256> {
38 ps.iter()
39 .copied()
40 .flat_map(|p| [p.x.into(), p.y.into()])
41 .collect()
42}
43
44#[derive(Debug, Clone)]
48pub struct QueryProofCircuitInput<const MAX_DEPTH: usize> {
49 pub pk: [Affine; MAX_AUTHENTICATOR_KEYS],
51 pub pk_index: BaseField,
53 pub s: ScalarField,
55 pub r: Affine,
57 pub merkle_root: BaseField,
59 pub depth: BaseField,
61 pub mt_index: BaseField,
65 pub siblings: [BaseField; MAX_DEPTH],
67 pub beta: ScalarField,
69 pub rp_id: BaseField,
73 pub action: BaseField,
75 pub nonce: BaseField,
77}
78
79impl<const MAX_DEPTH: usize> ProofInput for QueryProofCircuitInput<MAX_DEPTH> {
80 fn prepare_input(&self) -> HashMap<String, Vec<U256>> {
81 let mut map = HashMap::new();
82 map.insert("pk".to_owned(), affine_seq_to_u256_vec(&self.pk));
83 map.insert("pk_index".to_owned(), fq_to_u256_vec(self.pk_index));
84 map.insert("s".to_owned(), fr_to_u256_vec(self.s));
85 map.insert("r".to_owned(), affine_to_u256_vec(self.r));
86 map.insert("merkle_root".to_owned(), fq_to_u256_vec(self.merkle_root));
87 map.insert("depth".to_owned(), fq_to_u256_vec(self.depth));
88 map.insert("mt_index".to_owned(), fq_to_u256_vec(self.mt_index));
89 map.insert("siblings".to_owned(), fq_seq_to_u256_vec(&self.siblings));
90 map.insert("beta".to_owned(), fr_to_u256_vec(self.beta));
91 map.insert("rp_id".to_owned(), fq_to_u256_vec(self.rp_id));
92 map.insert("action".to_owned(), fq_to_u256_vec(self.action));
93 map.insert("nonce".to_owned(), fq_to_u256_vec(self.nonce));
94 map
95 }
96}
97
98#[derive(Debug, Clone)]
102pub struct NullifierProofCircuitInput<const MAX_DEPTH: usize> {
103 pub query_input: QueryProofCircuitInput<MAX_DEPTH>,
105
106 pub issuer_schema_id: BaseField,
111 pub cred_pk: Affine,
113 pub cred_hashes: [BaseField; 2],
116 pub cred_genesis_issued_at: BaseField,
118 pub cred_expires_at: BaseField,
120 pub cred_s: ScalarField,
122 pub cred_r: Affine,
124 pub current_timestamp: BaseField,
126 pub cred_genesis_issued_at_min: BaseField,
128 pub cred_sub_blinding_factor: BaseField,
130 pub cred_id: BaseField,
132
133 pub id_commitment_r: BaseField,
138
139 pub id_commitment: BaseField,
144
145 pub dlog_e: BaseField,
148 pub dlog_s: ScalarField,
150 pub oprf_pk: Affine,
152 pub oprf_response_blinded: Affine,
154 pub oprf_response: Affine,
156
157 pub signal_hash: BaseField,
160}
161
162impl<const MAX_DEPTH: usize> ProofInput for NullifierProofCircuitInput<MAX_DEPTH> {
163 fn prepare_input(&self) -> std::collections::HashMap<String, Vec<ruint::aliases::U256>> {
164 let mut map = self.query_input.prepare_input();
165 map.insert(
166 "issuer_schema_id".to_owned(),
167 fq_to_u256_vec(self.issuer_schema_id),
168 );
169 map.insert("cred_pk".to_owned(), affine_to_u256_vec(self.cred_pk));
170 map.insert(
171 "cred_hashes".to_owned(),
172 fq_seq_to_u256_vec(&self.cred_hashes),
173 );
174 map.insert(
175 "cred_genesis_issued_at".to_owned(),
176 fq_to_u256_vec(self.cred_genesis_issued_at),
177 );
178 map.insert(
179 "cred_genesis_issued_at_min".to_owned(),
180 fq_to_u256_vec(self.cred_genesis_issued_at_min),
181 );
182 map.insert(
183 "cred_expires_at".to_owned(),
184 fq_to_u256_vec(self.cred_expires_at),
185 );
186 map.insert("cred_id".to_owned(), fq_to_u256_vec(self.cred_id));
187 map.insert(
188 "cred_user_id_r".to_owned(),
189 fq_to_u256_vec(self.cred_sub_blinding_factor),
190 );
191 map.insert("cred_s".to_owned(), fr_to_u256_vec(self.cred_s));
192 map.insert("cred_r".to_owned(), affine_to_u256_vec(self.cred_r));
193
194 map.insert(
195 "id_commitment_r".to_owned(),
196 fq_to_u256_vec(self.id_commitment_r),
197 );
198 map.insert(
199 "id_commitment".to_owned(),
200 fq_to_u256_vec(self.id_commitment),
201 );
202
203 map.insert("dlog_e".to_owned(), fq_to_u256_vec(self.dlog_e));
204 map.insert("dlog_s".to_owned(), fr_to_u256_vec(self.dlog_s));
205 map.insert("oprf_pk".to_owned(), affine_to_u256_vec(self.oprf_pk));
206 map.insert(
207 "oprf_response_blinded".to_owned(),
208 affine_to_u256_vec(self.oprf_response_blinded),
209 );
210 map.insert(
211 "oprf_response".to_owned(),
212 affine_to_u256_vec(self.oprf_response),
213 );
214 map.insert("signal_hash".to_owned(), fq_to_u256_vec(self.signal_hash));
215 map.insert(
216 "current_timestamp".to_owned(),
217 fq_to_u256_vec(self.current_timestamp),
218 );
219
220 map
221 }
222}