use bcder::{
decode::{Constructed, DecodeError, Source},
BitString, Oid,
};
use x509_certificate::{asn1time::*, rfc3280::*, rfc5280::*};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AttributeCertificate {
pub ac_info: AttributeCertificateInfo,
pub signature_algorithm: AlgorithmIdentifier,
pub signature_value: BitString,
}
impl AttributeCertificate {
pub fn take_from<S: Source>(cons: &mut Constructed<S>) -> Result<Self, DecodeError<S::Error>> {
cons.take_sequence(|cons| {
let ac_info = AttributeCertificateInfo::take_from(cons)?;
let signature_algorithm = AlgorithmIdentifier::take_from(cons)?;
let signature_value = BitString::take_from(cons)?;
Ok(Self {
ac_info,
signature_algorithm,
signature_value,
})
})
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AttributeCertificateInfo {
pub version: AttCertVersion,
pub holder: Holder,
pub issuer: AttCertIssuer,
pub signature: AlgorithmIdentifier,
pub serial_number: CertificateSerialNumber,
pub attr_cert_validity_period: AttCertValidityPeriod,
pub attributes: Vec<Attribute>,
pub issuer_unique_ud: Option<UniqueIdentifier>,
pub extensions: Option<Extensions>,
}
impl AttributeCertificateInfo {
pub fn take_from<S: Source>(cons: &Constructed<S>) -> Result<Self, DecodeError<S::Error>> {
Err(cons.content_err("AttributeCertificateInfo parsing not implemented"))
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum AttCertVersion {
V2 = 1,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Holder {
pub base_certificate_id: Option<IssuerSerial>,
pub entity_name: Option<GeneralNames>,
pub object_digest_info: Option<ObjectDigestInfo>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum DigestedObjectType {
PublicKey = 0,
PublicKeyCert = 1,
OtherObjectTypes = 2,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ObjectDigestInfo {
pub digested_object_type: DigestedObjectType,
pub other_object_type_id: Oid,
pub digest_algorithm: AlgorithmIdentifier,
pub object_digest: BitString,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum AttCertIssuer {
V1Form(GeneralNames),
V2Form(Box<V2Form>),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct V2Form {
pub issuer_name: Option<GeneralNames>,
pub base_certificate_id: Option<IssuerSerial>,
pub object_digest_info: Option<ObjectDigestInfo>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct IssuerSerial {
pub issuer: GeneralNames,
pub serial: CertificateSerialNumber,
pub issuer_uid: Option<UniqueIdentifier>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AttCertValidityPeriod {
pub not_before_time: GeneralizedTime,
pub not_after_time: GeneralizedTime,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Attribute {
pub typ: AttributeType,
pub values: Vec<AttributeValue>,
}
pub type AttributeType = Oid;
pub type AttributeValue = Option<()>;