dns.rs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. use std::net::{Ipv4Addr, Ipv6Addr};
  2. use std::net::UdpSocket;
  3. pub struct DnsPacket {
  4. pub header: DnsHeader,
  5. pub questions: Vec<DnsQuestion>,
  6. pub answers: Vec<DnsRecord>,
  7. pub authorities: Vec<DnsRecord>,
  8. pub resources: Vec<DnsRecord>
  9. }
  10. impl DnsPacket {
  11. pub fn new(query_type: QueryType, qname: &str) -> Self {
  12. let id = 6677;
  13. let mut header = DnsHeader::new(id);
  14. header.recursion_desired = true;
  15. let mut questions = Vec::new();
  16. questions.push(DnsQuestion::new(String::from(qname), query_type));
  17. DnsPacket {
  18. header,
  19. questions,
  20. answers: Vec::new(),
  21. authorities: Vec::new(),
  22. resources: Vec::new(),
  23. }
  24. }
  25. pub fn empty() -> Self {
  26. let id = 6677;
  27. let header = DnsHeader::new(id);
  28. DnsPacket {
  29. header,
  30. questions: Vec::new(),
  31. answers: Vec::new(),
  32. authorities: Vec::new(),
  33. resources: Vec::new(),
  34. }
  35. }
  36. pub fn from_bytes(buffer: &mut BytePacketBuffer) -> Self {
  37. let header = DnsHeader::from(buffer).unwrap();
  38. let mut questions = Vec::new();
  39. let mut answers = Vec::new();
  40. let mut authorities = Vec::new();
  41. let mut resources = Vec::new();
  42. for _ in 0..header.question_count {
  43. let question = DnsQuestion::from(buffer);
  44. questions.push(question)
  45. }
  46. for _ in 0..header.answer_count {
  47. let answer = DnsRecord::from(buffer);
  48. answers.push(answer)
  49. }
  50. for _ in 0..header.authority_count {
  51. let authority = DnsRecord::from(buffer);
  52. authorities.push(authority)
  53. }
  54. for _ in 0..header.authority_count {
  55. let rec = DnsRecord::from(buffer);
  56. resources.push(rec)
  57. }
  58. DnsPacket {
  59. header,
  60. questions,
  61. answers,
  62. authorities,
  63. resources
  64. }
  65. }
  66. pub fn write(&mut self, buffer: &mut BytePacketBuffer) -> Result<(), &str> {
  67. self.header.question_count = self.questions.len() as u16;
  68. self.header.answer_count = self.answers.len() as u16;
  69. self.header.authority_count = self.authorities.len() as u16;
  70. self.header.add_count = self.resources.len() as u16;
  71. self.header.write(buffer).unwrap();
  72. for question in &self.questions {
  73. question.write(buffer).unwrap();
  74. }
  75. for rec in &self.answers {
  76. rec.write(buffer).unwrap();
  77. }
  78. for rec in &self.authorities {
  79. rec.write(buffer).unwrap();
  80. }
  81. for rec in &self.resources {
  82. rec.write(buffer).unwrap();
  83. }
  84. Ok(())
  85. }
  86. pub fn send(&mut self, server: (&str, u16)) -> DnsPacket {
  87. let mut req_buffer = BytePacketBuffer::new();
  88. self.write(&mut req_buffer).unwrap();
  89. let socket = UdpSocket::bind(("0.0.0.0", 43210)).unwrap();
  90. socket.send_to(&req_buffer.buf[0..req_buffer.pos], server).unwrap();
  91. let mut rec_buffer = BytePacketBuffer::new();
  92. socket.recv_from(&mut rec_buffer.buf).unwrap();
  93. let response = DnsPacket::from_bytes(&mut rec_buffer);
  94. return response;
  95. }
  96. }
  97. #[derive(Copy, Clone, Debug, PartialEq, Eq)]
  98. pub enum ResultCode {
  99. NOERROR = 0,
  100. FORMERR = 1,
  101. SERVFAIL = 2,
  102. NXDOMAIN = 3,
  103. NOTIMP = 4,
  104. REFUSED = 5,
  105. }
  106. impl ResultCode {
  107. pub fn from_num(num: u8) -> Self {
  108. match num {
  109. 1 => ResultCode::FORMERR,
  110. 2 => ResultCode::SERVFAIL,
  111. 3 => ResultCode::NXDOMAIN,
  112. 4 => ResultCode::NOTIMP,
  113. 5 => ResultCode::REFUSED,
  114. 0 | _ => ResultCode::NOERROR,
  115. }
  116. }
  117. }
  118. // The holy grail, the DNS Header itself
  119. #[derive(Clone, Debug)]
  120. pub struct DnsHeader {
  121. pub id: u16, // 16 bits
  122. pub query_response: bool, // 1 bit
  123. pub operation_code: u8, // 4 bits
  124. pub authoritative_answer: bool, // 1 bit
  125. pub truncated_message: bool, // 1 bit
  126. pub recursion_desired: bool, // 1 bit
  127. pub recursion_available: bool, // 1 bit
  128. pub z: u8, // 3 bits
  129. pub result_code: ResultCode, // 4 bits
  130. pub question_count: u16, // 16 bits
  131. pub answer_count: u16, // 16 bits
  132. pub authority_count: u16, // 16 bits
  133. pub add_count: u16, // 16 bits
  134. }
  135. impl DnsHeader {
  136. // returns a plain DnsHeader
  137. pub fn new(id: u16) -> Self {
  138. DnsHeader {
  139. id,
  140. query_response: false,
  141. operation_code: 0,
  142. authoritative_answer: false,
  143. truncated_message: false,
  144. recursion_desired: false,
  145. recursion_available: false,
  146. z: 0,
  147. result_code: ResultCode::NOERROR,
  148. question_count: 0,
  149. answer_count: 0,
  150. authority_count: 0,
  151. add_count: 0
  152. }
  153. }
  154. pub fn from(buffer: &mut BytePacketBuffer) -> Result<Self, &str> {
  155. let id = buffer.read_u16().unwrap();
  156. let flags = buffer.read_u16().unwrap();
  157. let bit1 = (flags >> 8) as u8; // Most significant byte
  158. let bit2 = (flags & 0xFF) as u8; // Least significant byte
  159. // parse the DNS Header from a 512 byte buffer
  160. Ok(DnsHeader {
  161. id,
  162. recursion_desired: (bit1 & (1 << 0)) > 0,
  163. truncated_message: (bit1 & (1 << 1)) > 0,
  164. authoritative_answer: (bit1 & (1 << 2)) > 0,
  165. operation_code: (bit1 >> 3) & 0xF,
  166. query_response: (bit1 >> 7) > 0,
  167. result_code: ResultCode::from_num(bit2 & 0x0F),
  168. z: (bit2 >> 0x4) & 0x7,
  169. recursion_available: (bit2 >> 7) > 0,
  170. question_count: buffer.read_u16().unwrap(),
  171. answer_count: buffer.read_u16().unwrap(),
  172. authority_count: buffer.read_u16().unwrap(),
  173. add_count: buffer.read_u16().unwrap(),
  174. })
  175. }
  176. pub fn write(&self, buffer: &mut BytePacketBuffer) -> Result<(), &str> {
  177. buffer.write_u16(self.id).unwrap();
  178. buffer.write_u8(
  179. (self.recursion_desired as u8)
  180. | ((self.truncated_message as u8) << 1)
  181. | ((self.authoritative_answer as u8) << 2)
  182. | (self.operation_code << 3)
  183. | ((self.query_response as u8) << 7) as u8
  184. ).unwrap();
  185. buffer.write_u8(
  186. (self.result_code as u8)
  187. | ((self.z as u8) << 6)
  188. | ((self.recursion_available as u8) << 7)
  189. ).unwrap();
  190. buffer.write_u16(self.question_count).unwrap();
  191. buffer.write_u16(self.answer_count).unwrap();
  192. buffer.write_u16(self.authority_count).unwrap();
  193. buffer.write_u16(self.add_count).unwrap();
  194. Ok(())
  195. }
  196. }
  197. #[derive(Copy, Clone, PartialEq, Eq, Debug, Ord, PartialOrd, Hash)]
  198. pub enum QueryType {
  199. UNKNOWN(u16),
  200. A, // = 1
  201. NS, // = 2
  202. CNAME, // = 5
  203. MX, // = 15
  204. AAAA, // 28
  205. TXT, // 16
  206. }
  207. impl QueryType {
  208. pub fn to_num(&self) -> u16 {
  209. match *self {
  210. QueryType::UNKNOWN(x) => x,
  211. QueryType::A => 1,
  212. QueryType::NS => 2,
  213. QueryType::CNAME => 5,
  214. QueryType::MX => 15,
  215. QueryType::TXT => 16,
  216. QueryType::AAAA => 28,
  217. }
  218. }
  219. pub fn from_num(num: u16) -> Self {
  220. match num {
  221. 1 => QueryType::A,
  222. 2 => QueryType::NS,
  223. 5 => QueryType::CNAME,
  224. 15 => QueryType::MX,
  225. 16 => QueryType::TXT,
  226. 28 => QueryType::AAAA,
  227. _ => QueryType::UNKNOWN(num),
  228. }
  229. }
  230. }
  231. #[derive(Clone, PartialEq, Eq, Debug)]
  232. pub struct DnsQuestion {
  233. pub name: String,
  234. pub qtype: QueryType
  235. }
  236. impl DnsQuestion {
  237. pub fn new(name: String, qtype: QueryType) -> Self {
  238. DnsQuestion {
  239. name,
  240. qtype
  241. }
  242. }
  243. pub fn from(buffer: &mut BytePacketBuffer) -> Self {
  244. let name = buffer.read_qname().unwrap();
  245. let qtype = QueryType::from_num(buffer.read_u16().unwrap());
  246. let _ = buffer.read_u16().unwrap();
  247. DnsQuestion {
  248. name,
  249. qtype
  250. }
  251. }
  252. pub fn write(&self, buffer: &mut BytePacketBuffer) -> Result<(), &str> {
  253. buffer.write_qname(&self.name).unwrap();
  254. let qtype_num = self.qtype.to_num();
  255. buffer.write_u16(qtype_num).unwrap();
  256. buffer.write_u16(1).unwrap();
  257. Ok(())
  258. }
  259. }
  260. #[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
  261. pub enum DnsRecord {
  262. UNKNOWN {
  263. domain: String,
  264. qtype: QueryType,
  265. data_len: u16,
  266. ttl: u32
  267. },
  268. A {
  269. domain: String,
  270. addr: Ipv4Addr,
  271. ttl: u32
  272. },
  273. NS {
  274. domain: String,
  275. host: String,
  276. ttl: u32
  277. },
  278. CNAME {
  279. domain: String,
  280. host: String,
  281. ttl: u32
  282. },
  283. MX {
  284. domain: String,
  285. priority: u16,
  286. host: String,
  287. ttl: u32
  288. },
  289. AAAA {
  290. domain: String,
  291. addr: Ipv6Addr,
  292. ttl: u32
  293. },
  294. TXT {
  295. domain: String,
  296. len: u8,
  297. txt: String,
  298. ttl: u32
  299. },
  300. }
  301. impl DnsRecord {
  302. pub fn from(buffer: &mut BytePacketBuffer) -> Self {
  303. let domain = buffer.read_qname().unwrap();
  304. let qtype_num = buffer.read_u16().unwrap();
  305. let qtype = QueryType::from_num(qtype_num);
  306. let _ = buffer.read_u16().unwrap(); // CLASS (should always be IN)
  307. let ttl = buffer.read_u32().unwrap();
  308. let data_len = buffer.read_u16().unwrap();
  309. match qtype {
  310. QueryType::A => {
  311. let raw_addr = buffer.read_u32().unwrap();
  312. let addr = Ipv4Addr::new(
  313. ((raw_addr >> 24) & 0xFF) as u8,
  314. ((raw_addr >> 16) & 0xFF) as u8,
  315. ((raw_addr >> 8) & 0xFF) as u8,
  316. ((raw_addr) & 0xFF) as u8);
  317. DnsRecord::A {
  318. domain,
  319. addr,
  320. ttl
  321. }
  322. },
  323. QueryType::UNKNOWN(_) => {
  324. buffer.step(data_len as usize).unwrap();
  325. DnsRecord::UNKNOWN {
  326. domain,
  327. qtype,
  328. data_len,
  329. ttl
  330. }
  331. },
  332. QueryType::AAAA => {
  333. let raw_addr0 = buffer.read_u32().unwrap();
  334. let raw_addr1 = buffer.read_u32().unwrap();
  335. let raw_addr2 = buffer.read_u32().unwrap();
  336. let raw_addr3 = buffer.read_u32().unwrap();
  337. let addr = Ipv6Addr::new(
  338. ((raw_addr0 >> 16) & 0xFF) as u16,
  339. ((raw_addr0 >> 0) & 0xFF) as u16,
  340. ((raw_addr1 >> 16) & 0xFF) as u16,
  341. ((raw_addr1 >> 0) & 0xFF) as u16,
  342. ((raw_addr2 >> 16) & 0xFF) as u16,
  343. ((raw_addr2 >> 0) & 0xFF) as u16,
  344. ((raw_addr3 >> 16) & 0xFF) as u16,
  345. ((raw_addr3 >> 0) & 0xFF) as u16);
  346. DnsRecord::AAAA {
  347. domain,
  348. addr,
  349. ttl
  350. }
  351. },
  352. QueryType::NS => {
  353. let ns = buffer.read_qname().unwrap();
  354. DnsRecord::NS {
  355. domain,
  356. host: ns,
  357. ttl
  358. }
  359. },
  360. QueryType::CNAME => {
  361. let cname = buffer.read_qname().unwrap();
  362. DnsRecord::CNAME {
  363. domain,
  364. host: cname,
  365. ttl
  366. }
  367. },
  368. QueryType::MX => {
  369. let priority = buffer.read_u16().unwrap();
  370. let mx = buffer.read_qname().unwrap();
  371. DnsRecord::MX {
  372. domain,
  373. priority,
  374. host: mx,
  375. ttl
  376. }
  377. },
  378. QueryType::TXT => {
  379. let txt_len = buffer.read().unwrap();
  380. let mut s = Vec::with_capacity(txt_len as usize);
  381. for _ in 0..txt_len {
  382. s.push(buffer.read().unwrap());
  383. }
  384. let txt = String::from_utf8_lossy(&s).to_string();
  385. DnsRecord::TXT {
  386. domain,
  387. len: txt_len as u8,
  388. txt,
  389. ttl
  390. }
  391. }
  392. }
  393. }
  394. pub fn write(&self, buffer: &mut BytePacketBuffer) -> Result<usize, &str> {
  395. let start_pos = buffer.pos();
  396. match *self {
  397. DnsRecord::A {
  398. ref domain,
  399. ref addr,
  400. ttl
  401. } => {
  402. buffer.write_qname(domain).unwrap();
  403. buffer.write_u16(QueryType::A.to_num()).unwrap();
  404. buffer.write_u16(1).unwrap();
  405. buffer.write_u32(ttl).unwrap();
  406. buffer.write_u16(4).unwrap();
  407. let oct = addr.octets();
  408. buffer.write_u8(oct[0]).unwrap();
  409. buffer.write_u8(oct[1]).unwrap();
  410. buffer.write_u8(oct[2]).unwrap();
  411. buffer.write_u8(oct[3]).unwrap();
  412. }
  413. DnsRecord::AAAA {
  414. ref domain,
  415. ref addr,
  416. ttl
  417. } => {
  418. buffer.write_qname(domain).unwrap();
  419. buffer.write_u16(QueryType::AAAA.to_num()).unwrap();
  420. buffer.write_u16(1).unwrap(); // CLASS `IN`
  421. buffer.write_u32(ttl).unwrap(); // TTL
  422. buffer.write_u16(8).unwrap(); // Length
  423. for oct in addr.segments().iter() {
  424. buffer.write_u16(*oct).unwrap();
  425. }
  426. },
  427. DnsRecord::NS {
  428. ref domain,
  429. ref host,
  430. ttl
  431. } => {
  432. buffer.write_qname(domain).unwrap();
  433. buffer.write_u16(QueryType::NS.to_num()).unwrap();
  434. buffer.write_u16(1).unwrap();
  435. buffer.write_u32(ttl).unwrap();
  436. let pos = buffer.pos();
  437. buffer.write_u16(0).unwrap();
  438. buffer.write_qname(host).unwrap();
  439. let size = buffer.pos() - (pos + 2);
  440. buffer.set_u16(pos, size as u16).unwrap();
  441. },
  442. DnsRecord::CNAME {
  443. ref domain,
  444. ref host,
  445. ttl
  446. } => {
  447. buffer.write_qname(domain).unwrap();
  448. buffer.write_u16(QueryType::CNAME.to_num()).unwrap();
  449. buffer.write_u16(1).unwrap();
  450. buffer.write_u32(ttl).unwrap();
  451. let pos = buffer.pos();
  452. buffer.write_u16(0).unwrap(); // write temporary size
  453. buffer.write_qname(host).unwrap(); // write host
  454. let size = buffer.pos() - (pos + 2);
  455. buffer.set_u16(pos, size as u16).unwrap();
  456. },
  457. DnsRecord::MX {
  458. ref domain,
  459. priority,
  460. ref host,
  461. ttl
  462. } => {
  463. buffer.write_qname(domain).unwrap();
  464. buffer.write_u16(QueryType::MX.to_num()).unwrap();
  465. buffer.write_u16(1).unwrap();
  466. buffer.write_u32(ttl).unwrap();
  467. let pos = buffer.pos();
  468. buffer.write_u16(0).unwrap(); // write temporary size
  469. buffer.write_u16(priority).unwrap();
  470. buffer.write_qname(host).unwrap(); // write host
  471. let size = buffer.pos() - (pos + 2);
  472. buffer.set_u16(pos, size as u16).unwrap();
  473. },
  474. DnsRecord::TXT {
  475. ref domain,
  476. len,
  477. ref txt,
  478. ttl
  479. } => {
  480. buffer.write_qname(domain).unwrap();
  481. buffer.write_u16(QueryType::TXT.to_num()).unwrap();
  482. buffer.write_u16(1).unwrap();
  483. buffer.write_u32(ttl).unwrap();
  484. let pos = buffer.pos();
  485. buffer.write_u16(0).unwrap(); // write temporary size
  486. buffer.write_u8(len).unwrap();
  487. for byte in txt.as_bytes() {
  488. buffer.write_u8(*byte).unwrap(); // write byte by byte
  489. }
  490. let size = buffer.pos() - (pos + 2);
  491. buffer.set_u16(pos, size as u16).unwrap();
  492. },
  493. DnsRecord::UNKNOWN {..} => {
  494. return Err("Unknown DnsRecord");
  495. },
  496. }
  497. Ok(buffer.pos() - start_pos)
  498. }
  499. }
  500. /// Buffer containing the full DNS Packet
  501. pub struct BytePacketBuffer {
  502. pub buf: [u8; 512],
  503. pub pos: usize,
  504. }
  505. impl BytePacketBuffer {
  506. pub fn new() -> Self {
  507. BytePacketBuffer { buf: [0; 512] ,pos: 0}
  508. }
  509. pub fn pos(&self) -> usize {
  510. self.pos
  511. }
  512. pub fn step(&mut self, steps: usize) -> Result<(), &str> {
  513. self.pos += steps;
  514. Ok(())
  515. }
  516. pub fn seek(&mut self, pos: usize) -> Result<(), &str> {
  517. self.pos = pos;
  518. Ok(())
  519. }
  520. /// Read a single byte from the buffer
  521. pub fn read(&mut self) -> Result<u8, &str> {
  522. if self.pos >= 512 {
  523. return Err("End of Buffer");
  524. }
  525. let ret = self.buf[self.pos];
  526. self.pos += 1;
  527. Ok(ret)
  528. }
  529. pub fn get(&self, pos: usize) -> Result<u8, &str> {
  530. if pos >= 512 {
  531. return Err("End of Buffer");
  532. }
  533. Ok(self.buf[pos])
  534. }
  535. pub fn get_range(&self, start: usize, len: usize) -> Result<&[u8], &str> {
  536. if (start + len) >= 512 {
  537. return Err("End of Buffer");
  538. }
  539. Ok(&self.buf[start..start+len])
  540. }
  541. pub fn read_u16(&mut self) -> Result<u16, &str> {
  542. if self.pos >= 512 {
  543. return Err("End of Buffer");
  544. }
  545. let mut res = (self.read().unwrap() as u16) << 8;
  546. res |= self.read()? as u16;
  547. Ok(res)
  548. }
  549. pub fn read_u32(&mut self) -> Result<u32, &str> {
  550. if self.pos >= 512 {
  551. return Err("End of Buffer");
  552. }
  553. // Hack: calling ? on read() results in error
  554. // "Second mutable borrow occurs here"
  555. let mut res = (self.read().unwrap() as u32) << 24;
  556. res |= (self.read().unwrap() as u32) << 16;
  557. res |= (self.read().unwrap() as u32) << 8;
  558. res |= self.read()? as u32;
  559. Ok(res)
  560. }
  561. /// Reading Domain Name in the following format
  562. /// [len][name][len][name] [...]
  563. /// The first [len] can be a jump to another position in the buffer
  564. /// if the two most sign. bits are set (0xC0)
  565. fn read_qname(&mut self) -> Result<String, &str> {
  566. let mut lpos = self.pos;
  567. let mut jumped = false;
  568. let mut num_jmps = 0;
  569. let max_jmps = 5;
  570. // delimiter to split the domain names
  571. let mut delim = "";
  572. let mut outstr = String::from("");
  573. // begin reading the domain names
  574. loop {
  575. // prevent endless looping jmps
  576. if num_jmps >= max_jmps {
  577. return Err("too many jumps");
  578. }
  579. let len = self.get(lpos).unwrap() as usize;
  580. if (len & 0xC0) == 0xC0 {
  581. if !jumped {
  582. self.seek(lpos + 2).unwrap();
  583. }
  584. // This indicates a jump to another location in the buffer
  585. // the location is indicated by the following byte
  586. let sb = self.get(lpos + 1).unwrap() as u16;
  587. let sb = ((self.get(lpos).unwrap() as u16 ^ 0xC0) << 8) as u16 | sb;
  588. // set the position to the jmp location
  589. lpos = sb as usize;
  590. jumped = true;
  591. num_jmps += 1;
  592. continue;
  593. }
  594. else {
  595. // Read regular domain name
  596. lpos += 1;
  597. // if the len is 0, this means that the final part of
  598. // the domain names is arrived
  599. if len == 0 {
  600. break
  601. }
  602. outstr.push_str(delim);
  603. let domain = &String::from_utf8_lossy(self.get_range(lpos, len).unwrap()).to_lowercase();
  604. outstr.push_str(domain);
  605. delim = ".";
  606. // move forward the local pos
  607. lpos += len;
  608. }
  609. }
  610. if !jumped {
  611. self.seek(lpos).unwrap();
  612. }
  613. Ok(outstr)
  614. }
  615. fn write(&mut self, val: u8) -> Result<(), &str> {
  616. if self.pos >= 512 {
  617. return Err("End of buffer");
  618. }
  619. self.buf[self.pos] = val;
  620. self.pos += 1;
  621. Ok(())
  622. }
  623. fn write_u8(&mut self, val: u8) -> Result<(), &str> {
  624. self.write(val)
  625. }
  626. fn write_u16(&mut self, val: u16) -> Result<(), &str> {
  627. self.write_u8((val >> 8) as u8).unwrap();
  628. self.write_u8((val & 0xFF) as u8).unwrap();
  629. Ok(())
  630. }
  631. fn write_u32(&mut self, val: u32) -> Result<(), &str> {
  632. self.write_u8(((val >> 24) & 0xFF) as u8).unwrap();
  633. self.write_u8(((val >> 16) & 0xFF) as u8).unwrap();
  634. self.write_u8(((val >> 8) & 0xFF) as u8).unwrap();
  635. self.write_u8(((val >> 0) & 0xFF) as u8).unwrap();
  636. Ok(())
  637. }
  638. fn write_qname(&mut self, qname: &str) -> Result<(), &str> {
  639. for label in qname.split(".") {
  640. let len = label.len();
  641. if len > 0x3F {
  642. return Err("Single Label exeeds 63 characters");
  643. }
  644. self.write_u8(len as u8).unwrap();
  645. for b in label.as_bytes() {
  646. self.write_u8(*b as u8).unwrap();
  647. }
  648. }
  649. self.write_u8(0).unwrap();
  650. Ok(())
  651. }
  652. fn set(&mut self, pos: usize, val: u8) -> Result<(), &str> {
  653. if pos >= 512 {
  654. return Err("End of Buffer");
  655. }
  656. self.buf[pos] = val;
  657. Ok(())
  658. }
  659. fn set_u16(&mut self, pos: usize, val: u16) -> Result<(), &str> {
  660. if pos >= 511 {
  661. return Err("End of Buffer");
  662. }
  663. self.buf[pos] = ((val >> 8) & 0xFF) as u8;
  664. self.buf[pos+1] = (val & 0xFF) as u8;
  665. Ok(())
  666. }
  667. }