@@ -92,11 +92,16 @@ impl SigningKeypair {
9292 ///match the private key.
9393 ///
9494 pub fn from_bytes ( sized_bytes : & [ u8 ; 64 ] ) -> Result < SigningKeypair , Ed25519Error > {
95- let ( _, pub_key) = array_split_64 ( sized_bytes) ;
95+ let ( priv_key, pub_key) = array_split_64 ( sized_bytes) ;
96+ let ed25519_dalek_secret = ed25519_dalek:: SigningKey :: from_bytes ( & priv_key) ;
9697 //Calculate the public key to check that the value passed in is correct.
97- let ed25519_dalek_pub = ed25519_dalek:: VerifyingKey :: from_bytes ( & pub_key)
98- . map_err ( |_| Ed25519Error :: PublicKeyInvalid ( pub_key) ) ?;
99- Ok ( SigningKeypair :: new_unchecked ( * sized_bytes) )
98+
99+ let ed25519_dalek_pub = ed25519_dalek:: VerifyingKey :: from ( & ed25519_dalek_secret) ;
100+ if ed25519_dalek_pub. to_bytes ( ) == pub_key {
101+ Ok ( SigningKeypair :: new_unchecked ( * sized_bytes) )
102+ } else {
103+ Err ( Ed25519Error :: PublicKeyInvalid ( pub_key) )
104+ }
100105 }
101106
102107 pub ( crate ) fn new_unchecked ( bytes : [ u8 ; 64 ] ) -> SigningKeypair {
@@ -147,7 +152,8 @@ impl Ed25519Signing for Ed25519 {
147152 use ed25519_dalek:: Signer ;
148153 //This unwrap cannot fail. The only thing that the `from_bytes` does for validation is that the
149154 //value is 64 bytes long, which we guarantee statically.
150- let key_pair = ed25519_dalek:: SigningKey :: from_bytes ( signing_key. public_key ( ) . bytes ( ) ) ;
155+ let ( priv_key, _) = array_split_64 ( & signing_key. bytes ) ;
156+ let key_pair = ed25519_dalek:: SigningKey :: from_bytes ( & priv_key) ;
151157 let sig = key_pair. sign ( & t. to_bytes ( ) [ ..] ) ;
152158
153159 Ed25519Signature :: new ( sig. to_bytes ( ) )
@@ -202,17 +208,13 @@ pub(crate) mod test {
202208
203209 #[ test]
204210 fn real_ed25519_matches_verify_good_message ( ) {
205- let dalek_pub_key = ed25519_dalek:: VerifyingKey :: from_bytes ( & [ 1u8 ; 32 ] ) . unwrap ( ) ;
206- let priv_key = SigningKeypair {
207- bytes : array_concat_32 ( & [ 1u8 ; 32 ] , & dalek_pub_key . to_bytes ( ) ) ,
211+ let sec_key = ed25519_dalek:: SigningKey :: from_bytes ( & [ 1 ; 32 ] ) ;
212+ let keypair = SigningKeypair {
213+ bytes : sec_key . to_keypair_bytes ( ) ,
208214 } ;
209215 let message = [ 100u8 ; 32 ] . to_vec ( ) ;
210- let result = Ed25519 . sign ( & message, & priv_key) ;
211- let verify_result = Ed25519 . verify (
212- & message,
213- & result,
214- & PublicSigningKey :: new ( dalek_pub_key. to_bytes ( ) ) ,
215- ) ;
216+ let result = Ed25519 . sign ( & message, & keypair) ;
217+ let verify_result = Ed25519 . verify ( & message, & result, & keypair. public_key ( ) ) ;
216218 assert ! ( verify_result) ;
217219 }
218220
0 commit comments