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())
    }
}