flex_dns/rdata/
nsec3param.rs1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::characters::Characters;
3use crate::parse::Parse;
4use crate::rdata::{RData, RDataParse};
5use crate::write::WriteBytes;
6
7#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct Nsec3Param<'a> {
11 pub hash_algorithm: u8,
13 pub flags: u8,
15 pub iterations: u16,
17 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, 0xae, 0x0a, 0xfe, 0x03, b'w', b'w', b'w', ],
70 Nsec3Param {
71 hash_algorithm: 0x0e,
72 flags: 0xae,
73 iterations: 0x0afe,
74 salt: unsafe { Characters::new_unchecked(b"www") },
75 },
76 );
77}