edcert_compressor/
certificate_loader.rsuse edcert::certificate::Certificate;
use certificate_compressor::CertificateCompressor;
pub struct CertificateLoader;
impl CertificateLoader {
pub fn save_to_folder(cert: &Certificate, folder: &str) -> Result<(), &'static str> {
use std::fs::DirBuilder;
use std::fs::metadata;
if metadata(&folder).is_err() && DirBuilder::new().create(&folder).is_err() {
return Err("Failed to create folder");
}
if cert.has_private_key() {
try!(CertificateLoader::save_private_key(cert, &format!("{}/private.key", &folder)));
}
try!(CertificateLoader::save_to_file(cert, &format!("{}/certificate.edc", &folder)));
Ok(())
}
pub fn load_from_folder(folder: &str) -> Result<Certificate, &'static str> {
let mut cert = try!(CertificateLoader::load_from_file(&format!("{}/certificate.edc",
&folder)));
try!(CertificateLoader::load_private_key(&mut cert, &format!("{}/private.key", &folder)));
Ok(cert)
}
pub fn save_to_file(cert: &Certificate, filename: &str) -> Result<(), &'static str> {
use std::fs::File;
use std::io::Write;
let mut certificate_file: File = match File::create(filename) {
Ok(x) => x,
Err(_) => return Err("Failed to create certificate file"),
};
let compressed = CertificateCompressor::encode(cert);
match certificate_file.write(&*compressed) {
Ok(_) => Ok(()),
Err(_) => Err("Failed to write certificate to File."),
}
}
pub fn save_private_key(cert: &Certificate, filename: &str) -> Result<(), &'static str> {
use std::fs::File;
use std::io::Write;
let bytes: &[u8] = match cert.private_key() {
Some(x) => x,
None => return Err("The certificate has no private key."),
};
let mut private_keyfile: File = match File::create(&filename) {
Ok(x) => x,
Err(_) => return Err("Failed to create private key file."),
};
match private_keyfile.write_all(bytes) {
Ok(_) => Ok(()),
Err(_) => Err("Failed to write private key file."),
}
}
pub fn load_from_file(filename: &str) -> Result<Certificate, &'static str> {
use std::fs::File;
use std::io::Read;
let filename: String = filename.to_string();
let mut certificate_file: File = match File::open(filename) {
Err(_) => return Err("Failed to open certificate file."),
Ok(x) => x,
};
let mut compressed = Vec::new();
if let Err(_) = certificate_file.read_to_end(&mut compressed) {
return Err("Failed to read certificate");
}
CertificateCompressor::decode(&*compressed)
}
pub fn load_private_key(cert: &mut Certificate, filename: &str) -> Result<(), &'static str> {
use std::fs::File;
use std::io::Read;
let filename: String = filename.to_string();
let mut private_key_file: File = match File::open(filename) {
Err(_) => return Err("Failed to open private kye file."),
Ok(x) => x,
};
let mut private_key = Vec::new();
if let Err(_) = private_key_file.read_to_end(&mut private_key) {
return Err("Failed to read private key");
}
cert.set_private_key(private_key);
Ok(())
}
}
#[test]
fn test_save() {
use edcert::ed25519;
use edcert::meta::Meta;
use chrono::Timelike;
use chrono::UTC;
use chrono::duration::Duration;
use edcert::validator::Validator;
use edcert::root_validator::RootValidator;
use edcert::revoker::NoRevoker;
let (mpk, msk) = ed25519::generate_keypair();
let cv = RootValidator::new(&mpk, NoRevoker);
let meta = Meta::new_empty();
let expires = UTC::now()
.checked_add(Duration::days(90))
.expect("Failed to add a day to expiration date.")
.with_nanosecond(0)
.unwrap();
let mut cert = Certificate::generate_random(meta, expires);
cert.sign_with_master(&msk);
assert_eq!(true, cv.is_valid(&cert).is_ok());
CertificateLoader::save_to_folder(&cert, &expires.to_rfc3339()).unwrap();
let mut cert = CertificateLoader::load_from_file(&format!("{}{}",
&expires.to_rfc3339(),
"/certificate.edc"))
.expect("Failed to load certificate from file");
CertificateLoader::load_private_key(&mut cert,
&format!("{}{}", &expires.to_rfc3339(), "/private.key"))
.expect("Failed to load private key from file");
assert_eq!(true, cv.is_valid(&cert).is_ok());
}