prople_crypto/eddsa/
privkey.rs

1//! `privkey` is a module that provides a primary object of [`PrivKey`]
2use rst_common::with_cryptography::ed25519_dalek::pkcs8::EncodePrivateKey;
3use rst_common::with_cryptography::ed25519_dalek::{self, SigningKey};
4
5use crate::keysecure::builder::Builder;
6use crate::keysecure::types::errors::KeySecureError;
7use crate::keysecure::types::ContextOptions;
8use crate::keysecure::types::{Password, ToKeySecure};
9use crate::keysecure::KeySecure;
10
11use crate::eddsa::types::errors::EddsaError;
12use crate::eddsa::types::PrivateKeyBytes;
13
14/// `PrivKey` is a private key generated from [`SigningKey`]
15///
16/// This object also able to serialize and encode the private key into `PEM` format
17/// Once this object encoded into `PEM`, we also able to encrypt the data and generate [`KeySecure`]
18/// object from it through trait [`ToKeySecure`].
19#[derive(Debug, Clone)]
20pub struct PrivKey {
21    key: SigningKey,
22}
23
24impl PrivKey {
25    pub fn new(key: SigningKey) -> Self {
26        Self { key }
27    }
28
29    pub fn serialize(&self) -> PrivateKeyBytes {
30        PrivateKeyBytes::from(self.key.to_bytes())
31    }
32
33    pub fn to_pem(&self) -> Result<String, EddsaError> {
34        self.key
35            .to_pkcs8_pem(ed25519_dalek::pkcs8::spki::der::pem::LineEnding::default())
36            .map(|val| val.to_string())
37            .map_err(|err| EddsaError::EncodePemError(err.to_string()))
38    }
39}
40
41impl ToKeySecure for PrivKey {
42    fn to_keysecure(&self, password: Password) -> Result<KeySecure, KeySecureError> {
43        let pem = self
44            .to_pem()
45            .map_err(|err| KeySecureError::BuildKeySecureError(err.to_string()))?;
46
47        let keysecure_builder = Builder::new(ContextOptions::ED25519, password);
48        let keysecure = keysecure_builder.secure(pem)?;
49
50        Ok(keysecure)
51    }
52}