mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 19:21:13 +00:00
Refactor crypto-related traits implementations in term of Public/Signature Bytes (#3806)
Another simple refactory to prune some duplicate code Follow up of: https://github.com/paritytech/polkadot-sdk/pull/3684
This commit is contained in:
@@ -26,7 +26,7 @@ pub use sp_core::crypto::{DeriveError, Pair, SecretStringError};
|
||||
#[doc(hidden)]
|
||||
pub use sp_core::{
|
||||
self,
|
||||
crypto::{ByteArray, CryptoType, Derive, IsWrappedBy, Public, UncheckedFrom, Wraps},
|
||||
crypto::{ByteArray, CryptoType, Derive, IsWrappedBy, Public, Signature, UncheckedFrom, Wraps},
|
||||
RuntimeDebug,
|
||||
};
|
||||
|
||||
@@ -505,6 +505,12 @@ macro_rules! app_crypto_signature_common {
|
||||
}
|
||||
}
|
||||
|
||||
impl AsMut<[u8]> for Signature {
|
||||
fn as_mut(&mut self) -> &mut [u8] {
|
||||
self.0.as_mut()
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::AppSignature for Signature {
|
||||
type Generic = $sig;
|
||||
}
|
||||
@@ -525,6 +531,12 @@ macro_rules! app_crypto_signature_common {
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::Signature for Signature {}
|
||||
|
||||
impl $crate::ByteArray for Signature {
|
||||
const LEN: usize = <$sig>::LEN;
|
||||
}
|
||||
|
||||
impl Signature {
|
||||
/// Convert into wrapped generic signature type.
|
||||
pub fn into_inner(self) -> $sig {
|
||||
|
||||
@@ -20,19 +20,12 @@
|
||||
//!
|
||||
//! The primitive can operate both as a regular VRF or as an anonymized Ring VRF.
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
#[cfg(feature = "full_crypto")]
|
||||
use crate::crypto::VrfSecret;
|
||||
use crate::crypto::{
|
||||
ByteArray, CryptoType, CryptoTypeId, Derive, DeriveError, DeriveJunction, Pair as TraitPair,
|
||||
Public as TraitPublic, PublicBytes, SecretStringError, SignatureBytes, UncheckedFrom,
|
||||
VrfPublic,
|
||||
ByteArray, CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair,
|
||||
PublicBytes, SecretStringError, SignatureBytes, UncheckedFrom, VrfPublic,
|
||||
};
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
|
||||
use bandersnatch_vrfs::{CanonicalSerialize, SecretKey};
|
||||
use codec::{Decode, Encode, EncodeLike, MaxEncodedLen};
|
||||
@@ -64,42 +57,10 @@ pub struct BandersnatchTag;
|
||||
/// Bandersnatch public key.
|
||||
pub type Public = PublicBytes<PUBLIC_SERIALIZED_SIZE, BandersnatchTag>;
|
||||
|
||||
impl TraitPublic for Public {}
|
||||
|
||||
impl CryptoType for Public {
|
||||
type Pair = Pair;
|
||||
}
|
||||
|
||||
impl Derive for Public {}
|
||||
|
||||
impl sp_std::fmt::Debug for Public {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8])
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Public {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Public {
|
||||
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
||||
Public::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
/// Bandersnatch signature.
|
||||
///
|
||||
/// The signature is created via the [`VrfSecret::vrf_sign`] using [`SIGNING_CTX`] as transcript
|
||||
@@ -110,18 +71,6 @@ impl CryptoType for Signature {
|
||||
type Pair = Pair;
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Signature {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// The raw secret seed, which can be used to reconstruct the secret [`Pair`].
|
||||
type Seed = [u8; SEED_SERIALIZED_SIZE];
|
||||
|
||||
|
||||
@@ -23,17 +23,11 @@
|
||||
//! Chaum-Pedersen proof uses the same hash-to-field specified in RFC 9380 for the field of the BLS
|
||||
//! curve.
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{
|
||||
CryptoType, Derive, DeriveError, DeriveJunction, Pair as TraitPair, Public as TraitPublic,
|
||||
PublicBytes, SecretStringError, SignatureBytes, UncheckedFrom,
|
||||
CryptoType, DeriveError, DeriveJunction, Pair as TraitPair, PublicBytes, SecretStringError,
|
||||
SignatureBytes, UncheckedFrom,
|
||||
};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
use w3f_bls::{
|
||||
@@ -115,68 +109,6 @@ pub struct BlsTag;
|
||||
/// A public key.
|
||||
pub type Public<SubTag> = PublicBytes<PUBLIC_KEY_SERIALIZED_SIZE, (BlsTag, SubTag)>;
|
||||
|
||||
impl<T: BlsBound> From<Pair<T>> for Public<T> {
|
||||
fn from(x: Pair<T>) -> Self {
|
||||
x.public()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<T: BlsBound> std::str::FromStr for Public<T> {
|
||||
type Err = crate::crypto::PublicError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
Self::from_ss58check(s)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<T: BlsBound> std::fmt::Display for Public<T> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<T: BlsBound> sp_std::fmt::Debug for Public<T> {
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8])
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
impl<T> sp_std::fmt::Debug for Public<T> {
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<T: BlsBound> Serialize for Public<T> {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, T: BlsBound> Deserialize<'de> for Public<T> {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Public::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: BlsBound> TraitPublic for Public<T> {}
|
||||
|
||||
impl<T> Derive for Public<T> {}
|
||||
|
||||
impl<T: BlsBound> CryptoType for Public<T> {
|
||||
type Pair = Pair<T>;
|
||||
}
|
||||
@@ -184,41 +116,6 @@ impl<T: BlsBound> CryptoType for Public<T> {
|
||||
/// A generic BLS signature.
|
||||
pub type Signature<SubTag> = SignatureBytes<SIGNATURE_SERIALIZED_SIZE, (BlsTag, SubTag)>;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<T> Serialize for Signature<T> {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, T> Deserialize<'de> for Signature<T> {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Signature::try_from(signature_hex.as_ref())
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> sp_std::fmt::Debug for Signature<T> {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: BlsBound> CryptoType for Signature<T> {
|
||||
type Pair = Pair<T>;
|
||||
}
|
||||
@@ -333,8 +230,10 @@ impl<T: BlsBound> CryptoType for Pair<T> {
|
||||
|
||||
// Test set exercising the BLS12-377 implementation
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::DEV_PHRASE;
|
||||
use bls377::{Pair, Signature};
|
||||
|
||||
|
||||
@@ -485,8 +485,11 @@ pub trait ByteArray: AsRef<[u8]> + AsMut<[u8]> + for<'a> TryFrom<&'a [u8], Error
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait suitable for typical cryptographic key public type.
|
||||
pub trait Public: CryptoType + ByteArray + Derive + PartialEq + Eq + Clone + Send + Sync {}
|
||||
/// Trait suitable for cryptographic public keys.
|
||||
pub trait Public: CryptoType + ByteArray + PartialEq + Eq + Clone + Send + Sync + Derive {}
|
||||
|
||||
/// Trait suitable for cryptographic signatures.
|
||||
pub trait Signature: CryptoType + ByteArray + PartialEq + Eq + Clone + Send + Sync {}
|
||||
|
||||
/// An opaque 32-byte cryptographic identifier.
|
||||
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, TypeInfo)]
|
||||
@@ -648,32 +651,11 @@ pub use self::dummy::*;
|
||||
mod dummy {
|
||||
use super::*;
|
||||
|
||||
#[doc(hidden)]
|
||||
pub struct DummyTag;
|
||||
|
||||
/// Dummy cryptography. Doesn't do anything.
|
||||
#[derive(Clone, Hash, Default, Eq, PartialEq)]
|
||||
pub struct Dummy;
|
||||
|
||||
impl AsRef<[u8]> for Dummy {
|
||||
fn as_ref(&self) -> &[u8] {
|
||||
&b""[..]
|
||||
}
|
||||
}
|
||||
|
||||
impl AsMut<[u8]> for Dummy {
|
||||
fn as_mut(&mut self) -> &mut [u8] {
|
||||
unsafe {
|
||||
#[allow(mutable_transmutes)]
|
||||
sp_std::mem::transmute::<_, &'static mut [u8]>(&b""[..])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> TryFrom<&'a [u8]> for Dummy {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(_: &'a [u8]) -> Result<Self, ()> {
|
||||
Ok(Self)
|
||||
}
|
||||
}
|
||||
pub type Dummy = CryptoBytes<0, DummyTag>;
|
||||
|
||||
impl CryptoType for Dummy {
|
||||
type Pair = Dummy;
|
||||
@@ -681,21 +663,10 @@ mod dummy {
|
||||
|
||||
impl Derive for Dummy {}
|
||||
|
||||
impl ByteArray for Dummy {
|
||||
const LEN: usize = 0;
|
||||
fn from_slice(_: &[u8]) -> Result<Self, ()> {
|
||||
Ok(Self)
|
||||
}
|
||||
#[cfg(feature = "std")]
|
||||
fn to_raw_vec(&self) -> Vec<u8> {
|
||||
vec![]
|
||||
}
|
||||
fn as_slice(&self) -> &[u8] {
|
||||
b""
|
||||
}
|
||||
}
|
||||
impl Public for Dummy {}
|
||||
|
||||
impl Signature for Dummy {}
|
||||
|
||||
impl Pair for Dummy {
|
||||
type Public = Dummy;
|
||||
type Seed = Dummy;
|
||||
@@ -716,15 +687,15 @@ mod dummy {
|
||||
_: Iter,
|
||||
_: Option<Dummy>,
|
||||
) -> Result<(Self, Option<Dummy>), DeriveError> {
|
||||
Ok((Self, None))
|
||||
Ok((Self::default(), None))
|
||||
}
|
||||
|
||||
fn from_seed_slice(_: &[u8]) -> Result<Self, SecretStringError> {
|
||||
Ok(Self)
|
||||
Ok(Self::default())
|
||||
}
|
||||
|
||||
fn sign(&self, _: &[u8]) -> Self::Signature {
|
||||
Self
|
||||
Self::default()
|
||||
}
|
||||
|
||||
fn verify<M: AsRef<[u8]>>(_: &Self::Signature, _: M, _: &Self::Public) -> bool {
|
||||
@@ -732,11 +703,11 @@ mod dummy {
|
||||
}
|
||||
|
||||
fn public(&self) -> Self::Public {
|
||||
Self
|
||||
Self::default()
|
||||
}
|
||||
|
||||
fn to_raw_vec(&self) -> Vec<u8> {
|
||||
vec![]
|
||||
Default::default()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -845,7 +816,7 @@ pub trait Pair: CryptoType + Sized {
|
||||
|
||||
/// The type used to represent a signature. Can be created from a key pair and a message
|
||||
/// and verified with the message and a public key.
|
||||
type Signature: AsRef<[u8]>;
|
||||
type Signature: Signature;
|
||||
|
||||
/// Generate new secure (random) key pair.
|
||||
///
|
||||
@@ -1218,6 +1189,8 @@ mod tests {
|
||||
use super::*;
|
||||
use crate::DeriveJunction;
|
||||
|
||||
struct TestCryptoTag;
|
||||
|
||||
#[derive(Clone, Eq, PartialEq, Debug)]
|
||||
enum TestPair {
|
||||
Generated,
|
||||
@@ -1226,59 +1199,33 @@ mod tests {
|
||||
Standard { phrase: String, password: Option<String>, path: Vec<DeriveJunction> },
|
||||
Seed(Vec<u8>),
|
||||
}
|
||||
|
||||
impl Default for TestPair {
|
||||
fn default() -> Self {
|
||||
TestPair::Generated
|
||||
}
|
||||
}
|
||||
|
||||
impl CryptoType for TestPair {
|
||||
type Pair = Self;
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Hash, Default)]
|
||||
struct TestPublic;
|
||||
impl AsRef<[u8]> for TestPublic {
|
||||
fn as_ref(&self) -> &[u8] {
|
||||
&[]
|
||||
}
|
||||
}
|
||||
impl AsMut<[u8]> for TestPublic {
|
||||
fn as_mut(&mut self) -> &mut [u8] {
|
||||
&mut []
|
||||
}
|
||||
}
|
||||
impl<'a> TryFrom<&'a [u8]> for TestPublic {
|
||||
type Error = ();
|
||||
type TestPublic = PublicBytes<0, TestCryptoTag>;
|
||||
|
||||
fn try_from(data: &'a [u8]) -> Result<Self, ()> {
|
||||
Self::from_slice(data)
|
||||
}
|
||||
}
|
||||
impl CryptoType for TestPublic {
|
||||
type Pair = TestPair;
|
||||
}
|
||||
impl Derive for TestPublic {}
|
||||
impl ByteArray for TestPublic {
|
||||
const LEN: usize = 0;
|
||||
fn from_slice(bytes: &[u8]) -> Result<Self, ()> {
|
||||
if bytes.is_empty() {
|
||||
Ok(Self)
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
fn as_slice(&self) -> &[u8] {
|
||||
&[]
|
||||
}
|
||||
fn to_raw_vec(&self) -> Vec<u8> {
|
||||
vec![]
|
||||
}
|
||||
|
||||
type TestSignature = SignatureBytes<0, TestCryptoTag>;
|
||||
|
||||
impl CryptoType for TestSignature {
|
||||
type Pair = TestPair;
|
||||
}
|
||||
impl Public for TestPublic {}
|
||||
|
||||
impl Pair for TestPair {
|
||||
type Public = TestPublic;
|
||||
type Seed = [u8; 8];
|
||||
type Signature = [u8; 0];
|
||||
type Signature = TestSignature;
|
||||
|
||||
fn generate() -> (Self, <Self as Pair>::Seed) {
|
||||
(TestPair::Generated, [0u8; 8])
|
||||
@@ -1327,7 +1274,7 @@ mod tests {
|
||||
}
|
||||
|
||||
fn sign(&self, _message: &[u8]) -> Self::Signature {
|
||||
[]
|
||||
TestSignature::default()
|
||||
}
|
||||
|
||||
fn verify<M: AsRef<[u8]>>(_: &Self::Signature, _: M, _: &Self::Public) -> bool {
|
||||
@@ -1335,7 +1282,7 @@ mod tests {
|
||||
}
|
||||
|
||||
fn public(&self) -> Self::Public {
|
||||
TestPublic
|
||||
TestPublic::default()
|
||||
}
|
||||
|
||||
fn from_seed_slice(seed: &[u8]) -> Result<Self, SecretStringError> {
|
||||
|
||||
@@ -18,15 +18,27 @@
|
||||
//! Generic byte array which can be specialized with a marker type.
|
||||
|
||||
use crate::{
|
||||
crypto::{FromEntropy, UncheckedFrom},
|
||||
crypto::{CryptoType, Derive, FromEntropy, Public, Signature, UncheckedFrom},
|
||||
hash::{H256, H512},
|
||||
};
|
||||
|
||||
use codec::{Decode, Encode, MaxEncodedLen};
|
||||
use core::marker::PhantomData;
|
||||
use scale_info::TypeInfo;
|
||||
|
||||
use sp_runtime_interface::pass_by::{self, PassBy, PassByInner};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
|
||||
pub use public_bytes::*;
|
||||
pub use signature_bytes::*;
|
||||
|
||||
/// Generic byte array holding some crypto-related raw data.
|
||||
///
|
||||
/// The type is generic over a constant length `N` and a "tag" `T` which
|
||||
@@ -231,14 +243,137 @@ impl<T> CryptoBytes<64, T> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Tag used for generic public key bytes.
|
||||
pub struct PublicTag;
|
||||
mod public_bytes {
|
||||
use super::*;
|
||||
|
||||
/// Generic encoded public key.
|
||||
pub type PublicBytes<const N: usize, SubTag> = CryptoBytes<N, (PublicTag, SubTag)>;
|
||||
/// Tag used for generic public key bytes.
|
||||
pub struct PublicTag;
|
||||
|
||||
/// Tag used for generic signature bytes.
|
||||
pub struct SignatureTag;
|
||||
/// Generic encoded public key.
|
||||
pub type PublicBytes<const N: usize, SubTag> = CryptoBytes<N, (PublicTag, SubTag)>;
|
||||
|
||||
/// Generic encoded signature.
|
||||
pub type SignatureBytes<const N: usize, SubTag> = CryptoBytes<N, (SignatureTag, SubTag)>;
|
||||
impl<const N: usize, SubTag> Derive for PublicBytes<N, SubTag> where Self: CryptoType {}
|
||||
|
||||
impl<const N: usize, SubTag> Public for PublicBytes<N, SubTag> where Self: CryptoType {}
|
||||
|
||||
impl<const N: usize, SubTag> sp_std::fmt::Debug for PublicBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8])
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<const N: usize, SubTag> std::fmt::Display for PublicBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<const N: usize, SubTag> std::str::FromStr for PublicBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
type Err = crate::crypto::PublicError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
Self::from_ss58check(s)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<const N: usize, SubTag> Serialize for PublicBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, const N: usize, SubTag> Deserialize<'de> for PublicBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Self::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mod signature_bytes {
|
||||
use super::*;
|
||||
|
||||
/// Tag used for generic signature bytes.
|
||||
pub struct SignatureTag;
|
||||
|
||||
/// Generic encoded signature.
|
||||
pub type SignatureBytes<const N: usize, SubTag> = CryptoBytes<N, (SignatureTag, SubTag)>;
|
||||
|
||||
impl<const N: usize, SubTag> Signature for SignatureBytes<N, SubTag> where Self: CryptoType {}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<const N: usize, SubTag> Serialize for SignatureBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, const N: usize, SubTag> Deserialize<'de> for SignatureBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Self::try_from(signature_hex.as_ref())
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<const N: usize, SubTag> sp_std::fmt::Debug for SignatureBytes<N, SubTag>
|
||||
where
|
||||
Self: CryptoType,
|
||||
{
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&&self.0[..]))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,11 +17,9 @@
|
||||
|
||||
//! Simple ECDSA secp256k1 API.
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{
|
||||
CryptoType, CryptoTypeId, Derive, DeriveError, DeriveJunction, Pair as TraitPair,
|
||||
Public as TraitPublic, PublicBytes, SecretStringError, SignatureBytes,
|
||||
CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair, PublicBytes,
|
||||
SecretStringError, SignatureBytes,
|
||||
};
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
@@ -31,10 +29,6 @@ use secp256k1::{
|
||||
ecdsa::{RecoverableSignature, RecoveryId},
|
||||
Message, PublicKey, SecretKey, SECP256K1,
|
||||
};
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
#[cfg(not(feature = "std"))]
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
@@ -80,10 +74,6 @@ impl Public {
|
||||
}
|
||||
}
|
||||
|
||||
impl TraitPublic for Public {}
|
||||
|
||||
impl Derive for Public {}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl From<PublicKey> for Public {
|
||||
fn from(pubkey: PublicKey) -> Self {
|
||||
@@ -106,85 +96,9 @@ impl From<Pair> for Public {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl std::fmt::Display for Public {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Public {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8])
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Public {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Public {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Public::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
/// A signature (a 512-bit value, plus 8 bits for recovery ID).
|
||||
pub type Signature = SignatureBytes<SIGNATURE_SERIALIZED_SIZE, EcdsaTag>;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Signature {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Signature {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Signature::try_from(signature_hex.as_ref())
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Signature {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Signature {
|
||||
/// Recover the public key from this signature and a message.
|
||||
pub fn recover<M: AsRef<[u8]>>(&self, message: M) -> Option<Public> {
|
||||
@@ -417,7 +331,7 @@ mod test {
|
||||
use super::*;
|
||||
use crate::crypto::{
|
||||
set_default_ss58_version, PublicError, Ss58AddressFormat, Ss58AddressFormatRegistry,
|
||||
DEV_PHRASE,
|
||||
Ss58Codec, DEV_PHRASE,
|
||||
};
|
||||
use serde_json;
|
||||
|
||||
|
||||
@@ -17,18 +17,13 @@
|
||||
|
||||
//! Simple Ed25519 API.
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{
|
||||
ByteArray, CryptoType, CryptoTypeId, Derive, DeriveError, DeriveJunction, Pair as TraitPair,
|
||||
Public as TraitPublic, PublicBytes, SecretStringError, SignatureBytes,
|
||||
ByteArray, CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair,
|
||||
PublicBytes, SecretStringError, SignatureBytes,
|
||||
};
|
||||
|
||||
use ed25519_zebra::{SigningKey, VerificationKey};
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
/// An identifier used to match public keys against ed25519 keys
|
||||
@@ -51,105 +46,9 @@ pub struct Ed25519Tag;
|
||||
/// A public key.
|
||||
pub type Public = PublicBytes<PUBLIC_KEY_SERIALIZED_SIZE, Ed25519Tag>;
|
||||
|
||||
impl TraitPublic for Public {}
|
||||
|
||||
impl Derive for Public {}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl From<Pair> for Public {
|
||||
fn from(x: Pair) -> Self {
|
||||
x.public()
|
||||
}
|
||||
}
|
||||
|
||||
#[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)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl std::fmt::Display for Public {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Public {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8])
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Public {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Public {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Public::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
/// A signature.
|
||||
pub type Signature = SignatureBytes<SIGNATURE_SERIALIZED_SIZE, Ed25519Tag>;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Signature {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Signature {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Signature::try_from(signature_hex.as_ref())
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Signature {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// A key pair.
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Pair {
|
||||
@@ -253,8 +152,10 @@ impl CryptoType for Pair {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::DEV_PHRASE;
|
||||
use serde_json;
|
||||
|
||||
|
||||
@@ -56,26 +56,26 @@ pub mod const_hex2array;
|
||||
pub mod crypto;
|
||||
pub mod hexdisplay;
|
||||
pub use paste;
|
||||
|
||||
mod address_uri;
|
||||
pub mod defer;
|
||||
pub mod hash;
|
||||
#[cfg(feature = "std")]
|
||||
mod hasher;
|
||||
pub mod offchain;
|
||||
pub mod testing;
|
||||
#[cfg(feature = "std")]
|
||||
pub mod traits;
|
||||
pub mod uint;
|
||||
|
||||
#[cfg(feature = "bandersnatch-experimental")]
|
||||
pub mod bandersnatch;
|
||||
#[cfg(feature = "bls-experimental")]
|
||||
pub mod bls;
|
||||
pub mod crypto_bytes;
|
||||
pub mod defer;
|
||||
pub mod ecdsa;
|
||||
pub mod ed25519;
|
||||
pub mod hash;
|
||||
#[cfg(feature = "std")]
|
||||
mod hasher;
|
||||
pub mod offchain;
|
||||
pub mod paired_crypto;
|
||||
pub mod sr25519;
|
||||
pub mod testing;
|
||||
#[cfg(feature = "std")]
|
||||
pub mod traits;
|
||||
pub mod uint;
|
||||
|
||||
#[cfg(feature = "bls-experimental")]
|
||||
pub use bls::{bls377, bls381};
|
||||
|
||||
@@ -19,20 +19,13 @@
|
||||
|
||||
use core::marker::PhantomData;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{
|
||||
ByteArray, CryptoType, Derive, DeriveError, DeriveJunction, Pair as PairT, Public as PublicT,
|
||||
PublicBytes, SecretStringError, SignatureBytes, UncheckedFrom,
|
||||
ByteArray, CryptoType, DeriveError, DeriveJunction, Pair as PairT, Public as PublicT,
|
||||
PublicBytes, SecretStringError, Signature as SignatureT, SignatureBytes, UncheckedFrom,
|
||||
};
|
||||
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||
#[cfg(all(not(feature = "std"), feature = "serde"))]
|
||||
use sp_std::alloc::{format, string::String};
|
||||
|
||||
/// ECDSA and BLS12-377 paired crypto scheme
|
||||
#[cfg(feature = "bls-experimental")]
|
||||
pub mod ecdsa_bls377 {
|
||||
@@ -173,130 +166,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> std::fmt::Display
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
Public<LEFT_PLUS_RIGHT_LEN, SubTag>: CryptoType,
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> sp_std::fmt::Debug
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
Public<LEFT_PLUS_RIGHT_LEN, SubTag>: CryptoType,
|
||||
[u8; LEFT_PLUS_RIGHT_LEN]: crate::hexdisplay::AsBytesRef,
|
||||
{
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
let s = self.to_ss58check();
|
||||
write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8])
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> Serialize
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
Public<LEFT_PLUS_RIGHT_LEN, SubTag>: CryptoType,
|
||||
{
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&self.to_ss58check())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> Deserialize<'de>
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
Public<LEFT_PLUS_RIGHT_LEN, SubTag>: CryptoType,
|
||||
{
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Public::from_ss58check(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> PublicT
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
Public<LEFT_PLUS_RIGHT_LEN, SubTag>: CryptoType,
|
||||
{
|
||||
}
|
||||
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag: PairedCryptoSubTagBound> Derive
|
||||
for Public<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
{
|
||||
}
|
||||
|
||||
/// Trait characterizing a signature which could be used as individual component of an
|
||||
/// `paired_crypto:Signature` pair.
|
||||
pub trait SignatureBound: ByteArray {}
|
||||
|
||||
impl<T: ByteArray> SignatureBound for T {}
|
||||
|
||||
/// A pair of signatures of different types
|
||||
pub type Signature<const LEFT_PLUS_RIGHT_LEN: usize, SubTag> =
|
||||
SignatureBytes<LEFT_PLUS_RIGHT_LEN, (PairedCryptoTag, SubTag)>;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag> Serialize
|
||||
for Signature<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
{
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, const LEFT_PLUS_RIGHT_LEN: usize, SubTag> Deserialize<'de>
|
||||
for Signature<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
{
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let bytes = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Signature::<LEFT_PLUS_RIGHT_LEN, SubTag>::try_from(bytes.as_ref()).map_err(|e| {
|
||||
de::Error::custom(format!("Error converting deserialized data into signature: {:?}", e))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize, SubTag> sp_std::fmt::Debug
|
||||
for Signature<LEFT_PLUS_RIGHT_LEN, SubTag>
|
||||
where
|
||||
[u8; LEFT_PLUS_RIGHT_LEN]: crate::hexdisplay::AsBytesRef,
|
||||
{
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// A key pair.
|
||||
pub struct Pair<
|
||||
LeftPair: PairT,
|
||||
@@ -332,9 +205,8 @@ impl<
|
||||
> PairT for Pair<LeftPair, RightPair, PUBLIC_KEY_LEN, SIGNATURE_LEN, SubTag>
|
||||
where
|
||||
Pair<LeftPair, RightPair, PUBLIC_KEY_LEN, SIGNATURE_LEN, SubTag>: CryptoType,
|
||||
LeftPair::Signature: SignatureBound,
|
||||
RightPair::Signature: SignatureBound,
|
||||
Public<PUBLIC_KEY_LEN, SubTag>: CryptoType,
|
||||
Public<PUBLIC_KEY_LEN, SubTag>: PublicT,
|
||||
Signature<SIGNATURE_LEN, SubTag>: SignatureT,
|
||||
LeftPair::Seed: From<Seed> + Into<Seed>,
|
||||
RightPair::Seed: From<Seed> + Into<Seed>,
|
||||
{
|
||||
@@ -417,14 +289,14 @@ where
|
||||
|
||||
// Test set exercising the (ECDSA,BLS12-377) implementation
|
||||
#[cfg(all(test, feature = "bls-experimental"))]
|
||||
mod test {
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{crypto::DEV_PHRASE, KeccakHasher};
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::{bls377, crypto::DEV_PHRASE, ecdsa, KeccakHasher};
|
||||
use codec::{Decode, Encode};
|
||||
use ecdsa_bls377::{Pair, Signature};
|
||||
|
||||
use crate::{bls377, ecdsa};
|
||||
|
||||
#[test]
|
||||
fn test_length_of_paired_ecdsa_and_bls377_public_key_and_signature_is_correct() {
|
||||
assert_eq!(
|
||||
|
||||
@@ -22,7 +22,9 @@
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError};
|
||||
use crate::crypto::{
|
||||
CryptoBytes, DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError,
|
||||
};
|
||||
#[cfg(feature = "full_crypto")]
|
||||
use schnorrkel::signing_context;
|
||||
use schnorrkel::{
|
||||
@@ -31,9 +33,7 @@ use schnorrkel::{
|
||||
};
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
use crate::crypto::{
|
||||
CryptoType, CryptoTypeId, Derive, Public as TraitPublic, PublicBytes, SignatureBytes,
|
||||
};
|
||||
use crate::crypto::{CryptoType, CryptoTypeId, Derive, Public as TraitPublic, SignatureBytes};
|
||||
use codec::{Decode, Encode, MaxEncodedLen};
|
||||
use scale_info::TypeInfo;
|
||||
|
||||
@@ -59,20 +59,28 @@ pub const SIGNATURE_SERIALIZED_SIZE: usize = 64;
|
||||
|
||||
#[doc(hidden)]
|
||||
pub struct Sr25519Tag;
|
||||
#[doc(hidden)]
|
||||
pub struct Sr25519PublicTag;
|
||||
|
||||
/// An Schnorrkel/Ristretto x25519 ("sr25519") public key.
|
||||
pub type Public = PublicBytes<PUBLIC_KEY_SERIALIZED_SIZE, Sr25519Tag>;
|
||||
pub type Public = CryptoBytes<PUBLIC_KEY_SERIALIZED_SIZE, Sr25519PublicTag>;
|
||||
|
||||
/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair.
|
||||
pub struct Pair(Keypair);
|
||||
impl TraitPublic for Public {}
|
||||
|
||||
impl Clone for Pair {
|
||||
fn clone(&self) -> Self {
|
||||
Pair(schnorrkel::Keypair {
|
||||
public: self.0.public,
|
||||
secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..])
|
||||
.expect("key is always the correct size; qed"),
|
||||
})
|
||||
impl Derive for Public {
|
||||
/// Derive a child key from a series of given junctions.
|
||||
///
|
||||
/// `None` if there are any hard junctions in there.
|
||||
#[cfg(feature = "serde")]
|
||||
fn derive<Iter: Iterator<Item = DeriveJunction>>(&self, path: Iter) -> Option<Public> {
|
||||
let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?;
|
||||
for j in path {
|
||||
match j {
|
||||
DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0,
|
||||
DeriveJunction::Hard(_cc) => return None,
|
||||
}
|
||||
}
|
||||
Some(Self::from(acc.to_bytes()))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,29 +137,6 @@ impl<'de> Deserialize<'de> for Public {
|
||||
/// An Schnorrkel/Ristretto x25519 ("sr25519") signature.
|
||||
pub type Signature = SignatureBytes<SIGNATURE_SERIALIZED_SIZE, Sr25519Tag>;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl Serialize for Signature {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(&array_bytes::bytes2hex("", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de> Deserialize<'de> for Signature {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?)
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))?;
|
||||
Signature::try_from(signature_hex.as_ref())
|
||||
.map_err(|e| de::Error::custom(format!("{:?}", e)))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl From<schnorrkel::Signature> for Signature {
|
||||
fn from(s: schnorrkel::Signature) -> Signature {
|
||||
@@ -159,37 +144,19 @@ impl From<schnorrkel::Signature> for Signature {
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::fmt::Debug for Signature {
|
||||
#[cfg(feature = "std")]
|
||||
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair.
|
||||
pub struct Pair(Keypair);
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
|
||||
Ok(())
|
||||
impl Clone for Pair {
|
||||
fn clone(&self) -> Self {
|
||||
Pair(schnorrkel::Keypair {
|
||||
public: self.0.public,
|
||||
secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..])
|
||||
.expect("key is always the correct size; qed"),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Derive for Public {
|
||||
/// Derive a child key from a series of given junctions.
|
||||
///
|
||||
/// `None` if there are any hard junctions in there.
|
||||
#[cfg(feature = "serde")]
|
||||
fn derive<Iter: Iterator<Item = DeriveJunction>>(&self, path: Iter) -> Option<Public> {
|
||||
let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?;
|
||||
for j in path {
|
||||
match j {
|
||||
DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0,
|
||||
DeriveJunction::Hard(_cc) => return None,
|
||||
}
|
||||
}
|
||||
Some(Self::from(acc.to_bytes()))
|
||||
}
|
||||
}
|
||||
|
||||
impl TraitPublic for Public {}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl From<MiniSecretKey> for Pair {
|
||||
fn from(sec: MiniSecretKey) -> Pair {
|
||||
|
||||
@@ -148,7 +148,7 @@ mod test {
|
||||
#[test]
|
||||
fn basic_ed25519_encryption() {
|
||||
let (pair, _) = sp_core::ed25519::Pair::generate();
|
||||
let pk = pair.into();
|
||||
let pk = pair.public();
|
||||
|
||||
let plain_message = b"An important secret message";
|
||||
let encrypted = encrypt_ed25519(&pk, plain_message).unwrap();
|
||||
|
||||
Reference in New Issue
Block a user