1
- #[ cfg( test) ]
2
- mod main_tests;
3
-
4
1
const MESS : i64 = 0x0123456789ABCDEF ;
5
2
const KEY : i64 = 0x133457799BBCDFF1 ;
6
3
@@ -29,7 +26,7 @@ const PC1 : [u8; 56] =
29
26
29 , 21 , 13 , 5 , 28 , 20 , 12 , 4 ] ;
30
27
31
28
32
- pub fn generate_key_plus ( key : i64 ) -> i64 {
29
+ fn generate_key_plus ( key : i64 ) -> i64 {
33
30
let mut key_plus : i64 = 0 ;
34
31
for idx in 0 ..56 {
35
32
let bit_to_add = key >> ( 64 - PC1 [ idx] ) & 1 ;
@@ -40,7 +37,7 @@ pub fn generate_key_plus(key: i64) -> i64 {
40
37
}
41
38
42
39
43
- pub fn split_key ( key : i64 , key_len : u8 ) -> ( i64 , i64 ) {
40
+ fn split_key ( key : i64 , key_len : u8 ) -> ( i64 , i64 ) {
44
41
let half_size = key_len / 2 ;
45
42
let left_half = ( key >> half_size) & bit_pattern_ones ( half_size) ;
46
43
let right_half = key & bit_pattern_ones ( half_size) ;
@@ -50,7 +47,7 @@ pub fn split_key(key : i64, key_len: u8) -> (i64, i64) {
50
47
51
48
const LEFT_SHIFTS : [ u8 ; 16 ] = [ 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 ] ;
52
49
53
- pub fn create_16_subkeys ( left_half : i64 , right_half : i64 ) -> Vec < ( i64 , i64 ) > {
50
+ fn create_16_subkeys ( left_half : i64 , right_half : i64 ) -> Vec < ( i64 , i64 ) > {
54
51
let mut subkeys : Vec < ( i64 , i64 ) > = Vec :: new ( ) ;
55
52
subkeys. push ( ( left_half, right_half) ) ;
56
53
for idx in 0 ..16 {
@@ -62,14 +59,14 @@ pub fn create_16_subkeys(left_half: i64, right_half: i64) -> Vec<(i64, i64)> {
62
59
subkeys
63
60
}
64
61
65
- pub fn bit_rotate_left ( bit_pattern : i64 , rol_count : u8 , pattern_len : u8 ) -> i64 {
62
+ fn bit_rotate_left ( bit_pattern : i64 , rol_count : u8 , pattern_len : u8 ) -> i64 {
66
63
let ones_for_rolled_bits = bit_pattern_ones ( rol_count) << pattern_len - rol_count;
67
64
let rotated_bits = ( ( ones_for_rolled_bits) & bit_pattern) >> pattern_len - rol_count;
68
65
( ( bit_pattern << rol_count) & bit_pattern_ones ( pattern_len) ) | rotated_bits
69
66
}
70
67
71
68
72
- pub fn bit_pattern_ones ( how_much : u8 ) -> i64 {
69
+ fn bit_pattern_ones ( how_much : u8 ) -> i64 {
73
70
( ( 2u64 ) . pow ( how_much as u32 ) - 1 ) as i64
74
71
}
75
72
@@ -85,7 +82,7 @@ const PC2 : [u8; 48] =
85
82
46 , 42 , 50 , 36 , 29 , 32 ] ;
86
83
87
84
88
- pub fn key_kn_from_pair ( left : i64 , right : i64 ) -> i64 {
85
+ fn key_kn_from_pair ( left : i64 , right : i64 ) -> i64 {
89
86
let combined = ( ( left << 28 ) | right) << 8 ;
90
87
let mut encrypted_key = 0i64 ;
91
88
for idx in 0 ..48 {
@@ -97,7 +94,7 @@ pub fn key_kn_from_pair(left: i64, right: i64) -> i64 {
97
94
}
98
95
99
96
100
- pub fn convert_pairs_to_encrypted_48_bit_keys ( pairs : Vec < ( i64 , i64 ) > ) -> Vec < i64 > {
97
+ fn convert_pairs_to_encrypted_48_bit_keys ( pairs : Vec < ( i64 , i64 ) > ) -> Vec < i64 > {
101
98
let mut keys_48_bit : Vec < i64 > = Vec :: new ( ) ;
102
99
for idx in 0 ..pairs. len ( ) {
103
100
keys_48_bit. push ( key_kn_from_pair ( pairs[ idx] . 0 , pairs[ idx] . 1 ) ) ;
@@ -118,8 +115,9 @@ const IP : [u8; 64] = [
118
115
61 , 53 , 45 , 37 , 29 , 21 , 13 , 5 ,
119
116
63 , 55 , 47 , 39 , 31 , 23 , 15 , 7
120
117
] ;
118
+
121
119
//b = bit
122
- pub fn initial_permutation_of_64bit_message ( message : i64 ) -> i64 {
120
+ fn initial_permutation_of_64bit_message ( message : i64 ) -> i64 {
123
121
let mut permutation = 0i64 ;
124
122
for idx in 0 ..64 {
125
123
let bit_at_index_in_message = ( message >> ( 64 - IP [ idx] ) ) & 1 ;
@@ -128,3 +126,170 @@ pub fn initial_permutation_of_64bit_message(message : i64) -> i64 {
128
126
}
129
127
permutation
130
128
}
129
+
130
+
131
+
132
+
133
+ //tests
134
+ #[ cfg( test) ]
135
+ #[ test]
136
+ fn rotatig_bit_with_1_on_firstbit ( ) {
137
+ let bit_to_rotate : i64 = 0b1111000011110000111100001111 ;
138
+ assert_eq ! ( 0b1110000111100001111000011111 , bit_rotate_left( bit_to_rotate, 1 , 28 ) ) ;
139
+ }
140
+
141
+
142
+ #[ cfg( test) ]
143
+ #[ test]
144
+ fn rotatig_bit_with_2_positions ( ) {
145
+ let bit_to_rotate : i64 = 0b1111_0000_1111_0000_1111_0000_1111 ;
146
+ assert_eq ! ( 0b1100_0011_1100_0011_1100_0011_1111 , bit_rotate_left( bit_to_rotate, 2 , 28 ) ) ;
147
+ }
148
+
149
+
150
+ #[ cfg( test) ]
151
+ #[ test]
152
+ fn ones_for_2_is_11 ( ) {
153
+ assert_eq ! ( 0b11 , bit_pattern_ones( 2 ) ) ;
154
+ }
155
+
156
+
157
+ #[ cfg( test) ]
158
+ #[ test]
159
+ fn creating_vector_with_keys_returns_correct_subkeys ( ) {
160
+ let subkeys = create_16_subkeys ( 0b1111000011001100101010101111 , 0b0101010101100110011110001111 ) ;
161
+ assert_eq ! ( 16 , subkeys. len( ) ) ;
162
+ //1
163
+ assert_eq ! ( 0b1110000110011001010101011111 , subkeys[ 0 ] . 0 ) ;
164
+ assert_eq ! ( 0b1010101011001100111100011110 , subkeys[ 0 ] . 1 ) ;
165
+ //2
166
+ assert_eq ! ( 0b1100001100110010101010111111 , subkeys[ 1 ] . 0 ) ;
167
+ assert_eq ! ( 0b0101010110011001111000111101 , subkeys[ 1 ] . 1 ) ;
168
+ //3
169
+ assert_eq ! ( 0b0000110011001010101011111111 , subkeys[ 2 ] . 0 ) ;
170
+ assert_eq ! ( 0b0101011001100111100011110101 , subkeys[ 2 ] . 1 ) ;
171
+ //4
172
+ assert_eq ! ( 0b0011001100101010101111111100 , subkeys[ 3 ] . 0 ) ;
173
+ assert_eq ! ( 0b0101100110011110001111010101 , subkeys[ 3 ] . 1 ) ;
174
+ //5
175
+ assert_eq ! ( 0b1100110010101010111111110000 , subkeys[ 4 ] . 0 ) ;
176
+ assert_eq ! ( 0b0110011001111000111101010101 , subkeys[ 4 ] . 1 ) ;
177
+ //6
178
+ assert_eq ! ( 0b0011001010101011111111000011 , subkeys[ 5 ] . 0 ) ;
179
+ assert_eq ! ( 0b1001100111100011110101010101 , subkeys[ 5 ] . 1 ) ;
180
+ //7
181
+ assert_eq ! ( 0b1100101010101111111100001100 , subkeys[ 6 ] . 0 ) ;
182
+ assert_eq ! ( 0b0110011110001111010101010110 , subkeys[ 6 ] . 1 ) ;
183
+ //8
184
+ assert_eq ! ( 0b0010101010111111110000110011 , subkeys[ 7 ] . 0 ) ;
185
+ assert_eq ! ( 0b1001111000111101010101011001 , subkeys[ 7 ] . 1 ) ;
186
+ //9
187
+ assert_eq ! ( 0b0101010101111111100001100110 , subkeys[ 8 ] . 0 ) ;
188
+ assert_eq ! ( 0b0011110001111010101010110011 , subkeys[ 8 ] . 1 ) ;
189
+ //10
190
+ assert_eq ! ( 0b0101010111111110000110011001 , subkeys[ 9 ] . 0 ) ;
191
+ assert_eq ! ( 0b1111000111101010101011001100 , subkeys[ 9 ] . 1 ) ;
192
+ //11
193
+ assert_eq ! ( 0b0101011111111000011001100101 , subkeys[ 10 ] . 0 ) ;
194
+ assert_eq ! ( 0b1100011110101010101100110011 , subkeys[ 10 ] . 1 ) ;
195
+ //12
196
+ assert_eq ! ( 0b0101111111100001100110010101 , subkeys[ 11 ] . 0 ) ;
197
+ assert_eq ! ( 0b0001111010101010110011001111 , subkeys[ 11 ] . 1 ) ;
198
+ //13
199
+ assert_eq ! ( 0b0111111110000110011001010101 , subkeys[ 12 ] . 0 ) ;
200
+ assert_eq ! ( 0b0111101010101011001100111100 , subkeys[ 12 ] . 1 ) ;
201
+ //14
202
+ assert_eq ! ( 0b1111111000011001100101010101 , subkeys[ 13 ] . 0 ) ;
203
+ assert_eq ! ( 0b1110101010101100110011110001 , subkeys[ 13 ] . 1 ) ;
204
+ //15
205
+ assert_eq ! ( 0b1111100001100110010101010111 , subkeys[ 14 ] . 0 ) ;
206
+ assert_eq ! ( 0b1010101010110011001111000111 , subkeys[ 14 ] . 1 ) ;
207
+ //16
208
+ assert_eq ! ( 0b1111000011001100101010101111 , subkeys[ 15 ] . 0 ) ;
209
+ assert_eq ! ( 0b0101010101100110011110001111 , subkeys[ 15 ] . 1 ) ;
210
+
211
+ }
212
+
213
+
214
+ #[ cfg( test) ]
215
+ #[ test]
216
+ fn test_spliting_a_56_bit_key_into_2_x_28_keys ( ) {
217
+ let original_key = 0b11110000110011001010101011110101010101100110011110001111 ;
218
+ let expected_left = 0b1111000011001100101010101111 ;
219
+ let expected_right = 0b0101010101100110011110001111 ;
220
+ assert_eq ! ( ( expected_left, expected_right) , split_key( original_key, 56 ) ) ;
221
+ }
222
+
223
+
224
+ #[ cfg( test) ]
225
+ #[ test]
226
+ fn generate_key_plus_based_on_pc1_table ( ) {
227
+ let key = 0b0001001100110100010101110111100110011011101111001101111111110001 ;
228
+ let key_plus = 0b11110000110011001010101011110101010101100110011110001111 ;
229
+ assert_eq ! ( key_plus, generate_key_plus( key) ) ;
230
+ }
231
+
232
+
233
+ #[ cfg( test) ]
234
+ #[ test]
235
+ fn creating_key_based_on_pairs_and_PC2_table ( ) {
236
+ let left = 0b1110000110011001010101011111 ;
237
+ let right = 0b1010101011001100111100011110 ;
238
+ let expected_key = 0b000110110000001011101111111111000111000001110010 ;
239
+ assert_eq ! ( expected_key, key_kn_from_pair( left, right) ) ;
240
+ }
241
+
242
+
243
+ #[ cfg( test) ]
244
+ #[ test]
245
+ fn creating_48_bit_key_based_on_maximum_pairs ( ) {
246
+ let left = 0b1111_1111_1111_1111_1111_1111_1111 ;
247
+ let right = 0b1111_1111_1111_1111_1111_1111_1111 ;
248
+ let expected = 0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111 ;
249
+ assert_eq ! ( expected, key_kn_from_pair( left, right) ) ;
250
+ }
251
+
252
+
253
+ #[ cfg( test) ]
254
+ #[ test]
255
+ fn get_48_bit_keys_from_array_of_28_bit_pairs ( ) {
256
+ let pairs_28_bit = vec ! [ ( 0b1110000110011001010101011111 , 0b1010101011001100111100011110 ) ,
257
+ ( 0b1100001100110010101010111111 , 0b0101010110011001111000111101 ) ,
258
+ ( 0b0000110011001010101011111111 , 0b0101011001100111100011110101 ) ,
259
+ ( 0b0011001100101010101111111100 , 0b0101100110011110001111010101 ) ,
260
+
261
+ ( 0b1100110010101010111111110000 , 0b0110011001111000111101010101 ) ,
262
+ ( 0b0011001010101011111111000011 , 0b1001100111100011110101010101 ) ,
263
+ ( 0b1100101010101111111100001100 , 0b0110011110001111010101010110 ) ,
264
+ ( 0b0010101010111111110000110011 , 0b1001111000111101010101011001 ) ] ;
265
+
266
+ let expected = vec ! [ 0b000110110000001011101111111111000111000001110010 ,
267
+ 0b011110011010111011011001110110111100100111100101 ,
268
+ 0b010101011111110010001010010000101100111110011001 ,
269
+ 0b011100101010110111010110110110110011010100011101 ,
270
+ 0b011111001110110000000111111010110101001110101000 ,
271
+ 0b011000111010010100111110010100000111101100101111 ,
272
+ 0b111011001000010010110111111101100001100010111100 ,
273
+ 0b111101111000101000111010110000010011101111111011 ] ;
274
+
275
+ assert_eq ! ( expected, convert_pairs_to_encrypted_48_bit_keys( pairs_28_bit) ) ;
276
+ }
277
+
278
+
279
+ #[ cfg( test) ]
280
+ #[ test]
281
+ fn permutation_of_64bit_integer_gives_58_bit ( ) {
282
+ let message_64bit = 0x123456789abcdef ;
283
+ let intial_permutation = 0xcc00ccfff0aaf0aa ;
284
+ assert_eq ! ( intial_permutation, initial_permutation_of_64bit_message( message_64bit) ) ;
285
+ }
286
+
287
+
288
+ #[ cfg( test) ]
289
+ #[ test]
290
+ fn splitting_key_of_64_bit_into_32_bit_pair ( ) {
291
+ let key = 0xcc00ccfff0aaf0aa ;
292
+ let left = 0xcc00ccffi64 ;
293
+ let right = 0xf0aaf0aai64 ;
294
+ assert_eq ! ( ( left, right) , split_key( key, 64 ) ) ;
295
+ }
0 commit comments