use super::error::AidError;
use actr_protocol::prost::Message as ProstMessage;
use actr_protocol::{AIdCredential, IdentityClaims};
use ed25519_dalek::{Signature, Verifier, VerifyingKey};
pub struct AIdCredentialVerifier;
impl AIdCredentialVerifier {
pub fn verify(
credential: &AIdCredential,
verifying_key: &VerifyingKey,
) -> Result<IdentityClaims, AidError> {
crate::recording::debug!(
"验证 AIdCredential Ed25519 签名:key_id={}, claims_len={}",
credential.key_id,
credential.claims.len()
);
let sig_bytes: [u8; 64] = credential.signature[..].try_into().map_err(|_| {
AidError::InvalidSignature(format!(
"signature 长度无效:期望 64 bytes,实际 {} bytes",
credential.signature.len()
))
})?;
let signature = Signature::from_bytes(&sig_bytes);
verifying_key
.verify(&credential.claims[..], &signature)
.map_err(|e| AidError::InvalidSignature(format!("Ed25519 签名验证失败:{e}")))?;
let claims = IdentityClaims::decode(&credential.claims[..])
.map_err(|e| AidError::DecodeFailure(format!("IdentityClaims proto 解码失败:{e}")))?;
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
if claims.expires_at <= now {
return Err(AidError::Expired);
}
crate::recording::debug!(
"AIdCredential 验证通过:key_id={}, actor_id={}, expires_at={}",
credential.key_id,
claims.actor_id,
claims.expires_at
);
Ok(claims)
}
}