add role-aware resource certificate profile
This commit is contained in:
@@ -2,6 +2,7 @@ use crate::data_model::common::BigUnsigned;
|
||||
use crate::data_model::crl::{CrlDecodeError, CrlVerifyError, RpkixCrl};
|
||||
use crate::data_model::rc::{
|
||||
ResourceCertKind, ResourceCertificate, ResourceCertificateDecodeError,
|
||||
ResourceCertificateProfileError, ResourceCertificateRole,
|
||||
};
|
||||
use crate::data_model::signed_object::{EeKeyUsageSummary, ResourceEeCertificate};
|
||||
use ring::signature;
|
||||
@@ -34,6 +35,9 @@ pub enum CertPathError {
|
||||
)]
|
||||
IssuerNotCa,
|
||||
|
||||
#[error("issuer CA certificate profile validation failed: {0} (RFC 6487 §4.8)")]
|
||||
IssuerProfile(ResourceCertificateProfileError),
|
||||
|
||||
#[error("EE certificate must be an EE resource certificate (RFC 6487 §4)")]
|
||||
EeNotEe,
|
||||
|
||||
@@ -128,6 +132,9 @@ pub fn validate_ee_cert_path(
|
||||
if issuer_ca.kind != ResourceCertKind::Ca {
|
||||
return Err(CertPathError::IssuerNotCa);
|
||||
}
|
||||
issuer_ca
|
||||
.validate_rfc6487_profile(ResourceCertificateRole::Ca)
|
||||
.map_err(CertPathError::IssuerProfile)?;
|
||||
let issuer_spki = parse_subject_pki_from_der(&issuer_ca.tbs.subject_public_key_info)?;
|
||||
|
||||
if !x509_names_equivalent(&ee.tbs.issuer_name, &issuer_ca.tbs.subject_name) {
|
||||
@@ -311,6 +318,9 @@ fn validate_ee_cert_path_bindings_and_status(
|
||||
if issuer_ca.kind != ResourceCertKind::Ca {
|
||||
return Err(CertPathError::IssuerNotCa);
|
||||
}
|
||||
issuer_ca
|
||||
.validate_rfc6487_profile(ResourceCertificateRole::Ca)
|
||||
.map_err(CertPathError::IssuerProfile)?;
|
||||
|
||||
if !x509_names_equivalent(&ee.tbs.issuer_name, &issuer_ca.tbs.subject_name) {
|
||||
return Err(CertPathError::IssuerSubjectMismatch {
|
||||
@@ -515,8 +525,10 @@ fn is_serial_revoked_by_crl(ee: &ResourceCertificate, crl: &RpkixCrl) -> bool {
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::data_model::common::X509NameDer;
|
||||
use crate::data_model::oid::OID_CP_IPADDR_ASNUMBER;
|
||||
use crate::data_model::rc::{
|
||||
RcExtensions, ResourceCertKind, ResourceCertificate, RpkixTbsCertificate,
|
||||
BasicConstraintsProfile, CertificatePoliciesProfile, RcExtensions, ResourceCertKind,
|
||||
ResourceCertificate, RpkixTbsCertificate,
|
||||
};
|
||||
use der_parser::num_bigint::BigUint;
|
||||
|
||||
@@ -545,12 +557,27 @@ mod tests {
|
||||
subject_public_key_info: Vec::new(),
|
||||
extensions: RcExtensions {
|
||||
basic_constraints_ca: kind == ResourceCertKind::Ca,
|
||||
basic_constraints: (kind == ResourceCertKind::Ca).then_some(
|
||||
BasicConstraintsProfile {
|
||||
ca: true,
|
||||
critical: true,
|
||||
path_len_constraint: None,
|
||||
},
|
||||
),
|
||||
subject_key_identifier: ski,
|
||||
authority_key_identifier: aki,
|
||||
crl_distribution_points_uris: crldp,
|
||||
ca_issuers_uris: aia,
|
||||
subject_info_access: None,
|
||||
certificate_policies_oid: None,
|
||||
certificate_policies_oid: (kind == ResourceCertKind::Ca)
|
||||
.then_some(OID_CP_IPADDR_ASNUMBER.to_string()),
|
||||
certificate_policies: (kind == ResourceCertKind::Ca).then_some(
|
||||
CertificatePoliciesProfile {
|
||||
policy_oid: OID_CP_IPADDR_ASNUMBER.to_string(),
|
||||
qualifier_oids: Vec::new(),
|
||||
},
|
||||
),
|
||||
extension_oids: Vec::new(),
|
||||
ip_resources: None,
|
||||
as_resources: None,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user