2019-07-01 15:43:34 +00:00
|
|
|
use crate::errors::*;
|
2020-03-07 15:57:47 +00:00
|
|
|
use bytes::{Buf, BufMut, Bytes};
|
2017-12-16 20:58:18 +00:00
|
|
|
use std::io::Cursor;
|
|
|
|
|
|
|
|
mod std_impls;
|
2017-12-27 14:24:11 +00:00
|
|
|
mod write;
|
|
|
|
|
|
|
|
pub use self::write::*;
|
2017-12-16 20:58:18 +00:00
|
|
|
|
2019-07-01 15:43:34 +00:00
|
|
|
pub use dnsbox_derive::DnsPacketData;
|
|
|
|
|
2017-12-16 20:58:18 +00:00
|
|
|
pub trait DnsPacketData: Sized {
|
|
|
|
fn deserialize(data: &mut Cursor<Bytes>) -> Result<Self>;
|
2017-12-27 14:24:11 +00:00
|
|
|
fn serialize(&self, context: &mut DnsPacketWriteContext, packet: &mut Vec<u8>) -> Result<()>;
|
2017-12-16 20:58:18 +00:00
|
|
|
}
|
|
|
|
|
2017-12-27 11:41:54 +00:00
|
|
|
pub fn deserialize_with<F, O>(data: Bytes, parser: F) -> Result<O>
|
2017-12-16 20:58:18 +00:00
|
|
|
where
|
2017-12-27 11:41:54 +00:00
|
|
|
F: FnOnce(&mut Cursor<Bytes>) -> Result<O>,
|
2017-12-16 20:58:18 +00:00
|
|
|
{
|
|
|
|
let mut c = Cursor::new(data);
|
2017-12-27 11:41:54 +00:00
|
|
|
let result = parser(&mut c)?;
|
2020-03-07 15:57:47 +00:00
|
|
|
failure::ensure!(
|
|
|
|
!c.has_remaining(),
|
|
|
|
"data remaining: {} bytes",
|
|
|
|
c.remaining()
|
|
|
|
);
|
2017-12-16 20:58:18 +00:00
|
|
|
Ok(result)
|
|
|
|
}
|
2017-12-21 12:32:14 +00:00
|
|
|
|
|
|
|
pub fn remaining_bytes(data: &mut Cursor<Bytes>) -> Bytes {
|
|
|
|
let pos = data.position() as usize;
|
|
|
|
let len = data.remaining();
|
|
|
|
let result = data.get_ref().slice(pos, pos + len);
|
|
|
|
data.advance(len);
|
|
|
|
result
|
|
|
|
}
|
|
|
|
|
2017-12-27 20:50:51 +00:00
|
|
|
pub fn get_blob(data: &mut Cursor<Bytes>, len: usize) -> Result<Bytes> {
|
|
|
|
check_enough_data!(data, len, "blob content");
|
|
|
|
let pos = data.position() as usize;
|
|
|
|
let blob = data.get_ref().slice(pos, pos + len);
|
|
|
|
data.advance(len);
|
|
|
|
Ok(blob)
|
|
|
|
}
|
|
|
|
|
2017-12-21 12:32:14 +00:00
|
|
|
pub fn short_blob(data: &mut Cursor<Bytes>) -> Result<Bytes> {
|
|
|
|
check_enough_data!(data, 1, "short blob length");
|
|
|
|
let blob_len = data.get_u8() as usize;
|
2017-12-27 20:50:51 +00:00
|
|
|
get_blob(data, blob_len)
|
2017-12-21 12:32:14 +00:00
|
|
|
}
|
2017-12-27 14:24:11 +00:00
|
|
|
|
|
|
|
pub fn write_short_blob(data: &[u8], packet: &mut Vec<u8>) -> Result<()> {
|
2020-03-07 15:57:47 +00:00
|
|
|
failure::ensure!(
|
|
|
|
data.len() < 256,
|
|
|
|
"short blob must be at most 255 bytes long"
|
|
|
|
);
|
2017-12-27 14:24:11 +00:00
|
|
|
packet.reserve(data.len() + 1);
|
|
|
|
packet.put_u8(data.len() as u8);
|
|
|
|
packet.put_slice(data);
|
|
|
|
Ok(())
|
|
|
|
}
|