1use crate::cipher::{MessageDecrypter, MessageEncrypter};
2use crate::error::TLSError;
3use crate::msgs::message::{BorrowMessage, Message};
4
5static SEQ_SOFT_LIMIT: u64 = 0xffff_ffff_ffff_0000u64;
6static SEQ_HARD_LIMIT: u64 = 0xffff_ffff_ffff_fffeu64;
7
8#[derive(PartialEq)]
9enum DirectionState {
10 Invalid,
12
13 Prepared,
15
16 Active,
18}
19
20pub struct RecordLayer {
21 message_encrypter: Box<dyn MessageEncrypter>,
22 message_decrypter: Box<dyn MessageDecrypter>,
23 write_seq: u64,
24 read_seq: u64,
25 encrypt_state: DirectionState,
26 decrypt_state: DirectionState,
27}
28
29impl RecordLayer {
30 pub fn new() -> RecordLayer {
31 RecordLayer {
32 message_encrypter: MessageEncrypter::invalid(),
33 message_decrypter: MessageDecrypter::invalid(),
34 write_seq: 0,
35 read_seq: 0,
36 encrypt_state: DirectionState::Invalid,
37 decrypt_state: DirectionState::Invalid,
38 }
39 }
40
41 pub fn is_encrypting(&self) -> bool {
42 self.encrypt_state == DirectionState::Active
43 }
44
45 pub fn is_decrypting(&self) -> bool {
46 self.decrypt_state == DirectionState::Active
47 }
48
49 pub fn prepare_message_encrypter(&mut self, cipher: Box<dyn MessageEncrypter>) {
52 self.message_encrypter = cipher;
53 self.write_seq = 0;
54 self.encrypt_state = DirectionState::Prepared;
55 }
56
57 pub fn prepare_message_decrypter(&mut self, cipher: Box<dyn MessageDecrypter>) {
60 self.message_decrypter = cipher;
61 self.read_seq = 0;
62 self.decrypt_state = DirectionState::Prepared;
63 }
64
65 pub fn start_encrypting(&mut self) {
68 debug_assert!(self.encrypt_state == DirectionState::Prepared);
69 self.encrypt_state = DirectionState::Active;
70 }
71
72 pub fn start_decrypting(&mut self) {
75 debug_assert!(self.decrypt_state == DirectionState::Prepared);
76 self.decrypt_state = DirectionState::Active;
77 }
78
79 pub fn set_message_encrypter(&mut self, cipher: Box<dyn MessageEncrypter>) {
82 self.prepare_message_encrypter(cipher);
83 self.start_encrypting();
84 }
85
86 pub fn set_message_decrypter(&mut self, cipher: Box<dyn MessageDecrypter>) {
89 self.prepare_message_decrypter(cipher);
90 self.start_decrypting();
91 }
92
93 pub fn wants_close_before_decrypt(&self) -> bool {
102 self.read_seq == SEQ_SOFT_LIMIT
103 }
104
105 pub fn wants_close_before_encrypt(&self) -> bool {
108 self.write_seq == SEQ_SOFT_LIMIT
109 }
110
111 pub fn encrypt_exhausted(&self) -> bool {
114 self.write_seq >= SEQ_HARD_LIMIT
115 }
116
117 pub fn decrypt_incoming(&mut self, encr: Message) -> Result<Message, TLSError> {
123 debug_assert!(self.decrypt_state == DirectionState::Active);
124 let seq = self.read_seq;
125 self.read_seq += 1;
126 self.message_decrypter
127 .decrypt(encr, seq)
128 }
129
130 pub fn encrypt_outgoing(&mut self, plain: BorrowMessage) -> Message {
135 debug_assert!(self.encrypt_state == DirectionState::Active);
136 assert!(!self.encrypt_exhausted());
137 let seq = self.write_seq;
138 self.write_seq += 1;
139 self.message_encrypter
140 .encrypt(plain, seq)
141 .unwrap()
142 }
143}