From ea45550d61f04af6144e02cad95fc04d070d4580 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Thu, 25 Jun 2020 13:15:33 +0300 Subject: [PATCH] Add Deserialize for ed25519::PublicKey (#21) --- core/Cargo.toml | 1 + core/src/identity/ed25519.rs | 47 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/core/Cargo.toml b/core/Cargo.toml index 98db09f0..3b11a7fc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -34,6 +34,7 @@ thiserror = "1.0" unsigned-varint = "0.3" void = "1" zeroize = "1" +serde = { version = "1.0.114", default-features = false } [target.'cfg(not(any(target_os = "emscripten", target_os = "unknown")))'.dependencies] ring = { version = "0.16.9", features = ["alloc", "std"], default-features = false } diff --git a/core/src/identity/ed25519.rs b/core/src/identity/ed25519.rs index f68e5d03..9d0b4751 100644 --- a/core/src/identity/ed25519.rs +++ b/core/src/identity/ed25519.rs @@ -84,6 +84,13 @@ impl Clone for Keypair { } } +/// Build keypair from existing ed25519 keypair +impl From for Keypair { + fn from(kp: ed25519::Keypair) -> Self { + Keypair(kp) + } +} + /// Demote an Ed25519 keypair to a secret key. impl From for SecretKey { fn from(kp: Keypair) -> SecretKey { @@ -124,6 +131,46 @@ impl PublicKey { } } +impl<'de> serde::Deserialize<'de> for PublicKey { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::{Error, Visitor}; + + struct PKVisitor; + + impl<'de> Visitor<'de> for PKVisitor { + type Value = PublicKey; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("byte array or base58 string") + } + + fn visit_str(self, s: &str) -> Result + where + E: Error, + { + bs58::decode(s) + .into_vec() + .map_err(|err| Error::custom(format!("Invalid string '{}': {}", s, err))) + .and_then(|v| self.visit_bytes(v.as_slice())) + .map_err(|err: E| Error::custom(format!("Parsed string '{}' as base58, but {}", s, err))) + } + + fn visit_bytes(self, b: &[u8]) -> Result + where + E: Error, + { + PublicKey::decode(b) + .map_err(|err| Error::custom(format!("Invalid bytes {:?}: {}", b, err))) + } + } + + deserializer.deserialize_str(PKVisitor) + } +} + /// An Ed25519 secret key. pub struct SecretKey(ed25519::SecretKey);