@@ -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