From 8ba1bc5e8f06da12d1c8aa0cf310db2b926a7523 Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Sat, 13 Jan 2024 15:59:35 +0000 Subject: [PATCH] feat: deserlialize secret key --- crates/cashu/src/nuts/nut01.rs | 24 ++++++++++++++++++++---- crates/cashu/src/nuts/nut02.rs | 4 ++-- crates/cashu/src/serde_utils.rs | 23 +++++++++++++---------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/crates/cashu/src/nuts/nut01.rs b/crates/cashu/src/nuts/nut01.rs index 0825ca9b..b4d9d6f4 100644 --- a/crates/cashu/src/nuts/nut01.rs +++ b/crates/cashu/src/nuts/nut01.rs @@ -56,7 +56,7 @@ impl std::fmt::Display for PublicKey { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct SecretKey(#[serde(with = "crate::serde_utils::serde_secret_key")] k256::SecretKey); @@ -98,6 +98,11 @@ impl SecretKey { Self(private_key.into()) } + + pub fn random() -> Self { + let mut rng = rand::thread_rng(); + SecretKey(k256::SecretKey::random(&mut rng)) + } } /// Mint Keys [NUT-01] @@ -193,15 +198,15 @@ impl<'de> serde::de::Deserialize<'de> for KeysResponse { pub mod mint { use std::collections::BTreeMap; - use serde::Serialize; + use serde::{Deserialize, Serialize}; use super::{PublicKey, SecretKey}; use crate::Amount; - #[derive(Debug, Clone, PartialEq, Eq, Serialize)] + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Keys(pub BTreeMap); - #[derive(Debug, Clone, PartialEq, Eq, Serialize)] + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct KeyPair { pub public_key: PublicKey, pub secret_key: SecretKey, @@ -238,4 +243,15 @@ mod tests { assert_eq!(&serde_json::to_string(&response).unwrap(), &res) } + + #[test] + fn test_ser_der_secret() { + let secret = SecretKey::random(); + + let json = serde_json::to_string(&secret).unwrap(); + + let sec: SecretKey = serde_json::from_str(&json).unwrap(); + + assert_eq!(sec, secret); + } } diff --git a/crates/cashu/src/nuts/nut02.rs b/crates/cashu/src/nuts/nut02.rs index 4634a773..74ef777f 100644 --- a/crates/cashu/src/nuts/nut02.rs +++ b/crates/cashu/src/nuts/nut02.rs @@ -214,14 +214,14 @@ pub mod mint { use bitcoin::hashes::sha256::Hash as Sha256; use bitcoin::hashes::{Hash, HashEngine}; use k256::SecretKey; - use serde::Serialize; + use serde::{Deserialize, Serialize}; use super::Id; use crate::nuts::nut01::mint::{KeyPair, Keys}; use crate::nuts::CurrencyUnit; use crate::Amount; - #[derive(Debug, Clone, PartialEq, Eq, Serialize)] + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct KeySet { pub id: Id, pub unit: CurrencyUnit, diff --git a/crates/cashu/src/serde_utils.rs b/crates/cashu/src/serde_utils.rs index f546f83d..77fe6525 100644 --- a/crates/cashu/src/serde_utils.rs +++ b/crates/cashu/src/serde_utils.rs @@ -103,7 +103,9 @@ pub mod serde_public_key { } pub mod serde_secret_key { + use k256::elliptic_curve::generic_array::GenericArray; use k256::SecretKey; + use serde::Deserialize; pub fn serialize(seckey: &SecretKey, serializer: S) -> Result where @@ -112,14 +114,15 @@ pub mod serde_secret_key { let encoded = hex::encode(seckey.to_bytes()); serializer.serialize_str(&encoded) } - /* - pub fn deserialize<'de, D>(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let encoded = String::deserialize(deserializer)?; - let decoded = hex::decode(encoded).map_err(serde::de::Error::custom)?; - SecretKey::from_slice(&decoded).map_err(serde::de::Error::custom) - } - */ + + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let encoded = String::deserialize(deserializer)?; + Ok( + k256::SecretKey::from_bytes(GenericArray::from_slice(&hex::decode(encoded).unwrap())) + .unwrap(), + ) + } }