pub mod ca;
pub mod cert;
pub mod error;
pub mod fetch;
pub mod types;
pub use error::{Error, Result};
pub use ca::{CertificateAuthority, IssuedCertificate};
pub use cert::CertificateBuilder;
pub use fetch::{CertificateChainInfo, ParsedCertificate, fetch_certificate_chain};
pub use types::{
CertSigAlgo, CertType, CertificateRequest, DistinguishedName, RevocationReason,
RevokedCertificate, SubjectAltName,
};
#[cfg(test)]
mod tests {
use super::*;
use types::CertSigAlgo;
#[test]
fn test_create_root_ca() {
let subject = DistinguishedName::new("Test Root CA")
.with_organization("Test Org")
.with_country("US");
let ca = CertificateAuthority::new_root(subject, CertSigAlgo::Ed25519, 365);
assert!(ca.is_ok());
}
#[test]
fn test_issue_server_certificate() {
let subject = DistinguishedName::new("Test CA");
let mut ca = CertificateAuthority::new_root(subject, CertSigAlgo::EcdsaP256, 365).unwrap();
let cert = CertificateBuilder::server("test.example.com")
.with_dns_san("www.test.example.com")
.with_validity_days(90)
.issue(&mut ca);
assert!(cert.is_ok());
}
#[test]
fn test_issue_client_certificate() {
let subject = DistinguishedName::new("Test CA");
let mut ca = CertificateAuthority::new_root(subject, CertSigAlgo::EcdsaP256, 365).unwrap();
let cert = CertificateBuilder::client("user@example.com")
.with_email_san("user@example.com")
.with_validity_days(365)
.issue(&mut ca);
assert!(cert.is_ok());
}
#[test]
fn test_algorithm_parsing() {
assert!(matches!(
"ed25519".parse::<CertSigAlgo>(),
Ok(CertSigAlgo::Ed25519)
));
assert!(matches!(
"ecdsa-p256".parse::<CertSigAlgo>(),
Ok(CertSigAlgo::EcdsaP256)
));
assert!(matches!(
"rsa4096".parse::<CertSigAlgo>(),
Ok(CertSigAlgo::Rsa4096)
));
}
#[test]
fn test_revocation() {
let subject = DistinguishedName::new("Test CA");
let mut ca = CertificateAuthority::new_root(subject, CertSigAlgo::EcdsaP256, 365).unwrap();
let cert = CertificateBuilder::server("test.example.com")
.issue(&mut ca)
.unwrap();
let result =
ca.revoke_certificate(cert.serial_number.clone(), RevocationReason::Superseded);
assert!(result.is_ok());
let crl = ca.generate_crl();
assert!(crl.is_ok());
}
}