use std::collections::HashMap;
use jsonprooftoken::{jpt::claims::JptClaims, jwp::{header::{IssuerProtectedHeader, PresentationProtectedHeader}, issued::JwpIssued, presented::JwpPresented}, jpa::algs::ProofAlgorithm, encoding::{base64url_encode, SerializationType}, jwk::{key::Jwk, types::KeyPairSubtype, alg_parameters::JwkAlgorithmParameters}};
use serde::Serialize;
use serde_json::{Value, json};
fn main() {
let custom_claims = serde_json::json!({
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts",
"ciao": [
{"u1": "value1"},
{"u2": "value2"}
]
},
"name": "John Doe"
});
let mut jpt_claims = JptClaims::new();
jpt_claims.set_iss("https://issuer.example".to_owned());
jpt_claims.set_claim(Some("vc"), custom_claims, true);
jpt_claims.set_claim(Some("test"), json!({
"a": "b",
"c": 1,
"d": {
"f": "g"
}
}), false);
println!("JptClaims: {:#?}", jpt_claims);
let (claims, payloads) = jpt_claims.get_claims_and_payloads();
println!("Claims: {:?}", claims);
println!("Payloads: {:?}", payloads);
let original_jpt_claims = JptClaims::from_claims_and_payloads(&claims, &payloads);
println!("Original JptClaims: {:#?}", original_jpt_claims);
let (claims2, payload2) = jpt_claims.get_claims_and_payloads();
assert_eq!(claims,claims2);
assert_eq!(payloads, payload2);
let issued_header = IssuerProtectedHeader{
typ: Some("JPT".to_owned()),
alg: ProofAlgorithm::BLS12381_SHA256,
kid: None,
cid: None,
claims: Some(claims),
};
println!("Issued Header: {:?}", issued_header);
let issued_jwp = JwpIssued::new(issued_header, payloads);
println!("ISSUED JWP: \n{:?}", issued_jwp);
let bbs_jwk = Jwk::generate(KeyPairSubtype::BLS12381SHA256).unwrap();
println!("BBS Jwk: {:?}", bbs_jwk);
let compact_issued_jwp = issued_jwp.encode(SerializationType::COMPACT, &bbs_jwk).unwrap();
println!("Compact JWP: {}", compact_issued_jwp);
let decoded_issued_jwp = JwpIssued::decode(compact_issued_jwp, SerializationType::COMPACT, &bbs_jwk.to_public().unwrap()).unwrap();
println!("DECODED ISSUED JWP \n{:?}", decoded_issued_jwp);
let presentation_header = PresentationProtectedHeader{
alg: ProofAlgorithm::BLS12381_SHA256_PROOF,
kid: None,
aud: Some("https://recipient.example.com".to_owned()),
nonce: Some("wrmBRkKtXjQ".to_owned())
};
let mut presentation_jwp = JwpPresented::new(decoded_issued_jwp.get_issuer_protected_header().clone(),presentation_header, decoded_issued_jwp.get_payloads().clone());
presentation_jwp.set_disclosed(1, false).unwrap();
presentation_jwp.set_disclosed(3, false).unwrap();
let compact_presented_jwp = presentation_jwp.encode(SerializationType::COMPACT, &bbs_jwk.to_public().unwrap(), decoded_issued_jwp.get_proof().unwrap()).unwrap();
println!("Compact Presented JWP: {}", compact_presented_jwp);
let decoded_presentation_jwp = JwpPresented::decode(compact_presented_jwp, SerializationType::COMPACT, &bbs_jwk.to_public().unwrap()).unwrap();
println!("DECODED PRESENTED JWP \n{:?}", decoded_presentation_jwp);
}