use der::{asn1::OctetString, Sequence};
use spki::AlgorithmIdentifierOwned;
use x509_cert::serial_number::SerialNumber;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct CertId {
pub hash_algorithm: AlgorithmIdentifierOwned,
pub issuer_name_hash: OctetString,
pub issuer_key_hash: OctetString,
pub serial_number: SerialNumber,
}
impl From<&CertId> for CertId {
fn from(other: &CertId) -> Self {
other.clone()
}
}
#[cfg(feature = "builder")]
mod builder {
use crate::{builder::Error, CertId};
use const_oid::AssociatedOid;
use der::{
asn1::{Null, OctetString},
Encode,
};
use digest::Digest;
use spki::AlgorithmIdentifierOwned;
use x509_cert::{serial_number::SerialNumber, Certificate};
impl CertId {
pub fn from_issuer<D>(
issuer: &Certificate,
serial_number: SerialNumber,
) -> Result<Self, Error>
where
D: Digest + AssociatedOid,
{
Ok(Self {
hash_algorithm: AlgorithmIdentifierOwned {
oid: D::OID,
parameters: Some(Null.into()),
},
issuer_name_hash: OctetString::new(
D::digest(issuer.tbs_certificate.subject.to_der()?).to_vec(),
)?,
issuer_key_hash: OctetString::new(
D::digest(
issuer
.tbs_certificate
.subject_public_key_info
.subject_public_key
.raw_bytes(),
)
.to_vec(),
)?,
serial_number,
})
}
pub fn from_cert<D>(issuer: &Certificate, cert: &Certificate) -> Result<Self, Error>
where
D: Digest + AssociatedOid,
{
Self::from_issuer::<D>(issuer, cert.tbs_certificate.serial_number.clone())
}
}
}