Skip to main content

chia_ssl/
lib.rs

1use std::str::FromStr;
2
3use rcgen::{CertificateParams, DistinguishedName, DnType, Ia5String, KeyPair, SanType};
4use rsa::{
5    RsaPrivateKey,
6    pkcs8::{EncodePrivateKey, LineEnding},
7    rand_core::UnwrapErr,
8};
9use time::{Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time};
10
11mod ca;
12mod error;
13
14pub use ca::*;
15pub use error::*;
16
17#[derive(Debug, Clone, PartialEq, Eq, Hash)]
18pub struct ChiaCertificate {
19    pub cert_pem: String,
20    pub key_pem: String,
21}
22
23impl ChiaCertificate {
24    pub fn generate() -> Result<ChiaCertificate> {
25        let key = RsaPrivateKey::new(&mut UnwrapErr(getrandom::SysRng), 2048)?;
26        let key_pem = key.to_pkcs8_pem(LineEnding::default())?.to_string();
27
28        let mut params = CertificateParams::default();
29
30        let mut subject = DistinguishedName::new();
31        subject.push(DnType::CommonName, "Chia");
32        subject.push(DnType::OrganizationName, "Chia");
33        subject.push(DnType::OrganizationalUnitName, "Organic Farming Division");
34        params.distinguished_name = subject;
35
36        params.subject_alt_names = vec![SanType::DnsName(Ia5String::from_str("chia.net")?)];
37
38        params.not_before = OffsetDateTime::now_utc() - Duration::DAY;
39        params.not_after = PrimitiveDateTime::new(
40            Date::from_calendar_date(2100, Month::August, 2)?,
41            Time::MIDNIGHT,
42        )
43        .assume_utc();
44
45        let key_pair = KeyPair::from_pem_and_sign_algo(&key_pem, &rcgen::PKCS_RSA_SHA256)?;
46        let cert = params.signed_by(&key_pair, &CHIA_CA, &CHIA_CA_KEY_PAIR)?;
47        let cert_pem = cert.pem();
48
49        Ok(ChiaCertificate { cert_pem, key_pem })
50    }
51}