20260324 完成和routinator对齐snapshot delta replay correctness一致
This commit is contained in:
@@ -20,6 +20,8 @@ pub struct ResourceEeCertificate {
|
||||
pub raw_der: Vec<u8>,
|
||||
pub subject_key_identifier: Vec<u8>,
|
||||
pub spki_der: Vec<u8>,
|
||||
pub rsa_public_modulus: Vec<u8>,
|
||||
pub rsa_public_exponent: Vec<u8>,
|
||||
pub sia_signed_object_uris: Vec<String>,
|
||||
pub resource_cert: ResourceCertificate,
|
||||
}
|
||||
@@ -324,7 +326,10 @@ impl RpkiSignedObject {
|
||||
/// Verify the CMS signature using the embedded EE certificate public key.
|
||||
pub fn verify_signature(&self) -> Result<(), SignedObjectVerifyError> {
|
||||
let ee = &self.signed_data.certificates[0];
|
||||
self.verify_signature_with_ee_spki_der(&ee.spki_der)
|
||||
self.verify_signature_with_rsa_components(
|
||||
&ee.rsa_public_modulus,
|
||||
&ee.rsa_public_exponent,
|
||||
)
|
||||
}
|
||||
|
||||
/// Verify the CMS signature using a DER-encoded SubjectPublicKeyInfo.
|
||||
@@ -360,10 +365,21 @@ impl RpkiSignedObject {
|
||||
_ => return Err(SignedObjectVerifyError::UnsupportedEePublicKeyAlgorithm),
|
||||
};
|
||||
|
||||
self.verify_signature_with_rsa_components(n.as_slice(), e.as_slice())
|
||||
}
|
||||
|
||||
fn verify_signature_with_rsa_components(
|
||||
&self,
|
||||
modulus: &[u8],
|
||||
exponent: &[u8],
|
||||
) -> Result<(), SignedObjectVerifyError> {
|
||||
let signer = &self.signed_data.signer_infos[0];
|
||||
let msg = &signer.signed_attrs_der_for_signature;
|
||||
|
||||
let pk = ring::signature::RsaPublicKeyComponents { n, e };
|
||||
let pk = ring::signature::RsaPublicKeyComponents {
|
||||
n: modulus,
|
||||
e: exponent,
|
||||
};
|
||||
pk.verify(
|
||||
&ring::signature::RSA_PKCS1_2048_8192_SHA256,
|
||||
msg,
|
||||
@@ -736,6 +752,35 @@ fn validate_ee_certificate(der: &[u8]) -> Result<ResourceEeCertificate, SignedOb
|
||||
.ok_or(SignedObjectValidateError::EeCertificateMissingSki)?;
|
||||
|
||||
let spki_der = rc.tbs.subject_public_key_info.clone();
|
||||
let (rem, spki) = SubjectPublicKeyInfo::from_der(&spki_der)
|
||||
.map_err(|e| SignedObjectValidateError::EeCertificateParse(e.to_string()))?;
|
||||
if !rem.is_empty() {
|
||||
return Err(SignedObjectValidateError::EeCertificateParse(
|
||||
"trailing bytes after EE SubjectPublicKeyInfo DER".to_string(),
|
||||
));
|
||||
}
|
||||
let parsed_pk = spki
|
||||
.parsed()
|
||||
.map_err(|_e| SignedObjectValidateError::EeCertificateParse(
|
||||
"unsupported EE public key algorithm".to_string(),
|
||||
))?;
|
||||
let (rsa_public_modulus, rsa_public_exponent) = match parsed_pk {
|
||||
PublicKey::RSA(rsa) => {
|
||||
let modulus = strip_leading_zeros(rsa.modulus).to_vec();
|
||||
let exponent = strip_leading_zeros(rsa.exponent).to_vec();
|
||||
let _ = rsa
|
||||
.try_exponent()
|
||||
.map_err(|_e| SignedObjectValidateError::EeCertificateParse(
|
||||
"invalid EE RSA exponent".to_string(),
|
||||
))?;
|
||||
(modulus, exponent)
|
||||
}
|
||||
_ => {
|
||||
return Err(SignedObjectValidateError::EeCertificateParse(
|
||||
"unsupported EE public key algorithm".to_string(),
|
||||
));
|
||||
}
|
||||
};
|
||||
|
||||
let sia = rc
|
||||
.tbs
|
||||
@@ -758,6 +803,8 @@ fn validate_ee_certificate(der: &[u8]) -> Result<ResourceEeCertificate, SignedOb
|
||||
raw_der: der.to_vec(),
|
||||
subject_key_identifier: ski,
|
||||
spki_der,
|
||||
rsa_public_modulus,
|
||||
rsa_public_exponent,
|
||||
sia_signed_object_uris: signed_object_uris,
|
||||
resource_cert: rc,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user