use eyre::WrapErr as _;
use pkcs8::{DecodePrivateKey as _, EncodePrivateKey as _};
use zeroize::Zeroizing;
#[derive(Debug, Clone)]
pub(crate) struct AcmeKey {
private_key: p256::ecdsa::SigningKey,
key_id: Option<String>,
}
impl AcmeKey {
pub(crate) fn new() -> AcmeKey {
Self::from_key(crate::create_p256_key())
}
pub(crate) fn from_pem(pem: &str) -> eyre::Result<AcmeKey> {
let private_key = ecdsa::SigningKey::<p256::NistP256>::from_pkcs8_pem(pem)
.context("Failed to read PEM")?;
Ok(Self::from_key(private_key))
}
fn from_key(private_key: p256::ecdsa::SigningKey) -> AcmeKey {
AcmeKey {
private_key,
key_id: None,
}
}
pub(crate) fn to_pem(&self) -> eyre::Result<Zeroizing<String>> {
self.private_key
.to_pkcs8_pem(pem::LineEnding::LF)
.context("private_key_to_pem")
}
pub(crate) fn private_key(&self) -> &p256::ecdsa::SigningKey {
&self.private_key
}
pub(crate) fn key_id(&self) -> &str {
self.key_id.as_ref().unwrap()
}
pub(crate) fn set_key_id(&mut self, kid: String) {
self.key_id = Some(kid)
}
}