rcgen CRL API
use rcgen::{
CertificateRevocationListParams, RevokedCertParams,
RevocationReason, SerialNumber,
};
pub fn generate_crl(
store: &CrlStore,
issuer_ca: &Ca,
) -> anyhow::Result<Vec<u8>> {
let revoked: Vec<RevokedCertParams> = store.revoked
.iter()
.map(|entry| RevokedCertParams {
serial_number: SerialNumber::from_slice(
&hex::decode(&entry.serial_hex)?
),
revocation_time: entry.revocation_time,
reason_code: Some(entry.reason.to_rcgen()),
invalidity_date: None,
})
.collect::<anyhow::Result<Vec<_>>>()?;
let params = CertificateRevocationListParams {
this_update: OffsetDateTime::now_utc(),
next_update: OffsetDateTime::now_utc() + Duration::hours(24),
crl_number: SerialNumber::from_slice(&store.crl_number.to_be_bytes()),
issuing_distribution_point: None,
revoked_certs: revoked,
alg: &rcgen::PKCS_ECDSA_P256_SHA256,
};
let crl = params.signed_by(&issuer_ca.cert, &issuer_ca.key)?;
Ok(crl.der().to_vec())
}