Skip to content

Commit aa9bdb4

Browse files
committed
added support for sk-ecdsa-sha2-nistp256-cert-v01@openssh.com and sk-ssh-ed25519-cert-v01@openssh.com keys in client
1 parent ce6cd79 commit aa9bdb4

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

russh/src/server/encrypted.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -458,13 +458,21 @@ impl Encrypted {
458458
let algo = s.read_string().map_err(crate::Error::from)?;
459459

460460
let sig = s.read_string().map_err(crate::Error::from)?;
461+
462+
let mut sig_buf = sig.to_vec();
463+
let algo = Algorithm::new(str::from_utf8(algo).map_err(crate::Error::from)?)
464+
.map_err(crate::Error::from)?;
465+
466+
if algo == Algorithm::SkEcdsaSha2NistP256 || algo == Algorithm::SkEd25519 {
467+
// https://github.com/RustCrypto/SSH/issues/312
468+
let flags = s.read_byte().map_err(crate::Error::from)?;
469+
sig_buf.push(flags);
470+
let counter = s.read_u32().map_err(crate::Error::from)?;
471+
sig_buf.extend_from_slice(&counter.to_be_bytes());
472+
}
473+
461474
#[allow(clippy::indexing_slicing)]
462-
let sig = Signature::new(
463-
Algorithm::new(str::from_utf8(algo).map_err(crate::Error::from)?)
464-
.map_err(crate::Error::from)?,
465-
sig,
466-
)
467-
.map_err(crate::Error::from)?;
475+
let sig = Signature::new(algo, sig_buf).map_err(crate::Error::from)?;
468476

469477
#[allow(clippy::indexing_slicing)] // length checked
470478
let init = &buf[0..pos0];
@@ -562,13 +570,16 @@ impl Encrypted {
562570
Ok(())
563571
}
564572
}
565-
Err(ssh_key::Error::AlgorithmUnknown)
566-
| Err(ssh_key::Error::AlgorithmUnsupported { .. })
567-
| Err(ssh_key::Error::CertificateValidation { .. }) => {
568-
reject_auth_request(until, &mut self.write, auth_request).await;
569-
Ok(())
570-
}
571-
Err(e) => Err(crate::Error::from(e).into()),
573+
Err(e) => match e {
574+
ssh_key::Error::AlgorithmUnknown
575+
| ssh_key::Error::AlgorithmUnsupported { .. }
576+
| ssh_key::Error::CertificateValidation { .. } => {
577+
debug!("public key error: {e}");
578+
reject_auth_request(until, &mut self.write, auth_request).await;
579+
Ok(())
580+
}
581+
e => Err(crate::Error::from(e).into()),
582+
},
572583
}
573584
}
574585
}

0 commit comments

Comments
 (0)