flex_dns/rdata/
cert.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/// # Certificate record
8/// This record lists the certificates used by the owner of the domain
9/// name to sign other records in the zone.
10#[derive(Copy, Clone, Debug, PartialEq)]
11pub struct Cert<'a> {
12    /// The type of certificate.
13    pub cert_type: u16,
14    /// The key tag of the certificate.
15    pub key_tag: u16,
16    /// The algorithm used to sign the certificate.
17    pub algorithm: u8,
18    /// The certificate data.
19    pub certificate: Characters<'a>,
20}
21
22impl<'a> RDataParse<'a> for Cert<'a> {
23    #[inline]
24    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
25        let cert_type = u16::parse(rdata.buffer, i)?;
26        let key_tag = u16::parse(rdata.buffer, i)?;
27        let algorithm = u8::parse(rdata.buffer, i)?;
28        let certificate = Characters::parse(rdata.buffer, i)?;
29
30        Ok(Self {
31            cert_type,
32            key_tag,
33            algorithm,
34            certificate,
35        })
36    }
37}
38
39impl<'a> WriteBytes for Cert<'a> {
40    #[inline]
41    fn write<
42        const PTR_STORAGE: usize,
43        const DNS_SECTION: usize,
44        B: MutBuffer + Buffer,
45    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
46        let mut bytes = 0;
47
48        bytes += self.cert_type.write(message)?;
49        bytes += self.key_tag.write(message)?;
50        bytes += self.algorithm.write(message)?;
51        bytes += self.certificate.write(message)?;
52
53        Ok(bytes)
54    }
55}
56
57#[cfg(test)]
58mod test {
59    use crate::rdata::testutils::parse_write_test;
60
61    use super::*;
62
63    parse_write_test!(
64        6,
65        [
66            0x00, 0x01, // cert type
67            0x02, 0x03, // key tag
68            0x04, // algorithm
69            0x00, // certificate length
70        ],
71        Cert {
72            cert_type: 1,
73            key_tag: 0x0203,
74            algorithm: 4,
75            certificate: unsafe { Characters::new_unchecked(&[]) },
76        },
77    );
78}