@@ -16,6 +16,7 @@ use std::cell::RefCell;
1616
1717use russh_cryptovec:: CryptoVec ;
1818use russh_keys:: encoding:: { Encoding , Reader } ;
19+ use russh_keys:: key:: parse_public_key;
1920use tokio:: sync:: mpsc:: unbounded_channel;
2021
2122use crate :: client:: { Handler , Msg , Reply , Session } ;
@@ -520,6 +521,34 @@ impl Session {
520521 } else {
521522 warn ! ( "Received keepalive without reply request!" ) ;
522523 }
524+ } else if req == b"hostkeys-00@openssh.com" {
525+ let mut keys = vec ! [ ] ;
526+ loop {
527+ match r. read_string ( ) {
528+ Ok ( key) => {
529+ let key2 = key. clone ( ) ;
530+ #[ cfg( not( feature = "openssl" ) ) ]
531+ let key = parse_public_key ( key) . map_err ( crate :: Error :: from) ;
532+ #[ cfg( feature = "openssl" ) ]
533+ let key =
534+ parse_public_key ( key, None ) . map_err ( crate :: Error :: from) ;
535+ match key {
536+ Ok ( key) => keys. push ( key) ,
537+ Err ( err) => {
538+ debug ! (
539+ "failed to parse announced host key {:?}: {:?}" ,
540+ key2, err
541+ )
542+ }
543+ }
544+ }
545+ Err ( russh_keys:: Error :: IndexOutOfBounds ) => break ,
546+ x => {
547+ x. map_err ( crate :: Error :: from) ?;
548+ }
549+ }
550+ }
551+ return client. openssh_ext_host_keys_announced ( keys, self ) . await ;
523552 } else {
524553 warn ! (
525554 "Unhandled global request: {:?} {:?}" ,
0 commit comments