Browse Source

base-station: Simplify decryption.

Mathias Gottschlag 5 years ago
parent
commit
da228540d8
1 changed files with 17 additions and 24 deletions
  1. 17
    24
      base-station/software/src/radio.rs

+ 17
- 24
base-station/software/src/radio.rs View File

107
             let mut payload = payload.as_ref().to_vec();
107
             let mut payload = payload.as_ref().to_vec();
108
 
108
 
109
             let sensor_id = payload[0];
109
             let sensor_id = payload[0];
110
-            let mut salt = payload[0..8].to_vec();
111
 
110
 
112
             // Decrypt the package
111
             // Decrypt the package
113
             let key = [
112
             let key = [
114
                 0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
113
                 0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
115
                 0x51, 0x56,
114
                 0x51, 0x56,
116
             ]; //TODO: define somewhere else
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
             info!("decrypted: {:x?}", payload);
117
             info!("decrypted: {:x?}", payload);
141
 
118
 
142
             // Calculate the CRC
119
             // Calculate the CRC
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
 fn get_pin_number(c: char, n: u64) -> u64 {
249
 fn get_pin_number(c: char, n: u64) -> u64 {
257
     (c as u64 - 'A' as u64) * 32 + n
250
     (c as u64 - 'A' as u64) * 32 + n
258
 }
251
 }

Loading…
Cancel
Save