Quellcode durchsuchen

Implement cipher block chaining for the decryption of packets

Bernd Gottschlag vor 5 Jahren
Ursprung
Commit
ed128699b7
1 geänderte Dateien mit 23 neuen und 7 gelöschten Zeilen
  1. 23
    7
      base-station/software/src/radio.rs

+ 23
- 7
base-station/software/src/radio.rs Datei anzeigen

@@ -107,21 +107,37 @@ 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 salt = payload[0..8].to_vec();
110
+            let mut salt = payload[0..8].to_vec();
111 111
 
112 112
             // Decrypt the package
113 113
             let key = [
114 114
                 0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
115 115
                 0x51, 0x56,
116 116
             ]; //TODO: define somewhere else
117
-            decrypt(&key, &mut payload.as_mut_slice()[8..32]);
117
+               //decrypt(&key, &mut payload.as_mut_slice()[8..32]);
118 118
 
119
-            info!("decrypted: {:x?}", payload);
120
-            let mut current_c
121
-            while (
122
-            {
123
-                
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;
124 139
             }
140
+            info!("decrypted: {:x?}", payload);
125 141
 
126 142
             // Calculate the CRC
127 143
             let crc_calculation_buffer = payload[8..30].to_vec();

Laden…
Abbrechen
Speichern