1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use crate::constants::*; use crate::Result; use std::io::{Cursor, Read}; #[derive(Clone)] pub(crate) struct Signature { pub sig_alg: [u8; TWOBYTES], pub keynum: [u8; KEYNUM_BYTES], pub sig: [u8; SIGNATURE_BYTES], } impl Signature { pub fn to_bytes(&self) -> Vec<u8> { let mut v: Vec<u8> = Vec::with_capacity(Self::BYTES); v.extend(&self.sig_alg); v.extend(&self.keynum); v.extend(&self.sig[..]); debug_assert_eq!(v.len(), Self::BYTES); v } pub fn from_bytes(bytes_buf: &[u8]) -> Result<Signature> { let mut buf = Cursor::new(bytes_buf); let mut sig_alg = [0u8; 2]; let mut keynum = [0u8; KEYNUM_BYTES]; let mut sig = [0u8; SIGNATURE_BYTES]; buf.read_exact(&mut sig_alg)?; buf.read_exact(&mut keynum)?; buf.read_exact(&mut sig)?; debug_assert_eq!(buf.position() as usize, Self::BYTES); Ok(Signature { sig_alg, keynum, sig, }) } pub const BYTES: usize = 2 + KEYNUM_BYTES + SIGNATURE_BYTES; } impl Default for Signature { fn default() -> Self { Signature { sig_alg: [0u8; TWOBYTES], keynum: [0u8; KEYNUM_BYTES], sig: [0u8; SIGNATURE_BYTES], } } } impl ToString for Signature { fn to_string(&self) -> String { base64::encode(self.to_bytes().as_slice()) } }