Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Implement Copy, Deref and FromStr to (ed25519|sr25519)::Public #3998

Merged
merged 1 commit into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion core/primitives/src/ed25519.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ use crate::crypto::Ss58Codec;
use serde::{de, Serializer, Serialize, Deserializer, Deserialize};
use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}};
use runtime_interface::pass_by::PassByInner;
use rstd::ops::Deref;

/// A secret seed. It's not called a "secret key" because ring doesn't expose the secret keys
/// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we
Expand All @@ -47,7 +48,7 @@ type Seed = [u8; 32];

/// A public key.
#[cfg_attr(feature = "full_crypto", derive(Hash))]
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode, Default, PassByInner)]
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Encode, Decode, Default, PassByInner)]
pub struct Public(pub [u8; 32]);

/// A key pair.
Expand Down Expand Up @@ -83,6 +84,14 @@ impl AsMut<[u8]> for Public {
}
}

impl Deref for Public {
type Target = [u8];

fn deref(&self) -> &Self::Target {
&self.0
}
}

impl rstd::convert::TryFrom<&[u8]> for Public {
type Error = ();

Expand Down Expand Up @@ -116,6 +125,15 @@ impl From<Public> for H256 {
}
}

#[cfg(feature = "std")]
impl std::str::FromStr for Public {
type Err = crate::crypto::PublicError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::from_ss58check(s)
}
}

impl UncheckedFrom<[u8; 32]> for Public {
fn unchecked_from(x: [u8; 32]) -> Self {
Public::from_raw(x)
Expand Down
20 changes: 19 additions & 1 deletion core/primitives/src/sr25519.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ use crate::crypto::Ss58Codec;
use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}};
use crate::hash::{H256, H512};
use codec::{Encode, Decode};
use rstd::ops::Deref;

#[cfg(feature = "std")]
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
Expand All @@ -53,7 +54,7 @@ const SIGNING_CTX: &[u8] = b"substrate";

/// An Schnorrkel/Ristretto x25519 ("sr25519") public key.
#[cfg_attr(feature = "full_crypto", derive(Hash))]
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode, Default, PassByInner)]
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Encode, Decode, Default, PassByInner)]
pub struct Public(pub [u8; 32]);

/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair.
Expand Down Expand Up @@ -89,6 +90,14 @@ impl AsMut<[u8]> for Public {
}
}

impl Deref for Public {
type Target = [u8];

fn deref(&self) -> &Self::Target {
&self.0
}
}

impl From<Public> for [u8; 32] {
fn from(x: Public) -> [u8; 32] {
x.0
Expand All @@ -101,6 +110,15 @@ impl From<Public> for H256 {
}
}

#[cfg(feature = "std")]
impl std::str::FromStr for Public {
type Err = crate::crypto::PublicError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::from_ss58check(s)
}
}

impl rstd::convert::TryFrom<&[u8]> for Public {
type Error = ();

Expand Down