1- #[ cfg( test) ]
2- mod main_tests;
3-
41const MESS : i64 = 0x0123456789ABCDEF ;
52const KEY : i64 = 0x133457799BBCDFF1 ;
63
@@ -29,7 +26,7 @@ const PC1 : [u8; 56] =
292629 , 21 , 13 , 5 , 28 , 20 , 12 , 4 ] ;
3027
3128
32- pub fn generate_key_plus ( key : i64 ) -> i64 {
29+ fn generate_key_plus ( key : i64 ) -> i64 {
3330 let mut key_plus : i64 = 0 ;
3431 for idx in 0 ..56 {
3532 let bit_to_add = key >> ( 64 - PC1 [ idx] ) & 1 ;
@@ -40,7 +37,7 @@ pub fn generate_key_plus(key: i64) -> i64 {
4037}
4138
4239
43- pub fn split_key ( key : i64 , key_len : u8 ) -> ( i64 , i64 ) {
40+ fn split_key ( key : i64 , key_len : u8 ) -> ( i64 , i64 ) {
4441 let half_size = key_len / 2 ;
4542 let left_half = ( key >> half_size) & bit_pattern_ones ( half_size) ;
4643 let right_half = key & bit_pattern_ones ( half_size) ;
@@ -50,7 +47,7 @@ pub fn split_key(key : i64, key_len: u8) -> (i64, i64) {
5047
5148const LEFT_SHIFTS : [ u8 ; 16 ] = [ 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 ] ;
5249
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 ) > {
5451 let mut subkeys : Vec < ( i64 , i64 ) > = Vec :: new ( ) ;
5552 subkeys. push ( ( left_half, right_half) ) ;
5653 for idx in 0 ..16 {
@@ -62,14 +59,14 @@ pub fn create_16_subkeys(left_half: i64, right_half: i64) -> Vec<(i64, i64)> {
6259 subkeys
6360}
6461
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 {
6663 let ones_for_rolled_bits = bit_pattern_ones ( rol_count) << pattern_len - rol_count;
6764 let rotated_bits = ( ( ones_for_rolled_bits) & bit_pattern) >> pattern_len - rol_count;
6865 ( ( bit_pattern << rol_count) & bit_pattern_ones ( pattern_len) ) | rotated_bits
6966}
7067
7168
72- pub fn bit_pattern_ones ( how_much : u8 ) -> i64 {
69+ fn bit_pattern_ones ( how_much : u8 ) -> i64 {
7370 ( ( 2u64 ) . pow ( how_much as u32 ) - 1 ) as i64
7471}
7572
@@ -85,7 +82,7 @@ const PC2 : [u8; 48] =
8582 46 , 42 , 50 , 36 , 29 , 32 ] ;
8683
8784
88- pub fn key_kn_from_pair ( left : i64 , right : i64 ) -> i64 {
85+ fn key_kn_from_pair ( left : i64 , right : i64 ) -> i64 {
8986 let combined = ( ( left << 28 ) | right) << 8 ;
9087 let mut encrypted_key = 0i64 ;
9188 for idx in 0 ..48 {
@@ -97,7 +94,7 @@ pub fn key_kn_from_pair(left: i64, right: i64) -> i64 {
9794}
9895
9996
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 > {
10198 let mut keys_48_bit : Vec < i64 > = Vec :: new ( ) ;
10299 for idx in 0 ..pairs. len ( ) {
103100 keys_48_bit. push ( key_kn_from_pair ( pairs[ idx] . 0 , pairs[ idx] . 1 ) ) ;
@@ -118,8 +115,9 @@ const IP : [u8; 64] = [
11811561 , 53 , 45 , 37 , 29 , 21 , 13 , 5 ,
11911663 , 55 , 47 , 39 , 31 , 23 , 15 , 7
120117] ;
118+
121119//b = bit
122- pub fn initial_permutation_of_64bit_message ( message : i64 ) -> i64 {
120+ fn initial_permutation_of_64bit_message ( message : i64 ) -> i64 {
123121 let mut permutation = 0i64 ;
124122 for idx in 0 ..64 {
125123 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 {
128126 }
129127 permutation
130128}
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