flex_dns/rdata/
nsec3param.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/// # Next secure record version 3 parameters
8/// This record is used to provide parameters for the NSEC3 records.
9#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct Nsec3Param<'a> {
11    /// Hash algorithm
12    pub hash_algorithm: u8,
13    /// Flags
14    pub flags: u8,
15    /// Iterations
16    pub iterations: u16,
17    /// Salt
18    pub salt: Characters<'a>,
19}
20
21impl<'a> RDataParse<'a> for Nsec3Param<'a> {
22    #[inline]
23    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
24        let hash_algorithm = u8::parse(rdata, i)?;
25        let flags = u8::parse(rdata, i)?;
26        let iterations = u16::parse(rdata, i)?;
27        let salt = Characters::parse(rdata, i)?;
28
29        Ok(Self {
30            hash_algorithm,
31            flags,
32            iterations,
33            salt,
34        })
35    }
36}
37
38impl<'a> WriteBytes for Nsec3Param<'a> {
39    #[inline]
40    fn write<
41        const PTR_STORAGE: usize,
42        const DNS_SECTION: usize,
43        B: MutBuffer + Buffer,
44    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
45        let mut bytes = 0;
46
47        bytes += self.hash_algorithm.write(message)?;
48        bytes += self.flags.write(message)?;
49        bytes += self.iterations.write(message)?;
50        bytes += self.salt.write(message)?;
51
52        Ok(bytes)
53    }
54}
55
56#[cfg(test)]
57mod test {
58    use crate::rdata::testutils::parse_write_test;
59
60    use super::*;
61
62    parse_write_test!(
63        8,
64        [
65            0x0e, // hash algorithm
66            0xae, // flags
67            0x0a, 0xfe, // iterations
68            0x03, b'w', b'w', b'w', // salt
69        ],
70        Nsec3Param {
71            hash_algorithm: 0x0e,
72            flags: 0xae,
73            iterations: 0x0afe,
74            salt: unsafe { Characters::new_unchecked(b"www") },
75        },
76    );
77}