dns_message_parser/decode/
dns.rs

1use crate::decode::Decoder;
2use crate::{DecodeError, DecodeResult, Dns, Flags, Opcode, RCode, MAXIMUM_DNS_PACKET_SIZE};
3use std::convert::TryFrom;
4
5impl<'a, 'b: 'a> Decoder<'a, 'b> {
6    fn flags(&mut self) -> DecodeResult<Flags> {
7        let buffer = self.u8()?;
8        let qr = (buffer & 0b1000_0000) != 0;
9        let opcode = (buffer & 0b0111_1000) >> 3;
10        let opcode = match Opcode::try_from(opcode) {
11            Ok(opcode) => opcode,
12            Err(buffer) => return Err(DecodeError::Opcode(buffer)),
13        };
14        let aa = (buffer & 0b0000_0100) != 0;
15        let tc = (buffer & 0b0000_0010) != 0;
16        let rd = (buffer & 0b0000_0001) != 0;
17        let buffer = self.u8()?;
18        let ra = (buffer & 0b1000_0000) != 0;
19        let z = buffer & 0b0100_0000;
20        if z != 0 {
21            return Err(DecodeError::ZNotZeroes(z));
22        }
23        let ad = (buffer & 0b0010_0000) != 0;
24        let cd = (buffer & 0b0001_0000) != 0;
25        let rcode = buffer & 0b0000_1111;
26        match RCode::try_from(rcode) {
27            Ok(rcode) => Ok(Flags {
28                qr,
29                opcode,
30                aa,
31                tc,
32                rd,
33                ra,
34                ad,
35                cd,
36                rcode,
37            }),
38            Err(buffer) => Err(DecodeError::RCode(buffer)),
39        }
40    }
41}
42
43impl<'a, 'b: 'a> Decoder<'b, 'b> {
44    fn dns(&'a mut self) -> DecodeResult<Dns> {
45        if self.offset != 0 {
46            return Err(DecodeError::Offset(self.offset));
47        }
48
49        let bytes_len = self.bytes.len();
50        if bytes_len < 12 {
51            return Err(DecodeError::NotEnoughBytes(bytes_len, 12));
52        } else if bytes_len > MAXIMUM_DNS_PACKET_SIZE {
53            return Err(DecodeError::DnsPacketTooBig(bytes_len));
54        }
55
56        let id = self.u16()?;
57        let flags = self.flags()?;
58        let question_count = self.u16()?;
59        let answer_count = self.u16()?;
60        let authority_count = self.u16()?;
61        let additional_count = self.u16()?;
62
63        let mut questions = Vec::with_capacity(question_count as usize);
64        for _ in 0..question_count {
65            questions.push(self.question()?);
66        }
67        let mut answers = Vec::with_capacity(answer_count as usize);
68        for _ in 0..answer_count {
69            answers.push(self.rr()?);
70        }
71        let mut authorities = Vec::with_capacity(authority_count as usize);
72        for _ in 0..authority_count {
73            authorities.push(self.rr()?);
74        }
75        let mut additionals = Vec::with_capacity(additional_count as usize);
76        for _ in 0..additional_count {
77            additionals.push(self.rr()?);
78        }
79
80        let is_finished = self.is_finished()?;
81        let dns = Dns {
82            id,
83            flags,
84            questions,
85            answers,
86            authorities,
87            additionals,
88        };
89
90        if is_finished {
91            Ok(dns)
92        } else {
93            Err(DecodeError::RemainingBytes(self.offset, dns))
94        }
95    }
96}
97
98impl_decode!(Flags, flags);
99
100impl_decode!(Dns, dns);