From 2a8c01ecaf145343ab725d761c32ed25aeeb9223 Mon Sep 17 00:00:00 2001 From: fh Date: Sun, 18 Jun 2023 17:11:14 +0800 Subject: [PATCH] add convert methods --- Cargo.toml | 2 +- src/crypto/mod.rs | 2 +- src/crypto/sig/ed25519/readable/mod.rs | 67 ++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9cf5e39..f323fc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ruc" -version = "5.0.0" +version = "5.0.3" authors = ["rust-util-collections", "hui.fan@mail.ru"] edition = "2021" description = "Rust Util Collections" diff --git a/src/crypto/mod.rs b/src/crypto/mod.rs index 5c2892d..fc350c7 100644 --- a/src/crypto/mod.rs +++ b/src/crypto/mod.rs @@ -6,7 +6,7 @@ pub mod sig; pub mod trie; pub use codec::base64::{ - decode as base64_decode, decode_generic as base_decode_generic, + decode as base64_decode, decode_generic as base64_decode_generic, encode as base64_encode, }; pub use hasher::keccak::{ diff --git a/src/crypto/sig/ed25519/readable/mod.rs b/src/crypto/sig/ed25519/readable/mod.rs index 89f63c3..bcf87e6 100644 --- a/src/crypto/sig/ed25519/readable/mod.rs +++ b/src/crypto/sig/ed25519/readable/mod.rs @@ -1,5 +1,6 @@ use super::origin; use crate::{crypto::codec::base64, *}; +use std::fmt; pub struct SignKey(String); pub struct VerifyKey(String); @@ -21,6 +22,34 @@ impl SignKey { let sig = base64::encode(sk.sign(msg).to_bytes()); Ok(Sig(sig)) } + + pub fn into_string(self) -> String { + self.0 + } +} + +impl fmt::Display for SignKey { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl TryFrom for SignKey { + type Error = Box; + fn try_from(s: String) -> Result { + let sk = base64::decode(&s).c(d!())?; + ed25519_zebra::SigningKey::try_from(sk.as_slice()).c(d!())?; + Ok(Self(s)) + } +} + +impl TryFrom<&str> for SignKey { + type Error = Box; + fn try_from(s: &str) -> Result { + let sk = base64::decode(s).c(d!())?; + ed25519_zebra::SigningKey::try_from(sk.as_slice()).c(d!())?; + Ok(Self(s.to_owned())) + } } impl VerifyKey { @@ -30,6 +59,34 @@ impl VerifyKey { ed25519_zebra::VerificationKey::try_from(vk.as_slice()).c(d!())?; verify_by_raw_vk(&vk, sig, msg).c(d!()) } + + pub fn into_string(self) -> String { + self.0 + } +} + +impl fmt::Display for VerifyKey { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl TryFrom for VerifyKey { + type Error = Box; + fn try_from(s: String) -> Result { + let vk = base64::decode(&s).c(d!())?; + ed25519_zebra::VerificationKey::try_from(vk.as_slice()).c(d!())?; + Ok(Self(s)) + } +} + +impl TryFrom<&str> for VerifyKey { + type Error = Box; + fn try_from(s: &str) -> Result { + let vk = base64::decode(s).c(d!())?; + ed25519_zebra::VerificationKey::try_from(vk.as_slice()).c(d!())?; + Ok(Self(s.to_owned())) + } } pub fn verify_by_raw_vk( @@ -55,4 +112,14 @@ mod test { let msg_fake = b"00000000000000000"; assert!(vk.verify(&sig, msg_fake).is_err()); } + + #[test] + fn parse_key() { + assert!(SignKey::try_from(";akjflkjafj".to_owned()).is_err()); + assert!(VerifyKey::try_from(";akjflkjafj".to_owned()).is_err()); + + let (sk, vk) = create_keypair(); + assert!(SignKey::try_from(sk.to_string()).is_ok()); + assert!(VerifyKey::try_from(vk.to_string()).is_ok()); + } }