mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-01-09 01:36:52 +08:00
Merge branch 'PenturaLabs-iclass-research' of github.com:Proxmark/proxmark3 into PenturaLabs-iclass-research
This commit is contained in:
commit
d2d0af8ca6
4 changed files with 28 additions and 24 deletions
|
@ -474,22 +474,21 @@ int CmdHFiClassReader_Dump(const char *Cmd)
|
|||
uint8_t isOK = resp.arg[0] & 0xff;
|
||||
uint8_t * data = resp.d.asBytes;
|
||||
|
||||
|
||||
memcpy(CSN,data,8);
|
||||
memcpy(CCNR,data+8,8);
|
||||
|
||||
PrintAndLog("isOk:%02x", isOK);
|
||||
|
||||
if(isOK > 0)
|
||||
if(isOK != 0)
|
||||
{
|
||||
PrintAndLog("CSN: %s",sprint_hex(CSN,8));
|
||||
}
|
||||
if(isOK > 1)
|
||||
if(isOK == 0)
|
||||
{
|
||||
PrintAndLog("CC: %s",sprint_hex(CCNR,8));
|
||||
//PrintAndLog("CC: %s",sprint_hex(CCNR,8));
|
||||
diversifyKey(CSN,KEY, div_key);
|
||||
doMAC(CCNR,div_key, MAC);
|
||||
|
||||
doMAC(CCNR,12,div_key, MAC);
|
||||
PrintAndLog("MAC: %s",sprint_hex(MAC,sizeof(MAC)));
|
||||
UsbCommand d = {CMD_READER_ICLASS_REPLAY, {readerType}};
|
||||
memcpy(d.d.asBytes, MAC, 4);
|
||||
SendCommand(&d);
|
||||
|
@ -561,7 +560,7 @@ int CmdHFiClass_iso14443A_write(const char *Cmd)
|
|||
diversifyKey(CSN,KEY, div_key);
|
||||
|
||||
PrintAndLog("Div Key: %s",sprint_hex(div_key,8));
|
||||
doMAC(CCNR, div_key, MAC);
|
||||
doMAC(CCNR, 12,div_key, MAC);
|
||||
|
||||
UsbCommand c2 = {CMD_ICLASS_ISO14443A_WRITE, {readerType,blockNo}};
|
||||
memcpy(c2.d.asBytes, bldata, 8);
|
||||
|
|
|
@ -205,20 +205,25 @@ void MAC(uint8_t* k, BitstreamIn input, BitstreamOut out)
|
|||
output(k,initState,&input_32_zeroes,&out);
|
||||
}
|
||||
|
||||
void doMAC(uint8_t cc_nr[12],uint8_t div_key[8], uint8_t mac[4])
|
||||
void doMAC(uint8_t *cc_nr_p, int length,uint8_t *div_key_p, uint8_t mac[4])
|
||||
{
|
||||
// Reversed "on-the-wire" data
|
||||
uint8_t cc_nr_r[12] = {0};
|
||||
reverse_arraycopy(cc_nr, cc_nr_r,12);
|
||||
BitstreamIn bitstream = {cc_nr_r,12 * 8,0};
|
||||
uint8_t dest [8]= {0,0,0,0,0,0,0,0};
|
||||
BitstreamOut out = { dest, sizeof(dest)*8, 0 };
|
||||
MAC(div_key,bitstream, out);
|
||||
|
||||
//The output MAC must also be reversed
|
||||
reverse_arraybytes(dest, sizeof(dest));
|
||||
memcpy(mac, dest, 4);
|
||||
return;
|
||||
uint8_t *cc_nr;
|
||||
uint8_t div_key[8];
|
||||
cc_nr=(uint8_t*)malloc(length+1);
|
||||
memcpy(cc_nr,cc_nr_p,length);
|
||||
memcpy(div_key,div_key_p,8);
|
||||
|
||||
reverse_arraybytes(cc_nr,length);
|
||||
BitstreamIn bitstream = {cc_nr,length * 8,0};
|
||||
uint8_t dest []= {0,0,0,0,0,0,0,0};
|
||||
BitstreamOut out = { dest, sizeof(dest)*8, 0 };
|
||||
MAC(div_key,bitstream, out);
|
||||
//The output MAC must also be reversed
|
||||
reverse_arraybytes(dest, sizeof(dest));
|
||||
memcpy(mac, dest, 4);
|
||||
printf("Calculated_MAC\t%02x%02x%02x%02x\n", dest[0],dest[1],dest[2],dest[3]);
|
||||
free(cc_nr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int testMAC()
|
||||
|
@ -232,7 +237,7 @@ int testMAC()
|
|||
uint8_t correct_MAC[4] = {0x1d,0x49,0xC9,0xDA};
|
||||
|
||||
uint8_t calculated_mac[4] = {0};
|
||||
doMAC(cc_nr, div_key, calculated_mac);
|
||||
doMAC(cc_nr, 12, div_key, calculated_mac);
|
||||
|
||||
if(memcmp(calculated_mac, correct_MAC,4) == 0)
|
||||
{
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#define CIPHER_H
|
||||
#include <stdint.h>
|
||||
|
||||
void doMAC(uint8_t cc_nr[12],uint8_t div_key[8], uint8_t mac[4]);
|
||||
void doMAC(uint8_t *cc_nr_p, int length, uint8_t *div_key_p, uint8_t mac[4]);
|
||||
int testMAC();
|
||||
|
||||
#endif // CIPHER_H
|
||||
|
|
|
@ -390,8 +390,8 @@ void diversifyKey(uint8_t csn[8], uint8_t key[8], uint8_t div_key[8])
|
|||
des_crypt_ecb(&ctx_enc,csn, crypted_csn);
|
||||
|
||||
//Calculate HASH0(DES))
|
||||
uint64_t crypt_csn = x_bytes_to_num(crypted_csn, 8);
|
||||
//uint64_t crypted_csn_swapped = swapZvalues(crypt_csn);
|
||||
uint64_t crypt_csn = x_bytes_to_num(crypted_csn, 8);
|
||||
uint64_t crypted_csn_swapped = swapZvalues(crypt_csn);
|
||||
|
||||
hash0(crypt_csn,div_key);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue