platform/aid/credential/
verifier.rs1use super::error::AidError;
9use actr_protocol::prost::Message as ProstMessage;
10use actr_protocol::{AIdCredential, IdentityClaims};
11use ed25519_dalek::{Signature, Verifier, VerifyingKey};
12
13pub struct AIdCredentialVerifier;
18
19impl AIdCredentialVerifier {
20 pub fn verify(
36 credential: &AIdCredential,
37 verifying_key: &VerifyingKey,
38 ) -> Result<IdentityClaims, AidError> {
39 crate::recording::debug!(
40 "验证 AIdCredential Ed25519 签名:key_id={}, claims_len={}",
41 credential.key_id,
42 credential.claims.len()
43 );
44
45 let sig_bytes: [u8; 64] = credential.signature[..].try_into().map_err(|_| {
47 AidError::InvalidSignature(format!(
48 "signature 长度无效:期望 64 bytes,实际 {} bytes",
49 credential.signature.len()
50 ))
51 })?;
52 let signature = Signature::from_bytes(&sig_bytes);
53
54 verifying_key
56 .verify(&credential.claims[..], &signature)
57 .map_err(|e| AidError::InvalidSignature(format!("Ed25519 签名验证失败:{e}")))?;
58
59 let claims = IdentityClaims::decode(&credential.claims[..])
61 .map_err(|e| AidError::DecodeFailure(format!("IdentityClaims proto 解码失败:{e}")))?;
62
63 let now = std::time::SystemTime::now()
65 .duration_since(std::time::UNIX_EPOCH)
66 .unwrap_or_default()
67 .as_secs();
68
69 if claims.expires_at <= now {
70 return Err(AidError::Expired);
71 }
72
73 crate::recording::debug!(
74 "AIdCredential 验证通过:key_id={}, actor_id={}, expires_at={}",
75 credential.key_id,
76 claims.actor_id,
77 claims.expires_at
78 );
79
80 Ok(claims)
81 }
82}