cardano_sdk/cardano/crypto/ed25519/
leakable_signing_key.rs1use crate::SigningKey;
6use std::{ops::Deref, str::FromStr};
7
8#[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}