cardano_sdk/cardano/crypto/ed25519/
leakable_signing_key.rs

1//  This Source Code Form is subject to the terms of the Mozilla Public
2//  License, v. 2.0. If a copy of the MPL was not distributed with this
3//  file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use crate::SigningKey;
6use std::{ops::Deref, str::FromStr};
7
8/// An ed25519 signing key which leaks through its serde::Serialised instance. Used in
9/// command-lines and interfaces.
10#[derive(Debug, Clone)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12#[repr(transparent)]
13pub struct LeakableSigningKey(
14    #[cfg_attr(
15        feature = "serde",
16        serde(
17            serialize_with = "LeakableSigningKey::unsafe_serialize",
18            deserialize_with = "LeakableSigningKey::deserialize"
19        )
20    )]
21    SigningKey,
22);
23
24impl Deref for LeakableSigningKey {
25    type Target = SigningKey;
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30
31impl LeakableSigningKey {
32    pub fn into_signing_key(self) -> SigningKey {
33        SigningKey::from(self)
34    }
35}
36
37impl From<LeakableSigningKey> for SigningKey {
38    fn from(lsk: LeakableSigningKey) -> Self {
39        lsk.0
40    }
41}
42
43impl From<SigningKey> for LeakableSigningKey {
44    fn from(sk: SigningKey) -> Self {
45        LeakableSigningKey(sk)
46    }
47}
48
49impl FromStr for LeakableSigningKey {
50    type Err = anyhow::Error;
51    fn from_str(s: &str) -> anyhow::Result<Self> {
52        Ok(Self::from(SigningKey::from_str(s)?))
53    }
54}
55
56impl LeakableSigningKey {
57    #[cfg(feature = "serde")]
58    pub fn unsafe_serialize<S: serde::ser::Serializer>(
59        sk: &SigningKey,
60        serializer: S,
61    ) -> Result<S::Ok, S::Error> {
62        serializer.serialize_str(&unsafe { hex::encode(SigningKey::leak(sk.clone())) })
63    }
64
65    #[cfg(feature = "serde")]
66    pub fn deserialize<'de, D: serde::de::Deserializer<'de>>(
67        deserializer: D,
68    ) -> Result<SigningKey, D::Error> {
69        let text: &str = serde::Deserialize::deserialize(deserializer)?;
70        SigningKey::from_str(text).map_err(serde::de::Error::custom)
71    }
72}