|
|
@@ -107,36 +107,13 @@ fn radio_thread(updates: &mpsc::Sender<SensorUpdate>) -> Result<(), Error> {
|
|
107
|
107
|
let mut payload = payload.as_ref().to_vec();
|
|
108
|
108
|
|
|
109
|
109
|
let sensor_id = payload[0];
|
|
110
|
|
- let mut salt = payload[0..8].to_vec();
|
|
111
|
110
|
|
|
112
|
111
|
// Decrypt the package
|
|
113
|
112
|
let key = [
|
|
114
|
113
|
0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
|
|
115
|
114
|
0x51, 0x56,
|
|
116
|
115
|
]; //TODO: define somewhere else
|
|
117
|
|
- //decrypt(&key, &mut payload.as_mut_slice()[8..32]);
|
|
118
|
|
-
|
|
119
|
|
- let mut position_in_buffer = 24;
|
|
120
|
|
- let (mut previous_cipher_block, mut current_cipher_block) =
|
|
121
|
|
- payload[position_in_buffer - 8..position_in_buffer + 8].split_at_mut(8);
|
|
122
|
|
-
|
|
123
|
|
- loop {
|
|
124
|
|
- decrypt(&key, current_cipher_block);
|
|
125
|
|
-
|
|
126
|
|
- for i in 0..8 {
|
|
127
|
|
- current_cipher_block[i] ^= previous_cipher_block[i];
|
|
128
|
|
- }
|
|
129
|
|
-
|
|
130
|
|
- position_in_buffer -= 8;
|
|
131
|
|
- if position_in_buffer == 0 {
|
|
132
|
|
- break;
|
|
133
|
|
- }
|
|
134
|
|
- info!("position_in_buffer = {}", position_in_buffer);
|
|
135
|
|
- let blocks =
|
|
136
|
|
- payload[position_in_buffer - 8..position_in_buffer + 8].split_at_mut(8);
|
|
137
|
|
- previous_cipher_block = blocks.0;
|
|
138
|
|
- current_cipher_block = blocks.1;
|
|
139
|
|
- }
|
|
|
116
|
+ decrypt_cbc(&key, &mut payload);
|
|
140
|
117
|
info!("decrypted: {:x?}", payload);
|
|
141
|
118
|
|
|
142
|
119
|
// Calculate the CRC
|
|
|
@@ -253,6 +230,22 @@ fn radio_thread(updates: &mpsc::Sender<SensorUpdate>) -> Result<(), Error> {
|
|
253
|
230
|
}
|
|
254
|
231
|
}
|
|
255
|
232
|
|
|
|
233
|
+fn decrypt_cbc(key: &[u8], data: &mut [u8]) {
|
|
|
234
|
+ let mut blocks = data.rchunks_mut(8).peekable();
|
|
|
235
|
+ loop {
|
|
|
236
|
+ let block = blocks.next().unwrap();
|
|
|
237
|
+ let prev_block = match blocks.peek() {
|
|
|
238
|
+ Some(b) => b,
|
|
|
239
|
+ None => break,
|
|
|
240
|
+ };
|
|
|
241
|
+ decrypt(&key, block);
|
|
|
242
|
+
|
|
|
243
|
+ for i in 0..8 {
|
|
|
244
|
+ block[i] ^= prev_block[i];
|
|
|
245
|
+ }
|
|
|
246
|
+ }
|
|
|
247
|
+}
|
|
|
248
|
+
|
|
256
|
249
|
fn get_pin_number(c: char, n: u64) -> u64 {
|
|
257
|
250
|
(c as u64 - 'A' as u64) * 32 + n
|
|
258
|
251
|
}
|