use crate::{PrivateKeyInfo, Result, SubjectPublicKeyInfo};
#[cfg(feature = "alloc")]
use crate::{PrivateKeyDocument, PublicKeyDocument};
#[cfg(feature = "pem")]
use alloc::string::String;
#[cfg(feature = "std")]
use std::path::Path;
#[cfg(any(feature = "pem", feature = "std"))]
use zeroize::Zeroizing;
pub trait FromPrivateKey: Sized {
fn from_pkcs8_private_key_info(private_key_info: PrivateKeyInfo<'_>) -> Result<Self>;
fn from_pkcs8_der(bytes: &[u8]) -> Result<Self> {
PrivateKeyInfo::from_der(bytes).and_then(Self::from_pkcs8_private_key_info)
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
fn from_pkcs8_doc(doc: &PrivateKeyDocument) -> Result<Self> {
Self::from_pkcs8_private_key_info(doc.private_key_info())
}
#[cfg(feature = "pem")]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
fn from_pkcs8_pem(s: &str) -> Result<Self> {
PrivateKeyDocument::from_pem(s).and_then(|doc| Self::from_pkcs8_doc(&doc))
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn read_pkcs8_der_file(path: impl AsRef<Path>) -> Result<Self> {
PrivateKeyDocument::read_der_file(path).and_then(|doc| Self::from_pkcs8_doc(&doc))
}
#[cfg(all(feature = "pem", feature = "std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn read_pkcs8_pem_file(path: impl AsRef<Path>) -> Result<Self> {
PrivateKeyDocument::read_pem_file(path).and_then(|doc| Self::from_pkcs8_doc(&doc))
}
}
pub trait FromPublicKey: Sized {
fn from_spki(spki: SubjectPublicKeyInfo<'_>) -> Result<Self>;
fn from_public_key_der(bytes: &[u8]) -> Result<Self> {
SubjectPublicKeyInfo::from_der(bytes).and_then(Self::from_spki)
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
fn from_public_key_doc(doc: &PublicKeyDocument) -> Result<Self> {
Self::from_spki(doc.spki())
}
#[cfg(feature = "pem")]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
fn from_public_key_pem(s: &str) -> Result<Self> {
PublicKeyDocument::from_pem(s).and_then(|doc| Self::from_public_key_doc(&doc))
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn read_public_key_der_file(path: impl AsRef<std::path::Path>) -> Result<Self> {
PublicKeyDocument::read_der_file(path).and_then(|doc| Self::from_public_key_doc(&doc))
}
#[cfg(all(feature = "pem", feature = "std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn read_public_key_pem_file(path: impl AsRef<std::path::Path>) -> Result<Self> {
PublicKeyDocument::read_pem_file(path).and_then(|doc| Self::from_public_key_doc(&doc))
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub trait ToPrivateKey {
fn to_pkcs8_der(&self) -> PrivateKeyDocument;
#[cfg(feature = "pem")]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
fn to_pkcs8_pem(&self) -> Zeroizing<String> {
self.to_pkcs8_der().to_pem()
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn write_pkcs8_der_file(&self, path: impl AsRef<Path>) -> Result<()> {
self.to_pkcs8_der().write_der_file(path)
}
#[cfg(all(feature = "pem", feature = "std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn write_pkcs8_pem_file(&self, path: impl AsRef<Path>) -> Result<()> {
self.to_pkcs8_der().write_pem_file(path)
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub trait ToPublicKey {
fn to_public_key_der(&self) -> PublicKeyDocument;
#[cfg(feature = "pem")]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
fn to_public_key_pem(&self) -> String {
self.to_public_key_der().to_pem()
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn write_public_key_der_file(&self, path: impl AsRef<Path>) -> Result<()> {
self.to_public_key_der().write_der_file(path)
}
#[cfg(all(feature = "pem", feature = "std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn write_public_key_pem_file(&self, path: impl AsRef<Path>) -> Result<()> {
self.to_public_key_der().write_pem_file(path)
}
}