f38a1528 |
1 | /***************************************************************************** |
2ae8a312 |
2 | * WARNING |
3 | * |
4 | * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. |
5 | * |
6 | * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL |
7 | * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, |
8 | * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. |
9 | * |
10 | * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. |
11 | * |
12 | ***************************************************************************** |
13 | * |
14 | * This file is part of loclass. It is a reconstructon of the cipher engine |
f38a1528 |
15 | * used in iClass, and RFID techology. |
16 | * |
17 | * The implementation is based on the work performed by |
18 | * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and |
19 | * Milosch Meriac in the paper "Dismantling IClass". |
20 | * |
21 | * Copyright (C) 2014 Martin Holst Swende |
22 | * |
23 | * This is free software: you can redistribute it and/or modify |
24 | * it under the terms of the GNU General Public License version 2 as published |
25 | * by the Free Software Foundation. |
26 | * |
27 | * This file is distributed in the hope that it will be useful, |
28 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
29 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
30 | * GNU General Public License for more details. |
31 | * |
32 | * You should have received a copy of the GNU General Public License |
2ae8a312 |
33 | * along with loclass. If not, see <http://www.gnu.org/licenses/>. |
34 | * |
35 | * |
36 | * |
f38a1528 |
37 | ****************************************************************************/ |
38 | |
2ae8a312 |
39 | |
f38a1528 |
40 | #include <stdio.h> |
41 | #include <cipherutils.h> |
42 | #include <stdint.h> |
43 | #include <stdbool.h> |
44 | #include <string.h> |
45 | #include <unistd.h> |
46 | #include <ctype.h> |
47 | #include "cipherutils.h" |
48 | #include "cipher.h" |
49 | #include "ikeys.h" |
50 | #include "fileutils.h" |
51 | #include "elite_crack.h" |
52 | |
53 | int unitTests() |
54 | { |
55 | int errors = testCipherUtils(); |
56 | errors += testMAC(); |
57 | errors += doKeyTests(0); |
58 | errors += testElite(); |
59 | return errors; |
60 | } |
61 | int showHelp() |
62 | { |
63 | prnlog("Usage: iclazz [options]"); |
64 | prnlog("Options:"); |
65 | prnlog("-t Perform self-test"); |
66 | prnlog("-h Show this help"); |
67 | prnlog("-f <filename> Bruteforce iclass dumpfile"); |
68 | prnlog(" An iclass dumpfile is assumed to consist of an arbitrary number of malicious CSNs, and their protocol responses"); |
69 | prnlog(" The the binary format of the file is expected to be as follows: "); |
70 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
71 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
72 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
73 | prnlog(" ... totalling N*24 bytes"); |
74 | prnlog(" Check iclass_dump.bin for an example"); |
75 | |
76 | return 0; |
77 | } |
78 | |
79 | int main (int argc, char **argv) |
80 | { |
2ae8a312 |
81 | |
82 | |
f38a1528 |
83 | prnlog("IClass Cipher version 1.2, Copyright (C) 2014 Martin Holst Swende\n"); |
84 | prnlog("Comes with ABSOLUTELY NO WARRANTY"); |
2ae8a312 |
85 | prnlog("Released as GPLv2\n"); |
86 | prnlog("WARNING"); |
87 | prnlog(""); |
88 | prnlog("THIS TOOL IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. "); |
89 | prnlog(""); |
90 | prnlog("USAGE OF THIS TOOL IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL "); |
91 | prnlog("PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, "); |
92 | prnlog("AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. "); |
93 | prnlog(""); |
94 | prnlog("THIS TOOL SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. "); |
95 | |
96 | |
f38a1528 |
97 | char *fileName = NULL; |
98 | int c; |
99 | while ((c = getopt (argc, argv, "thf:")) != -1) |
100 | switch (c) |
101 | { |
102 | case 't': |
103 | return unitTests(); |
104 | case 'h': |
105 | return showHelp(); |
106 | case 'f': |
107 | fileName = optarg; |
108 | return bruteforceFileNoKeys(fileName); |
109 | case '?': |
110 | if (optopt == 'f') |
111 | fprintf (stderr, "Option -%c requires an argument.\n", optopt); |
112 | else if (isprint (optopt)) |
113 | fprintf (stderr, "Unknown option `-%c'.\n", optopt); |
114 | else |
115 | fprintf (stderr, |
116 | "Unknown option character `\\x%x'.\n", |
117 | optopt); |
118 | return 1; |
119 | //default: |
120 | //showHelp(); |
121 | } |
122 | showHelp(); |
123 | return 0; |
124 | } |
125 | |