@@ -18,7 +18,9 @@ use world_id_primitives::OwnershipProof;
1818use world_id_primitives:: TREE_DEPTH ;
1919#[ cfg( not( target_arch = "wasm32" ) ) ]
2020use world_id_proof:: {
21+ ClaimsProver ,
2122 circuit_inputs:: OwnershipProofCircuitInput ,
23+ claims_proof:: { ClaimsProofContext , ClaimsProofInput , generate_claims_proof_with_prover} ,
2224 ownership_proof:: generate_ownership_proof_with_prover,
2325} ;
2426
@@ -336,6 +338,24 @@ impl Authenticator {
336338 . nullifier_material ( )
337339 . map_err ( AuthenticatorError :: ZkArtifactError ) ?;
338340
341+ #[ cfg( not( target_arch = "wasm32" ) ) ]
342+ let claims_prover = if items_to_prove. iter ( ) . any ( |item| item. claims . is_some ( ) ) {
343+ Some (
344+ self . zk_artifact_source
345+ . claims_prover ( )
346+ . map_err ( AuthenticatorError :: ZkArtifactError ) ?,
347+ )
348+ } else {
349+ None
350+ } ;
351+
352+ #[ cfg( target_arch = "wasm32" ) ]
353+ if items_to_prove. iter ( ) . any ( |item| item. claims . is_some ( ) ) {
354+ return Err ( AuthenticatorError :: Generic (
355+ "claims proofs are not available on wasm32" . to_owned ( ) ,
356+ ) ) ;
357+ }
358+
339359 // 3. Generate per-credential proofs for the selected items
340360 let creds_by_schema: std:: collections:: HashMap < u64 , & CredentialInput > = credentials
341361 . iter ( )
@@ -356,6 +376,8 @@ impl Authenticator {
356376 resolved_session_id,
357377 proof_request. proof_type ,
358378 proof_request. created_at ,
379+ #[ cfg( not( target_arch = "wasm32" ) ) ]
380+ claims_prover. as_ref ( ) ,
359381 ) ?;
360382 responses. push ( response_item) ;
361383 }
@@ -415,11 +437,14 @@ impl Authenticator {
415437 session_id : Option < SessionId > ,
416438 proof_type : ProofType ,
417439 request_timestamp : u64 ,
440+ #[ cfg( not( target_arch = "wasm32" ) ) ] claims_prover : Option < & ClaimsProver > ,
418441 ) -> Result < ResponseItem , AuthenticatorError > {
419442 let mut rng = rand:: rngs:: OsRng ;
420443
421444 let merkle_root: FieldElement = oprf_nullifier. query_proof_input . merkle_root . into ( ) ;
422445 let action_from_query: FieldElement = oprf_nullifier. query_proof_input . action . into ( ) ;
446+ let rp_id: FieldElement = oprf_nullifier. query_proof_input . rp_id . into ( ) ;
447+ let oprf_response = oprf_nullifier. verifiable_oprf_output . unblinded_response ;
423448
424449 let expires_at_min = request_item. effective_expires_at_min ( request_timestamp) ;
425450
@@ -439,7 +464,7 @@ impl Authenticator {
439464
440465 // Construct the appropriate response item based on proof type
441466 let nullifier_fe: FieldElement = nullifier. into ( ) ;
442- let response_item = if proof_type. is_session ( ) {
467+ let mut response_item = if proof_type. is_session ( ) {
443468 let session_nullifier = SessionNullifier :: new ( nullifier_fe, action_from_query) ?;
444469 ResponseItem :: new_session (
445470 request_item. identifier . clone ( ) ,
@@ -458,6 +483,35 @@ impl Authenticator {
458483 )
459484 } ;
460485
486+ #[ cfg( not( target_arch = "wasm32" ) ) ]
487+ if let Some ( claims_request) = & request_item. claims {
488+ let prover = claims_prover. ok_or_else ( || {
489+ AuthenticatorError :: Generic (
490+ "claims prover was not loaded for a claims proof request" . to_owned ( ) ,
491+ )
492+ } ) ?;
493+ let context = ClaimsProofContext {
494+ issuer_schema_id : credential. issuer_schema_id . into ( ) ,
495+ credential_public_key : credential. issuer . clone ( ) ,
496+ current_timestamp : expires_at_min. into ( ) ,
497+ cred_genesis_issued_at_min : request_item. genesis_issued_at_min . unwrap_or ( 0 ) . into ( ) ,
498+ nullifier : nullifier_fe,
499+ rp_id,
500+ action : action_from_query,
501+ } ;
502+ response_item. claims_proof = Some ( generate_claims_proof_with_prover (
503+ ClaimsProofInput {
504+ credential,
505+ credential_sub_blinding_factor,
506+ leaf_index : self . leaf_index ( ) ,
507+ oprf_response,
508+ context,
509+ request : claims_request,
510+ } ,
511+ prover. clone ( ) ,
512+ ) ?) ;
513+ }
514+
461515 Ok ( response_item)
462516 }
463517
0 commit comments