1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414//
15- use serde:: { Serialize , Deserialize } ;
16- use ed25519_dalek:: ed25519:: signature:: Signature as EdSignature ;
1715use ed25519_dalek:: { Signer , Verifier } ;
1816#[ cfg( feature = "openssl" ) ]
1917use openssl:: pkey:: { Private , Public } ;
20- use rand :: rngs :: OsRng ;
18+ use rand_core :: OsRng ;
2119use russh_cryptovec:: CryptoVec ;
20+ use serde:: { Deserialize , Serialize } ;
21+ use std:: convert:: TryFrom ;
2222
2323use crate :: encoding:: { Encoding , Reader } ;
2424pub use crate :: signature:: * ;
@@ -109,7 +109,7 @@ impl SignatureHash {
109109#[ derive( Eq , Debug , Clone ) ]
110110pub enum PublicKey {
111111 #[ doc( hidden) ]
112- Ed25519 ( ed25519_dalek:: PublicKey ) ,
112+ Ed25519 ( ed25519_dalek:: VerifyingKey ) ,
113113 #[ doc( hidden) ]
114114 #[ cfg( feature = "openssl" ) ]
115115 RSA {
@@ -137,7 +137,7 @@ pub struct OpenSSLPKey(pub openssl::pkey::PKey<Public>);
137137
138138#[ cfg( feature = "openssl" ) ]
139139use std:: cmp:: { Eq , PartialEq } ;
140- use std :: convert :: TryInto ;
140+
141141#[ cfg( feature = "openssl" ) ]
142142impl PartialEq for OpenSSLPKey {
143143 fn eq ( & self , b : & OpenSSLPKey ) -> bool {
@@ -161,11 +161,13 @@ impl PublicKey {
161161 let mut p = pubkey. reader ( 0 ) ;
162162 let key_algo = p. read_string ( ) ?;
163163 let key_bytes = p. read_string ( ) ?;
164- if key_algo != b"ssh-ed25519" || key_bytes. len ( ) != ed25519_dalek:: PUBLIC_KEY_LENGTH
165- {
164+ if key_algo != b"ssh-ed25519" {
166165 return Err ( Error :: CouldNotReadKey ) ;
167166 }
168- ed25519_dalek:: PublicKey :: from_bytes ( key_bytes)
167+ let Ok ( key_bytes) = <& [ u8 ; ed25519_dalek:: PUBLIC_KEY_LENGTH ] >:: try_from ( key_bytes) else {
168+ return Err ( Error :: CouldNotReadKey ) ;
169+ } ;
170+ ed25519_dalek:: VerifyingKey :: from_bytes ( key_bytes)
169171 . map ( PublicKey :: Ed25519 )
170172 . map_err ( Error :: from)
171173 }
@@ -217,9 +219,13 @@ impl PublicKey {
217219 /// Verify a signature.
218220 pub fn verify_detached ( & self , buffer : & [ u8 ] , sig : & [ u8 ] ) -> bool {
219221 match self {
220- PublicKey :: Ed25519 ( ref public) => ed25519_dalek:: Signature :: from_bytes ( sig)
221- . and_then ( |sig| public. verify ( buffer, & sig) )
222- . is_ok ( ) ,
222+ PublicKey :: Ed25519 ( ref public) => {
223+ let Ok ( sig) = ed25519_dalek:: ed25519:: SignatureBytes :: try_from ( sig) else {
224+ return false ;
225+ } ;
226+ let sig = ed25519_dalek:: Signature :: from_bytes ( & sig) ;
227+ public. verify ( buffer, & sig) . is_ok ( )
228+ }
223229
224230 #[ cfg( feature = "openssl" ) ]
225231 PublicKey :: RSA { ref key, ref hash } => {
@@ -273,7 +279,7 @@ impl Verify for PublicKey {
273279/// Public key exchange algorithms.
274280#[ allow( clippy:: large_enum_variant) ]
275281pub enum KeyPair {
276- Ed25519 ( ed25519_dalek:: Keypair ) ,
282+ Ed25519 ( ed25519_dalek:: SigningKey ) ,
277283 #[ cfg( feature = "openssl" ) ]
278284 RSA {
279285 key : openssl:: rsa:: Rsa < Private > ,
@@ -285,10 +291,9 @@ impl Clone for KeyPair {
285291 fn clone ( & self ) -> Self {
286292 match self {
287293 #[ allow( clippy:: expect_used) ]
288- Self :: Ed25519 ( kp) => Self :: Ed25519 (
289- ed25519_dalek:: Keypair :: from_bytes ( & kp. to_bytes ( ) )
290- . expect ( "expected to clone keypair" ) ,
291- ) ,
294+ Self :: Ed25519 ( kp) => {
295+ Self :: Ed25519 ( ed25519_dalek:: SigningKey :: from_bytes ( & kp. to_bytes ( ) ) )
296+ }
292297 #[ cfg( feature = "openssl" ) ]
293298 Self :: RSA { key, hash } => Self :: RSA {
294299 key : key. clone ( ) ,
@@ -304,7 +309,7 @@ impl std::fmt::Debug for KeyPair {
304309 KeyPair :: Ed25519 ( ref key) => write ! (
305310 f,
306311 "Ed25519 {{ public: {:?}, secret: (hidden) }}" ,
307- key. public . as_bytes( )
312+ key. verifying_key ( ) . as_bytes( )
308313 ) ,
309314 #[ cfg( feature = "openssl" ) ]
310315 KeyPair :: RSA { .. } => write ! ( f, "RSA {{ (hidden) }}" ) ,
@@ -322,7 +327,7 @@ impl KeyPair {
322327 /// Copy the public key of this algorithm.
323328 pub fn clone_public_key ( & self ) -> Result < PublicKey , Error > {
324329 Ok ( match self {
325- KeyPair :: Ed25519 ( ref key) => PublicKey :: Ed25519 ( key. public ) ,
330+ KeyPair :: Ed25519 ( ref key) => PublicKey :: Ed25519 ( key. verifying_key ( ) ) ,
326331 #[ cfg( feature = "openssl" ) ]
327332 KeyPair :: RSA { ref key, ref hash } => {
328333 use openssl:: pkey:: PKey ;
@@ -347,10 +352,10 @@ impl KeyPair {
347352
348353 /// Generate a key pair.
349354 pub fn generate_ed25519 ( ) -> Option < Self > {
350- let keypair = ed25519_dalek:: Keypair :: generate ( & mut OsRng { } ) ;
355+ let keypair = ed25519_dalek:: SigningKey :: generate ( & mut OsRng { } ) ;
351356 assert_eq ! (
352- keypair. public . as_bytes( ) ,
353- ed25519_dalek:: PublicKey :: from( & keypair. secret ) . as_bytes( )
357+ keypair. verifying_key ( ) . as_bytes( ) ,
358+ ed25519_dalek:: VerifyingKey :: from( & keypair) . as_bytes( )
354359 ) ;
355360 Some ( KeyPair :: Ed25519 ( keypair) )
356361 }
@@ -366,9 +371,7 @@ impl KeyPair {
366371 match self {
367372 #[ allow( clippy:: unwrap_used) ]
368373 KeyPair :: Ed25519 ( ref secret) => Ok ( Signature :: Ed25519 ( SignatureBytes (
369- ed25519_dalek:: ed25519:: signature:: Signature :: as_bytes ( & secret. sign ( to_sign) )
370- . try_into ( )
371- . unwrap ( ) ,
374+ secret. sign ( to_sign) . to_bytes ( ) ,
372375 ) ) ) ,
373376 #[ cfg( feature = "openssl" ) ]
374377 KeyPair :: RSA { ref key, ref hash } => Ok ( Signature :: RSA {
@@ -391,11 +394,9 @@ impl KeyPair {
391394 KeyPair :: Ed25519 ( ref secret) => {
392395 let signature = secret. sign ( to_sign. as_ref ( ) ) ;
393396
394- buffer. push_u32_be (
395- ( ED25519 . 0 . len ( ) + EdSignature :: as_bytes ( & signature) . len ( ) + 8 ) as u32 ,
396- ) ;
397+ buffer. push_u32_be ( ( ED25519 . 0 . len ( ) + signature. to_bytes ( ) . len ( ) + 8 ) as u32 ) ;
397398 buffer. extend_ssh_string ( ED25519 . 0 . as_bytes ( ) ) ;
398- buffer. extend_ssh_string ( signature. as_bytes ( ) ) ;
399+ buffer. extend_ssh_string ( signature. to_bytes ( ) . as_slice ( ) ) ;
399400 }
400401 #[ cfg( feature = "openssl" ) ]
401402 KeyPair :: RSA { ref key, ref hash } => {
@@ -418,9 +419,9 @@ impl KeyPair {
418419 match self {
419420 KeyPair :: Ed25519 ( ref secret) => {
420421 let signature = secret. sign ( buffer) ;
421- buffer. push_u32_be ( ( ED25519 . 0 . len ( ) + signature. as_bytes ( ) . len ( ) + 8 ) as u32 ) ;
422+ buffer. push_u32_be ( ( ED25519 . 0 . len ( ) + signature. to_bytes ( ) . len ( ) + 8 ) as u32 ) ;
422423 buffer. extend_ssh_string ( ED25519 . 0 . as_bytes ( ) ) ;
423- buffer. extend_ssh_string ( signature. as_bytes ( ) ) ;
424+ buffer. extend_ssh_string ( signature. to_bytes ( ) . as_slice ( ) ) ;
424425 }
425426 #[ cfg( feature = "openssl" ) ]
426427 KeyPair :: RSA { ref key, ref hash } => {
@@ -482,7 +483,10 @@ pub fn parse_public_key(
482483 let t = pos. read_string ( ) ?;
483484 if t == b"ssh-ed25519" {
484485 if let Ok ( pubkey) = pos. read_string ( ) {
485- let p = ed25519_dalek:: PublicKey :: from_bytes ( pubkey) . map_err ( Error :: from) ?;
486+ let Ok ( pubkey) = <& [ u8 ; ed25519_dalek:: PUBLIC_KEY_LENGTH ] >:: try_from ( pubkey) else {
487+ return Err ( Error :: CouldNotReadKey ) ;
488+ } ;
489+ let p = ed25519_dalek:: VerifyingKey :: from_bytes ( pubkey) . map_err ( Error :: from) ?;
486490 return Ok ( PublicKey :: Ed25519 ( p) ) ;
487491 }
488492 }
0 commit comments