Add sub proof request to proof verifier.
The order of sub-proofs is important: both Prover and Verifier should use the same order.
proof_verifier
- Proof verifier.
credential_schema
- Credential schema.
credential_pub_key
- Credential public key.
rev_reg_pub
- Revocation registry public key.
sub_proof_request
- Requested attributes and predicates instance pointer.
#Example
use indy_crypto::cl::issuer::Issuer;
use indy_crypto::cl::verifier::Verifier;
let mut credential_schema_builder = Issuer::new_credential_schema_builder().unwrap();
credential_schema_builder.add_attr("sex").unwrap();
let credential_schema = credential_schema_builder.finalize().unwrap();
let mut non_credential_schema_builder = Issuer::new_non_credential_schema_builder().unwrap();
non_credential_schema_builder.add_attr("master_secret").unwrap();
let non_credential_schema = non_credential_schema_builder.finalize().unwrap();
let (credential_pub_key, credential_priv_key, cred_key_correctness_proof) = Issuer::new_credential_def(&credential_schema, &non_credential_schema, false).unwrap();
let (credential_pub_key, _credential_priv_key, _credential_key_correctness_proof) = Issuer::new_credential_def(&credential_schema, &non_credential_schema, false).unwrap();
let mut sub_proof_request_builder = Verifier::new_sub_proof_request_builder().unwrap();
sub_proof_request_builder.add_revealed_attr("sex").unwrap();
let sub_proof_request = sub_proof_request_builder.finalize().unwrap();
let mut proof_verifier = Verifier::new_proof_verifier().unwrap();
proof_verifier.add_sub_proof_request(&sub_proof_request,
&credential_schema,
&non_credential_schema,
&credential_pub_key,
None,
None).unwrap();
Verifies proof.
proof_verifier
- Proof verifier.
proof
- Proof generated by Prover.
nonce
- Nonce.
#Example
use indy_crypto::cl::new_nonce;
use indy_crypto::cl::issuer::Issuer;
use indy_crypto::cl::prover::Prover;
use indy_crypto::cl::verifier::Verifier;
let mut credential_schema_builder = Issuer::new_credential_schema_builder().unwrap();
credential_schema_builder.add_attr("sex").unwrap();
let credential_schema = credential_schema_builder.finalize().unwrap();
let mut non_credential_schema_builder = Issuer::new_non_credential_schema_builder().unwrap();
non_credential_schema_builder.add_attr("master_secret").unwrap();
let non_credential_schema = non_credential_schema_builder.finalize().unwrap();
let (credential_pub_key, credential_priv_key, cred_key_correctness_proof) = Issuer::new_credential_def(&credential_schema, &non_credential_schema, false).unwrap();
let master_secret = Prover::new_master_secret().unwrap();
let mut credential_values_builder = Issuer::new_credential_values_builder().unwrap();
credential_values_builder.add_value_hidden("master_secret", &master_secret.value().unwrap()).unwrap();
credential_values_builder.add_dec_known("sex", "5944657099558967239210949258394887428692050081607692519917050011144233115103").unwrap();
let credential_values = credential_values_builder.finalize().unwrap();
let credential_nonce = new_nonce().unwrap();
let (blinded_credential_secrets, credential_secrets_blinding_factors, blinded_credential_secrets_correctness_proof) =
Prover::blind_credential_secrets(&credential_pub_key, &cred_key_correctness_proof, &credential_values, &credential_nonce).unwrap();
let credential_issuance_nonce = new_nonce().unwrap();
let (mut credential_signature, signature_correctness_proof) =
Issuer::sign_credential("CnEDk9HrMnmiHXEV1WFgbVCRteYnPqsJwrTdcZaNhFVW",
&blinded_credential_secrets,
&blinded_credential_secrets_correctness_proof,
&credential_nonce,
&credential_issuance_nonce,
&credential_values,
&credential_pub_key,
&credential_priv_key).unwrap();
Prover::process_credential_signature(&mut credential_signature,
&credential_values,
&signature_correctness_proof,
&credential_secrets_blinding_factors,
&credential_pub_key,
&credential_issuance_nonce,
None, None, None).unwrap();
let mut sub_proof_request_builder = Verifier::new_sub_proof_request_builder().unwrap();
sub_proof_request_builder.add_revealed_attr("sex").unwrap();
let sub_proof_request = sub_proof_request_builder.finalize().unwrap();
let mut proof_builder = Prover::new_proof_builder().unwrap();
proof_builder.add_common_attribute("master_secret").unwrap();
proof_builder.add_sub_proof_request(&sub_proof_request,
&credential_schema,
&non_credential_schema,
&credential_signature,
&credential_values,
&credential_pub_key,
None,
None).unwrap();
let proof_request_nonce = new_nonce().unwrap();
let proof = proof_builder.finalize(&proof_request_nonce).unwrap();
let mut proof_verifier = Verifier::new_proof_verifier().unwrap();
proof_verifier.add_sub_proof_request(&sub_proof_request,
&credential_schema,
&non_credential_schema,
&credential_pub_key,
None,
None).unwrap();
assert!(proof_verifier.verify(&proof, &proof_request_nonce).unwrap());