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

Commit 57dddd2

Browse files
davxygpestana
authored andcommitted
Generic keystore internals (#13749)
* Generic testing keystore internals * Generic local keystore internals * Restore deleted comment
1 parent 17a5d9e commit 57dddd2

File tree

2 files changed

+95
-190
lines changed

2 files changed

+95
-190
lines changed

client/keystore/src/local.rs

Lines changed: 47 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,50 @@ impl LocalKeystore {
6363
) -> Result<Option<Pair>> {
6464
self.0.read().key_pair::<Pair>(public)
6565
}
66-
}
6766

68-
impl Keystore for LocalKeystore {
69-
fn sr25519_public_keys(&self, key_type: KeyTypeId) -> Vec<sr25519::Public> {
67+
fn public_keys<T: CorePair>(&self, key_type: KeyTypeId) -> Vec<T::Public> {
7068
self.0
7169
.read()
7270
.raw_public_keys(key_type)
7371
.map(|v| {
74-
v.into_iter()
75-
.filter_map(|k| sr25519::Public::from_slice(k.as_slice()).ok())
76-
.collect()
72+
v.into_iter().filter_map(|k| T::Public::from_slice(k.as_slice()).ok()).collect()
7773
})
7874
.unwrap_or_default()
7975
}
8076

77+
fn generate_new<T: CorePair>(
78+
&self,
79+
key_type: KeyTypeId,
80+
seed: Option<&str>,
81+
) -> std::result::Result<T::Public, TraitError> {
82+
let pair = match seed {
83+
Some(seed) => self.0.write().insert_ephemeral_from_seed_by_type::<T>(seed, key_type),
84+
None => self.0.write().generate_by_type::<T>(key_type),
85+
}
86+
.map_err(|e| -> TraitError { e.into() })?;
87+
Ok(pair.public())
88+
}
89+
90+
fn sign<T: CorePair>(
91+
&self,
92+
key_type: KeyTypeId,
93+
public: &T::Public,
94+
msg: &[u8],
95+
) -> std::result::Result<Option<T::Signature>, TraitError> {
96+
let signature = self
97+
.0
98+
.read()
99+
.key_pair_by_type::<T>(public, key_type)?
100+
.map(|pair| pair.sign(msg));
101+
Ok(signature)
102+
}
103+
}
104+
105+
impl Keystore for LocalKeystore {
106+
fn sr25519_public_keys(&self, key_type: KeyTypeId) -> Vec<sr25519::Public> {
107+
self.public_keys::<sr25519::Pair>(key_type)
108+
}
109+
81110
/// Generate a new pair compatible with the 'ed25519' signature scheme.
82111
///
83112
/// If the `[seed]` is `Some` then the key will be ephemeral and stored in memory.
@@ -86,16 +115,7 @@ impl Keystore for LocalKeystore {
86115
key_type: KeyTypeId,
87116
seed: Option<&str>,
88117
) -> std::result::Result<sr25519::Public, TraitError> {
89-
let pair = match seed {
90-
Some(seed) => self
91-
.0
92-
.write()
93-
.insert_ephemeral_from_seed_by_type::<sr25519::Pair>(seed, key_type),
94-
None => self.0.write().generate_by_type::<sr25519::Pair>(key_type),
95-
}
96-
.map_err(|e| -> TraitError { e.into() })?;
97-
98-
Ok(pair.public())
118+
self.generate_new::<sr25519::Pair>(key_type, seed)
99119
}
100120

101121
fn sr25519_sign(
@@ -104,12 +124,7 @@ impl Keystore for LocalKeystore {
104124
public: &sr25519::Public,
105125
msg: &[u8],
106126
) -> std::result::Result<Option<sr25519::Signature>, TraitError> {
107-
let res = self
108-
.0
109-
.read()
110-
.key_pair_by_type::<sr25519::Pair>(public, key_type)?
111-
.map(|pair| pair.sign(msg));
112-
Ok(res)
127+
self.sign::<sr25519::Pair>(key_type, public, msg)
113128
}
114129

115130
fn sr25519_vrf_sign(
@@ -118,24 +133,16 @@ impl Keystore for LocalKeystore {
118133
public: &sr25519::Public,
119134
transcript_data: VRFTranscriptData,
120135
) -> std::result::Result<Option<VRFSignature>, TraitError> {
121-
let res = self.0.read().key_pair_by_type::<sr25519::Pair>(public, key_type)?.map(|pair| {
136+
let sig = self.0.read().key_pair_by_type::<sr25519::Pair>(public, key_type)?.map(|pair| {
122137
let transcript = make_transcript(transcript_data);
123138
let (inout, proof, _) = pair.as_ref().vrf_sign(transcript);
124139
VRFSignature { output: inout.to_output(), proof }
125140
});
126-
Ok(res)
141+
Ok(sig)
127142
}
128143

129144
fn ed25519_public_keys(&self, key_type: KeyTypeId) -> Vec<ed25519::Public> {
130-
self.0
131-
.read()
132-
.raw_public_keys(key_type)
133-
.map(|v| {
134-
v.into_iter()
135-
.filter_map(|k| ed25519::Public::from_slice(k.as_slice()).ok())
136-
.collect()
137-
})
138-
.unwrap_or_default()
145+
self.public_keys::<ed25519::Pair>(key_type)
139146
}
140147

141148
/// Generate a new pair compatible with the 'sr25519' signature scheme.
@@ -146,16 +153,7 @@ impl Keystore for LocalKeystore {
146153
key_type: KeyTypeId,
147154
seed: Option<&str>,
148155
) -> std::result::Result<ed25519::Public, TraitError> {
149-
let pair = match seed {
150-
Some(seed) => self
151-
.0
152-
.write()
153-
.insert_ephemeral_from_seed_by_type::<ed25519::Pair>(seed, key_type),
154-
None => self.0.write().generate_by_type::<ed25519::Pair>(key_type),
155-
}
156-
.map_err(|e| -> TraitError { e.into() })?;
157-
158-
Ok(pair.public())
156+
self.generate_new::<ed25519::Pair>(key_type, seed)
159157
}
160158

161159
fn ed25519_sign(
@@ -164,24 +162,11 @@ impl Keystore for LocalKeystore {
164162
public: &ed25519::Public,
165163
msg: &[u8],
166164
) -> std::result::Result<Option<ed25519::Signature>, TraitError> {
167-
let res = self
168-
.0
169-
.read()
170-
.key_pair_by_type::<ed25519::Pair>(public, key_type)?
171-
.map(|pair| pair.sign(msg));
172-
Ok(res)
165+
self.sign::<ed25519::Pair>(key_type, public, msg)
173166
}
174167

175168
fn ecdsa_public_keys(&self, key_type: KeyTypeId) -> Vec<ecdsa::Public> {
176-
self.0
177-
.read()
178-
.raw_public_keys(key_type)
179-
.map(|v| {
180-
v.into_iter()
181-
.filter_map(|k| ecdsa::Public::from_slice(k.as_slice()).ok())
182-
.collect()
183-
})
184-
.unwrap_or_default()
169+
self.public_keys::<ecdsa::Pair>(key_type)
185170
}
186171

187172
/// Generate a new pair compatible with the 'ecdsa' signature scheme.
@@ -192,14 +177,7 @@ impl Keystore for LocalKeystore {
192177
key_type: KeyTypeId,
193178
seed: Option<&str>,
194179
) -> std::result::Result<ecdsa::Public, TraitError> {
195-
let pair = match seed {
196-
Some(seed) =>
197-
self.0.write().insert_ephemeral_from_seed_by_type::<ecdsa::Pair>(seed, key_type),
198-
None => self.0.write().generate_by_type::<ecdsa::Pair>(key_type),
199-
}
200-
.map_err(|e| -> TraitError { e.into() })?;
201-
202-
Ok(pair.public())
180+
self.generate_new::<ecdsa::Pair>(key_type, seed)
203181
}
204182

205183
fn ecdsa_sign(
@@ -208,12 +186,7 @@ impl Keystore for LocalKeystore {
208186
public: &ecdsa::Public,
209187
msg: &[u8],
210188
) -> std::result::Result<Option<ecdsa::Signature>, TraitError> {
211-
let res = self
212-
.0
213-
.read()
214-
.key_pair_by_type::<ecdsa::Pair>(public, key_type)?
215-
.map(|pair| pair.sign(msg));
216-
Ok(res)
189+
self.sign::<ecdsa::Pair>(key_type, public, msg)
217190
}
218191

219192
fn ecdsa_sign_prehashed(
@@ -222,12 +195,12 @@ impl Keystore for LocalKeystore {
222195
public: &ecdsa::Public,
223196
msg: &[u8; 32],
224197
) -> std::result::Result<Option<ecdsa::Signature>, TraitError> {
225-
let res = self
198+
let sig = self
226199
.0
227200
.read()
228201
.key_pair_by_type::<ecdsa::Pair>(public, key_type)?
229202
.map(|pair| pair.sign_prehashed(msg));
230-
Ok(res)
203+
Ok(sig)
231204
}
232205

233206
fn insert(

0 commit comments

Comments
 (0)