use crate::consts::VERSION;
use err_derive::Error;
use rand::{thread_rng, Rng};
use rcgen::{
BasicConstraints, Certificate, CertificateParams, DistinguishedName, DnType, IsCa, RcgenError, SanType,
};
#[derive(Debug, Error)]
pub enum CertAuthError {
#[error(display = "Error generating key")]
KeyGen(#[source] RcgenError),
}
def_into_error!(CertAuthError);
pub fn generate_ca() -> Result<Certificate, CertAuthError> {
let mut params = CertificateParams::default();
params.is_ca = IsCa::Ca(BasicConstraints::Constrained(0));
params.serial_number = Some(thread_rng().gen());
params.distinguished_name = {
let mut tmp = DistinguishedName::new();
tmp.push(DnType::OrganizationName, VERSION);
tmp.push(DnType::CommonName, "ca");
tmp
};
params.subject_alt_names = vec![SanType::DnsName("ca".to_string())];
Ok(Certificate::from_params(params)?)
}
pub fn generate_cert(name: String, ca: &Certificate) -> Result<(Vec<u8>, Vec<u8>), CertAuthError> {
let mut params = CertificateParams::default();
params.serial_number = Some(thread_rng().gen());
params.distinguished_name = {
let mut tmp = DistinguishedName::new();
tmp.push(DnType::OrganizationName, VERSION);
tmp.push(DnType::CommonName, &name);
tmp
};
params.subject_alt_names = vec![SanType::DnsName(name)];
let cert = Certificate::from_params(params)?;
Ok((cert.serialize_der_with_signer(ca)?, cert.serialize_private_key_der()))
}