1 //-----------------------------------------------------------------------------
2 // Copyright (C) 2015, 2016 by piwi
4 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
5 // at your option, any later version. See the LICENSE.txt file for the text of
7 //-----------------------------------------------------------------------------
8 // Implements a card only attack based on crypto text (encrypted nonces
9 // received during a nested authentication) only. Unlike other card only
10 // attacks this doesn't rely on implementation errors but only on the
11 // inherent weaknesses of the crypto1 cypher. Described in
12 // Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened
13 // Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on
14 // Computer and Communications Security, 2015
15 //-----------------------------------------------------------------------------
17 // This program calculates tables with possible states for a given
20 //-----------------------------------------------------------------------------
28 #include "crapto1/crapto1.h"
32 #define NUM_PART_SUMS 9
33 #define BITFLIP_2ND_BYTE 0x0200
41 static uint16_t PartialSumProperty(uint32_t state
, odd_even_t odd_even
)
44 for (uint16_t j
= 0; j
< 16; j
++) {
46 uint16_t part_sum
= 0;
47 if (odd_even
== ODD_STATE
) {
48 for (uint16_t i
= 0; i
< 5; i
++) {
49 part_sum
^= filter(st
);
50 st
= (st
<< 1) | ((j
>> (3-i
)) & 0x01) ;
52 part_sum
^= 1; // XOR 1 cancelled out for the other 8 bits
54 for (uint16_t i
= 0; i
< 4; i
++) {
55 st
= (st
<< 1) | ((j
>> (3-i
)) & 0x01) ;
56 part_sum
^= filter(st
);
65 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
68 #define malloc_bitarray(x) __builtin_assume_aligned(_aligned_malloc(x, __BIGGEST_ALIGNMENT__), __BIGGEST_ALIGNMENT__)
69 #define free_bitarray(x) _aligned_free(x)
71 static inline void clear_bitarray24(uint32_t *bitarray
)
73 memset(bitarray
, 0x00, sizeof(uint32_t) * (1<<19));
77 static inline uint32_t test_bit24(uint32_t *bitarray
, uint32_t index
)
79 return bitarray
[index
>>5] & (0x80000000>>(index
&0x0000001f));
83 static inline void set_bit24(uint32_t *bitarray
, uint32_t index
)
85 bitarray
[index
>>5] |= 0x80000000>>(index
&0x0000001f);
89 static inline uint32_t next_state(uint32_t *bitset
, uint32_t state
)
91 if (++state
== 1<<24) return 1<<24;
92 uint32_t index
= state
>> 5;
93 uint_fast8_t bit
= state
& 0x1f;
94 uint32_t line
= bitset
[index
] << bit
;
96 if (line
& 0x80000000) return state
;
102 while (bitset
[index
] == 0x00000000 && state
< 1<<24) {
106 if (state
>= 1<<24) return 1<<24;
108 return state
+ __builtin_clz(bitset
[index
]);
111 line
= bitset
[index
];
112 while (bit
<= 0x1f) {
113 if (line
& 0x80000000) return state
;
123 static inline uint32_t next_not_state(uint32_t *bitset
, uint32_t state
)
125 if (++state
== 1<<24) return 1<<24;
126 uint32_t index
= state
>> 5;
127 uint_fast8_t bit
= state
& 0x1f;
128 uint32_t line
= bitset
[index
] << bit
;
129 while (bit
<= 0x1f) {
130 if ((line
& 0x80000000) == 0) return state
;
136 while (bitset
[index
] == 0xffffffff && state
< 1<<24) {
140 if (state
>= 1<<24) return 1<<24;
142 return state
+ __builtin_clz(~bitset
[index
]);
145 line
= bitset
[index
];
146 while (bit
<= 0x1f) {
147 if ((line
& 0x80000000) == 0) return state
;
157 static inline uint32_t bitcount(uint32_t a
)
160 return __builtin_popcountl(a
);
162 a
= a
- ((a
>> 1) & 0x55555555);
163 a
= (a
& 0x33333333) + ((a
>> 2) & 0x33333333);
164 return (((a
+ (a
>> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24;
169 static inline uint32_t count_states(uint32_t *bitset
)
172 for (uint32_t i
= 0; i
< (1<<19); i
++) {
173 count
+= bitcount(bitset
[i
]);
179 static void write_bitflips_file(odd_even_t odd_even
, uint16_t bitflip
, int sum_a0
, uint32_t *bitset
, uint32_t count
)
182 sprintf(filename
, "bitflip_%d_%03" PRIx16
"_sum%d_states.bin", odd_even
, bitflip
, sum_a0
);
183 FILE *outfile
= fopen(filename
, "wb");
184 fwrite(&count
, 1, sizeof(count
), outfile
);
185 fwrite(bitset
, 1, sizeof(uint32_t)*(1<<19), outfile
);
190 uint32_t *restrict part_sum_a0_bitarrays
[2][NUM_PART_SUMS
];
192 static void init_part_sum_bitarrays(void)
194 printf("init_part_sum_bitarrays()...");
195 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
196 for (uint16_t part_sum_a0
= 0; part_sum_a0
< NUM_PART_SUMS
; part_sum_a0
++) {
197 part_sum_a0_bitarrays
[odd_even
][part_sum_a0
] = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1<<19));
198 if (part_sum_a0_bitarrays
[odd_even
][part_sum_a0
] == NULL
) {
199 printf("Out of memory error in init_part_suma0_statelists(). Aborting...\n");
202 clear_bitarray24(part_sum_a0_bitarrays
[odd_even
][part_sum_a0
]);
205 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
206 //printf("(%d, %" PRIu16 ")...", odd_even, part_sum_a0);
207 for (uint32_t state
= 0; state
< (1<<20); state
++) {
208 uint16_t part_sum_a0
= PartialSumProperty(state
, odd_even
) / 2;
209 for (uint16_t low_bits
= 0; low_bits
< 1<<4; low_bits
++) {
210 set_bit24(part_sum_a0_bitarrays
[odd_even
][part_sum_a0
], state
<<4 | low_bits
);
218 static void free_part_sum_bitarrays(void)
220 printf("free_part_sum_bitarrays()...");
221 for (int16_t part_sum_a0
= (NUM_PART_SUMS
-1); part_sum_a0
>= 0; part_sum_a0
--) {
222 free_bitarray(part_sum_a0_bitarrays
[ODD_STATE
][part_sum_a0
]);
224 for (int16_t part_sum_a0
= (NUM_PART_SUMS
-1); part_sum_a0
>= 0; part_sum_a0
--) {
225 free_bitarray(part_sum_a0_bitarrays
[EVEN_STATE
][part_sum_a0
]);
230 uint32_t *restrict sum_a0_bitarray
[2];
232 void init_sum_bitarray(uint16_t sum_a0
)
234 printf("init_sum_bitarray()...\n");
235 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
236 sum_a0_bitarray
[odd_even
] = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1<<19));
237 if (sum_a0_bitarray
[odd_even
] == NULL
) {
238 printf("Out of memory error in init_sum_bitarrays(). Aborting...\n");
241 clear_bitarray24(sum_a0_bitarray
[odd_even
]);
243 for (uint8_t p
= 0; p
< NUM_PART_SUMS
; p
++) {
244 for (uint8_t q
= 0; q
< NUM_PART_SUMS
; q
++) {
245 if (sum_a0
== 2*p
*(16-2*q
) + (16-2*p
)*2*q
) {
246 for (uint32_t i
= 0; i
< (1<<19); i
++) {
247 sum_a0_bitarray
[EVEN_STATE
][i
] |= part_sum_a0_bitarrays
[EVEN_STATE
][q
][i
];
248 sum_a0_bitarray
[ODD_STATE
][i
] |= part_sum_a0_bitarrays
[ODD_STATE
][p
][i
];
253 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
254 uint32_t count
= count_states(sum_a0_bitarray
[odd_even
]);
255 printf("sum_a0_bitarray[%s] has %d states (%5.2f%%)\n", odd_even
==EVEN_STATE
?"even":"odd ", count
, (float)count
/(1<<24)*100.0);
261 static void free_sum_bitarray(void)
263 printf("free_sum_bitarray()...");
264 free_bitarray(sum_a0_bitarray
[ODD_STATE
]);
265 free_bitarray(sum_a0_bitarray
[EVEN_STATE
]);
270 static void precalculate_bit0_bitflip_bitarrays(uint8_t const bitflip
, uint16_t const sum_a0
)
274 #define NUM_TEST_STATES (1<<10)
276 #define NUM_TEST_STATES (1<<23)
279 time_t start_time
= time(NULL
);
280 time_t last_check_time
= start_time
;
282 uint32_t *restrict test_bitarray
[2];
283 uint32_t *restrict test_not_bitarray
[2];
285 test_bitarray
[EVEN_STATE
] = malloc_bitarray(sizeof(uint32_t) * (1<<19));
286 clear_bitarray24(test_bitarray
[EVEN_STATE
]);
287 test_bitarray
[ODD_STATE
] = malloc_bitarray(sizeof(uint32_t) * (1<<19));
288 clear_bitarray24(test_bitarray
[ODD_STATE
]);
290 test_not_bitarray
[EVEN_STATE
] = malloc_bitarray(sizeof(uint32_t) * (1<<19));
291 clear_bitarray24(test_not_bitarray
[EVEN_STATE
]);
292 test_not_bitarray
[ODD_STATE
] = malloc_bitarray(sizeof(uint32_t) * (1<<19));
293 clear_bitarray24(test_not_bitarray
[ODD_STATE
]);
296 bool all_odd_states_are_possible_for_notbitflip
= false;
298 printf("\n\nStarting search for crypto1 states resulting in bitflip property 0x%03x...\n", bitflip
);
299 for (uint32_t even_state
= next_state(sum_a0_bitarray
[EVEN_STATE
], -1); even_state
< NUM_TEST_STATES
; even_state
= next_state(sum_a0_bitarray
[EVEN_STATE
], even_state
)) {
300 bool even_state_is_possible
= false;
301 time_t time_now
= time(NULL
);
302 if (difftime(time_now
, last_check_time
) > 5*60) { // print status every 5 minutes
303 float runtime
= difftime(time_now
, start_time
);
304 float remaining_time
= runtime
* ((1<<23) - even_state
) / even_state
;
305 printf("\n%1.1f hours elapsed, expected completion in %1.1f hours (%1.1f days)", runtime
/3600, remaining_time
/3600, remaining_time
/3600/24);
306 last_check_time
= time_now
;
308 for (uint32_t odd_state
= next_state(sum_a0_bitarray
[ODD_STATE
], -1); odd_state
< (1<<24); odd_state
= next_state(test_bitarray
[ODD_STATE
], odd_state
)) {
309 if (even_state_is_possible
&& test_bit24(test_bitarray
[ODD_STATE
], odd_state
)) continue;
310 // load crypto1 state
311 struct Crypto1State cs
;
312 cs
.odd
= odd_state
>> 4;
313 cs
.even
= even_state
>> 4;
315 // track flipping bits in state
316 struct Crypto1DeltaState
{
323 uint_fast16_t keystream
= 0;
326 for (int i
= 0; i
< 9; i
++) {
327 uint_fast8_t keystream_bit
= filter(cs
.odd
& 0x000fffff) ^ filter((cs
.odd
& 0x000fffff) ^ cs_delta
.odd
);
328 keystream
= keystream
<< 1 | keystream_bit
;
329 uint_fast8_t nt_bit
= BIT(bitflip
, i
) ^ keystream_bit
;
330 uint_fast8_t LSFR_feedback
= BIT(cs_delta
.odd
, 2) ^ BIT(cs_delta
.even
, 2) ^ BIT(cs_delta
.odd
, 3);
332 cs_delta
.even
= cs_delta
.even
<< 1 | (LSFR_feedback
^ nt_bit
);
333 uint_fast8_t tmp
= cs_delta
.odd
;
334 cs_delta
.odd
= cs_delta
.even
;
339 cs
.odd
= odd_state
>> (7 - i
) / 2;
341 cs
.odd
= even_state
>> (7 - i
) / 2;
345 if (evenparity32(keystream
) == evenparity32(bitflip
)) {
346 // found valid bitflip state
347 even_state_is_possible
= true;
348 set_bit24(test_bitarray
[EVEN_STATE
], even_state
);
349 set_bit24(test_bitarray
[EVEN_STATE
], 1 << 23 | even_state
);
350 set_bit24(test_bitarray
[ODD_STATE
], odd_state
);
352 // found valid !bitflip state
353 set_bit24(test_not_bitarray
[EVEN_STATE
], even_state
);
354 set_bit24(test_not_bitarray
[EVEN_STATE
], 1 << 23 | even_state
);
355 set_bit24(test_not_bitarray
[ODD_STATE
], odd_state
);
358 if (!even_state_is_possible
) {
359 all_odd_states_are_possible_for_notbitflip
= true;
363 printf("\nAnalysis completed. Checking for effective bitflip properties...\n");
364 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
365 count
[odd_even
] = count_states(test_bitarray
[odd_even
]);
366 if (count
[odd_even
] != 1<<24) {
367 printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n",
369 odd_even
==EVEN_STATE
?"even":"odd",
370 bitflip
, (1<<24) - count
[odd_even
],
371 (float)((1<<24) - count
[odd_even
]) / (1<<24) * 100.0);
373 write_bitflips_file(odd_even
, bitflip
, sum_a0
, test_bitarray
[odd_even
], count
[odd_even
]);
376 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
);
379 uint32_t *restrict test_bitarray_2nd
= malloc_bitarray(sizeof(uint32_t) * (1<<19));
380 clear_bitarray24(test_bitarray_2nd
);
381 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
382 if (count
[odd_even
] != 1<<24) {
383 for (uint32_t state
= 0; state
< (1<<24); state
+= 1<<4) {
384 uint32_t line
= test_bitarray
[odd_even
][state
>>5];
385 uint16_t half_line
= state
&0x000000010 ? line
&0x0000ffff : line
>>16;
386 if (half_line
!= 0) {
387 for (uint32_t low_bits
= 0; low_bits
< (1<<4); low_bits
++) {
388 set_bit24(test_bitarray_2nd
, low_bits
<< 20 | state
>> 4);
392 count
[odd_even
] = count_states(test_bitarray_2nd
);
393 if (count
[odd_even
] != 1<<24) {
394 printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n",
396 odd_even
==EVEN_STATE
?"even":"odd",
397 bitflip
| BITFLIP_2ND_BYTE
, (1<<24) - count
[odd_even
],
398 (float)((1<<24) - count
[odd_even
]) / (1<<24) * 100.0);
400 write_bitflips_file(odd_even
, bitflip
| BITFLIP_2ND_BYTE
, sum_a0
, test_bitarray_2nd
, count
[odd_even
]);
403 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
| BITFLIP_2ND_BYTE
);
406 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
| BITFLIP_2ND_BYTE
);
410 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
411 // second run for the remaining "not bitflip" states
412 printf("\n\nStarting search for crypto1 states resulting in bitflip property 0x%03x...", bitflip
| 0x100);
413 start_time
= time(NULL
);
414 last_check_time
= start_time
;
415 for (uint32_t even_state
= next_state(sum_a0_bitarray
[EVEN_STATE
], -1); even_state
< NUM_TEST_STATES
; even_state
= next_state(sum_a0_bitarray
[EVEN_STATE
], even_state
)) {
416 bool even_state_is_possible
= test_bit24(test_not_bitarray
[EVEN_STATE
], even_state
);
417 time_t time_now
= time(NULL
);
418 if (difftime(time_now
, last_check_time
) > 5*60) { // print status every 5 minutes
419 float runtime
= difftime(time_now
, start_time
);
420 float remaining_time
= runtime
* ((1<<23) - even_state
) / even_state
;
421 printf("\n%1.1f hours elapsed, expected completion in %1.1f hours (%1.1f days)", runtime
/3600, remaining_time
/3600, remaining_time
/3600/24);
422 last_check_time
= time_now
;
424 for (uint32_t odd_state
= next_state(sum_a0_bitarray
[ODD_STATE
], -1); odd_state
< (1<<24); odd_state
= next_state(sum_a0_bitarray
[ODD_STATE
], odd_state
)) {
425 if (even_state_is_possible
) {
426 if (all_odd_states_are_possible_for_notbitflip
) break;
427 if (test_bit24(test_not_bitarray
[ODD_STATE
], odd_state
)) continue;
429 // load crypto1 state
430 struct Crypto1State cs
;
431 cs
.odd
= odd_state
>> 4;
432 cs
.even
= even_state
>> 4;
434 // track flipping bits in state
435 struct Crypto1DeltaState
{
442 uint_fast16_t keystream
= 0;
443 // uint_fast16_t nt = 0;
446 for (int i
= 0; i
< 9; i
++) {
447 uint_fast8_t keystream_bit
= filter(cs
.odd
& 0x000fffff) ^ filter((cs
.odd
& 0x000fffff) ^ cs_delta
.odd
);
448 keystream
= keystream
<< 1 | keystream_bit
;
449 uint_fast8_t nt_bit
= BIT(bitflip
|0x100, i
) ^ keystream_bit
;
450 uint_fast8_t LSFR_feedback
= BIT(cs_delta
.odd
, 2) ^ BIT(cs_delta
.even
, 2) ^ BIT(cs_delta
.odd
, 3);
452 cs_delta
.even
= cs_delta
.even
<< 1 | (LSFR_feedback
^ nt_bit
);
453 uint_fast8_t tmp
= cs_delta
.odd
;
454 cs_delta
.odd
= cs_delta
.even
;
459 cs
.odd
= odd_state
>> (7 - i
) / 2;
461 cs
.odd
= even_state
>> (7 - i
) / 2;
465 if (evenparity32(keystream
) != evenparity32(bitflip
)) {
466 // found valid !bitflip state
467 even_state_is_possible
= true;
468 set_bit24(test_not_bitarray
[EVEN_STATE
], even_state
);
469 set_bit24(test_not_bitarray
[EVEN_STATE
], 1 << 23 | even_state
);
470 set_bit24(test_not_bitarray
[ODD_STATE
], odd_state
);
475 printf("\nAnalysis completed. Checking for effective !bitflip properties...\n");
476 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
477 count
[odd_even
] = count_states(test_not_bitarray
[odd_even
]);
478 if (count
[odd_even
] != 1<<24) {
479 printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n",
481 odd_even
==EVEN_STATE
?"even":"odd",
482 bitflip
|0x100, (1<<24) - count
[odd_even
],
483 (float)((1<<24) - count
[odd_even
]) / (1<<24) * 100.0);
485 write_bitflips_file(odd_even
, bitflip
|0x100, sum_a0
, test_not_bitarray
[odd_even
], count
[odd_even
]);
488 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
|0x100);
492 clear_bitarray24(test_bitarray_2nd
);
493 for (odd_even_t odd_even
= EVEN_STATE
; odd_even
<= ODD_STATE
; odd_even
++) {
494 if (count
[odd_even
] != 1<<24) {
495 for (uint32_t state
= 0; state
< (1<<24); state
+= 1<<4) {
496 uint32_t line
= test_not_bitarray
[odd_even
][state
>>5];
497 uint16_t half_line
= state
&0x000000010 ? line
&0x0000ffff : line
>>16;
498 if (half_line
!= 0) {
499 for (uint32_t low_bits
= 0; low_bits
< (1<<4); low_bits
++) {
500 set_bit24(test_bitarray_2nd
, low_bits
<< 20 | state
>> 4);
504 count
[odd_even
] = count_states(test_bitarray_2nd
);
505 if (count
[odd_even
] != 1<<24) {
506 printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n",
508 odd_even
==EVEN_STATE
?"even":"odd",
509 bitflip
| 0x100| BITFLIP_2ND_BYTE
, (1<<24) - count
[odd_even
],
510 (float)((1<<24) - count
[odd_even
]) / (1<<24) * 100.0);
512 write_bitflips_file(odd_even
, bitflip
| 0x100 | BITFLIP_2ND_BYTE
, sum_a0
, test_bitarray_2nd
, count
[odd_even
]);
515 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
| 0x100 | BITFLIP_2ND_BYTE
);
518 printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even
==EVEN_STATE
?"even":"odd", bitflip
| 0x100 | BITFLIP_2ND_BYTE
);
522 free_bitarray(test_bitarray_2nd
);
523 free_bitarray(test_not_bitarray
[ODD_STATE
]);
524 free_bitarray(test_not_bitarray
[EVEN_STATE
]);
525 free_bitarray(test_bitarray
[ODD_STATE
]);
526 free_bitarray(test_bitarray
[EVEN_STATE
]);
532 int main (int argc
, char *argv
[]) {
534 unsigned int bitflip_in
;
537 printf("Create tables required by hardnested attack.\n");
538 printf("Expect a runtime in the range of days or weeks.\n");
539 printf("Single thread only. If you want to use several threads, start it multiple times :-)\n\n");
541 if (argc
!= 2 && argc
!= 3) {
542 printf(" syntax: %s <bitflip property> [<Sum_a0>]\n\n", argv
[0]);
543 printf(" example: %s 1f\n", argv
[0]);
547 sscanf(argv
[1],"%x", &bitflip_in
);
549 if (bitflip_in
> 255) {
550 printf("Bitflip property must be less than or equal to 0xff\n\n");
555 sscanf(argv
[2], "%d", &sum_a0
);
578 default: sum_a0
= -1;
581 printf("Calculating for bitflip = %02x, sum_a0 = %d\n", bitflip_in
, sum_a0
);
583 init_part_sum_bitarrays();
584 init_sum_bitarray(sum_a0
);
586 precalculate_bit0_bitflip_bitarrays(bitflip_in
, sum_a0
);
589 free_part_sum_bitarrays();