use std::io::{BufReader, BufWriter}; use std::time::{Duration, SystemTime}; use super::*; use crate::compression_methods::*; use crate::handshake::handshake_message_client_hello::*; use crate::handshake::handshake_random::HandshakeRandom; use crate::record_layer::record_layer_header::ProtocolVersion; #[test] fn test_handshake_message() -> Result<()> { let raw_handshake_message = vec![ 0x01, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xfe, 0xfd, 0xb6, 0x2f, 0xce, 0x5c, 0x42, 0x54, 0xff, 0x86, 0xe1, 0x24, 0x41, 0x91, 0x42, 0x62, 0x15, 0xad, 0x16, 0xc9, 0x15, 0x8d, 0x95, 0x71, 0x8a, 0xbb, 0x22, 0xd7, 0x47, 0xec, 0xd8, 0x3d, 0xdc, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]; let parsed_handshake = Handshake { handshake_header: HandshakeHeader { handshake_type: HandshakeType::ClientHello, length: 0x29, message_sequence: 0, fragment_offset: 0, fragment_length: 0x29, }, handshake_message: HandshakeMessage::ClientHello(HandshakeMessageClientHello { version: ProtocolVersion { major: 0xFE, minor: 0xFD, }, random: HandshakeRandom { gmt_unix_time: if let Some(unix_time) = SystemTime::UNIX_EPOCH.checked_add(Duration::new(3056586332u64, 0)) { unix_time } else { SystemTime::UNIX_EPOCH }, random_bytes: [ 0x42, 0x54, 0xff, 0x86, 0xe1, 0x24, 0x41, 0x91, 0x42, 0x62, 0x15, 0xad, 0x16, 0xc9, 0x15, 0x8d, 0x95, 0x71, 0x8a, 0xbb, 0x22, 0xd7, 0x47, 0xec, 0xd8, 0x3d, 0xdc, 0x4b, ], }, cookie: vec![], cipher_suites: vec![], compression_methods: CompressionMethods { ids: vec![] }, extensions: vec![], }), }; let mut reader = BufReader::new(raw_handshake_message.as_slice()); let h = Handshake::unmarshal(&mut reader)?; assert_eq!( h, parsed_handshake, "handshakeMessageClientHello unmarshal: got {h:?}, want {parsed_handshake:?}" ); let mut raw = vec![]; { let mut writer = BufWriter::<&mut Vec>::new(raw.as_mut()); h.marshal(&mut writer)?; } assert_eq!( raw, raw_handshake_message, "handshakeMessageClientHello marshal: got {raw:?}, want {raw_handshake_message:?}" ); Ok(()) }