diff options
author | Jaka Hudoklin <jakahudoklin@gmail.com> | 2014-09-24 11:20:47 +0200 |
---|---|---|
committer | Jaka Hudoklin <jakahudoklin@gmail.com> | 2014-09-24 11:20:47 +0200 |
commit | 8eed86fba9d5dea89a0ead255b47842e9e1c5050 (patch) | |
tree | 04018df076be251dc90c5463446641c5040d2372 /pkgs/tools/security/mfoc | |
parent | f26c32f9205dbca715b574f2383bc84f4dfed821 (diff) | |
download | nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar.gz nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar.bz2 nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar.lz nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar.xz nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.tar.zst nixpkgs-8eed86fba9d5dea89a0ead255b47842e9e1c5050.zip |
add mfoc, Mifare Classic Offline Cracker
Diffstat (limited to 'pkgs/tools/security/mfoc')
-rw-r--r-- | pkgs/tools/security/mfoc/default.nix | 23 | ||||
-rw-r--r-- | pkgs/tools/security/mfoc/mf_mini.patch | 96 |
2 files changed, 119 insertions, 0 deletions
diff --git a/pkgs/tools/security/mfoc/default.nix b/pkgs/tools/security/mfoc/default.nix new file mode 100644 index 00000000000..f99db572b6c --- /dev/null +++ b/pkgs/tools/security/mfoc/default.nix @@ -0,0 +1,23 @@ +{ stdenv, fetchurl, pkgconfig, libnfc }: + +stdenv.mkDerivation rec { + name = "mfoc-${version}"; + version = "0.10.6"; + + src = fetchurl { + url = "http://mfoc.googlecode.com/files/${name}.tar.gz"; + sha1 = "3adce3029dce9124ff3bc7d0fad86fa0c374a9e3"; + }; + + patches = [./mf_mini.patch]; + + buildInputs = [ pkgconfig libnfc ]; + + meta = with stdenv.lib; { + description = "Mifare Classic Offline Cracker"; + license = licenses.gpl2; + homepage = http://code.google.com/p/mfoc/; + maintainers = with maintainers; [ offline ]; + platforms = with platforms; unix; + }; +} diff --git a/pkgs/tools/security/mfoc/mf_mini.patch b/pkgs/tools/security/mfoc/mf_mini.patch new file mode 100644 index 00000000000..02bd656d602 --- /dev/null +++ b/pkgs/tools/security/mfoc/mf_mini.patch @@ -0,0 +1,96 @@ +diff --git a/src/mfoc.c b/src/mfoc.c +index 0cb917d..195de68 100644 +--- a/src/mfoc.c ++++ b/src/mfoc.c +@@ -93,8 +93,8 @@ int main(int argc, char *const argv[]) + {0x58, 0x7e, 0xe5, 0xf9, 0x35, 0x0f}, + {0xa0, 0x47, 0x8c, 0xc3, 0x90, 0x91}, + {0x53, 0x3c, 0xb6, 0xc7, 0x23, 0xf6}, +- {0x8f, 0xd0, 0xa4, 0xf2, 0x56, 0xe9} +- ++ {0x8f, 0xd0, 0xa4, 0xf2, 0x56, 0xe9}, ++ {0xb4, 0xc1, 0x32, 0x43, 0x9e, 0xef} + }; + + mftag t; +@@ -219,12 +219,31 @@ int main(int argc, char *const argv[]) + goto error; + } + +- // Save tag's block size (b4K) +- t.b4K = (t.nt.nti.nai.abtAtqa[1] == 0x02); + t.authuid = (uint32_t) bytes_to_num(t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, 4); + +- t.num_blocks = (t.b4K) ? 0xff : 0x3f; +- t.num_sectors = t.b4K ? NR_TRAILERS_4k : NR_TRAILERS_1k; ++ // Get Mifare Classic type from SAK ++ // see http://www.nxp.com/documents/application_note/AN10833.pdf Section 3.2 ++ switch (t.nt.nti.nai.btSak) ++ { ++ case 0x08: ++ printf("Found Mifare Classic 1k tag\n"); ++ t.num_sectors = NR_TRAILERS_1k; ++ t.num_blocks = NR_BLOCKS_1k; ++ break; ++ case 0x09: ++ printf("Found Mifare Classic Mini tag\n"); ++ t.num_sectors = NR_TRAILERS_MINI; ++ t.num_blocks = NR_BLOCKS_MINI; ++ break; ++ case 0x18: ++ printf("Found Mifare Classic 4k tag\n"); ++ t.num_sectors = NR_TRAILERS_4k; ++ t.num_blocks = NR_BLOCKS_4k; ++ break; ++ defaul: ++ ERR("Cannot determine card type from SAK"); ++ goto error; ++ } + + t.sectors = (void *) calloc(t.num_sectors, sizeof(sector)); + if (t.sectors == NULL) { +@@ -564,7 +583,7 @@ void usage(FILE *stream, int errno) + fprintf(stream, " k try the specified key in addition to the default keys\n"); + // fprintf(stream, " D number of distance probes, default is 20\n"); + // fprintf(stream, " S number of sets with keystreams, default is 5\n"); +- fprintf(stream, " P number of probes per sector, instead of default of 20\n"); ++ fprintf(stream, " P number of probes per sector, instead of default of 150\n"); + fprintf(stream, " T nonce tolerance half-range, instead of default of 20\n (i.e., 40 for the total range, in both directions)\n"); + // fprintf(stream, " s specify the list of sectors to crack, for example -s 0,1,3,5\n"); + fprintf(stream, " O file in which the card contents will be written (REQUIRED)\n"); +diff --git a/src/mfoc.h b/src/mfoc.h +index b411670..532e834 100644 +--- a/src/mfoc.h ++++ b/src/mfoc.h +@@ -2,11 +2,21 @@ + #define TRY_KEYS 50 + + // Number of trailers == number of sectors +-// 16x64b = 16 ++// Mifare Classic 1k 16x64b = 16 + #define NR_TRAILERS_1k (16) +-// 32x64b + 8*256b = 40 ++// Mifare Classic Mini ++#define NR_TRAILERS_MINI (5) ++// Mifare Classic 4k 32x64b + 8*256b = 40 + #define NR_TRAILERS_4k (40) + ++// Number of blocks ++// Mifare Classic 1k ++#define NR_BLOCKS_1k 0x3f ++// Mifare Classic Mini ++#define NR_BLOCKS_MINI 0x13 ++// Mifare Classic 4k ++#define NR_BLOCKS_4k 0xff ++ + #define MAX_FRAME_LEN 264 + + // Used for counting nonce distances, explore [nd-value, nd+value] +@@ -46,7 +56,6 @@ typedef struct { + uint8_t num_sectors; + uint8_t num_blocks; + uint32_t authuid; +- bool b4K; + } mftag; + + typedef struct { |