use binrw::binwrite;
use crate::arch;
#[binwrite]
#[derive(Debug)]
#[bw(big)]
pub struct Publickey<'b> {
pub session_id: arch::Bytes<'b>,
#[bw(calc = 50)]
magic: u8,
pub username: arch::Utf8<'b>,
pub service_name: arch::Ascii<'b>,
#[bw(calc = "publickey".into())]
method: arch::Utf8<'b>,
#[bw(calc = true.into())]
signed: arch::Bool,
pub algorithm: arch::Bytes<'b>,
pub blob: arch::Bytes<'b>,
}
impl Publickey<'_> {
#[cfg(feature = "signature")]
#[cfg_attr(docsrs, doc(cfg(feature = "signature")))]
pub fn verify<S, K: signature::Verifier<S>>(
&self,
key: &K,
signature: &S,
) -> signature::Result<()> {
use binrw::BinWrite;
let mut buffer = Vec::new();
self.write(&mut std::io::Cursor::new(&mut buffer))
.expect("The binrw structure serialization failed");
K::verify(key, &buffer, signature)
}
#[cfg(feature = "signature")]
#[cfg_attr(docsrs, doc(cfg(feature = "signature")))]
pub fn sign<S, K: signature::Signer<S>>(&self, key: &K) -> S {
use binrw::BinWrite;
let mut buffer = Vec::new();
self.write(&mut std::io::Cursor::new(&mut buffer))
.expect("The binrw structure serialization failed");
K::sign(key, &buffer)
}
}