ssh_packet/crypto/
signature.rs1use binrw::binwrite;
4
5use crate::arch;
6
7#[binwrite]
12#[derive(Debug)]
13#[bw(big)]
14pub struct Publickey<'b> {
15 pub session_id: arch::Bytes<'b>,
17
18 #[bw(calc = 50)]
19 magic: u8,
20
21 pub username: arch::Utf8<'b>,
23
24 pub service_name: arch::Ascii<'b>,
26
27 #[bw(calc = "publickey".into())]
28 method: arch::Utf8<'b>,
29
30 #[bw(calc = true.into())]
31 signed: arch::Bool,
32
33 pub algorithm: arch::Bytes<'b>,
35
36 pub blob: arch::Bytes<'b>,
38}
39
40impl Publickey<'_> {
41 #[cfg(feature = "signature")]
43 #[cfg_attr(docsrs, doc(cfg(feature = "signature")))]
44 pub fn verify<S, K: signature::Verifier<S>>(
45 &self,
46 key: &K,
47 signature: &S,
48 ) -> signature::Result<()> {
49 use binrw::BinWrite;
50
51 let mut buffer = Vec::new();
52 self.write(&mut std::io::Cursor::new(&mut buffer))
53 .expect("The binrw structure serialization failed");
54
55 K::verify(key, &buffer, signature)
56 }
57
58 #[cfg(feature = "signature")]
60 #[cfg_attr(docsrs, doc(cfg(feature = "signature")))]
61 pub fn sign<S, K: signature::Signer<S>>(&self, key: &K) -> S {
62 use binrw::BinWrite;
63
64 let mut buffer = Vec::new();
65 self.write(&mut std::io::Cursor::new(&mut buffer))
66 .expect("The binrw structure serialization failed");
67
68 K::sign(key, &buffer)
69 }
70}