use agentic_payments::prelude::*;
use chrono::{Duration as ChronoDuration, Utc};
#[tokio::main]
async fn main() -> Result<()> {
agentic_payments::init()?;
println!("🔗 Trust Chain Validation Example\n");
println!("================================================\n");
println!("1️⃣ Creating certificate hierarchy...");
println!(" Root CA → Intermediate CA → Leaf Certificate\n");
let root_identity = AgentIdentity::generate()?;
let root_cert = Certificate::new_root(
"Root CA".to_string(),
root_identity.did().to_string(),
root_identity.verifying_key_bytes().to_vec(),
Utc::now() + ChronoDuration::days(3650), )?;
println!(" ✓ Root CA Certificate created");
println!(" Subject: {}", root_cert.subject);
println!(" DID: {}", root_cert.subject_did);
println!(" Valid Until: {}", root_cert.not_after.to_rfc3339());
println!(" Is Root: {}", root_cert.is_root);
let intermediate_identity = AgentIdentity::generate()?;
let intermediate_cert = Certificate::new_intermediate(
"Intermediate CA".to_string(),
intermediate_identity.did().to_string(),
intermediate_identity.verifying_key_bytes().to_vec(),
root_cert.clone(),
&root_identity,
Utc::now() + ChronoDuration::days(1825), )?;
println!("\n ✓ Intermediate CA Certificate created");
println!(" Subject: {}", intermediate_cert.subject);
println!(" Issuer: {}", intermediate_cert.issuer);
println!(" Valid Until: {}", intermediate_cert.not_after.to_rfc3339());
let leaf_identity = AgentIdentity::generate()?;
let leaf_cert = Certificate::new_leaf(
"Leaf Certificate".to_string(),
leaf_identity.did().to_string(),
leaf_identity.verifying_key_bytes().to_vec(),
intermediate_cert.clone(),
&intermediate_identity,
Utc::now() + ChronoDuration::days(365), )?;
println!("\n ✓ Leaf Certificate created");
println!(" Subject: {}", leaf_cert.subject);
println!(" Issuer: {}", leaf_cert.issuer);
println!(" Valid Until: {}", leaf_cert.not_after.to_rfc3339());
println!(" Chain Depth: 3 (Root → Intermediate → Leaf)\n");
println!("2️⃣ Building certificate chain...");
let chain = CertificateChain::new(vec![
leaf_cert.clone(),
intermediate_cert.clone(),
root_cert.clone(),
]);
println!(" ✓ Certificate chain built");
println!(" Chain Length: {}", chain.len());
println!(" Root Certificate: {}", chain.root().subject);
println!(" Leaf Certificate: {}", chain.leaf().subject);
println!("\n3️⃣ Validating trust chain with DFS traversal...");
let trust_validator = TrustChainValidator::new();
let validation_result = trust_validator.validate_chain(&chain).await?;
println!(" ✓ Trust chain validation completed\n");
println!(" 📊 Validation Results:");
println!(" • Chain Valid: {}", if validation_result.is_valid { "✅ YES" } else { "❌ NO" });
println!(" • Chain Length: {}", validation_result.chain_length);
println!(" • Certificates Validated: {}", validation_result.certificates_validated);
println!(" • Root Trusted: {}", if validation_result.root_trusted { "✅ YES" } else { "❌ NO" });
println!(" • No Expired Certificates: {}", if validation_result.no_expired { "✅ YES" } else { "❌ NO" });
println!(" • Signatures Valid: {}", if validation_result.signatures_valid { "✅ YES" } else { "❌ NO" });
println!(" • Validation Time: {:?}", validation_result.duration);
println!("\n4️⃣ Testing chain depth limits...");
const MAX_CHAIN_DEPTH: usize = 5;
println!(" Configuration: Maximum chain depth = {}", MAX_CHAIN_DEPTH);
let mut deep_chain = vec![root_cert.clone()];
let mut current_issuer = root_identity.clone();
let mut current_cert = root_cert.clone();
for i in 0..7 {
let new_identity = AgentIdentity::generate()?;
let new_cert = Certificate::new_intermediate(
format!("Intermediate CA Level {}", i + 1),
new_identity.did().to_string(),
new_identity.verifying_key_bytes().to_vec(),
current_cert.clone(),
¤t_issuer,
Utc::now() + ChronoDuration::days(365),
)?;
deep_chain.push(new_cert.clone());
current_cert = new_cert;
current_issuer = new_identity;
}
println!(" ✓ Deep chain created with {} certificates", deep_chain.len());
let deep_chain_obj = CertificateChain::new(deep_chain);
let deep_validation = trust_validator.validate_chain_with_max_depth(
&deep_chain_obj,
MAX_CHAIN_DEPTH
).await?;
println!("\n 📊 Deep Chain Validation:");
println!(" • Chain Length: {}", deep_chain_obj.len());
println!(" • Max Depth: {}", MAX_CHAIN_DEPTH);
println!(" • Chain Valid: {}", if deep_validation.is_valid { "✅ YES" } else { "❌ NO (expected)" });
println!(" • Depth Limit Enforced: {}", if !deep_validation.is_valid && deep_chain_obj.len() > MAX_CHAIN_DEPTH { "✅ YES" } else { "❌ NO" });
println!("\n5️⃣ Testing with expired certificate...");
let expired_identity = AgentIdentity::generate()?;
let expired_cert = Certificate::new_leaf(
"Expired Certificate".to_string(),
expired_identity.did().to_string(),
expired_identity.verifying_key_bytes().to_vec(),
root_cert.clone(),
&root_identity,
Utc::now() - ChronoDuration::days(1), )?;
let expired_chain = CertificateChain::new(vec![
expired_cert.clone(),
root_cert.clone(),
]);
println!(" ⚠️ Certificate expired on: {}", expired_cert.not_after.to_rfc3339());
let expired_validation = trust_validator.validate_chain(&expired_chain).await?;
println!("\n 📊 Expired Certificate Validation:");
println!(" • Chain Valid: {}", if expired_validation.is_valid { "✅ YES" } else { "❌ NO (expected)" });
println!(" • Expiration Detected: {}", if !expired_validation.no_expired { "✅ YES" } else { "❌ NO" });
println!("\n6️⃣ Testing cross-issuer validation...");
let rogue_identity = AgentIdentity::generate()?;
let rogue_cert = Certificate::new_intermediate(
"Rogue Certificate".to_string(),
rogue_identity.did().to_string(),
rogue_identity.verifying_key_bytes().to_vec(),
root_cert.clone(),
&rogue_identity, Utc::now() + ChronoDuration::days(365),
)?;
let rogue_chain = CertificateChain::new(vec![
rogue_cert.clone(),
root_cert.clone(),
]);
println!(" ⚠️ Rogue certificate claims issuer: {}", rogue_cert.issuer);
println!(" ⚠️ But was actually signed by: {} (self)", rogue_cert.subject);
let rogue_validation = trust_validator.validate_chain(&rogue_chain).await?;
println!("\n 📊 Rogue Certificate Validation:");
println!(" • Chain Valid: {}", if rogue_validation.is_valid { "✅ YES" } else { "❌ NO (expected)" });
println!(" • Signature Mismatch Detected: {}", if !rogue_validation.signatures_valid { "✅ YES" } else { "❌ NO" });
println!("\n7️⃣ Multi-agent consensus validation...");
let consensus_validator = ConsensusChainValidator::new(5); println!(" 🔄 Distributing validation to 5 agents...");
let consensus_result = consensus_validator.validate_with_consensus(&chain).await?;
println!(" ✓ Consensus validation completed\n");
println!(" 📊 Consensus Results:");
println!(" • Total Validators: {}", consensus_result.total_validators);
println!(" • Votes FOR (Valid): {}", consensus_result.votes_for);
println!(" • Votes AGAINST (Invalid): {}", consensus_result.votes_against);
println!(" • Consensus: {}", if consensus_result.consensus_reached { "✅ REACHED" } else { "❌ NOT REACHED" });
println!(" • Agreement: {:.1}%", consensus_result.agreement_percentage);
println!(" • BFT Quorum: {}", if consensus_result.bft_quorum_met { "✅ MET" } else { "❌ NOT MET" });
println!("\n8️⃣ Performance Metrics:");
println!(" ⚡ Trust Chain Validation:");
println!(" • Valid Chain: {:?}", validation_result.duration);
println!(" • Deep Chain: {:?}", deep_validation.duration);
println!(" • Expired Chain: {:?}", expired_validation.duration);
println!(" • Rogue Chain: {:?}", rogue_validation.duration);
println!(" • Consensus Validation: {:?}", consensus_result.duration);
println!("\n================================================");
println!("✨ Summary:");
println!(" • 3-level certificate hierarchy created (Root → Intermediate → Leaf)");
println!(" • Trust chain validated with DFS traversal");
println!(" • Chain depth limits enforced (max depth: {})", MAX_CHAIN_DEPTH);
println!(" • Expired certificates properly detected");
println!(" • Rogue/invalid signatures rejected");
println!(" • Multi-agent consensus validation succeeded");
println!("\n🎉 Trust chain validation example completed successfully!");
println!("\n💡 Key Concepts:");
println!(" • Certificate Hierarchy: Root → Intermediate → Leaf structure");
println!(" • DFS Traversal: Depth-first search for chain validation");
println!(" • Chain Depth Limits: Prevent excessively deep chains");
println!(" • Expiration Checking: Validate temporal bounds");
println!(" • Signature Verification: Cryptographic proof of issuance");
Ok(())
}