@@ -16,6 +16,7 @@ use std::{
1616 path:: Path ,
1717 str:: FromStr ,
1818} ;
19+ use thiserror:: Error ;
1920
2021#[ derive( Debug , Default ) ]
2122pub struct Keypair ( ed25519_dalek:: Keypair ) ;
@@ -160,6 +161,60 @@ impl KeypairUtil for Keypair {
160161 }
161162}
162163
164+ impl < T > PartialEq < T > for Keypair
165+ where
166+ T : KeypairUtil ,
167+ {
168+ fn eq ( & self , other : & T ) -> bool {
169+ self . pubkey ( ) == other. pubkey ( )
170+ }
171+ }
172+
173+ #[ derive( Debug , Default ) ]
174+ pub struct Presigner {
175+ pubkey : Pubkey ,
176+ signature : Signature ,
177+ }
178+
179+ impl Presigner {
180+ #[ allow( dead_code) ]
181+ fn new ( pubkey : & Pubkey , signature : & Signature ) -> Self {
182+ Self {
183+ pubkey : * pubkey,
184+ signature : * signature,
185+ }
186+ }
187+ }
188+
189+ #[ derive( Debug , Error , PartialEq ) ]
190+ enum PresignerError {
191+ #[ error( "pre-generated signature cannot verify data" ) ]
192+ VerificationFailure ,
193+ }
194+
195+ impl KeypairUtil for Presigner {
196+ fn try_pubkey ( & self ) -> Result < Pubkey , Box < dyn error:: Error > > {
197+ Ok ( self . pubkey )
198+ }
199+
200+ fn try_sign_message ( & self , message : & [ u8 ] ) -> Result < Signature , Box < dyn error:: Error > > {
201+ if self . signature . verify ( self . pubkey . as_ref ( ) , message) {
202+ Ok ( self . signature )
203+ } else {
204+ Err ( PresignerError :: VerificationFailure . into ( ) )
205+ }
206+ }
207+ }
208+
209+ impl < T > PartialEq < T > for Presigner
210+ where
211+ T : KeypairUtil ,
212+ {
213+ fn eq ( & self , other : & T ) -> bool {
214+ self . pubkey ( ) == other. pubkey ( )
215+ }
216+ }
217+
163218pub fn read_keypair < R : Read > ( reader : & mut R ) -> Result < Keypair , Box < dyn error:: Error > > {
164219 let bytes: Vec < u8 > = serde_json:: from_reader ( reader) ?;
165220 let dalek_keypair = ed25519_dalek:: Keypair :: from_bytes ( & bytes)
@@ -367,4 +422,46 @@ mod tests {
367422 keypair_from_seed_phrase_and_passphrase ( mnemonic. phrase ( ) , passphrase) . unwrap ( ) ;
368423 assert_eq ! ( keypair. pubkey( ) , expected_keypair. pubkey( ) ) ;
369424 }
425+
426+ #[ test]
427+ fn test_keypair ( ) {
428+ let keypair = keypair_from_seed ( & [ 0u8 ; 32 ] ) . unwrap ( ) ;
429+ let pubkey = keypair. pubkey ( ) ;
430+ let data = [ 1u8 ] ;
431+ let sig = keypair. sign_message ( & data) ;
432+
433+ // KeypairUtil
434+ assert_eq ! ( keypair. try_pubkey( ) . unwrap( ) , pubkey) ;
435+ assert_eq ! ( keypair. pubkey( ) , pubkey) ;
436+ assert_eq ! ( keypair. try_sign_message( & data) . unwrap( ) , sig) ;
437+ assert_eq ! ( keypair. sign_message( & data) , sig) ;
438+
439+ // PartialEq
440+ let keypair2 = keypair_from_seed ( & [ 0u8 ; 32 ] ) . unwrap ( ) ;
441+ assert_eq ! ( keypair, keypair2) ;
442+ }
443+
444+ #[ test]
445+ fn test_presigner ( ) {
446+ let keypair = keypair_from_seed ( & [ 0u8 ; 32 ] ) . unwrap ( ) ;
447+ let pubkey = keypair. pubkey ( ) ;
448+ let data = [ 1u8 ] ;
449+ let sig = keypair. sign_message ( & data) ;
450+
451+ // KeypairUtil
452+ let presigner = Presigner :: new ( & pubkey, & sig) ;
453+ assert_eq ! ( presigner. try_pubkey( ) . unwrap( ) , pubkey) ;
454+ assert_eq ! ( presigner. pubkey( ) , pubkey) ;
455+ assert_eq ! ( presigner. try_sign_message( & data) . unwrap( ) , sig) ;
456+ assert_eq ! ( presigner. sign_message( & data) , sig) ;
457+ let bad_data = [ 2u8 ] ;
458+ assert ! ( presigner. try_sign_message( & bad_data) . is_err( ) ) ;
459+ assert_eq ! ( presigner. sign_message( & bad_data) , Signature :: default ( ) ) ;
460+
461+ // PartialEq
462+ assert_eq ! ( presigner, keypair) ;
463+ assert_eq ! ( keypair, presigner) ;
464+ let presigner2 = Presigner :: new ( & pubkey, & sig) ;
465+ assert_eq ! ( presigner, presigner2) ;
466+ }
370467}
0 commit comments