1use ring::hmac::Tag;
2
3mod hmac_sha1;
4mod hmac_sha2;
5use hmac_sha1::HMacSha1;
6use hmac_sha2::{HmacSha2_256, HmacSha2_512};
7
8pub(crate) trait Mac: Send + Sync {
9 fn sign(&self, ik: &[u8], sequence_num: u32, buf: &[u8]) -> Tag;
10 fn new() -> Self
11 where
12 Self: Sized;
13 fn bsize(&self) -> usize;
14}
15
16pub(crate) fn from(s: &super::Mac) -> Box<dyn Mac> {
17 match s {
18 super::Mac::HmacSha1 => Box::new(HMacSha1::new()),
19 super::Mac::HmacSha2_256 => Box::new(HmacSha2_256::new()),
20 super::Mac::HmacSha2_512 => Box::new(HmacSha2_512::new()),
21 }
22}
23
24pub(crate) struct MacNone {}
25
26impl Mac for MacNone {
27 fn sign(&self, _ik: &[u8], _sequence_num: u32, _buf: &[u8]) -> Tag {
28 unreachable!()
29 }
30 fn new() -> Self
31 where
32 Self: Sized,
33 {
34 Self {}
35 }
36 fn bsize(&self) -> usize {
37 unreachable!()
38 }
39}