use crate::{Buf, BufMut, BufResult};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10ContentType(pub u8);
impl Tls10ContentType {
pub const CHANGE_CIPHER_SPEC: Self = Self(20);
pub const ALERT: Self = Self(21);
pub const HANDSHAKE: Self = Self(22);
pub const APPLICATION_DATA: Self = Self(23);
}
impl From<u8> for Tls10ContentType {
#[inline(always)]
fn from(val: u8) -> Self {
Self(val)
}
}
impl From<Tls10ContentType> for u8 {
#[inline(always)]
fn from(val: Tls10ContentType) -> u8 {
val.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10ProtocolVersion(pub u16);
impl Tls10ProtocolVersion {
pub const TLS1_0: Self = Self(769);
}
impl From<u16> for Tls10ProtocolVersion {
#[inline(always)]
fn from(val: u16) -> Self {
Self(val)
}
}
impl From<Tls10ProtocolVersion> for u16 {
#[inline(always)]
fn from(val: Tls10ProtocolVersion) -> u16 {
val.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10HandshakeType(pub u8);
impl Tls10HandshakeType {
pub const HELLO_REQUEST: Self = Self(0);
pub const CLIENT_HELLO: Self = Self(1);
pub const SERVER_HELLO: Self = Self(2);
pub const CERTIFICATE: Self = Self(11);
pub const SERVER_KEY_EXCHANGE: Self = Self(12);
pub const CERTIFICATE_REQUEST: Self = Self(13);
pub const SERVER_HELLO_DONE: Self = Self(14);
pub const CERTIFICATE_VERIFY: Self = Self(15);
pub const CLIENT_KEY_EXCHANGE: Self = Self(16);
pub const FINISHED: Self = Self(20);
}
impl From<u8> for Tls10HandshakeType {
#[inline(always)]
fn from(val: u8) -> Self {
Self(val)
}
}
impl From<Tls10HandshakeType> for u8 {
#[inline(always)]
fn from(val: Tls10HandshakeType) -> u8 {
val.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10RecordMapping<T> {
buffer: T,
}
impl<T> Tls10RecordMapping<T> {
#[inline(always)]
pub fn new(buffer: T) -> Self {
Self { buffer }
}
pub fn into_inner(self) -> T {
self.buffer
}
}
impl<T: Buf> Tls10RecordMapping<T> {
pub fn read_type(&self) -> BufResult<Tls10ContentType> {
Ok(self.buffer.get_u8(0)?.into())
}
pub fn read_version(&self) -> BufResult<Tls10ProtocolVersion> {
Ok(self.buffer.get_u16_be(1)?.into())
}
pub fn read_length(&self) -> BufResult<u16> {
Ok(self.buffer.get_u16_be(3)?)
}
pub fn read_fragment(&self) -> BufResult<&[u8]> {
let offset = 5;
let length = self.read_length()? as usize;
self.buffer.get_slice(offset, length)
}
}
impl<T: BufMut> Tls10RecordMapping<T> {
pub fn write_type(&mut self, value: Tls10ContentType) -> BufResult<()> {
let value_to_write = value.into();
self.buffer.set_u8(0, value_to_write)
}
pub fn write_version(&mut self, value: Tls10ProtocolVersion) -> BufResult<()> {
let value_to_write = value.into();
self.buffer.set_u16_be(1, value_to_write)
}
pub fn write_length(&mut self, value: u16) -> BufResult<()> {
let value_to_write = value;
self.buffer.set_u16_be(3, value_to_write)
}
pub fn write_fragment(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 5;
self.buffer.set_slice(offset, data)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10HandshakeMapping<T> {
buffer: T,
}
impl<T> Tls10HandshakeMapping<T> {
#[inline(always)]
pub fn new(buffer: T) -> Self {
Self { buffer }
}
pub fn into_inner(self) -> T {
self.buffer
}
}
impl<T: Buf> Tls10HandshakeMapping<T> {
pub fn read_msg_type(&self) -> BufResult<Tls10HandshakeType> {
Ok(self.buffer.get_u8(0)?.into())
}
pub fn read_length(&self) -> BufResult<u32> {
Ok(self.buffer.get_u24_be(1)?)
}
pub fn read_body(&self) -> BufResult<&[u8]> {
let offset = 4;
let length = self.read_length()? as usize;
self.buffer.get_slice(offset, length)
}
}
impl<T: BufMut> Tls10HandshakeMapping<T> {
pub fn write_msg_type(&mut self, value: Tls10HandshakeType) -> BufResult<()> {
let value_to_write = value.into();
self.buffer.set_u8(0, value_to_write)
}
pub fn write_length(&mut self, value: u32) -> BufResult<()> {
let value_to_write = value;
self.buffer.set_u24_be(1, value_to_write)
}
pub fn write_body(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 4;
self.buffer.set_slice(offset, data)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10ClientHelloMapping<T> {
buffer: T,
}
impl<T> Tls10ClientHelloMapping<T> {
#[inline(always)]
pub fn new(buffer: T) -> Self {
Self { buffer }
}
pub fn into_inner(self) -> T {
self.buffer
}
}
impl<T: Buf> Tls10ClientHelloMapping<T> {
pub fn read_client_version(&self) -> BufResult<Tls10ProtocolVersion> {
Ok(self.buffer.get_u16_be(0)?.into())
}
pub fn read_session_id_length(&self) -> BufResult<u8> {
Ok(self.buffer.get_u8(2)?)
}
pub fn read_session_id(&self) -> BufResult<&[u8]> {
let offset = 3;
let length = self.read_session_id_length()? as usize;
self.buffer.get_slice(offset, length)
}
pub fn read_cipher_suites_length(&self) -> BufResult<u16> {
Ok(self
.buffer
.get_u16_be(3 + self.read_session_id_length()? as usize)?)
}
pub fn read_cipher_suites(&self) -> BufResult<&[u8]> {
let offset = 5 + self.read_session_id_length()? as usize;
let length = self.read_cipher_suites_length()? as usize;
self.buffer.get_slice(offset, length)
}
pub fn read_compression_methods_length(&self) -> BufResult<u8> {
Ok(self.buffer.get_u8(
5 + self.read_session_id_length()? as usize
+ self.read_cipher_suites_length()? as usize,
)?)
}
pub fn read_compression_methods(&self) -> BufResult<&[u8]> {
let offset = 6
+ self.read_session_id_length()? as usize
+ self.read_cipher_suites_length()? as usize;
let length = self.read_compression_methods_length()? as usize;
self.buffer.get_slice(offset, length)
}
}
impl<T: BufMut> Tls10ClientHelloMapping<T> {
pub fn write_client_version(&mut self, value: Tls10ProtocolVersion) -> BufResult<()> {
let value_to_write = value.into();
self.buffer.set_u16_be(0, value_to_write)
}
pub fn write_session_id_length(&mut self, value: u8) -> BufResult<()> {
let value_to_write = value;
self.buffer.set_u8(2, value_to_write)
}
pub fn write_session_id(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 3;
self.buffer.set_slice(offset, data)
}
pub fn write_cipher_suites_length(&mut self, value: u16) -> BufResult<()> {
let value_to_write = value;
self.buffer
.set_u16_be(3 + self.read_session_id_length()? as usize, value_to_write)
}
pub fn write_cipher_suites(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 5 + self.read_session_id_length()? as usize;
self.buffer.set_slice(offset, data)
}
pub fn write_compression_methods_length(&mut self, value: u8) -> BufResult<()> {
let value_to_write = value;
self.buffer.set_u8(
5 + self.read_session_id_length()? as usize
+ self.read_cipher_suites_length()? as usize,
value_to_write,
)
}
pub fn write_compression_methods(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 6
+ self.read_session_id_length()? as usize
+ self.read_cipher_suites_length()? as usize;
self.buffer.set_slice(offset, data)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tls10ServerHelloMapping<T> {
buffer: T,
}
impl<T> Tls10ServerHelloMapping<T> {
#[inline(always)]
pub fn new(buffer: T) -> Self {
Self { buffer }
}
pub fn into_inner(self) -> T {
self.buffer
}
}
impl<T: Buf> Tls10ServerHelloMapping<T> {
pub fn read_server_version(&self) -> BufResult<Tls10ProtocolVersion> {
Ok(self.buffer.get_u16_be(0)?.into())
}
pub fn read_session_id_length(&self) -> BufResult<u8> {
Ok(self.buffer.get_u8(2)?)
}
pub fn read_session_id(&self) -> BufResult<&[u8]> {
let offset = 3;
let length = self.read_session_id_length()? as usize;
self.buffer.get_slice(offset, length)
}
pub fn read_cipher_suite(&self) -> BufResult<u16> {
Ok(self
.buffer
.get_u16_be(3 + self.read_session_id_length()? as usize)?)
}
pub fn read_compression_method(&self) -> BufResult<u8> {
Ok(self
.buffer
.get_u8(5 + self.read_session_id_length()? as usize)?)
}
}
impl<T: BufMut> Tls10ServerHelloMapping<T> {
pub fn write_server_version(&mut self, value: Tls10ProtocolVersion) -> BufResult<()> {
let value_to_write = value.into();
self.buffer.set_u16_be(0, value_to_write)
}
pub fn write_session_id_length(&mut self, value: u8) -> BufResult<()> {
let value_to_write = value;
self.buffer.set_u8(2, value_to_write)
}
pub fn write_session_id(&mut self, data: &[u8]) -> BufResult<()> {
let offset = 3;
self.buffer.set_slice(offset, data)
}
pub fn write_cipher_suite(&mut self, value: u16) -> BufResult<()> {
let value_to_write = value;
self.buffer
.set_u16_be(3 + self.read_session_id_length()? as usize, value_to_write)
}
pub fn write_compression_method(&mut self, value: u8) -> BufResult<()> {
let value_to_write = value;
self.buffer
.set_u8(5 + self.read_session_id_length()? as usize, value_to_write)
}
}