Browse Source

Implement cipher block chaining for the decryption of packets

Bernd Gottschlag 5 years ago
parent
commit
ed128699b7
1 changed files with 23 additions and 7 deletions
  1. 23
    7
      base-station/software/src/radio.rs

+ 23
- 7
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 salt = payload[0..8].to_vec();
110
+            let mut salt = payload[0..8].to_vec();
111
 
111
 
112
             // Decrypt the package
112
             // Decrypt the package
113
             let key = [
113
             let key = [
114
                 0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
114
                 0x9e, 0x37, 0x79, 0xb9, 0x9b, 0x97, 0x73, 0xe9, 0xb9, 0x79, 0x37, 0x9e, 0x6b, 0x69,
115
                 0x51, 0x56,
115
                 0x51, 0x56,
116
             ]; //TODO: define somewhere else
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
             // Calculate the CRC
142
             // Calculate the CRC
127
             let crc_calculation_buffer = payload[8..30].to_vec();
143
             let crc_calculation_buffer = payload[8..30].to_vec();

Loading…
Cancel
Save