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#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct Ds<'a> {
11 pub key_tag: u16,
13 pub algorithm: u8,
15 pub digest_type: u8,
17 pub digest: Characters<'a>,
19}
20
21impl<'a> RDataParse<'a> for Ds<'a> {
22 #[inline]
23 fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
24 let key_tag = u16::parse(rdata.buffer, i)?;
25 let algorithm = u8::parse(rdata.buffer, i)?;
26 let digest_type = u8::parse(rdata.buffer, i)?;
27 let digest = Characters::parse(rdata.buffer, i)?;
28
29 Ok(Ds {
30 key_tag,
31 algorithm,
32 digest_type,
33 digest,
34 })
35 }
36}
37
38impl<'a> WriteBytes for Ds<'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.key_tag.write(message)?;
48 bytes += self.algorithm.write(message)?;
49 bytes += self.digest_type.write(message)?;
50 bytes += self.digest.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 0x0c, 0x07, 0x83, 0x73, 0x03, b'w', b'w', b'w', ],
71 Ds {
72 key_tag: 0x0c07,
73 algorithm: 0x83,
74 digest_type: 0x73,
75 digest: unsafe { Characters::new_unchecked(b"www") },
76 },
77 );
78}