flex_dns/rdata/
ipseckey.rs

1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::characters::Characters;
3use crate::parse::Parse;
4use crate::rdata::{RData, RDataParse};
5use crate::write::WriteBytes;
6
7/// # IPsec key record
8/// This record is used to store a public key that is associated with a domain name.
9#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct IpSecKey<'a> {
11    /// The precedence of the key.
12    pub precedence: u16,
13    /// The gateway type.
14    pub gateway_type: u8,
15    /// The algorithm used for the key.
16    pub algorithm: u8,
17    /// The gateway data.
18    pub gateway: Characters<'a>,
19    /// The public key data.
20    pub public_key: Characters<'a>,
21}
22
23impl<'a> RDataParse<'a> for IpSecKey<'a> {
24    #[inline]
25    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
26        let precedence = u16::parse(rdata.buffer, i)?;
27        let gateway_type = u8::parse(rdata.buffer, i)?;
28        let algorithm = u8::parse(rdata.buffer, i)?;
29        let gateway = Characters::parse(rdata.buffer, i)?;
30        let public_key = Characters::parse(rdata.buffer, i)?;
31
32        Ok(Self {
33            precedence,
34            gateway_type,
35            algorithm,
36            gateway,
37            public_key,
38        })
39    }
40}
41
42impl<'a> WriteBytes for IpSecKey<'a> {
43    #[inline]
44    fn write<
45        const PTR_STORAGE: usize,
46        const DNS_SECTION: usize,
47        B: MutBuffer + Buffer,
48    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
49        let mut bytes = 0;
50
51        bytes += self.precedence.write(message)?;
52        bytes += self.gateway_type.write(message)?;
53        bytes += self.algorithm.write(message)?;
54        bytes += self.gateway.write(message)?;
55        bytes += self.public_key.write(message)?;
56
57        Ok(bytes)
58    }
59}
60
61#[cfg(test)]
62mod test {
63    use crate::rdata::testutils::parse_write_test;
64
65    use super::*;
66
67    parse_write_test!(
68        12,
69        [
70            0x01, 0x02, // precedence
71            0x03, // gateway type
72            0x04, // algorithm
73            0x03, b'w', b'w', b'w', // gateway
74            0x03, b'w', b'w', b'w', // public key
75        ],
76        IpSecKey {
77            precedence: 0x0102,
78            gateway_type: 0x03,
79            algorithm: 0x04,
80            gateway: unsafe { Characters::new_unchecked(b"www") },
81            public_key: unsafe { Characters::new_unchecked(b"www") },
82        },
83    );
84}