Generate first CRL
This commit is contained in:
		@@ -11,12 +11,14 @@ use openssl::hash::MessageDigest;
 | 
			
		||||
use openssl::nid::Nid;
 | 
			
		||||
use openssl::pkey::{PKey, Private};
 | 
			
		||||
use openssl::x509::extension::{BasicConstraints, KeyUsage, SubjectKeyIdentifier};
 | 
			
		||||
use openssl::x509::{ReasonCode, X509Crl, X509NameBuilder, X509};
 | 
			
		||||
use openssl_sys::{X509_CRL_free, X509_CRL_set1_lastUpdate, X509_CRL_set1_nextUpdate, X509_CRL_set_issuer_name, X509_CRL_set_version};
 | 
			
		||||
use openssl::x509::{X509Crl, X509NameBuilder, X509};
 | 
			
		||||
use openssl_sys::{
 | 
			
		||||
    X509_CRL_add0_revoked, X509_CRL_set1_lastUpdate, X509_CRL_set1_nextUpdate,
 | 
			
		||||
    X509_CRL_set_issuer_name, X509_CRL_set_version, X509_CRL_sign, X509_REVOKED_dup,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use crate::app_config::AppConfig;
 | 
			
		||||
use crate::crypto::crl_extension::CRLDistributionPointExt;
 | 
			
		||||
use crate::crypto::openssl_utils::clone_asn1_time;
 | 
			
		||||
 | 
			
		||||
#[derive(thiserror::Error, Debug)]
 | 
			
		||||
pub enum PKIError {
 | 
			
		||||
@@ -230,7 +232,7 @@ pub fn initialize_devices_ca() -> anyhow::Result<()> {
 | 
			
		||||
fn refresh_crl(d: &CertData) -> anyhow::Result<()> {
 | 
			
		||||
    let crl_path = d.crl.as_ref().ok_or(PKIError::MissingCRL)?;
 | 
			
		||||
 | 
			
		||||
    let old_list = if crl_path.exists() {
 | 
			
		||||
    let old_crl = if crl_path.exists() {
 | 
			
		||||
        let crl = load_crl_from_file(crl_path)?;
 | 
			
		||||
 | 
			
		||||
        // Check if revocation is un-needed
 | 
			
		||||
@@ -239,20 +241,7 @@ fn refresh_crl(d: &CertData) -> anyhow::Result<()> {
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        match crl.get_revoked() {
 | 
			
		||||
            Some(l) => Some(
 | 
			
		||||
                l.iter()
 | 
			
		||||
                    .map(|r| {
 | 
			
		||||
                        Ok((
 | 
			
		||||
                            r.serial_number().to_owned()?,
 | 
			
		||||
                            clone_asn1_time(r.revocation_date())?,
 | 
			
		||||
                            r.extension::<ReasonCode>()?,
 | 
			
		||||
                        ))
 | 
			
		||||
                    })
 | 
			
		||||
                    .collect::<anyhow::Result<Vec<_>>>()?,
 | 
			
		||||
            ),
 | 
			
		||||
            None => None,
 | 
			
		||||
        }
 | 
			
		||||
        Some(crl)
 | 
			
		||||
    } else {
 | 
			
		||||
        None
 | 
			
		||||
    };
 | 
			
		||||
@@ -284,7 +273,24 @@ fn refresh_crl(d: &CertData) -> anyhow::Result<()> {
 | 
			
		||||
            return Err(PKIError::GenCRLError("X509_CRL_set1_nextUpdate").into());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        X509_CRL_free(crl);
 | 
			
		||||
        // Add old entries
 | 
			
		||||
        if let Some(old_crl) = old_crl {
 | 
			
		||||
            if let Some(entries) = old_crl.get_revoked() {
 | 
			
		||||
                for entry in entries {
 | 
			
		||||
                    if X509_CRL_add0_revoked(crl, X509_REVOKED_dup(entry.as_ptr())) == 0 {
 | 
			
		||||
                        return Err(PKIError::GenCRLError("X509_CRL_add0_revoked").into());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let md = MessageDigest::sha256();
 | 
			
		||||
        if X509_CRL_sign(crl, d.key.as_ptr(), md.as_ptr()) == 0 {
 | 
			
		||||
            return Err(PKIError::GenCRLError("X509_CRL_sign").into());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let crl = X509Crl::from_ptr(crl);
 | 
			
		||||
        std::fs::write(crl_path, crl.to_pem()?)?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user