- \r
- memcpy(emCARD + blockNum * 16, data, blocksCount * 16);\r
-}\r
-\r
-void emlGetMem(uint8_t *data, int blockNum, int blocksCount) {\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- \r
- memcpy(data, emCARD + blockNum * 16, blocksCount * 16);\r
-}\r
-\r
-void emlGetMemBt(uint8_t *data, int bytePtr, int byteCount) {\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- \r
- memcpy(data, emCARD + bytePtr, byteCount);\r
-}\r
-\r
-int emlCheckValBl(int blockNum) {\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- uint8_t* data = emCARD + blockNum * 16;\r
-\r
- if ((data[0] != (data[4] ^ 0xff)) || (data[0] != data[8]) ||\r
- (data[1] != (data[5] ^ 0xff)) || (data[1] != data[9]) ||\r
- (data[2] != (data[6] ^ 0xff)) || (data[2] != data[10]) ||\r
- (data[3] != (data[7] ^ 0xff)) || (data[3] != data[11]) ||\r
- (data[12] != (data[13] ^ 0xff)) || (data[12] != data[14]) ||\r
- (data[12] != (data[15] ^ 0xff))\r
- ) \r
- return 1;\r
- return 0;\r
-}\r
-\r
-int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum) {\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- uint8_t* data = emCARD + blockNum * 16;\r
- \r
- if (emlCheckValBl(blockNum)) {\r
- return 1;\r
- }\r
- \r
- memcpy(blReg, data, 4);\r
- *blBlock = data[12];\r
- \r
- return 0;\r
-}\r
-\r
-int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum) {\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- uint8_t* data = emCARD + blockNum * 16;\r
- \r
- memcpy(data + 0, &blReg, 4);\r
- memcpy(data + 8, &blReg, 4);\r
- blReg = blReg ^ 0xffffffff;\r
- memcpy(data + 4, &blReg, 4);\r
- \r
- data[12] = blBlock;\r
- data[13] = blBlock ^ 0xff;\r
- data[14] = blBlock;\r
- data[15] = blBlock ^ 0xff;\r
- \r
- return 0;\r
-}\r
-\r
-uint64_t emlGetKey(int sectorNum, int keyType) {\r
- uint8_t key[6];\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- \r
- memcpy(key, emCARD + 3 * 16 + sectorNum * 4 * 16 + keyType * 10, 6);\r
- return bytes_to_num(key, 6);\r
-}\r
-\r
-void emlClearMem(void) {\r
- int b;\r
- \r
- const uint8_t trailer[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x80, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
- const uint8_t uid[] = {0xe6, 0x84, 0x87, 0xf3, 0x16, 0x88, 0x04, 0x00, 0x46, 0x8e, 0x45, 0x55, 0x4d, 0x70, 0x41, 0x04};\r
- uint8_t* emCARD = eml_get_bigbufptr_cardmem();\r
- \r
- memset(emCARD, 0, CARD_MEMORY_LEN);\r
- \r
- // fill sectors trailer data\r
- for(b = 3; b < 256; b<127?(b+=4):(b+=16)) {\r
- emlSetMem((uint8_t *)trailer, b , 1);\r
- } \r
-\r
- // uid\r
- emlSetMem((uint8_t *)uid, 0, 1);\r
- return;\r
-}\r
+
+ memcpy(emCARD + blockNum * 16, data, blocksCount * 16);
+}
+
+void emlGetMem(uint8_t *data, int blockNum, int blocksCount) {
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+
+ memcpy(data, emCARD + blockNum * 16, blocksCount * 16);
+}
+
+void emlGetMemBt(uint8_t *data, int bytePtr, int byteCount) {
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+
+ memcpy(data, emCARD + bytePtr, byteCount);
+}
+
+int emlCheckValBl(int blockNum) {
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+ uint8_t* data = emCARD + blockNum * 16;
+
+ if ((data[0] != (data[4] ^ 0xff)) || (data[0] != data[8]) ||
+ (data[1] != (data[5] ^ 0xff)) || (data[1] != data[9]) ||
+ (data[2] != (data[6] ^ 0xff)) || (data[2] != data[10]) ||
+ (data[3] != (data[7] ^ 0xff)) || (data[3] != data[11]) ||
+ (data[12] != (data[13] ^ 0xff)) || (data[12] != data[14]) ||
+ (data[12] != (data[15] ^ 0xff))
+ )
+ return 1;
+ return 0;
+}
+
+int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum) {
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+ uint8_t* data = emCARD + blockNum * 16;
+
+ if (emlCheckValBl(blockNum)) {
+ return 1;
+ }
+
+ memcpy(blReg, data, 4);
+ *blBlock = data[12];
+
+ return 0;
+}
+
+int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum) {
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+ uint8_t* data = emCARD + blockNum * 16;
+
+ memcpy(data + 0, &blReg, 4);
+ memcpy(data + 8, &blReg, 4);
+ blReg = blReg ^ 0xffffffff;
+ memcpy(data + 4, &blReg, 4);
+
+ data[12] = blBlock;
+ data[13] = blBlock ^ 0xff;
+ data[14] = blBlock;
+ data[15] = blBlock ^ 0xff;
+
+ return 0;
+}
+
+uint64_t emlGetKey(int sectorNum, int keyType) {
+ uint8_t key[6];
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+
+ memcpy(key, emCARD + 3 * 16 + sectorNum * 4 * 16 + keyType * 10, 6);
+ return bytes_to_num(key, 6);
+}
+
+void emlClearMem(void) {
+ int b;
+
+ const uint8_t trailer[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x80, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+ const uint8_t uid[] = {0xe6, 0x84, 0x87, 0xf3, 0x16, 0x88, 0x04, 0x00, 0x46, 0x8e, 0x45, 0x55, 0x4d, 0x70, 0x41, 0x04};
+ uint8_t* emCARD = eml_get_bigbufptr_cardmem();
+
+ memset(emCARD, 0, CARD_MEMORY_LEN);
+
+ // fill sectors trailer data
+ for(b = 3; b < 256; b<127?(b+=4):(b+=16)) {
+ emlSetMem((uint8_t *)trailer, b , 1);
+ }
+
+ // uid
+ emlSetMem((uint8_t *)uid, 0, 1);
+ return;
+}
+
+//
+//DESFIRE
+//
+
+int mifare_sendcmd_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer, uint8_t *timing)
+{
+ uint8_t dcmd[5];//, ecmd[4];
+ //dcmd= (uint8_t *) malloc(data_len+3);
+ //uint32_t par=0;
+
+ dcmd[0] = cmd;
+ memcpy(dcmd+1,data,2);
+ AppendCrc14443a(dcmd, 3);
+ //Dbprintf("Data command: %02x", dcmd[0]);
+ //Dbprintf("Data R: %02x %02x", dcmd[1],dcmd[2]);
+
+ //memcpy(ecmd, dcmd, sizeof(dcmd));
+ ReaderTransmit(dcmd, sizeof(dcmd), NULL);
+ int len = ReaderReceive(answer);
+ if(!len)
+ {
+ if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Card timeout.");
+ return 2;
+ }
+ //free(dcmd);
+ return len;
+}
+
+
+int mifare_sendcmd_special2(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer, uint8_t *timing)
+{
+ uint8_t dcmd[20];//, ecmd[4];
+ //dcmd= (uint8_t *) malloc(data_len+3);
+ //uint32_t par=0;
+
+ dcmd[0] = cmd;
+ memcpy(dcmd+1,data,17);
+ AppendCrc14443a(dcmd, 18);
+ //Dbprintf("Data command: %02x", dcmd[0]);
+ //Dbprintf("Data R: %02x %02x %02x %02x", dcmd[1],dcmd[2],dcmd[3],dcmd[4]);
+
+ //memcpy(ecmd, dcmd, sizeof(dcmd));
+ ReaderTransmit(dcmd, sizeof(dcmd), NULL);
+ int len = ReaderReceive(answer);
+ if(!len)
+ {
+ if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Card timeout.");
+ return 2;
+ }
+ //free(dcmd);
+ return len;
+}
+
+int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData){
+ // variables
+ int len;
+ // load key, keynumber
+ uint8_t data[2]={0x0a, 0x00};
+ //uint8_t data_len=2;
+ uint8_t* receivedAnswer = mifare_get_bigbufptr();
+
+ // command MIFARE_CLASSIC_READBLOCK
+ len = mifare_sendcmd_special(NULL, 1, 0x02, data, receivedAnswer,NULL);
+ if (len == 1) {
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);
+ return 1;
+ }
+ if (len == 12) {
+ if (MF_DBGLEVEL >= 1) Dbprintf("Auth1 Resp: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ receivedAnswer[0],receivedAnswer[1],receivedAnswer[2],receivedAnswer[3],receivedAnswer[4],
+ receivedAnswer[5],receivedAnswer[6],receivedAnswer[7],receivedAnswer[8],receivedAnswer[9],
+ receivedAnswer[10],receivedAnswer[11]);
+ memcpy(blockData, receivedAnswer, 12);
+ return 0;
+ }
+ //else something went wrong???
+ return 1;
+}
+
+int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData){
+ // variables
+ int len;
+ uint8_t data[17]={0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+ memcpy(data+1,key,16);
+ uint8_t* receivedAnswer = mifare_get_bigbufptr();
+
+
+ // command MIFARE_CLASSIC_READBLOCK
+ len = mifare_sendcmd_special2(NULL, 1, 0x03, data, receivedAnswer,NULL);
+ if ((receivedAnswer[0] == 0x03)&&(receivedAnswer[1] == 0xae)) {
+ if (MF_DBGLEVEL >= 1) Dbprintf("Auth Error: %02x %02x", receivedAnswer[0], receivedAnswer[1]);
+ return 1;
+ }
+ if (len == 12){
+ if (MF_DBGLEVEL >= 1) Dbprintf("Auth2 Resp: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ receivedAnswer[0],receivedAnswer[1],receivedAnswer[2],receivedAnswer[3],receivedAnswer[4],
+ receivedAnswer[5],receivedAnswer[6],receivedAnswer[7],receivedAnswer[8],receivedAnswer[9],
+ receivedAnswer[10],receivedAnswer[11]);
+ memcpy(blockData, receivedAnswer, 12);
+ return 0;
+ }
+ //something went wrong?
+ return 1;
+}
\ No newline at end of file