// Work with mifare cards.\r
//-----------------------------------------------------------------------------\r
\r
+#include <string.h>\r
#include "mifareutil.h"\r
#include "proxmark3.h"\r
#include "apps.h"\r
#include "util.h"\r
-#include "string.h"\r
+#include "parity.h"\r
\r
#include "iso14443crc.h"\r
#include "iso14443a.h"\r
#include "crapto1/crapto1.h"\r
-#include "des.h"\r
+#include "polarssl/des.h"\r
\r
int MF_DBGLEVEL = MF_DBG_ALL;\r
\r
data[i] = crypto1_byte(pcs, 0x00, 0) ^ data[i];\r
if((i&0x0007) == 0) \r
par[i>>3] = 0;\r
- par[i>>3] |= (((filter(pcs->odd) ^ oddparity(bt)) & 0x01)<<(7-(i&0x0007)));\r
+ par[i>>3] |= (((filter(pcs->odd) ^ oddparity8(bt)) & 0x01)<<(7-(i&0x0007)));\r
} \r
return;\r
}\r
for (pos = 0; pos < 4; pos++)\r
{\r
ecmd[pos] = crypto1_byte(pcs, 0x00, 0) ^ dcmd[pos];\r
- par[0] |= (((filter(pcs->odd) ^ oddparity(dcmd[pos])) & 0x01) << (7-pos));\r
+ par[0] |= (((filter(pcs->odd) ^ oddparity8(dcmd[pos])) & 0x01) << (7-pos));\r
} \r
\r
ReaderTransmitPar(ecmd, sizeof(ecmd), par, timing);\r
for (pos = 0; pos < 4; pos++)\r
{\r
mf_nr_ar[pos] = crypto1_byte(pcs, nr[pos], 0) ^ nr[pos];\r
- par[0] |= (((filter(pcs->odd) ^ oddparity(nr[pos])) & 0x01) << (7-pos));\r
+ par[0] |= (((filter(pcs->odd) ^ oddparity8(nr[pos])) & 0x01) << (7-pos));\r
} \r
\r
// Skip 32 bits in pseudo random generator\r
{\r
nt = prng_successor(nt,8);\r
mf_nr_ar[pos] = crypto1_byte(pcs,0x00,0) ^ (nt & 0xff);\r
- par[0] |= (((filter(pcs->odd) ^ oddparity(nt & 0xff)) & 0x01) << (7-pos));\r
+ par[0] |= (((filter(pcs->odd) ^ oddparity8(nt)) & 0x01) << (7-pos));\r
} \r
\r
// Transmit reader nonce and reader answer\r
\r
/// 3des2k\r
\r
+ des3_context ctx = { 0x00 };\r
uint8_t random_a[8] = {1,1,1,1,1,1,1,1};\r
uint8_t random_b[8] = {0x00};\r
uint8_t enc_random_b[8] = {0x00};\r
memcpy(enc_random_b,resp+1,8);\r
\r
// decrypt nonce.\r
- tdes_2key_dec(random_b, enc_random_b, sizeof(random_b), key, IV );\r
+ // tdes_2key_dec(random_b, enc_random_b, sizeof(random_b), key, IV );\r
+ des3_set2key_dec(&ctx, key);\r
+ des3_crypt_cbc(&ctx // des3_context\r
+ , DES_DECRYPT // int mode\r
+ , sizeof(random_b) // length\r
+ , IV // iv[8]\r
+ , enc_random_b // input\r
+ , random_b // output\r
+ );\r
+\r
rol(random_b,8);\r
memcpy(rnd_ab ,random_a,8);\r
memcpy(rnd_ab+8,random_b,8);\r
}\r
\r
// encrypt out, in, length, key, iv\r
- tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);\r
+ //tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);\r
+ des3_set2key_enc(&ctx, key);\r
+ des3_crypt_cbc(&ctx // des3_context\r
+ , DES_ENCRYPT // int mode\r
+ , sizeof(rnd_ab) // length\r
+ , enc_random_b // iv[8]\r
+ , rnd_ab // input\r
+ , rnd_ab // output\r
+ );\r
+\r
//len = mifare_sendcmd_short_mfucauth(NULL, 1, 0xAF, rnd_ab, resp, respPar, NULL);\r
len = mifare_sendcmd(0xAF, rnd_ab, sizeof(rnd_ab), resp, respPar, NULL);\r
if (len != 11) {\r
memcpy(enc_resp, resp+1, 8);\r
\r
// decrypt out, in, length, key, iv \r
- tdes_2key_dec(resp_random_a, enc_resp, 8, key, enc_random_b);\r
+ // tdes_2key_dec(resp_random_a, enc_resp, 8, key, enc_random_b);\r
+ des3_set2key_dec(&ctx, key);\r
+ des3_crypt_cbc(&ctx // des3_context\r
+ , DES_DECRYPT // int mode\r
+ , 8 // length\r
+ , enc_random_b // iv[8]\r
+ , enc_resp // input\r
+ , resp_random_a // output\r
+ );\r
if ( memcmp(resp_random_a, random_a, 8) != 0 ) {\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("failed authentication");\r
return 0;\r
for (pos = 0; pos < 18; pos++)\r
{\r
d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos];\r
- par[pos>>3] |= (((filter(pcs->odd) ^ oddparity(d_block[pos])) & 0x01) << (7 - (pos&0x0007)));\r
+ par[pos>>3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos&0x0007)));\r
} \r
\r
ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL);\r