| 1 | /***************************************************************************** |
| 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 |
| 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, or, at your option, any later version. |
| 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 |
| 33 | * along with loclass. If not, see <http://www.gnu.org/licenses/>. |
| 34 | * |
| 35 | * |
| 36 | ****************************************************************************/ |
| 37 | |
| 38 | |
| 39 | #include <stdio.h> |
| 40 | #include <stdint.h> |
| 41 | #include <stdbool.h> |
| 42 | #include <string.h> |
| 43 | #include <unistd.h> |
| 44 | #include <ctype.h> |
| 45 | #include "cipherutils.h" |
| 46 | #include "cipher.h" |
| 47 | #include "ikeys.h" |
| 48 | #include "fileutils.h" |
| 49 | #include "elite_crack.h" |
| 50 | |
| 51 | int unitTests() |
| 52 | { |
| 53 | int errors = testCipherUtils(); |
| 54 | errors += testMAC(); |
| 55 | errors += doKeyTests(0); |
| 56 | errors += testElite(); |
| 57 | if(errors) |
| 58 | { |
| 59 | prnlog("OBS! There were errors!!!"); |
| 60 | } |
| 61 | return errors; |
| 62 | } |
| 63 | int showHelp() |
| 64 | { |
| 65 | prnlog("Usage: loclass [options]"); |
| 66 | prnlog("Options:"); |
| 67 | prnlog("-t Perform self-test"); |
| 68 | prnlog("-h Show this help"); |
| 69 | prnlog("-f <filename> Bruteforce iclass dumpfile"); |
| 70 | prnlog(" An iclass dumpfile is assumed to consist of an arbitrary number of malicious CSNs, and their protocol responses"); |
| 71 | prnlog(" The binary format of the file is expected to be as follows: "); |
| 72 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
| 73 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
| 74 | prnlog(" <8 byte CSN><8 byte CC><4 byte NR><4 byte MAC>"); |
| 75 | prnlog(" ... totalling N*24 bytes"); |
| 76 | prnlog(" Check iclass_dump.bin for an example"); |
| 77 | |
| 78 | return 0; |
| 79 | } |
| 80 | |
| 81 | int main (int argc, char **argv) |
| 82 | { |
| 83 | prnlog("IClass Cipher version 1.2, Copyright (C) 2014 Martin Holst Swende\n"); |
| 84 | prnlog("Comes with ABSOLUTELY NO WARRANTY"); |
| 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 | |
| 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 | |