mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 23:21:06 +00:00
Generic keystore (#3008)
* Add KeyTypeId. * Implement clone for sr25519::Pair. * Extend Pair with to_raw_vec. * Implement TypedKey for Signature and Pair. * Add trait Public. * Make keystore generic. * Fixup clone. * Fix tests. * Update service. * Fix imports. * Fix build. * Fix babe build. * Fix subkey build. * Make authority setup generic. * Update node-template. * Fix build. * Remove unsafe code. * Fix tests.
This commit is contained in:
@@ -26,6 +26,8 @@ use parity_codec::{Encode, Decode};
|
||||
use regex::Regex;
|
||||
#[cfg(feature = "std")]
|
||||
use base58::{FromBase58, ToBase58};
|
||||
#[cfg(feature = "std")]
|
||||
use std::hash::Hash;
|
||||
|
||||
/// The root phrase for our publicly known keys.
|
||||
pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk";
|
||||
@@ -286,13 +288,30 @@ impl<T: AsMut<[u8]> + AsRef<[u8]> + Default + Derive> Ss58Codec for T {
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait suitable for typical cryptographic PKI key public type.
|
||||
pub trait Public: PartialEq + Eq {
|
||||
/// A new instance from the given slice that should be 32 bytes long.
|
||||
///
|
||||
/// NOTE: No checking goes on to ensure this is a real public key. Only use it if
|
||||
/// you are certain that the array actually is a pubkey. GIGO!
|
||||
fn from_slice(data: &[u8]) -> Self;
|
||||
|
||||
/// Return a `Vec<u8>` filled with raw data.
|
||||
#[cfg(feature = "std")]
|
||||
fn to_raw_vec(&self) -> Vec<u8>;
|
||||
|
||||
/// Return a slice filled with raw data.
|
||||
fn as_slice(&self) -> &[u8];
|
||||
}
|
||||
|
||||
/// Trait suitable for typical cryptographic PKI key pair type.
|
||||
///
|
||||
/// For now it just specifies how to create a key from a phrase and derivation path.
|
||||
#[cfg(feature = "std")]
|
||||
pub trait Pair: Sized + 'static {
|
||||
pub trait Pair: Sized + 'static
|
||||
{
|
||||
/// TThe type which is used to encode a public key.
|
||||
type Public;
|
||||
type Public: Public + Hash;
|
||||
|
||||
/// The type used to (minimally) encode the data required to securely create
|
||||
/// a new key pair.
|
||||
@@ -412,6 +431,31 @@ pub trait Pair: Sized + 'static {
|
||||
path,
|
||||
)
|
||||
}
|
||||
|
||||
/// Return a vec filled with raw data.
|
||||
fn to_raw_vec(&self) -> Vec<u8>;
|
||||
}
|
||||
|
||||
/// An identifier for a type of cryptographic key.
|
||||
///
|
||||
/// 0-1024 are reserved.
|
||||
pub type KeyTypeId = u32;
|
||||
|
||||
/// Constant key types.
|
||||
pub mod key_types {
|
||||
use super::KeyTypeId;
|
||||
|
||||
/// ED25519 public key.
|
||||
pub const ED25519: KeyTypeId = 10;
|
||||
|
||||
/// SR25519 public key.
|
||||
pub const SR25519: KeyTypeId = 20;
|
||||
}
|
||||
|
||||
/// A trait for something that has a key type ID.
|
||||
pub trait TypedKey {
|
||||
/// The type ID of this key.
|
||||
const KEY_TYPE: KeyTypeId;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -429,8 +473,21 @@ mod tests {
|
||||
Seed(Vec<u8>),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Hash)]
|
||||
struct TestPublic;
|
||||
impl Public for TestPublic {
|
||||
fn from_slice(bytes: &[u8]) -> Self {
|
||||
Self
|
||||
}
|
||||
fn as_slice(&self) -> &[u8] {
|
||||
&[]
|
||||
}
|
||||
fn to_raw_vec(&self) -> Vec<u8> {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
impl Pair for TestPair {
|
||||
type Public = ();
|
||||
type Public = TestPublic;
|
||||
type Seed = [u8; 0];
|
||||
type Signature = ();
|
||||
type DeriveError = ();
|
||||
@@ -464,7 +521,7 @@ mod tests {
|
||||
_message: M,
|
||||
_pubkey: P
|
||||
) -> bool { true }
|
||||
fn public(&self) -> Self::Public { () }
|
||||
fn public(&self) -> Self::Public { TestPublic }
|
||||
fn from_standard_components<I: Iterator<Item=DeriveJunction>>(
|
||||
phrase: &str,
|
||||
password: Option<&str>,
|
||||
@@ -481,6 +538,9 @@ mod tests {
|
||||
{
|
||||
Ok(TestPair::Seed(seed.to_owned()))
|
||||
}
|
||||
fn to_raw_vec(&self) -> Vec<u8> {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user