ソースを参照

base-station: Simplify decryption.

コミット
da228540d8
1個のファイルの変更17行の追加24行の削除
  1. 17
    24
      base-station/software/src/radio.rs

+ 17
- 24
base-station/software/src/radio.rs ファイルの表示

@@ -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
 }

読み込み中…
キャンセル
保存