use crate::{
constants::{PATTERN, PEM_PRIVATE, PEM_PUBLIC},
snow::Keypair,
Error, Result,
};
use pem::Pem;
pub fn generate_keypair() -> Result<Keypair> {
let builder = snow::Builder::new(PATTERN.parse()?);
Ok(builder.generate_keypair()?)
}
pub fn encode_keypair(keypair: &Keypair) -> String {
let public_pem = Pem::new(PEM_PUBLIC, keypair.public.clone());
let private_pem = Pem::new(PEM_PRIVATE, keypair.private.clone());
pem::encode_many(&[public_pem, private_pem])
}
pub fn decode_keypair(keypair: impl AsRef<[u8]>) -> Result<Keypair> {
let mut pems = pem::parse_many(keypair)?;
if pems.len() == 2 {
let (first, second) = (pems.remove(0), pems.remove(0));
if (PEM_PUBLIC, PEM_PRIVATE) == (first.tag(), second.tag()) {
Ok(Keypair {
public: first.into_contents(),
private: second.into_contents(),
})
} else {
Err(Error::BadKeypairPem)
}
} else {
Err(Error::BadKeypairPem)
}
}