mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
Reduce some var scopes
This commit is contained in:
parent
ac6b0ec1ce
commit
732bc766f9
52 changed files with 318 additions and 409 deletions
|
@ -223,7 +223,6 @@ void RunMod() {
|
||||||
*/
|
*/
|
||||||
bool printKeys = false; // Prints keys
|
bool printKeys = false; // Prints keys
|
||||||
bool transferToEml = true; // Transfer keys to emulator memory
|
bool transferToEml = true; // Transfer keys to emulator memory
|
||||||
bool ecfill = true; // Fill emulator memory with cards content.
|
|
||||||
bool simulation = true; // Simulates an exact copy of the target tag
|
bool simulation = true; // Simulates an exact copy of the target tag
|
||||||
bool fillFromEmulator = false; // Dump emulator memory.
|
bool fillFromEmulator = false; // Dump emulator memory.
|
||||||
|
|
||||||
|
@ -236,7 +235,6 @@ void RunMod() {
|
||||||
uint64_t key64; // Defines current key
|
uint64_t key64; // Defines current key
|
||||||
uint8_t *keyBlock; // Where the keys will be held in memory.
|
uint8_t *keyBlock; // Where the keys will be held in memory.
|
||||||
uint8_t stKeyBlock = 20; // Set the quantity of keys in the block.
|
uint8_t stKeyBlock = 20; // Set the quantity of keys in the block.
|
||||||
int filled; // Used to check if the memory was filled with success.
|
|
||||||
bool keyFound = false;
|
bool keyFound = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -368,7 +366,7 @@ void RunMod() {
|
||||||
}
|
}
|
||||||
Dbprintf("\t✓ Found keys have been transferred to the emulator memory.");
|
Dbprintf("\t✓ Found keys have been transferred to the emulator memory.");
|
||||||
if (ecfill) {
|
if (ecfill) {
|
||||||
|
int filled;
|
||||||
Dbprintf("\tFilling in with key A.");
|
Dbprintf("\tFilling in with key A.");
|
||||||
filled = MifareECardLoad(sectorsCnt, 0);
|
filled = MifareECardLoad(sectorsCnt, 0);
|
||||||
if (filled != PM3_SUCCESS) {
|
if (filled != PM3_SUCCESS) {
|
||||||
|
|
|
@ -160,13 +160,14 @@ void RunMod() {
|
||||||
Bytes 5-7 are reserved SAK and ATQA for mifare classic
|
Bytes 5-7 are reserved SAK and ATQA for mifare classic
|
||||||
-Use mfCSetBlock(0, block0, oldUID, wantWipe, MAGIC_SINGLE) to write it
|
-Use mfCSetBlock(0, block0, oldUID, wantWipe, MAGIC_SINGLE) to write it
|
||||||
*/
|
*/
|
||||||
uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0}, testBlock0[16] = {0};
|
uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0};
|
||||||
// arg0 = Flags, arg1=blockNo
|
// arg0 = Flags, arg1=blockNo
|
||||||
MifareCGetBlock(params, 0, oldBlock0);
|
MifareCGetBlock(params, 0, oldBlock0);
|
||||||
if (oldBlock0[0] == 0 && oldBlock0[0] == oldBlock0[1] && oldBlock0[1] == oldBlock0[2] && oldBlock0[2] == oldBlock0[3]) {
|
if (oldBlock0[0] == 0 && oldBlock0[0] == oldBlock0[1] && oldBlock0[1] == oldBlock0[2] && oldBlock0[2] == oldBlock0[3]) {
|
||||||
Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected);
|
Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected);
|
||||||
playing = 1;
|
playing = 1;
|
||||||
} else {
|
} else {
|
||||||
|
uint8_t testBlock0[16] = {0};
|
||||||
Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0], oldBlock0[1], oldBlock0[2], oldBlock0[3]);
|
Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0], oldBlock0[1], oldBlock0[2], oldBlock0[3]);
|
||||||
memcpy(newBlock0 + 5, oldBlock0 + 5, 11);
|
memcpy(newBlock0 + 5, oldBlock0 + 5, 11);
|
||||||
|
|
||||||
|
|
|
@ -1465,7 +1465,6 @@ static void PacketReceived(PacketCommandNG *packet) {
|
||||||
case CMD_DOWNLOAD_EML_BIGBUF: {
|
case CMD_DOWNLOAD_EML_BIGBUF: {
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
uint8_t *mem = BigBuf_get_EM_addr();
|
uint8_t *mem = BigBuf_get_EM_addr();
|
||||||
size_t len = 0;
|
|
||||||
uint32_t startidx = packet->oldarg[0];
|
uint32_t startidx = packet->oldarg[0];
|
||||||
uint32_t numofbytes = packet->oldarg[1];
|
uint32_t numofbytes = packet->oldarg[1];
|
||||||
|
|
||||||
|
@ -1474,7 +1473,7 @@ static void PacketReceived(PacketCommandNG *packet) {
|
||||||
// arg2 = RFU
|
// arg2 = RFU
|
||||||
|
|
||||||
for (size_t i = 0; i < numofbytes; i += PM3_CMD_DATA_SIZE) {
|
for (size_t i = 0; i < numofbytes; i += PM3_CMD_DATA_SIZE) {
|
||||||
len = MIN((numofbytes - i), PM3_CMD_DATA_SIZE);
|
size_t len = MIN((numofbytes - i), PM3_CMD_DATA_SIZE);
|
||||||
int result = reply_old(CMD_DOWNLOADED_EML_BIGBUF, i, len, 0, mem + startidx + i, len);
|
int result = reply_old(CMD_DOWNLOADED_EML_BIGBUF, i, len, 0, mem + startidx + i, len);
|
||||||
if (result != PM3_SUCCESS)
|
if (result != PM3_SUCCESS)
|
||||||
Dbprintf("transfer to client failed :: | bytes between %d - %d (%d) | result: %d", i, i + len, len, result);
|
Dbprintf("transfer to client failed :: | bytes between %d - %d (%d) | result: %d", i, i + len, len, result);
|
||||||
|
|
|
@ -208,9 +208,9 @@ void permute(const uint8_t *ptable, const uint8_t *in, uint8_t *out) {
|
||||||
ob = ptable[1];
|
ob = ptable[1];
|
||||||
ptable = &(ptable[2]);
|
ptable = &(ptable[2]);
|
||||||
for (byte = 0; byte < ob; ++byte) {
|
for (byte = 0; byte < ob; ++byte) {
|
||||||
uint8_t x, t = 0;
|
uint8_t t = 0;
|
||||||
for (bit = 0; bit < 8; ++bit) {
|
for (bit = 0; bit < 8; ++bit) {
|
||||||
x = *ptable++ - 1;
|
uint8_t x = *ptable++ - 1;
|
||||||
t <<= 1;
|
t <<= 1;
|
||||||
if ((in[x / 8]) & (0x80 >> (x % 8))) {
|
if ((in[x / 8]) & (0x80 >> (x % 8))) {
|
||||||
t |= 0x01;
|
t |= 0x01;
|
||||||
|
|
|
@ -288,7 +288,6 @@ void *mifare_cryto_preprocess_data(desfiretag_t tag, void *data, size_t *nbytes,
|
||||||
|
|
||||||
void *mifare_cryto_postprocess_data(desfiretag_t tag, void *data, size_t *nbytes, int communication_settings) {
|
void *mifare_cryto_postprocess_data(desfiretag_t tag, void *data, size_t *nbytes, int communication_settings) {
|
||||||
void *res = data;
|
void *res = data;
|
||||||
size_t edl;
|
|
||||||
void *edata = NULL;
|
void *edata = NULL;
|
||||||
uint8_t first_cmac_byte = 0x00;
|
uint8_t first_cmac_byte = 0x00;
|
||||||
|
|
||||||
|
@ -322,7 +321,7 @@ void *mifare_cryto_postprocess_data(desfiretag_t tag, void *data, size_t *nbytes
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
edl = enciphered_data_length(tag, *nbytes - 1, communication_settings);
|
size_t edl = enciphered_data_length(tag, *nbytes - 1, communication_settings);
|
||||||
edata = malloc(edl);
|
edata = malloc(edl);
|
||||||
|
|
||||||
memcpy(edata, data, *nbytes - 1);
|
memcpy(edata, data, *nbytes - 1);
|
||||||
|
|
|
@ -496,19 +496,17 @@ void EPA_PACE_Replay(PacketCommandNG *c) {
|
||||||
// Returns 0 on success or a non-zero error code on failure
|
// Returns 0 on success or a non-zero error code on failure
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
int EPA_Setup() {
|
int EPA_Setup() {
|
||||||
int return_code = 0;
|
|
||||||
uint8_t uid[10];
|
uint8_t uid[10];
|
||||||
uint8_t pps_response[3];
|
|
||||||
uint8_t pps_response_par[1];
|
|
||||||
iso14a_card_select_t card_a_info;
|
iso14a_card_select_t card_a_info;
|
||||||
iso14b_card_select_t card_b_info;
|
|
||||||
|
|
||||||
// first, look for type A cards
|
// first, look for type A cards
|
||||||
// power up the field
|
// power up the field
|
||||||
iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD);
|
iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD);
|
||||||
// select the card
|
// select the card
|
||||||
return_code = iso14443a_select_card(uid, &card_a_info, NULL, true, 0, false);
|
int return_code = iso14443a_select_card(uid, &card_a_info, NULL, true, 0, false);
|
||||||
if (return_code == 1) {
|
if (return_code == 1) {
|
||||||
|
uint8_t pps_response[3];
|
||||||
|
uint8_t pps_response_par[1];
|
||||||
// send the PPS request
|
// send the PPS request
|
||||||
ReaderTransmit((uint8_t *)pps, sizeof(pps), NULL);
|
ReaderTransmit((uint8_t *)pps, sizeof(pps), NULL);
|
||||||
return_code = ReaderReceive(pps_response, pps_response_par);
|
return_code = ReaderReceive(pps_response, pps_response_par);
|
||||||
|
@ -523,6 +521,7 @@ int EPA_Setup() {
|
||||||
// if we're here, there is no type A card, so we look for type B
|
// if we're here, there is no type A card, so we look for type B
|
||||||
// power up the field
|
// power up the field
|
||||||
iso14443b_setup();
|
iso14443b_setup();
|
||||||
|
iso14b_card_select_t card_b_info;
|
||||||
// select the card
|
// select the card
|
||||||
return_code = iso14443b_select_card(&card_b_info);
|
return_code = iso14443b_select_card(&card_b_info);
|
||||||
if (return_code == 0) {
|
if (return_code == 0) {
|
||||||
|
|
|
@ -1366,9 +1366,7 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
uint8_t *tx = txbuf;
|
uint8_t *tx = txbuf;
|
||||||
size_t txlen = 0;
|
size_t txlen = 0;
|
||||||
int lastbit;
|
int lastbit;
|
||||||
bool bSkip;
|
|
||||||
int reset_sof;
|
int reset_sof;
|
||||||
int tag_sof;
|
|
||||||
int t_wait = HITAG_T_WAIT_MAX;
|
int t_wait = HITAG_T_WAIT_MAX;
|
||||||
bool bStop;
|
bool bStop;
|
||||||
|
|
||||||
|
@ -1515,8 +1513,8 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
memset(rx, 0x00, sizeof(rx));
|
memset(rx, 0x00, sizeof(rx));
|
||||||
rxlen = 0;
|
rxlen = 0;
|
||||||
lastbit = 1;
|
lastbit = 1;
|
||||||
bSkip = true;
|
bool bSkip = true;
|
||||||
tag_sof = reset_sof;
|
int tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
uint32_t errorCount = 0;
|
uint32_t errorCount = 0;
|
||||||
|
|
||||||
|
|
|
@ -295,8 +295,6 @@ static int check_select(uint8_t *rx, uint32_t uid) {
|
||||||
static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
uint8_t *tx, size_t *txlen) {
|
uint8_t *tx, size_t *txlen) {
|
||||||
uint8_t rx_air[HITAG_FRAME_LEN];
|
uint8_t rx_air[HITAG_FRAME_LEN];
|
||||||
uint8_t page;
|
|
||||||
int i;
|
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
unsigned char crc;
|
unsigned char crc;
|
||||||
|
|
||||||
|
@ -330,7 +328,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
}
|
}
|
||||||
//send uid as a response
|
//send uid as a response
|
||||||
*txlen = 32;
|
*txlen = 32;
|
||||||
for (i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
tx[i] = (tag.uid >> (24 - (i * 8))) & 0xff;
|
tx[i] = (tag.uid >> (24 - (i * 8))) & 0xff;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -357,13 +355,13 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
}
|
}
|
||||||
|
|
||||||
//send configuration
|
//send configuration
|
||||||
for (i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
tx[i] = (tag.pages[0][1] >> (i * 8)) & 0xff;
|
tx[i] = (tag.pages[0][1] >> (i * 8)) & 0xff;
|
||||||
tx[3] = 0xff;
|
tx[3] = 0xff;
|
||||||
if (tag.mode != HT_STANDARD) {
|
if (tag.mode != HT_STANDARD) {
|
||||||
*txlen = 40;
|
*txlen = 40;
|
||||||
crc = CRC_PRESET;
|
crc = CRC_PRESET;
|
||||||
for (i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
calc_crc(&crc, tx[i], 8);
|
calc_crc(&crc, tx[i], 8);
|
||||||
tx[4] = crc;
|
tx[4] = crc;
|
||||||
}
|
}
|
||||||
|
@ -399,7 +397,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
_hitag2_byte(&state);
|
_hitag2_byte(&state);
|
||||||
|
|
||||||
//send con2, pwdh0, pwdl0, pwdl1 encrypted as a response
|
//send con2, pwdh0, pwdl0, pwdl1 encrypted as a response
|
||||||
|
@ -490,7 +488,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
//write page, write block, read page or read block command received
|
//write page, write block, read page or read block command received
|
||||||
if ((rx[0] & 0xf0) == 0xc0) { //read page
|
if ((rx[0] & 0xf0) == 0xc0) { //read page
|
||||||
//send page data
|
//send page data
|
||||||
page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
uint8_t page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
||||||
*txlen = 32;
|
*txlen = 32;
|
||||||
tx[0] = (tag.pages[page / 4][page % 4]) & 0xff;
|
tx[0] = (tag.pages[page / 4][page % 4]) & 0xff;
|
||||||
tx[1] = (tag.pages[page / 4][page % 4] >> 8) & 0xff;
|
tx[1] = (tag.pages[page / 4][page % 4] >> 8) & 0xff;
|
||||||
|
@ -520,7 +518,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
//add crc8
|
//add crc8
|
||||||
*txlen = 40;
|
*txlen = 40;
|
||||||
crc = CRC_PRESET;
|
crc = CRC_PRESET;
|
||||||
for (i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
calc_crc(&crc, tx[i], 8);
|
calc_crc(&crc, tx[i], 8);
|
||||||
tx[4] = crc;
|
tx[4] = crc;
|
||||||
}
|
}
|
||||||
|
@ -531,10 +529,10 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
*txlen = 0;
|
*txlen = 0;
|
||||||
}
|
}
|
||||||
} else if ((rx[0] & 0xf0) == 0xd0) { //read block
|
} else if ((rx[0] & 0xf0) == 0xd0) { //read block
|
||||||
page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
uint8_t page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
||||||
*txlen = 32 * 4;
|
*txlen = 32 * 4;
|
||||||
//send page,...,page+3 data
|
//send page,...,page+3 data
|
||||||
for (i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
tx[0 + i * 4] = (tag.pages[page / 4][page % 4]) & 0xff;
|
tx[0 + i * 4] = (tag.pages[page / 4][page % 4]) & 0xff;
|
||||||
tx[1 + i * 4] = (tag.pages[page / 4][page % 4] >> 8) & 0xff;
|
tx[1 + i * 4] = (tag.pages[page / 4][page % 4] >> 8) & 0xff;
|
||||||
tx[2 + i * 4] = (tag.pages[page / 4][page % 4] >> 16) & 0xff;
|
tx[2 + i * 4] = (tag.pages[page / 4][page % 4] >> 16) & 0xff;
|
||||||
|
@ -563,7 +561,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
//add crc8
|
//add crc8
|
||||||
*txlen = 32 * 4 + 8;
|
*txlen = 32 * 4 + 8;
|
||||||
crc = CRC_PRESET;
|
crc = CRC_PRESET;
|
||||||
for (i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
calc_crc(&crc, tx[i], 8);
|
calc_crc(&crc, tx[i], 8);
|
||||||
tx[16] = crc;
|
tx[16] = crc;
|
||||||
}
|
}
|
||||||
|
@ -573,7 +571,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
*txlen = 0;
|
*txlen = 0;
|
||||||
}
|
}
|
||||||
} else if ((rx[0] & 0xf0) == 0x80) { //write page
|
} else if ((rx[0] & 0xf0) == 0x80) { //write page
|
||||||
page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
uint8_t page = ((rx[0] & 0x0f) * 16) + ((rx[1] & 0xf0) / 16);
|
||||||
|
|
||||||
switch (tag.mode) {
|
switch (tag.mode) {
|
||||||
case HT_STANDARD:
|
case HT_STANDARD:
|
||||||
|
@ -604,7 +602,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ((rx[0] & 0xf0) == 0x90) { //write block
|
} else if ((rx[0] & 0xf0) == 0x90) { //write block
|
||||||
page = ((rx[0] & 0x0f) * 6) + ((rx[1] & 0xf0) / 16);
|
uint8_t page = ((rx[0] & 0x0f) * 6) + ((rx[1] & 0xf0) / 16);
|
||||||
switch (tag.mode) {
|
switch (tag.mode) {
|
||||||
case HT_STANDARD:
|
case HT_STANDARD:
|
||||||
sof_bits = 1;
|
sof_bits = 1;
|
||||||
|
@ -647,10 +645,8 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen,
|
||||||
static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrAr, uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) {
|
static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrAr, uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) {
|
||||||
uint8_t rx_air[HITAG_FRAME_LEN];
|
uint8_t rx_air[HITAG_FRAME_LEN];
|
||||||
int response_bit[200];
|
int response_bit[200];
|
||||||
int i, j, z;
|
|
||||||
unsigned char mask = 1;
|
unsigned char mask = 1;
|
||||||
unsigned char uid[32];
|
unsigned char uid[32];
|
||||||
uint8_t uid1, uid2, uid3, uid4;
|
|
||||||
unsigned char crc;
|
unsigned char crc;
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
uint8_t auth_ks[4];
|
uint8_t auth_ks[4];
|
||||||
|
@ -664,9 +660,9 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
Dbprintf("authentication failed!");
|
Dbprintf("authentication failed!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
z = 0;
|
int z = 0;
|
||||||
for (i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
for (j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
response_bit[z] = 0;
|
response_bit[z] = 0;
|
||||||
if ((rx[i] & ((mask << 7) >> j)) != 0)
|
if ((rx[i] & ((mask << 7) >> j)) != 0)
|
||||||
response_bit[z] = 1;
|
response_bit[z] = 1;
|
||||||
|
@ -674,13 +670,13 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint16_t k = 0;
|
uint16_t k = 0;
|
||||||
for (i = 5; i < z; i += 2) {
|
for (int i = 5; i < z; i += 2) {
|
||||||
uid[k] = response_bit[i];
|
uid[k] = response_bit[i];
|
||||||
k++;
|
k++;
|
||||||
if (k > 31)
|
if (k > 31)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uid1 = (uid[0] << 7)
|
uint8_t uid1 = (uid[0] << 7)
|
||||||
| (uid[1] << 6)
|
| (uid[1] << 6)
|
||||||
| (uid[2] << 5)
|
| (uid[2] << 5)
|
||||||
| (uid[3] << 4)
|
| (uid[3] << 4)
|
||||||
|
@ -689,7 +685,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
| (uid[6] << 1)
|
| (uid[6] << 1)
|
||||||
| uid[7];
|
| uid[7];
|
||||||
|
|
||||||
uid2 = (uid[8] << 7)
|
uint8_t uid2 = (uid[8] << 7)
|
||||||
| (uid[9] << 6)
|
| (uid[9] << 6)
|
||||||
| (uid[10] << 5)
|
| (uid[10] << 5)
|
||||||
| (uid[11] << 4)
|
| (uid[11] << 4)
|
||||||
|
@ -698,7 +694,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
| (uid[14] << 1)
|
| (uid[14] << 1)
|
||||||
| uid[15];
|
| uid[15];
|
||||||
|
|
||||||
uid3 = (uid[16] << 7)
|
uint8_t uid3 = (uid[16] << 7)
|
||||||
| (uid[17] << 6)
|
| (uid[17] << 6)
|
||||||
| (uid[18] << 5)
|
| (uid[18] << 5)
|
||||||
| (uid[19] << 4)
|
| (uid[19] << 4)
|
||||||
|
@ -707,7 +703,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
| (uid[22] << 1)
|
| (uid[22] << 1)
|
||||||
| uid[23];
|
| uid[23];
|
||||||
|
|
||||||
uid4 = (uid[24] << 7)
|
uint8_t uid4 = (uid[24] << 7)
|
||||||
| (uid[25] << 6)
|
| (uid[25] << 6)
|
||||||
| (uid[26] << 5)
|
| (uid[26] << 5)
|
||||||
| (uid[27] << 4)
|
| (uid[27] << 4)
|
||||||
|
@ -730,19 +726,19 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
calc_crc(&crc, uid3, 8);
|
calc_crc(&crc, uid3, 8);
|
||||||
calc_crc(&crc, uid4, 8);
|
calc_crc(&crc, uid4, 8);
|
||||||
|
|
||||||
for (i = 0; i < 100; i++) {
|
for (int i = 0; i < 100; i++) {
|
||||||
response_bit[i] = 0;
|
response_bit[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
response_bit[i] = 0;
|
response_bit[i] = 0;
|
||||||
}
|
}
|
||||||
|
int i = 5;
|
||||||
for (i = 5; i < 37; i++) {
|
for (; i < 37; i++) {
|
||||||
response_bit[i] = uid[i - 5];
|
response_bit[i] = uid[i - 5];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
response_bit[i] = 0;
|
response_bit[i] = 0;
|
||||||
if ((crc & ((mask << 7) >> j)) != 0)
|
if ((crc & ((mask << 7) >> j)) != 0)
|
||||||
response_bit[i] = 1;
|
response_bit[i] = 1;
|
||||||
|
@ -750,7 +746,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
}
|
}
|
||||||
|
|
||||||
k = 0;
|
k = 0;
|
||||||
for (i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
tx[i] = (response_bit[k] << 7)
|
tx[i] = (response_bit[k] << 7)
|
||||||
| (response_bit[k + 1] << 6)
|
| (response_bit[k + 1] << 6)
|
||||||
| (response_bit[k + 2] << 5)
|
| (response_bit[k + 2] << 5)
|
||||||
|
@ -766,9 +762,9 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
tag.pstate = HT_INIT;
|
tag.pstate = HT_INIT;
|
||||||
} else if (tag.pstate == HT_INIT && rxlen == 44) {
|
} else if (tag.pstate == HT_INIT && rxlen == 44) {
|
||||||
// received configuration after select command
|
// received configuration after select command
|
||||||
z = 0;
|
int z = 0;
|
||||||
for (i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
for (j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
response_bit[z] = 0;
|
response_bit[z] = 0;
|
||||||
if ((rx[i] & ((mask << 7) >> j)) != 0)
|
if ((rx[i] & ((mask << 7) >> j)) != 0)
|
||||||
response_bit[z] = 1;
|
response_bit[z] = 1;
|
||||||
|
@ -819,7 +815,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
if (htf == 02 || htf == 04) { //RHTS_KEY //WHTS_KEY
|
if (htf == 02 || htf == 04) { //RHTS_KEY //WHTS_KEY
|
||||||
state = _hitag2_init(REV64(key), REV32(tag.uid), REV32(rnd));
|
state = _hitag2_init(REV64(key), REV32(tag.uid), REV32(rnd));
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
auth_ks[i] = _hitag2_byte(&state) ^ 0xff;
|
auth_ks[i] = _hitag2_byte(&state) ^ 0xff;
|
||||||
}
|
}
|
||||||
*txlen = 64;
|
*txlen = 64;
|
||||||
|
@ -836,7 +832,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
Dbprintf("%02X %02X %02X %02X %02X %02X %02X %02X", tx[0],
|
Dbprintf("%02X %02X %02X %02X %02X %02X %02X %02X", tx[0],
|
||||||
tx[1], tx[2], tx[3], tx[4], tx[5], tx[6], tx[7]);
|
tx[1], tx[2], tx[3], tx[4], tx[5], tx[6], tx[7]);
|
||||||
} else if (htf == 01 || htf == 03) { //RHTS_CHALLENGE //WHTS_CHALLENGE
|
} else if (htf == 01 || htf == 03) { //RHTS_CHALLENGE //WHTS_CHALLENGE
|
||||||
for (i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
tx[i] = ((NrAr >> (56 - (i * 8))) & 0xff);
|
tx[i] = ((NrAr >> (56 - (i * 8))) & 0xff);
|
||||||
}
|
}
|
||||||
end = true;
|
end = true;
|
||||||
|
@ -869,7 +865,7 @@ static int hitagS_handle_tag_auth(hitag_function htf, uint64_t key, uint64_t NrA
|
||||||
if (htf == 02 || htf == 04) { //RHTS_KEY //WHTS_KEY
|
if (htf == 02 || htf == 04) { //RHTS_KEY //WHTS_KEY
|
||||||
{
|
{
|
||||||
state = _hitag2_init(REV64(key), REV32(tag.uid), REV32(rnd));
|
state = _hitag2_init(REV64(key), REV32(tag.uid), REV32(rnd));
|
||||||
for (i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
_hitag2_byte(&state);
|
_hitag2_byte(&state);
|
||||||
|
|
||||||
pwdh0 = ((rx[1] & 0x0f) * 16 + ((rx[2] & 0xf0) / 16)) ^ _hitag2_byte(&state);
|
pwdh0 = ((rx[1] & 0x0f) * 16 + ((rx[2] & 0xf0) / 16)) ^ _hitag2_byte(&state);
|
||||||
|
@ -1133,9 +1129,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) {
|
||||||
uint8_t *tx = txbuf;
|
uint8_t *tx = txbuf;
|
||||||
size_t txlen = 0;
|
size_t txlen = 0;
|
||||||
int lastbit = 1;
|
int lastbit = 1;
|
||||||
bool bSkip;
|
|
||||||
int reset_sof = 1;
|
int reset_sof = 1;
|
||||||
int tag_sof;
|
|
||||||
int t_wait = HITAG_T_WAIT_MAX;
|
int t_wait = HITAG_T_WAIT_MAX;
|
||||||
bool bStop = false;
|
bool bStop = false;
|
||||||
int sendNum = 0;
|
int sendNum = 0;
|
||||||
|
@ -1369,8 +1363,8 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) {
|
||||||
memset(rx, 0x00, sizeof(rx));
|
memset(rx, 0x00, sizeof(rx));
|
||||||
rxlen = 0;
|
rxlen = 0;
|
||||||
lastbit = 1;
|
lastbit = 1;
|
||||||
bSkip = true;
|
bool bSkip = true;
|
||||||
tag_sof = reset_sof;
|
int tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
|
|
||||||
// Receive frame, watch for at most T0*EOF periods
|
// Receive frame, watch for at most T0*EOF periods
|
||||||
|
@ -1462,9 +1456,7 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) {
|
||||||
uint8_t *tx = txbuf;
|
uint8_t *tx = txbuf;
|
||||||
size_t txlen = 0;
|
size_t txlen = 0;
|
||||||
int lastbit;
|
int lastbit;
|
||||||
bool bSkip;
|
|
||||||
int reset_sof;
|
int reset_sof;
|
||||||
int tag_sof;
|
|
||||||
int t_wait = HITAG_T_WAIT_MAX;
|
int t_wait = HITAG_T_WAIT_MAX;
|
||||||
bool bStop;
|
bool bStop;
|
||||||
unsigned char crc;
|
unsigned char crc;
|
||||||
|
@ -1659,8 +1651,8 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) {
|
||||||
memset(rx, 0x00, sizeof(rx));
|
memset(rx, 0x00, sizeof(rx));
|
||||||
rxlen = 0;
|
rxlen = 0;
|
||||||
lastbit = 1;
|
lastbit = 1;
|
||||||
bSkip = true;
|
bool bSkip = true;
|
||||||
tag_sof = reset_sof;
|
int tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
uint32_t errorCount = 0;
|
uint32_t errorCount = 0;
|
||||||
|
|
||||||
|
@ -1754,12 +1746,11 @@ void check_challenges(bool file_given, uint8_t *data) {
|
||||||
uint8_t rx[HITAG_FRAME_LEN];
|
uint8_t rx[HITAG_FRAME_LEN];
|
||||||
uint8_t unlocker[60][8];
|
uint8_t unlocker[60][8];
|
||||||
int u1 = 0;
|
int u1 = 0;
|
||||||
size_t rxlen = 0, txlen = 0;
|
size_t rxlen = 0;
|
||||||
uint8_t txbuf[HITAG_FRAME_LEN];
|
uint8_t txbuf[HITAG_FRAME_LEN];
|
||||||
uint8_t *tx;
|
|
||||||
int t_wait = HITAG_T_WAIT_MAX;
|
int t_wait = HITAG_T_WAIT_MAX;
|
||||||
int lastbit, reset_sof, tag_sof, STATE = 0;;
|
int lastbit, reset_sof, STATE = 0;;
|
||||||
bool bSkip, bStop;
|
bool bStop;
|
||||||
int response_bit[200];
|
int response_bit[200];
|
||||||
unsigned char mask = 1;
|
unsigned char mask = 1;
|
||||||
unsigned char uid[32];
|
unsigned char uid[32];
|
||||||
|
@ -1837,8 +1828,8 @@ void check_challenges(bool file_given, uint8_t *data) {
|
||||||
LogTrace(rx, nbytes(rxlen), response, 0, NULL, false);
|
LogTrace(rx, nbytes(rxlen), response, 0, NULL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
tx = txbuf;
|
uint8_t *tx = txbuf;
|
||||||
txlen = 0;
|
size_t txlen = 0;
|
||||||
if (rxlen == 0) {
|
if (rxlen == 0) {
|
||||||
if (STATE == 2)
|
if (STATE == 2)
|
||||||
// challenge failed
|
// challenge failed
|
||||||
|
@ -1968,8 +1959,8 @@ void check_challenges(bool file_given, uint8_t *data) {
|
||||||
memset(rx, 0x00, sizeof(rx));
|
memset(rx, 0x00, sizeof(rx));
|
||||||
rxlen = 0;
|
rxlen = 0;
|
||||||
lastbit = 1;
|
lastbit = 1;
|
||||||
bSkip = true;
|
bool bSkip = true;
|
||||||
tag_sof = reset_sof;
|
int tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
|
|
||||||
// Receive frame, watch for at most T0*EOF periods
|
// Receive frame, watch for at most T0*EOF periods
|
||||||
|
|
|
@ -1093,7 +1093,6 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) {
|
||||||
#define ORDER_EV1_COMP_WRITE 40
|
#define ORDER_EV1_COMP_WRITE 40
|
||||||
#define ORDER_RATS 70
|
#define ORDER_RATS 70
|
||||||
int order = ORDER_NONE;
|
int order = ORDER_NONE;
|
||||||
int lastorder;
|
|
||||||
|
|
||||||
int retval = PM3_SUCCESS;
|
int retval = PM3_SUCCESS;
|
||||||
|
|
||||||
|
@ -1101,7 +1100,6 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) {
|
||||||
int happened = 0;
|
int happened = 0;
|
||||||
int happened2 = 0;
|
int happened2 = 0;
|
||||||
int cmdsRecvd = 0;
|
int cmdsRecvd = 0;
|
||||||
tag_response_info_t *p_response;
|
|
||||||
|
|
||||||
// compatible write block number
|
// compatible write block number
|
||||||
uint8_t wrblock = 0;
|
uint8_t wrblock = 0;
|
||||||
|
@ -1118,10 +1116,10 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) {
|
||||||
retval = PM3_EOPABORTED;
|
retval = PM3_EOPABORTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
p_response = NULL;
|
tag_response_info_t *p_response = NULL;
|
||||||
|
|
||||||
// Okay, look at the command now.
|
// Okay, look at the command now.
|
||||||
lastorder = order;
|
int lastorder = order;
|
||||||
|
|
||||||
//
|
//
|
||||||
// we need to check "ordered" states before, because received data may be same to any command - is wrong!!!
|
// we need to check "ordered" states before, because received data may be same to any command - is wrong!!!
|
||||||
|
@ -1527,17 +1525,16 @@ void PrepareDelayedTransfer(uint16_t delay) {
|
||||||
delay &= 0x07;
|
delay &= 0x07;
|
||||||
if (!delay) return;
|
if (!delay) return;
|
||||||
|
|
||||||
uint8_t bitmask = 0, bits_to_shift;
|
uint8_t bitmask = 0;
|
||||||
uint8_t bits_shifted = 0;
|
uint8_t bits_shifted = 0;
|
||||||
uint16_t i = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < delay; i++)
|
for (uint16_t i = 0; i < delay; i++)
|
||||||
bitmask |= (0x01 << i);
|
bitmask |= (0x01 << i);
|
||||||
|
|
||||||
ToSend[ToSendMax++] = 0x00;
|
ToSend[ToSendMax++] = 0x00;
|
||||||
|
|
||||||
for (i = 0; i < ToSendMax; i++) {
|
for (uint16_t i = 0; i < ToSendMax; i++) {
|
||||||
bits_to_shift = ToSend[i] & bitmask;
|
uint8_t bits_to_shift = ToSend[i] & bitmask;
|
||||||
ToSend[i] = ToSend[i] >> delay;
|
ToSend[i] = ToSend[i] >> delay;
|
||||||
ToSend[i] = ToSend[i] | (bits_shifted << (8 - delay));
|
ToSend[i] = ToSend[i] | (bits_shifted << (8 - delay));
|
||||||
bits_shifted = bits_to_shift;
|
bits_shifted = bits_to_shift;
|
||||||
|
@ -1600,9 +1597,7 @@ static void TransmitFor14443a(const uint8_t *cmd, uint16_t len, uint32_t *timing
|
||||||
// Prepare reader command (in bits, support short frames) to send to FPGA
|
// Prepare reader command (in bits, support short frames) to send to FPGA
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) {
|
void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) {
|
||||||
int i, j;
|
|
||||||
int last = 0;
|
int last = 0;
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
ToSendReset();
|
ToSendReset();
|
||||||
|
|
||||||
|
@ -1612,11 +1607,11 @@ void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8
|
||||||
|
|
||||||
size_t bytecount = nbytes(bits);
|
size_t bytecount = nbytes(bits);
|
||||||
// Generate send structure for the data bits
|
// Generate send structure for the data bits
|
||||||
for (i = 0; i < bytecount; i++) {
|
for (int i = 0; i < bytecount; i++) {
|
||||||
// Get the current byte to send
|
// Get the current byte to send
|
||||||
b = cmd[i];
|
uint8_t b = cmd[i];
|
||||||
size_t bitsleft = MIN((bits - (i * 8)), 8);
|
size_t bitsleft = MIN((bits - (i * 8)), 8);
|
||||||
|
int j;
|
||||||
for (j = 0; j < bitsleft; j++) {
|
for (j = 0; j < bitsleft; j++) {
|
||||||
if (b & 1) {
|
if (b & 1) {
|
||||||
// Sequence X
|
// Sequence X
|
||||||
|
@ -2078,25 +2073,22 @@ void iso14443a_antifuzz(uint32_t flags) {
|
||||||
|
|
||||||
static void iso14a_set_ATS_times(uint8_t *ats) {
|
static void iso14a_set_ATS_times(uint8_t *ats) {
|
||||||
|
|
||||||
uint8_t tb1;
|
|
||||||
uint8_t fwi, sfgi;
|
|
||||||
uint32_t fwt, sfgt;
|
|
||||||
|
|
||||||
if (ats[0] > 1) { // there is a format byte T0
|
if (ats[0] > 1) { // there is a format byte T0
|
||||||
if ((ats[1] & 0x20) == 0x20) { // there is an interface byte TB(1)
|
if ((ats[1] & 0x20) == 0x20) { // there is an interface byte TB(1)
|
||||||
|
uint8_t tb1;
|
||||||
if ((ats[1] & 0x10) == 0x10) { // there is an interface byte TA(1) preceding TB(1)
|
if ((ats[1] & 0x10) == 0x10) { // there is an interface byte TA(1) preceding TB(1)
|
||||||
tb1 = ats[3];
|
tb1 = ats[3];
|
||||||
} else {
|
} else {
|
||||||
tb1 = ats[2];
|
tb1 = ats[2];
|
||||||
}
|
}
|
||||||
fwi = (tb1 & 0xf0) >> 4; // frame waiting time integer (FWI)
|
uint8_t fwi = (tb1 & 0xf0) >> 4; // frame waiting time integer (FWI)
|
||||||
if (fwi != 15) {
|
if (fwi != 15) {
|
||||||
fwt = 256 * 16 * (1 << fwi); // frame waiting time (FWT) in 1/fc
|
uint32_t fwt = 256 * 16 * (1 << fwi); // frame waiting time (FWT) in 1/fc
|
||||||
iso14a_set_timeout(fwt / (8 * 16));
|
iso14a_set_timeout(fwt / (8 * 16));
|
||||||
}
|
}
|
||||||
sfgi = tb1 & 0x0f; // startup frame guard time integer (SFGI)
|
uint8_t sfgi = tb1 & 0x0f; // startup frame guard time integer (SFGI)
|
||||||
if (sfgi != 0 && sfgi != 15) {
|
if (sfgi != 0 && sfgi != 15) {
|
||||||
sfgt = 256 * 16 * (1 << sfgi); // startup frame guard time (SFGT) in 1/fc
|
uint32_t sfgt = 256 * 16 * (1 << sfgi); // startup frame guard time (SFGT) in 1/fc
|
||||||
NextTransferTime = MAX(NextTransferTime, Demod.endTime + (sfgt - DELAY_AIR2ARM_AS_READER - DELAY_ARM2AIR_AS_READER) / 16);
|
NextTransferTime = MAX(NextTransferTime, Demod.endTime + (sfgt - DELAY_AIR2ARM_AS_READER - DELAY_ARM2AIR_AS_READER) / 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2144,7 +2136,6 @@ int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32
|
||||||
|
|
||||||
uint8_t sak = 0x04; // cascade uid
|
uint8_t sak = 0x04; // cascade uid
|
||||||
int cascade_level = 0;
|
int cascade_level = 0;
|
||||||
int len;
|
|
||||||
|
|
||||||
if (p_card) {
|
if (p_card) {
|
||||||
p_card->uidlen = 0;
|
p_card->uidlen = 0;
|
||||||
|
@ -2271,7 +2262,7 @@ int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32
|
||||||
|
|
||||||
AddCrc14A(rats, 2);
|
AddCrc14A(rats, 2);
|
||||||
ReaderTransmit(rats, sizeof(rats), NULL);
|
ReaderTransmit(rats, sizeof(rats), NULL);
|
||||||
len = ReaderReceive(resp, resp_par);
|
int len = ReaderReceive(resp, resp_par);
|
||||||
|
|
||||||
if (!len) return 0;
|
if (!len) return 0;
|
||||||
|
|
||||||
|
@ -2639,7 +2630,6 @@ void ReaderMifare(bool first_try, uint8_t block, uint8_t keytype) {
|
||||||
uint16_t sync_tries = 0;
|
uint16_t sync_tries = 0;
|
||||||
|
|
||||||
bool have_uid = false;
|
bool have_uid = false;
|
||||||
bool received_nack;
|
|
||||||
uint8_t cascade_levels = 0;
|
uint8_t cascade_levels = 0;
|
||||||
|
|
||||||
// static variables here, is re-used in the next call
|
// static variables here, is re-used in the next call
|
||||||
|
@ -2667,7 +2657,7 @@ void ReaderMifare(bool first_try, uint8_t block, uint8_t keytype) {
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for (i = 0; true; ++i) {
|
for (i = 0; true; ++i) {
|
||||||
|
|
||||||
received_nack = false;
|
bool received_nack = false;
|
||||||
|
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
|
@ -2893,7 +2883,6 @@ void DetectNACKbug() {
|
||||||
uint16_t sync_tries = 0;
|
uint16_t sync_tries = 0;
|
||||||
uint32_t sync_time = 0;
|
uint32_t sync_time = 0;
|
||||||
bool have_uid = false;
|
bool have_uid = false;
|
||||||
bool received_nack;
|
|
||||||
|
|
||||||
int32_t status = PM3_SUCCESS;
|
int32_t status = PM3_SUCCESS;
|
||||||
|
|
||||||
|
@ -2912,7 +2901,7 @@ void DetectNACKbug() {
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for (i = 1; true; ++i) {
|
for (i = 1; true; ++i) {
|
||||||
|
|
||||||
received_nack = false;
|
bool received_nack = false;
|
||||||
|
|
||||||
// Cards always leaks a NACK, no matter the parity
|
// Cards always leaks a NACK, no matter the parity
|
||||||
if ((i == 10) && (num_nacks == i - 1)) {
|
if ((i == 10) && (num_nacks == i - 1)) {
|
||||||
|
|
|
@ -237,9 +237,6 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int i, j;
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
ToSendReset();
|
ToSendReset();
|
||||||
|
|
||||||
// Transmit a burst of ones, as the initial thing that lets the
|
// Transmit a burst of ones, as the initial thing that lets the
|
||||||
|
@ -252,23 +249,23 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
||||||
|
|
||||||
// Send SOF.
|
// Send SOF.
|
||||||
// 10-11 ETU * 4times samples ZEROS
|
// 10-11 ETU * 4times samples ZEROS
|
||||||
for (i = 0; i < 10; i++) { SEND4STUFFBIT(0); }
|
for (int i = 0; i < 10; i++) { SEND4STUFFBIT(0); }
|
||||||
//for(i = 0; i < 10; i++) { ToSendStuffBit(0); }
|
//for(i = 0; i < 10; i++) { ToSendStuffBit(0); }
|
||||||
|
|
||||||
// 2-3 ETU * 4times samples ONES
|
// 2-3 ETU * 4times samples ONES
|
||||||
for (i = 0; i < 3; i++) { SEND4STUFFBIT(1); }
|
for (int i = 0; i < 3; i++) { SEND4STUFFBIT(1); }
|
||||||
//for(i = 0; i < 3; i++) { ToSendStuffBit(1); }
|
//for(i = 0; i < 3; i++) { ToSendStuffBit(1); }
|
||||||
|
|
||||||
// data
|
// data
|
||||||
for (i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
|
|
||||||
// Start bit
|
// Start bit
|
||||||
SEND4STUFFBIT(0);
|
SEND4STUFFBIT(0);
|
||||||
//ToSendStuffBit(0);
|
//ToSendStuffBit(0);
|
||||||
|
|
||||||
// Data bits
|
// Data bits
|
||||||
b = cmd[i];
|
uint8_t b = cmd[i];
|
||||||
for (j = 0; j < 8; ++j) {
|
for (int j = 0; j < 8; ++j) {
|
||||||
// if(b & 1) {
|
// if(b & 1) {
|
||||||
// SEND4STUFFBIT(1);
|
// SEND4STUFFBIT(1);
|
||||||
// //ToSendStuffBit(1);
|
// //ToSendStuffBit(1);
|
||||||
|
@ -292,11 +289,11 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
||||||
|
|
||||||
// Send EOF.
|
// Send EOF.
|
||||||
// 10-11 ETU * 4 sample rate = ZEROS
|
// 10-11 ETU * 4 sample rate = ZEROS
|
||||||
for (i = 0; i < 10; i++) { SEND4STUFFBIT(0); }
|
for (int i = 0; i < 10; i++) { SEND4STUFFBIT(0); }
|
||||||
//for(i = 0; i < 10; i++) { ToSendStuffBit(0); }
|
//for(i = 0; i < 10; i++) { ToSendStuffBit(0); }
|
||||||
|
|
||||||
// why this?
|
// why this?
|
||||||
for (i = 0; i < 40; i++) { SEND4STUFFBIT(1); }
|
for (int i = 0; i < 40; i++) { SEND4STUFFBIT(1); }
|
||||||
//for(i = 0; i < 40; i++) { ToSendStuffBit(1); }
|
//for(i = 0; i < 40; i++) { ToSendStuffBit(1); }
|
||||||
|
|
||||||
// Convert from last byte pos to length
|
// Convert from last byte pos to length
|
||||||
|
@ -945,7 +942,7 @@ static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) {
|
||||||
* quiet: set to 'TRUE' to disable debug output
|
* quiet: set to 'TRUE' to disable debug output
|
||||||
*/
|
*/
|
||||||
static void GetTagSamplesFor14443bDemod() {
|
static void GetTagSamplesFor14443bDemod() {
|
||||||
bool gotFrame, finished = false;
|
bool finished = false;
|
||||||
// int lastRxCounter = ISO14443B_DMA_BUFFER_SIZE;
|
// int lastRxCounter = ISO14443B_DMA_BUFFER_SIZE;
|
||||||
uint32_t time_0 = 0, time_stop = 0;
|
uint32_t time_0 = 0, time_stop = 0;
|
||||||
|
|
||||||
|
@ -991,7 +988,7 @@ static void GetTagSamplesFor14443bDemod() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/Proxmark/proxmark3/issues/103
|
// https://github.com/Proxmark/proxmark3/issues/103
|
||||||
gotFrame = Handle14443bTagSamplesDemod(ci, cq);
|
bool gotFrame = Handle14443bTagSamplesDemod(ci, cq);
|
||||||
time_stop = GetCountSspClk() - time_0;
|
time_stop = GetCountSspClk() - time_0;
|
||||||
|
|
||||||
finished = (time_stop > iso14b_timeout || gotFrame);
|
finished = (time_stop > iso14b_timeout || gotFrame);
|
||||||
|
@ -1058,14 +1055,12 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
|
||||||
* QUESTION: how long is a 1 or 0 in pulses in the xcorr_848 mode?
|
* QUESTION: how long is a 1 or 0 in pulses in the xcorr_848 mode?
|
||||||
* 1 "stuffbit" = 1ETU (9us)
|
* 1 "stuffbit" = 1ETU (9us)
|
||||||
*/
|
*/
|
||||||
int i;
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
ToSendReset();
|
ToSendReset();
|
||||||
|
|
||||||
// Send SOF
|
// Send SOF
|
||||||
// 10-11 ETUs of ZERO
|
// 10-11 ETUs of ZERO
|
||||||
for (i = 0; i < 10; ++i) ToSendStuffBit(0);
|
for (int i = 0; i < 10; ++i) ToSendStuffBit(0);
|
||||||
|
|
||||||
// 2-3 ETUs of ONE
|
// 2-3 ETUs of ONE
|
||||||
ToSendStuffBit(1);
|
ToSendStuffBit(1);
|
||||||
|
@ -1074,11 +1069,11 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
|
||||||
|
|
||||||
// Sending cmd, LSB
|
// Sending cmd, LSB
|
||||||
// from here we add BITS
|
// from here we add BITS
|
||||||
for (i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
// Start bit
|
// Start bit
|
||||||
ToSendStuffBit(0);
|
ToSendStuffBit(0);
|
||||||
// Data bits
|
// Data bits
|
||||||
b = cmd[i];
|
uint8_t b = cmd[i];
|
||||||
// if ( b & 1 ) ToSendStuffBit(1); else ToSendStuffBit(0);
|
// if ( b & 1 ) ToSendStuffBit(1); else ToSendStuffBit(0);
|
||||||
// if ( (b>>1) & 1) ToSendStuffBit(1); else ToSendStuffBit(0);
|
// if ( (b>>1) & 1) ToSendStuffBit(1); else ToSendStuffBit(0);
|
||||||
// if ( (b>>2) & 1) ToSendStuffBit(1); else ToSendStuffBit(0);
|
// if ( (b>>2) & 1) ToSendStuffBit(1); else ToSendStuffBit(0);
|
||||||
|
@ -1108,13 +1103,13 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
|
||||||
|
|
||||||
// Send EOF
|
// Send EOF
|
||||||
// 10-11 ETUs of ZERO
|
// 10-11 ETUs of ZERO
|
||||||
for (i = 0; i < 10; ++i) ToSendStuffBit(0);
|
for (int i = 0; i < 10; ++i) ToSendStuffBit(0);
|
||||||
|
|
||||||
// Transition time. TR0 - guard time
|
// Transition time. TR0 - guard time
|
||||||
// 8ETUS minum?
|
// 8ETUS minum?
|
||||||
// Per specification, Subcarrier must be stopped no later than 2 ETUs after EOF.
|
// Per specification, Subcarrier must be stopped no later than 2 ETUs after EOF.
|
||||||
// I'm guessing this is for the FPGA to be able to send all bits before we switch to listening mode
|
// I'm guessing this is for the FPGA to be able to send all bits before we switch to listening mode
|
||||||
for (i = 0; i < 24 ; ++i) ToSendStuffBit(1);
|
for (int i = 0; i < 24 ; ++i) ToSendStuffBit(1);
|
||||||
|
|
||||||
// TR1 - Synchronization time
|
// TR1 - Synchronization time
|
||||||
// Convert from last character reference to length
|
// Convert from last character reference to length
|
||||||
|
@ -1462,7 +1457,6 @@ static void iso1444b_setup_sniff(void) {
|
||||||
void RAMFUNC SniffIso14443b(void) {
|
void RAMFUNC SniffIso14443b(void) {
|
||||||
|
|
||||||
uint32_t time_0 = 0, time_start = 0, time_stop;
|
uint32_t time_0 = 0, time_start = 0, time_stop;
|
||||||
int ci, cq;
|
|
||||||
|
|
||||||
// We won't start recording the frames that we acquire until we trigger;
|
// We won't start recording the frames that we acquire until we trigger;
|
||||||
// a good trigger condition to get started is probably when we see a
|
// a good trigger condition to get started is probably when we see a
|
||||||
|
@ -1490,8 +1484,8 @@ void RAMFUNC SniffIso14443b(void) {
|
||||||
while (!BUTTON_PRESS()) {
|
while (!BUTTON_PRESS()) {
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
ci = data[0];
|
int ci = data[0];
|
||||||
cq = data[1];
|
int cq = data[1];
|
||||||
data += 2;
|
data += 2;
|
||||||
|
|
||||||
if (data >= dmaBuf + ISO14443B_DMA_BUFFER_SIZE) {
|
if (data >= dmaBuf + ISO14443B_DMA_BUFFER_SIZE) {
|
||||||
|
|
|
@ -736,9 +736,9 @@ int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outda
|
||||||
// Decodes a message from a tag and displays its metadata and content
|
// Decodes a message from a tag and displays its metadata and content
|
||||||
#define DBD15STATLEN 48
|
#define DBD15STATLEN 48
|
||||||
void DbdecodeIso15693Answer(int len, uint8_t *d) {
|
void DbdecodeIso15693Answer(int len, uint8_t *d) {
|
||||||
char status[DBD15STATLEN + 1] = {0};
|
|
||||||
|
|
||||||
if (len > 3) {
|
if (len > 3) {
|
||||||
|
char status[DBD15STATLEN + 1] = {0};
|
||||||
if (d[0] & (1 << 3))
|
if (d[0] & (1 << 3))
|
||||||
strncat(status, "ProtExt ", DBD15STATLEN - strlen(status));
|
strncat(status, "ProtExt ", DBD15STATLEN - strlen(status));
|
||||||
if (d[0] & 1) {
|
if (d[0] & 1) {
|
||||||
|
@ -802,9 +802,6 @@ void DbdecodeIso15693Answer(int len, uint8_t *d) {
|
||||||
void ReaderIso15693(uint32_t parameter) {
|
void ReaderIso15693(uint32_t parameter) {
|
||||||
int answerLen1 = 0;
|
int answerLen1 = 0;
|
||||||
int tsamples = 0, wait = 0, elapsed = 0;
|
int tsamples = 0, wait = 0, elapsed = 0;
|
||||||
|
|
||||||
uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
|
|
||||||
// set up device/fpga
|
// set up device/fpga
|
||||||
Iso15693InitReader();
|
Iso15693InitReader();
|
||||||
|
|
||||||
|
@ -829,6 +826,7 @@ void ReaderIso15693(uint32_t parameter) {
|
||||||
|
|
||||||
// we should do a better check than this
|
// we should do a better check than this
|
||||||
if (answerLen1 >= 12) {
|
if (answerLen1 >= 12) {
|
||||||
|
uint8_t uid[8];
|
||||||
uid[0] = answer1[9]; // always E0
|
uid[0] = answer1[9]; // always E0
|
||||||
uid[1] = answer1[8]; // IC Manufacturer code
|
uid[1] = answer1[8]; // IC Manufacturer code
|
||||||
uid[2] = answer1[7];
|
uid[2] = answer1[7];
|
||||||
|
|
|
@ -1151,24 +1151,20 @@ void CmdAWIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol)
|
||||||
// w = wiegand parity
|
// w = wiegand parity
|
||||||
// (26 bit format shown)
|
// (26 bit format shown)
|
||||||
|
|
||||||
uint32_t fac = 0;
|
|
||||||
uint32_t cardnum = 0;
|
|
||||||
uint32_t code1 = 0;
|
|
||||||
uint32_t code2 = 0;
|
|
||||||
uint8_t fmtLen = bytebits_to_byte(dest, 8);
|
uint8_t fmtLen = bytebits_to_byte(dest, 8);
|
||||||
if (fmtLen == 26) {
|
if (fmtLen == 26) {
|
||||||
fac = bytebits_to_byte(dest + 9, 8);
|
uint32_t fac = bytebits_to_byte(dest + 9, 8);
|
||||||
cardnum = bytebits_to_byte(dest + 17, 16);
|
uint32_t cardnum = bytebits_to_byte(dest + 17, 16);
|
||||||
code1 = bytebits_to_byte(dest + 8, fmtLen);
|
uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen);
|
||||||
Dbprintf("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fac, cardnum, code1, rawHi2, rawHi, rawLo);
|
Dbprintf("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fac, cardnum, code1, rawHi2, rawHi, rawLo);
|
||||||
} else {
|
} else {
|
||||||
cardnum = bytebits_to_byte(dest + 8 + (fmtLen - 17), 16);
|
uint32_t cardnum = bytebits_to_byte(dest + 8 + (fmtLen - 17), 16);
|
||||||
if (fmtLen > 32) {
|
if (fmtLen > 32) {
|
||||||
code1 = bytebits_to_byte(dest + 8, fmtLen - 32);
|
uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen - 32);
|
||||||
code2 = bytebits_to_byte(dest + 8 + (fmtLen - 32), 32);
|
uint32_t code2 = bytebits_to_byte(dest + 8 + (fmtLen - 32), 32);
|
||||||
Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
|
Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
|
||||||
} else {
|
} else {
|
||||||
code1 = bytebits_to_byte(dest + 8, fmtLen);
|
uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen);
|
||||||
Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
|
Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1189,7 +1185,7 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol)
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
|
|
||||||
size_t size, idx = 0;
|
size_t size, idx = 0;
|
||||||
int clk = 0, invert = 0, errCnt, maxErr = 20;
|
int clk = 0, invert = 0, maxErr = 20;
|
||||||
uint32_t hi = 0;
|
uint32_t hi = 0;
|
||||||
uint64_t lo = 0;
|
uint64_t lo = 0;
|
||||||
|
|
||||||
|
@ -1207,7 +1203,7 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol)
|
||||||
size = BigBuf_max_traceLen();
|
size = BigBuf_max_traceLen();
|
||||||
//askdemod and manchester decode
|
//askdemod and manchester decode
|
||||||
if (size > 16385) size = 16385; //big enough to catch 2 sequences of largest format
|
if (size > 16385) size = 16385; //big enough to catch 2 sequences of largest format
|
||||||
errCnt = askdemod(dest, &size, &clk, &invert, maxErr, 0, 1);
|
int errCnt = askdemod(dest, &size, &clk, &invert, maxErr, 0, 1);
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
if (errCnt > 50) continue;
|
if (errCnt > 50) continue;
|
||||||
|
|
|
@ -861,11 +861,10 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
|
||||||
ui64Key = bytes_to_num(datain, 6);
|
ui64Key = bytes_to_num(datain, 6);
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
uint16_t rtr, i, j, len;
|
uint16_t i, j, len;
|
||||||
uint16_t davg = 0;
|
|
||||||
static uint16_t dmin, dmax;
|
static uint16_t dmin, dmax;
|
||||||
uint8_t uid[10] = {0x00};
|
uint8_t uid[10] = {0x00};
|
||||||
uint32_t cuid = 0, nt1, nt2, nttmp, nttest, ks1;
|
uint32_t cuid = 0, nt1, nt2, nttest, ks1;
|
||||||
uint8_t par[1] = {0x00};
|
uint8_t par[1] = {0x00};
|
||||||
uint32_t target_nt[2] = {0x00}, target_ks[2] = {0x00};
|
uint32_t target_nt[2] = {0x00}, target_ks[2] = {0x00};
|
||||||
|
|
||||||
|
@ -893,15 +892,16 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
|
||||||
// statistics on nonce distance
|
// statistics on nonce distance
|
||||||
int16_t isOK = 0;
|
int16_t isOK = 0;
|
||||||
#define NESTED_MAX_TRIES 12
|
#define NESTED_MAX_TRIES 12
|
||||||
uint16_t unsuccessfull_tries = 0;
|
|
||||||
if (arg2) { // calibrate: for first call only. Otherwise reuse previous calibration
|
if (arg2) { // calibrate: for first call only. Otherwise reuse previous calibration
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
davg = dmax = 0;
|
uint16_t unsuccessfull_tries = 0;
|
||||||
|
uint16_t davg = 0;
|
||||||
|
dmax = 0;
|
||||||
dmin = 2000;
|
dmin = 2000;
|
||||||
delta_time = 0;
|
delta_time = 0;
|
||||||
|
uint16_t rtr;
|
||||||
for (rtr = 0; rtr < 17; rtr++) {
|
for (rtr = 0; rtr < 17; rtr++) {
|
||||||
|
|
||||||
// Test if the action was cancelled
|
// Test if the action was cancelled
|
||||||
|
@ -937,7 +937,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
nttmp = prng_successor(nt1, 100); //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160
|
uint32_t nttmp = prng_successor(nt1, 100); //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160
|
||||||
for (i = 101; i < 1200; i++) {
|
for (i = 101; i < 1200; i++) {
|
||||||
nttmp = prng_successor(nttmp, 1);
|
nttmp = prng_successor(nttmp, 1);
|
||||||
if (nttmp == nt2) break;
|
if (nttmp == nt2) break;
|
||||||
|
@ -1653,7 +1653,6 @@ void MifareEMemGet(uint8_t blockno, uint8_t blockcnt) {
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
int MifareECardLoad(uint32_t arg0, uint32_t arg1) {
|
int MifareECardLoad(uint32_t arg0, uint32_t arg1) {
|
||||||
uint64_t ui64Key;
|
|
||||||
uint32_t cuid = 0;
|
uint32_t cuid = 0;
|
||||||
uint8_t numSectors = arg0;
|
uint8_t numSectors = arg0;
|
||||||
uint8_t keyType = arg1;
|
uint8_t keyType = arg1;
|
||||||
|
@ -1682,7 +1681,7 @@ int MifareECardLoad(uint32_t arg0, uint32_t arg1) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) {
|
for (uint8_t sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) {
|
||||||
ui64Key = emlGetKey(sectorNo, keyType);
|
uint64_t ui64Key = emlGetKey(sectorNo, keyType);
|
||||||
if (sectorNo == 0) {
|
if (sectorNo == 0) {
|
||||||
if (isOK && mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keyType, ui64Key, AUTH_FIRST)) {
|
if (isOK && mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keyType, ui64Key, AUTH_FIRST)) {
|
||||||
if (DBGLEVEL >= 1) Dbprintf("Sector[%2d]. Auth error", sectorNo);
|
if (DBGLEVEL >= 1) Dbprintf("Sector[%2d]. Auth error", sectorNo);
|
||||||
|
@ -2016,7 +2015,6 @@ void MifareSetMod(uint8_t *datain) {
|
||||||
uint32_t cuid = 0;
|
uint32_t cuid = 0;
|
||||||
struct Crypto1State mpcs = {0, 0};
|
struct Crypto1State mpcs = {0, 0};
|
||||||
struct Crypto1State *pcs = &mpcs;
|
struct Crypto1State *pcs = &mpcs;
|
||||||
int respLen;
|
|
||||||
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0};
|
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0};
|
||||||
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0};
|
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0};
|
||||||
|
|
||||||
|
@ -2040,6 +2038,7 @@ void MifareSetMod(uint8_t *datain) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int respLen;
|
||||||
if (((respLen = mifare_sendcmd_short(pcs, 1, 0x43, mod, receivedAnswer, receivedAnswerPar, NULL)) != 1) || (receivedAnswer[0] != 0x0a)) {
|
if (((respLen = mifare_sendcmd_short(pcs, 1, 0x43, mod, receivedAnswer, receivedAnswerPar, NULL)) != 1) || (receivedAnswer[0] != 0x0a)) {
|
||||||
if (DBGLEVEL >= 1) Dbprintf("SetMod error; response[0]: %hhX, len: %d", receivedAnswer[0], respLen);
|
if (DBGLEVEL >= 1) Dbprintf("SetMod error; response[0]: %hhX, len: %d", receivedAnswer[0], respLen);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -174,22 +174,18 @@ void MifareDES_Auth1(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
int len = 0;
|
int len = 0;
|
||||||
//uint8_t PICC_MASTER_KEY8[8] = { 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
|
//uint8_t PICC_MASTER_KEY8[8] = { 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
|
||||||
uint8_t PICC_MASTER_KEY16[16] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f };
|
uint8_t PICC_MASTER_KEY16[16] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f };
|
||||||
uint8_t null_key_data8[8] = {0x00};
|
|
||||||
//uint8_t null_key_data16[16] = {0x00};
|
//uint8_t null_key_data16[16] = {0x00};
|
||||||
//uint8_t new_key_data8[8] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
|
//uint8_t new_key_data8[8] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
|
||||||
//uint8_t new_key_data16[16] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};
|
//uint8_t new_key_data16[16] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};
|
||||||
|
|
||||||
uint8_t resp[256] = {0x00};
|
uint8_t resp[256] = {0x00};
|
||||||
uint8_t IV[16] = {0x00};
|
|
||||||
|
|
||||||
size_t datalen = datain[0];
|
size_t datalen = datain[0];
|
||||||
|
|
||||||
uint8_t cmd[40] = {0x00};
|
uint8_t cmd[40] = {0x00};
|
||||||
uint8_t encRndB[16] = {0x00};
|
uint8_t encRndB[16] = {0x00};
|
||||||
uint8_t decRndB[16] = {0x00};
|
uint8_t decRndB[16] = {0x00};
|
||||||
uint8_t nonce[16] = {0x00};
|
|
||||||
uint8_t both[32] = {0x00};
|
uint8_t both[32] = {0x00};
|
||||||
uint8_t encBoth[32] = {0x00};
|
|
||||||
|
|
||||||
InitDesfireCard();
|
InitDesfireCard();
|
||||||
|
|
||||||
|
@ -217,6 +213,7 @@ void MifareDES_Auth1(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
} else {
|
} else {
|
||||||
if (arg1 == 1) {
|
if (arg1 == 1) {
|
||||||
if (datain[1] == 0xff) {
|
if (datain[1] == 0xff) {
|
||||||
|
uint8_t null_key_data8[8] = {0x00};
|
||||||
memcpy(keybytes, null_key_data8, 8);
|
memcpy(keybytes, null_key_data8, 8);
|
||||||
} else {
|
} else {
|
||||||
memcpy(keybytes, datain + 1, datalen);
|
memcpy(keybytes, datain + 1, datalen);
|
||||||
|
@ -437,6 +434,7 @@ void MifareDES_Auth1(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
Desfire_aes_key_new(keybytes, key);
|
Desfire_aes_key_new(keybytes, key);
|
||||||
|
|
||||||
AesCtx ctx;
|
AesCtx ctx;
|
||||||
|
uint8_t IV[16] = {0x00};
|
||||||
if (AesCtxIni(&ctx, IV, key->data, KEY128, CBC) < 0) {
|
if (AesCtxIni(&ctx, IV, key->data, KEY128, CBC) < 0) {
|
||||||
if (DBGLEVEL >= 4) {
|
if (DBGLEVEL >= 4) {
|
||||||
DbpString("AES context failed to init");
|
DbpString("AES context failed to init");
|
||||||
|
@ -461,8 +459,10 @@ void MifareDES_Auth1(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
// dekryptera tagnonce.
|
// dekryptera tagnonce.
|
||||||
AesDecrypt(&ctx, encRndB, decRndB, 16);
|
AesDecrypt(&ctx, encRndB, decRndB, 16);
|
||||||
rol(decRndB, 16);
|
rol(decRndB, 16);
|
||||||
|
uint8_t nonce[16] = {0x00};
|
||||||
memcpy(both, nonce, 16);
|
memcpy(both, nonce, 16);
|
||||||
memcpy(both + 16, decRndB, 16);
|
memcpy(both + 16, decRndB, 16);
|
||||||
|
uint8_t encBoth[32] = {0x00};
|
||||||
AesEncrypt(&ctx, both, encBoth, 32);
|
AesEncrypt(&ctx, both, encBoth, 32);
|
||||||
|
|
||||||
cmd[0] = ADDITIONAL_FRAME;
|
cmd[0] = ADDITIONAL_FRAME;
|
||||||
|
|
|
@ -309,13 +309,13 @@ bool RAMFUNC MfSniffLogic(const uint8_t *data, uint16_t len, uint8_t *parity, ui
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void RAMFUNC MfSniffSend() {
|
void RAMFUNC MfSniffSend() {
|
||||||
uint16_t chunksize, tracelen = BigBuf_get_traceLen();
|
uint16_t tracelen = BigBuf_get_traceLen();
|
||||||
int packlen = tracelen; // total number of bytes to send
|
int packlen = tracelen; // total number of bytes to send
|
||||||
uint8_t *data = BigBuf_get_addr();
|
uint8_t *data = BigBuf_get_addr();
|
||||||
|
|
||||||
while (packlen > 0) {
|
while (packlen > 0) {
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
chunksize = MIN(PM3_CMD_DATA_SIZE, packlen); // chunk size 512
|
uint16_t chunksize = MIN(PM3_CMD_DATA_SIZE, packlen); // chunk size 512
|
||||||
reply_old(CMD_ACK, 1, tracelen, chunksize, data + tracelen - packlen, chunksize);
|
reply_old(CMD_ACK, 1, tracelen, chunksize, data + tracelen - packlen, chunksize);
|
||||||
packlen -= chunksize;
|
packlen -= chunksize;
|
||||||
LED_B_OFF();
|
LED_B_OFF();
|
||||||
|
|
|
@ -111,9 +111,8 @@ void opt_successor(const uint8_t *k, State *s, bool y, State *successor) {
|
||||||
|
|
||||||
void opt_suc(const uint8_t *k, State *s, uint8_t *in, uint8_t length, bool add32Zeroes) {
|
void opt_suc(const uint8_t *k, State *s, uint8_t *in, uint8_t length, bool add32Zeroes) {
|
||||||
State x2;
|
State x2;
|
||||||
int i;
|
for (int i = 0; i < length; i++) {
|
||||||
uint8_t head;
|
uint8_t head;
|
||||||
for (i = 0; i < length; i++) {
|
|
||||||
head = 1 & (in[i] >> 7);
|
head = 1 & (in[i] >> 7);
|
||||||
opt_successor(k, s, head, &x2);
|
opt_successor(k, s, head, &x2);
|
||||||
|
|
||||||
|
@ -141,7 +140,7 @@ void opt_suc(const uint8_t *k, State *s, uint8_t *in, uint8_t length, bool add32
|
||||||
|
|
||||||
//For tag MAC, an additional 32 zeroes
|
//For tag MAC, an additional 32 zeroes
|
||||||
if (add32Zeroes) {
|
if (add32Zeroes) {
|
||||||
for (i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
opt_successor(k, s, 0, &x2);
|
opt_successor(k, s, 0, &x2);
|
||||||
opt_successor(k, &x2, 0, s);
|
opt_successor(k, &x2, 0, s);
|
||||||
}
|
}
|
||||||
|
@ -149,10 +148,9 @@ void opt_suc(const uint8_t *k, State *s, uint8_t *in, uint8_t length, bool add32
|
||||||
}
|
}
|
||||||
|
|
||||||
void opt_output(const uint8_t *k, State *s, uint8_t *buffer) {
|
void opt_output(const uint8_t *k, State *s, uint8_t *buffer) {
|
||||||
uint8_t bout, times = 0;
|
|
||||||
State temp = {0, 0, 0, 0};
|
State temp = {0, 0, 0, 0};
|
||||||
for (; times < 4; times++) {
|
for (uint8_t times = 0; times < 4; times++) {
|
||||||
bout = 0;
|
uint8_t bout = 0;
|
||||||
bout |= (s->r & 0x4) << 5;
|
bout |= (s->r & 0x4) << 5;
|
||||||
opt_successor(k, s, 0, &temp);
|
opt_successor(k, s, 0, &temp);
|
||||||
bout |= (temp.r & 0x4) << 4;
|
bout |= (temp.r & 0x4) << 4;
|
||||||
|
|
|
@ -60,12 +60,10 @@ char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) {
|
ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) {
|
||||||
char *p, c;
|
char *p = nbuf;
|
||||||
|
|
||||||
p = nbuf;
|
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
do {
|
do {
|
||||||
c = hex2ascii(num % base);
|
char c = hex2ascii(num % base);
|
||||||
*++p = upper ? toupper(c) : c;
|
*++p = upper ? toupper(c) : c;
|
||||||
} while (num /= base);
|
} while (num /= base);
|
||||||
if (lenp)
|
if (lenp)
|
||||||
|
|
|
@ -80,10 +80,10 @@ char *strcat(char *dest, const char *src) {
|
||||||
|
|
||||||
/* reverse: reverse string s in place */
|
/* reverse: reverse string s in place */
|
||||||
void strreverse(char s[]) {
|
void strreverse(char s[]) {
|
||||||
int c, i, j;
|
int j = strlen(s) - 1;
|
||||||
|
|
||||||
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
|
for (int i = 0; i < j; i++, j--) {
|
||||||
c = s[i];
|
int c = s[i];
|
||||||
s[i] = s[j];
|
s[i] = s[j];
|
||||||
s[j] = c;
|
s[j] = c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,6 @@ static void Fatal(void) {
|
||||||
void UsbPacketReceived(uint8_t *packet, int len) {
|
void UsbPacketReceived(uint8_t *packet, int len) {
|
||||||
int i, dont_ack = 0;
|
int i, dont_ack = 0;
|
||||||
PacketCommandOLD *c = (PacketCommandOLD *)packet;
|
PacketCommandOLD *c = (PacketCommandOLD *)packet;
|
||||||
volatile uint32_t *p;
|
|
||||||
|
|
||||||
//if ( len != sizeof(PacketCommandOLD`)) Fatal();
|
//if ( len != sizeof(PacketCommandOLD`)) Fatal();
|
||||||
|
|
||||||
|
@ -136,7 +135,7 @@ void UsbPacketReceived(uint8_t *packet, int len) {
|
||||||
/* The temporary write buffer of the embedded flash controller is mapped to the
|
/* The temporary write buffer of the embedded flash controller is mapped to the
|
||||||
* whole memory region, only the last 8 bits are decoded.
|
* whole memory region, only the last 8 bits are decoded.
|
||||||
*/
|
*/
|
||||||
p = (volatile uint32_t *)&_flash_start;
|
volatile uint32_t *p = (volatile uint32_t *)&_flash_start;
|
||||||
for (i = 0; i < 12; i++)
|
for (i = 0; i < 12; i++)
|
||||||
p[i + arg0] = c->d.asDwords[i];
|
p[i + arg0] = c->d.asDwords[i];
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
|
|
||||||
static int split(char *str, char *arr[MAX_ARGS]) {
|
static int split(char *str, char *arr[MAX_ARGS]) {
|
||||||
int beginIndex = 0;
|
int beginIndex = 0;
|
||||||
int endIndex;
|
|
||||||
int maxWords = MAX_ARGS;
|
|
||||||
int wordCnt = 0;
|
int wordCnt = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -24,7 +22,7 @@ static int split(char *str, char *arr[MAX_ARGS]) {
|
||||||
if (str[beginIndex] == '\0') {
|
if (str[beginIndex] == '\0') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
endIndex = beginIndex;
|
int endIndex = beginIndex;
|
||||||
while (str[endIndex] && !isspace(str[endIndex])) {
|
while (str[endIndex] && !isspace(str[endIndex])) {
|
||||||
++endIndex;
|
++endIndex;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +31,7 @@ static int split(char *str, char *arr[MAX_ARGS]) {
|
||||||
memcpy(tmp, &str[beginIndex], len);
|
memcpy(tmp, &str[beginIndex], len);
|
||||||
arr[wordCnt++] = tmp;
|
arr[wordCnt++] = tmp;
|
||||||
beginIndex = endIndex;
|
beginIndex = endIndex;
|
||||||
if (wordCnt == maxWords)
|
if (wordCnt == MAX_ARGS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return wordCnt;
|
return wordCnt;
|
||||||
|
@ -45,10 +43,8 @@ int GetModels(char *Models[], int *count, uint8_t *width) {
|
||||||
/* default values */
|
/* default values */
|
||||||
static model_t model = MZERO;
|
static model_t model = MZERO;
|
||||||
|
|
||||||
int ibperhx = 8;//, obperhx = 8;
|
|
||||||
int rflags = 0, uflags = 0; /* search and UI flags */
|
|
||||||
poly_t apoly, crc, qpoly = PZERO, *apolys = NULL, *pptr = NULL, *qptr = NULL;
|
poly_t apoly, crc, qpoly = PZERO, *apolys = NULL, *pptr = NULL, *qptr = NULL;
|
||||||
model_t pset = model, *candmods, *mptr;
|
model_t pset = model;
|
||||||
|
|
||||||
/* stdin must be binary */
|
/* stdin must be binary */
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -81,6 +77,8 @@ int GetModels(char *Models[], int *count, uint8_t *width) {
|
||||||
mfree(&model);
|
mfree(&model);
|
||||||
} else { //reveng -s
|
} else { //reveng -s
|
||||||
|
|
||||||
|
int ibperhx = 8;//, obperhx = 8;
|
||||||
|
int rflags = 0, uflags = 0; /* search and UI flags */
|
||||||
if (~model.flags & P_MULXN) {
|
if (~model.flags & P_MULXN) {
|
||||||
PrintAndLogEx(WARNING, "cannot search for non-Williams compliant models");
|
PrintAndLogEx(WARNING, "cannot search for non-Williams compliant models");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -108,9 +106,9 @@ int GetModels(char *Models[], int *count, uint8_t *width) {
|
||||||
/* scan against preset models */
|
/* scan against preset models */
|
||||||
if (~uflags & C_NOPCK) {
|
if (~uflags & C_NOPCK) {
|
||||||
pass = 0;
|
pass = 0;
|
||||||
int Cnt = 0, psets;
|
int Cnt = 0;
|
||||||
do {
|
do {
|
||||||
psets = mcount();
|
int psets = mcount();
|
||||||
|
|
||||||
while (psets) {
|
while (psets) {
|
||||||
mbynum(&pset, --psets);
|
mbynum(&pset, --psets);
|
||||||
|
@ -192,7 +190,8 @@ int GetModels(char *Models[], int *count, uint8_t *width) {
|
||||||
pass = 0;
|
pass = 0;
|
||||||
int args = 0;
|
int args = 0;
|
||||||
do {
|
do {
|
||||||
mptr = candmods = reveng(&model, qpoly, rflags, args, apolys);
|
model_t *candmods = reveng(&model, qpoly, rflags, args, apolys);
|
||||||
|
model_t *mptr = candmods;
|
||||||
if (mptr && plen(mptr->spoly)) {
|
if (mptr && plen(mptr->spoly)) {
|
||||||
uflags |= C_RESULT;
|
uflags |= C_RESULT;
|
||||||
}
|
}
|
||||||
|
@ -396,7 +395,6 @@ static int CmdrevengSearch(const char *Cmd) {
|
||||||
uint8_t width[NMODELS] = {0};
|
uint8_t width[NMODELS] = {0};
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
uint8_t crcChars;
|
|
||||||
char result[30];
|
char result[30];
|
||||||
char revResult[30];
|
char revResult[30];
|
||||||
int ans = GetModels(Models, &count, width);
|
int ans = GetModels(Models, &count, width);
|
||||||
|
@ -410,7 +408,7 @@ static int CmdrevengSearch(const char *Cmd) {
|
||||||
continue;
|
continue;
|
||||||
}*/
|
}*/
|
||||||
// round up to # of characters in this model's crc
|
// round up to # of characters in this model's crc
|
||||||
crcChars = ((width[i] + 7) / 8) * 2;
|
uint8_t crcChars = ((width[i] + 7) / 8) * 2;
|
||||||
// can't test a model that has more crc digits than our data
|
// can't test a model that has more crc digits than our data
|
||||||
if (crcChars >= dataLen)
|
if (crcChars >= dataLen)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -384,7 +384,6 @@ void printDemodBuff(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdPrintDemodBuff(const char *Cmd) {
|
int CmdPrintDemodBuff(const char *Cmd) {
|
||||||
char hex[512] = {0x00};
|
|
||||||
bool hexMode = false;
|
bool hexMode = false;
|
||||||
bool errors = false;
|
bool errors = false;
|
||||||
uint32_t offset = 0;
|
uint32_t offset = 0;
|
||||||
|
@ -425,6 +424,7 @@ int CmdPrintDemodBuff(const char *Cmd) {
|
||||||
|
|
||||||
if (hexMode) {
|
if (hexMode) {
|
||||||
char *buf = (char *)(DemodBuffer + offset);
|
char *buf = (char *)(DemodBuffer + offset);
|
||||||
|
char hex[512] = {0x00};
|
||||||
int numBits = binarraytohex(hex, sizeof(hex), buf, length);
|
int numBits = binarraytohex(hex, sizeof(hex), buf, length);
|
||||||
if (numBits == 0) {
|
if (numBits == 0) {
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
|
@ -745,15 +745,13 @@ int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveG
|
||||||
|
|
||||||
//test
|
//test
|
||||||
double autocv = 0.0; // Autocovariance value
|
double autocv = 0.0; // Autocovariance value
|
||||||
double ac_value; // Computed autocorrelation value to be returned
|
|
||||||
double variance; // Computed variance
|
|
||||||
double mean;
|
|
||||||
size_t correlation = 0;
|
size_t correlation = 0;
|
||||||
int lastmax = 0;
|
int lastmax = 0;
|
||||||
|
|
||||||
// in, len, 4000
|
// in, len, 4000
|
||||||
mean = compute_mean(in, len);
|
double mean = compute_mean(in, len);
|
||||||
variance = compute_variance(in, len);
|
// Computed variance
|
||||||
|
double variance = compute_variance(in, len);
|
||||||
|
|
||||||
static int CorrelBuffer[MAX_GRAPH_TRACE_LEN];
|
static int CorrelBuffer[MAX_GRAPH_TRACE_LEN];
|
||||||
|
|
||||||
|
@ -766,8 +764,9 @@ int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveG
|
||||||
|
|
||||||
CorrelBuffer[i] = autocv;
|
CorrelBuffer[i] = autocv;
|
||||||
|
|
||||||
|
// Computed autocorrelation value to be returned
|
||||||
// Autocorrelation is autocovariance divided by variance
|
// Autocorrelation is autocovariance divided by variance
|
||||||
ac_value = autocv / variance;
|
double ac_value = autocv / variance;
|
||||||
|
|
||||||
// keep track of which distance is repeating.
|
// keep track of which distance is repeating.
|
||||||
if (ac_value > 1) {
|
if (ac_value > 1) {
|
||||||
|
|
|
@ -506,9 +506,9 @@ int CmdHF14ASim(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdHF14ASniff(const char *Cmd) {
|
int CmdHF14ASniff(const char *Cmd) {
|
||||||
uint8_t param = 0, ctmp;
|
uint8_t param = 0;
|
||||||
for (uint8_t i = 0; i < 2; i++) {
|
for (uint8_t i = 0; i < 2; i++) {
|
||||||
ctmp = tolower(param_getchar(Cmd, i));
|
uint8_t ctmp = tolower(param_getchar(Cmd, i));
|
||||||
if (ctmp == 'h') return usage_hf_14a_sniff();
|
if (ctmp == 'h') return usage_hf_14a_sniff();
|
||||||
if (ctmp == 'c') param |= 0x01;
|
if (ctmp == 'c') param |= 0x01;
|
||||||
if (ctmp == 'r') param |= 0x02;
|
if (ctmp == 'r') param |= 0x02;
|
||||||
|
@ -701,11 +701,10 @@ static int CmdExchangeAPDU(bool chainingin, uint8_t *datain, int datainlen, bool
|
||||||
else
|
else
|
||||||
SendCommandMIX(CMD_READER_ISO_14443a, ISO14A_APDU | ISO14A_NO_DISCONNECT | cmdc, 0, 0, NULL, 0);
|
SendCommandMIX(CMD_READER_ISO_14443a, ISO14A_APDU | ISO14A_NO_DISCONNECT | cmdc, 0, 0, NULL, 0);
|
||||||
|
|
||||||
uint8_t *recv;
|
|
||||||
PacketResponseNG resp;
|
PacketResponseNG resp;
|
||||||
|
|
||||||
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
|
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
|
||||||
recv = resp.data.asBytes;
|
uint8_t *recv = resp.data.asBytes;
|
||||||
int iLen = resp.oldarg[0];
|
int iLen = resp.oldarg[0];
|
||||||
uint8_t res = resp.oldarg[1];
|
uint8_t res = resp.oldarg[1];
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,6 @@ static int switch_off_field_14b(void) {
|
||||||
|
|
||||||
static bool waitCmd14b(bool verbose) {
|
static bool waitCmd14b(bool verbose) {
|
||||||
|
|
||||||
uint8_t data[PM3_CMD_DATA_SIZE] = {0x00};
|
|
||||||
PacketResponseNG resp;
|
PacketResponseNG resp;
|
||||||
|
|
||||||
if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) {
|
if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) {
|
||||||
|
@ -130,6 +129,7 @@ static bool waitCmd14b(bool verbose) {
|
||||||
|
|
||||||
uint16_t len = (resp.oldarg[1] & 0xFFFF);
|
uint16_t len = (resp.oldarg[1] & 0xFFFF);
|
||||||
|
|
||||||
|
uint8_t data[PM3_CMD_DATA_SIZE] = {0x00};
|
||||||
memcpy(data, resp.data.asBytes, len);
|
memcpy(data, resp.data.asBytes, len);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
|
|
|
@ -1160,9 +1160,8 @@ static int CmdHF15Restore(const char *Cmd) {
|
||||||
char newCmdPrefix[FILE_PATH_SIZE + 1] = {0x00}, tmpCmd[FILE_PATH_SIZE + 262] = {0x00};
|
char newCmdPrefix[FILE_PATH_SIZE + 1] = {0x00}, tmpCmd[FILE_PATH_SIZE + 262] = {0x00};
|
||||||
char param[FILE_PATH_SIZE] = "";
|
char param[FILE_PATH_SIZE] = "";
|
||||||
char hex[255] = "";
|
char hex[255] = "";
|
||||||
uint8_t retries = 3, tried = 0, i = 0;
|
uint8_t retries = 3, i = 0;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
size_t bytes_read;
|
|
||||||
|
|
||||||
while (param_getchar(Cmd, cmdp) != 0x00) {
|
while (param_getchar(Cmd, cmdp) != 0x00) {
|
||||||
switch (tolower(param_getchar(Cmd, cmdp))) {
|
switch (tolower(param_getchar(Cmd, cmdp))) {
|
||||||
|
@ -1226,11 +1225,11 @@ static int CmdHF15Restore(const char *Cmd) {
|
||||||
PrintAndLogEx(INFO, "Restoring data blocks.");
|
PrintAndLogEx(INFO, "Restoring data blocks.");
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tried = 0;
|
uint8_t tried = 0;
|
||||||
hex[0] = 0x00;
|
hex[0] = 0x00;
|
||||||
tmpCmd[0] = 0x00;
|
tmpCmd[0] = 0x00;
|
||||||
|
|
||||||
bytes_read = fread(buff, 1, blocksize, f);
|
size_t bytes_read = fread(buff, 1, blocksize, f);
|
||||||
if (bytes_read == 0) {
|
if (bytes_read == 0) {
|
||||||
PrintAndLogEx(SUCCESS, "File reading done `%s`", filename);
|
PrintAndLogEx(SUCCESS, "File reading done `%s`", filename);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
|
@ -308,8 +308,6 @@ static int CmdHFiClassSim(const char *Cmd) {
|
||||||
return usage_hf_iclass_sim();
|
return usage_hf_iclass_sim();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t numberOfCSNs = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// pre-defined 8 CSN by Holiman
|
// pre-defined 8 CSN by Holiman
|
||||||
uint8_t csns[8*NUM_CSNS] = {
|
uint8_t csns[8*NUM_CSNS] = {
|
||||||
|
@ -478,9 +476,8 @@ static int CmdHFiClassSim(const char *Cmd) {
|
||||||
|
|
||||||
//KEYROLL 2
|
//KEYROLL 2
|
||||||
memset(dump, 0, datalen);
|
memset(dump, 0, datalen);
|
||||||
uint8_t resp_index = 0;
|
|
||||||
for (uint8_t i = 0; i < NUM_CSNS; i++) {
|
for (uint8_t i = 0; i < NUM_CSNS; i++) {
|
||||||
resp_index = (i + NUM_CSNS) * 16;
|
uint8_t resp_index = (i + NUM_CSNS) * 16;
|
||||||
// Copy CSN
|
// Copy CSN
|
||||||
memcpy(dump + i * MAC_ITEM_SIZE, csns + i * 8, 8);
|
memcpy(dump + i * MAC_ITEM_SIZE, csns + i * 8, 8);
|
||||||
// copy EPURSE
|
// copy EPURSE
|
||||||
|
@ -496,6 +493,7 @@ static int CmdHFiClassSim(const char *Cmd) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
default: {
|
default: {
|
||||||
|
uint8_t numberOfCSNs = 0;
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommandOLD(CMD_SIMULATE_TAG_ICLASS, simType, numberOfCSNs, 0, CSN, 8);
|
SendCommandOLD(CMD_SIMULATE_TAG_ICLASS, simType, numberOfCSNs, 0, CSN, 8);
|
||||||
break;
|
break;
|
||||||
|
@ -1303,7 +1301,6 @@ static int CmdHFiClassCloneTag(const char *Cmd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *ptr;
|
|
||||||
uint8_t data[(endblock - startblock) * 12];
|
uint8_t data[(endblock - startblock) * 12];
|
||||||
// calculate all mac for every the block we will write
|
// calculate all mac for every the block we will write
|
||||||
for (i = startblock; i <= endblock; i++) {
|
for (i = startblock; i <= endblock; i++) {
|
||||||
|
@ -1312,7 +1309,7 @@ static int CmdHFiClassCloneTag(const char *Cmd) {
|
||||||
// memcpy(pointer,tag_data[i - 6],8) 8 bytes
|
// memcpy(pointer,tag_data[i - 6],8) 8 bytes
|
||||||
// memcpy(pointer + 8,mac,sizoof(mac) 4 bytes;
|
// memcpy(pointer + 8,mac,sizoof(mac) 4 bytes;
|
||||||
// next one
|
// next one
|
||||||
ptr = data + (i - startblock) * 12;
|
uint8_t *ptr = data + (i - startblock) * 12;
|
||||||
memcpy(ptr, &(tag_data[i - startblock].d[0]), 8);
|
memcpy(ptr, &(tag_data[i - startblock].d[0]), 8);
|
||||||
memcpy(ptr + 8, MAC, 4);
|
memcpy(ptr + 8, MAC, 4);
|
||||||
}
|
}
|
||||||
|
@ -1335,11 +1332,10 @@ static int CmdHFiClassCloneTag(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ReadBlock(uint8_t *KEY, uint8_t blockno, uint8_t keyType, bool elite, bool rawkey, bool verbose, bool auth) {
|
static int ReadBlock(uint8_t *KEY, uint8_t blockno, uint8_t keyType, bool elite, bool rawkey, bool verbose, bool auth) {
|
||||||
uint8_t MAC[4] = {0x00, 0x00, 0x00, 0x00};
|
|
||||||
uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
||||||
|
|
||||||
// block 0,1 should always be able to read, and block 5 on some cards.
|
// block 0,1 should always be able to read, and block 5 on some cards.
|
||||||
if (auth || blockno >= 2) {
|
if (auth || blockno >= 2) {
|
||||||
|
uint8_t MAC[4] = {0x00, 0x00, 0x00, 0x00};
|
||||||
|
uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
if (!select_and_auth(KEY, MAC, div_key, (keyType == 0x18), elite, rawkey, verbose))
|
if (!select_and_auth(KEY, MAC, div_key, (keyType == 0x18), elite, rawkey, verbose))
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1445,8 +1441,8 @@ static int CmdHFiClass_loclass(const char *Cmd) {
|
||||||
if (strlen(Cmd) < 1 || opt == 'h')
|
if (strlen(Cmd) < 1 || opt == 'h')
|
||||||
usage_hf_iclass_loclass();
|
usage_hf_iclass_loclass();
|
||||||
|
|
||||||
char fileName[FILE_PATH_SIZE] = {0};
|
|
||||||
if (opt == 'f') {
|
if (opt == 'f') {
|
||||||
|
char fileName[FILE_PATH_SIZE] = {0};
|
||||||
if (param_getstr(Cmd, 1, fileName, sizeof(fileName)) > 0) {
|
if (param_getstr(Cmd, 1, fileName, sizeof(fileName)) > 0) {
|
||||||
return bruteforceFileNoKeys(fileName);
|
return bruteforceFileNoKeys(fileName);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1551,9 +1547,9 @@ static int CmdHFiClassReadTagFile(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HFiClassCalcDivKey(uint8_t *CSN, uint8_t *KEY, uint8_t *div_key, bool elite) {
|
void HFiClassCalcDivKey(uint8_t *CSN, uint8_t *KEY, uint8_t *div_key, bool elite) {
|
||||||
|
if (elite) {
|
||||||
uint8_t keytable[128] = {0};
|
uint8_t keytable[128] = {0};
|
||||||
uint8_t key_index[8] = {0};
|
uint8_t key_index[8] = {0};
|
||||||
if (elite) {
|
|
||||||
uint8_t key_sel[8] = { 0 };
|
uint8_t key_sel[8] = { 0 };
|
||||||
uint8_t key_sel_p[8] = { 0 };
|
uint8_t key_sel_p[8] = { 0 };
|
||||||
hash2(KEY, keytable);
|
hash2(KEY, keytable);
|
||||||
|
@ -1595,7 +1591,6 @@ static int CmdHFiClassCalcNewKey(const char *Cmd) {
|
||||||
uint8_t NEWKEY[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
uint8_t NEWKEY[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
uint8_t xor_div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
uint8_t xor_div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
uint8_t CSN[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
uint8_t CSN[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
uint8_t CCNR[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
||||||
uint8_t keyNbr = 0;
|
uint8_t keyNbr = 0;
|
||||||
uint8_t dataLen = 0;
|
uint8_t dataLen = 0;
|
||||||
char tempStr[50] = {0};
|
char tempStr[50] = {0};
|
||||||
|
@ -1665,9 +1660,11 @@ static int CmdHFiClassCalcNewKey(const char *Cmd) {
|
||||||
}
|
}
|
||||||
if (errors || cmdp < 4) return usage_hf_iclass_calc_newkey();
|
if (errors || cmdp < 4) return usage_hf_iclass_calc_newkey();
|
||||||
|
|
||||||
if (!givenCSN)
|
if (!givenCSN) {
|
||||||
|
uint8_t CCNR[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
if (!select_only(CSN, CCNR, false, true))
|
if (!select_only(CSN, CCNR, false, true))
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
HFiClassCalcNewKey(CSN, OLDKEY, NEWKEY, xor_div_key, elite, oldElite, true);
|
HFiClassCalcNewKey(CSN, OLDKEY, NEWKEY, xor_div_key, elite, oldElite, true);
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
|
@ -2318,11 +2315,10 @@ static void permute(uint8_t *data, uint8_t len, uint8_t *output) {
|
||||||
PrintAndLogEx(NORMAL, "[!] wrong key size\n");
|
PrintAndLogEx(NORMAL, "[!] wrong key size\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint8_t i, j, p, mask;
|
for (uint8_t i = 0; i < KEY_SIZE; ++i) {
|
||||||
for (i = 0; i < KEY_SIZE; ++i) {
|
uint8_t p = 0;
|
||||||
p = 0;
|
uint8_t mask = 0x80 >> i;
|
||||||
mask = 0x80 >> i;
|
for (uint8_t j = 0; j < KEY_SIZE; ++j) {
|
||||||
for (j = 0; j < KEY_SIZE; ++j) {
|
|
||||||
p >>= 1;
|
p >>= 1;
|
||||||
if (data[j] & mask)
|
if (data[j] & mask)
|
||||||
p |= 0x80;
|
p |= 0x80;
|
||||||
|
@ -2377,8 +2373,6 @@ static void generate(uint8_t *data, uint8_t len) {
|
||||||
static int CmdHFiClassPermuteKey(const char *Cmd) {
|
static int CmdHFiClassPermuteKey(const char *Cmd) {
|
||||||
|
|
||||||
uint8_t key[8] = {0};
|
uint8_t key[8] = {0};
|
||||||
uint8_t key_std_format[8] = {0};
|
|
||||||
uint8_t key_iclass_format[8] = {0};
|
|
||||||
uint8_t data[16] = {0};
|
uint8_t data[16] = {0};
|
||||||
bool isReverse = false;
|
bool isReverse = false;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
@ -2396,10 +2390,12 @@ static int CmdHFiClassPermuteKey(const char *Cmd) {
|
||||||
|
|
||||||
if (isReverse) {
|
if (isReverse) {
|
||||||
generate_rev(data, len);
|
generate_rev(data, len);
|
||||||
|
uint8_t key_std_format[8] = {0};
|
||||||
permutekey_rev(key, key_std_format);
|
permutekey_rev(key, key_std_format);
|
||||||
PrintAndLogEx(SUCCESS, "holiman iclass key | %s \n", sprint_hex(key_std_format, 8));
|
PrintAndLogEx(SUCCESS, "holiman iclass key | %s \n", sprint_hex(key_std_format, 8));
|
||||||
} else {
|
} else {
|
||||||
generate(data, len);
|
generate(data, len);
|
||||||
|
uint8_t key_iclass_format[8] = {0};
|
||||||
permutekey(key, key_iclass_format);
|
permutekey(key, key_iclass_format);
|
||||||
PrintAndLogEx(SUCCESS, "holiman std key | %s \n", sprint_hex(key_iclass_format, 8));
|
PrintAndLogEx(SUCCESS, "holiman std key | %s \n", sprint_hex(key_iclass_format, 8));
|
||||||
}
|
}
|
||||||
|
|
|
@ -591,10 +591,8 @@ static int CmdHF14AMfRdBl(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CmdHF14AMfRdSc(const char *Cmd) {
|
static int CmdHF14AMfRdSc(const char *Cmd) {
|
||||||
int i;
|
uint8_t sectorNo = 0, keyType = 0;
|
||||||
uint8_t isOK, sectorNo = 0, keyType = 0;
|
|
||||||
uint8_t key[6] = {0, 0, 0, 0, 0, 0};
|
uint8_t key[6] = {0, 0, 0, 0, 0, 0};
|
||||||
uint8_t *data = NULL;
|
|
||||||
char cmdp = 0x00;
|
char cmdp = 0x00;
|
||||||
|
|
||||||
if (strlen(Cmd) < 3) {
|
if (strlen(Cmd) < 3) {
|
||||||
|
@ -631,12 +629,12 @@ static int CmdHF14AMfRdSc(const char *Cmd) {
|
||||||
|
|
||||||
PacketResponseNG resp;
|
PacketResponseNG resp;
|
||||||
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
|
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
|
||||||
isOK = resp.oldarg[0] & 0xff;
|
uint8_t isOK = resp.oldarg[0] & 0xff;
|
||||||
data = resp.data.asBytes;
|
uint8_t *data = resp.data.asBytes;
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "isOk:%02x", isOK);
|
PrintAndLogEx(NORMAL, "isOk:%02x", isOK);
|
||||||
if (isOK) {
|
if (isOK) {
|
||||||
for (i = 0; i < (sectorNo < 32 ? 3 : 15); i++) {
|
for (int i = 0; i < (sectorNo < 32 ? 3 : 15); i++) {
|
||||||
PrintAndLogEx(NORMAL, "data : %s", sprint_hex(data + i * 16, 16));
|
PrintAndLogEx(NORMAL, "data : %s", sprint_hex(data + i * 16, 16));
|
||||||
}
|
}
|
||||||
PrintAndLogEx(NORMAL, "trailer: %s", sprint_hex(data + (sectorNo < 32 ? 3 : 15) * 16, 16));
|
PrintAndLogEx(NORMAL, "trailer: %s", sprint_hex(data + (sectorNo < 32 ? 3 : 15) * 16, 16));
|
||||||
|
@ -644,7 +642,7 @@ static int CmdHF14AMfRdSc(const char *Cmd) {
|
||||||
PrintAndLogEx(NORMAL, "Trailer decoded:");
|
PrintAndLogEx(NORMAL, "Trailer decoded:");
|
||||||
int bln = mfFirstBlockOfSector(sectorNo);
|
int bln = mfFirstBlockOfSector(sectorNo);
|
||||||
int blinc = (mfNumBlocksPerSector(sectorNo) > 4) ? 5 : 1;
|
int blinc = (mfNumBlocksPerSector(sectorNo) > 4) ? 5 : 1;
|
||||||
for (i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
PrintAndLogEx(NORMAL, "Access block %d%s: %s", bln, ((blinc > 1) && (i < 3) ? "+" : ""), mfGetAccessConditionsDesc(i, &(data + (sectorNo < 32 ? 3 : 15) * 16)[6]));
|
PrintAndLogEx(NORMAL, "Access block %d%s: %s", bln, ((blinc > 1) && (i < 3) ? "+" : ""), mfGetAccessConditionsDesc(i, &(data + (sectorNo < 32 ? 3 : 15) * 16)[6]));
|
||||||
bln += blinc;
|
bln += blinc;
|
||||||
}
|
}
|
||||||
|
@ -1065,9 +1063,7 @@ static int CmdHF14AMfRestore(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CmdHF14AMfNested(const char *Cmd) {
|
static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
int i, iterations;
|
|
||||||
sector_t *e_sector = NULL;
|
sector_t *e_sector = NULL;
|
||||||
uint8_t blockNo = 0;
|
|
||||||
uint8_t keyType = 0;
|
uint8_t keyType = 0;
|
||||||
uint8_t trgBlockNo = 0;
|
uint8_t trgBlockNo = 0;
|
||||||
uint8_t trgKeyType = 0;
|
uint8_t trgKeyType = 0;
|
||||||
|
@ -1077,16 +1073,12 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
uint64_t key64 = 0;
|
uint64_t key64 = 0;
|
||||||
bool transferToEml = false;
|
bool transferToEml = false;
|
||||||
bool createDumpFile = false;
|
bool createDumpFile = false;
|
||||||
FILE *fkeys;
|
|
||||||
uint8_t standart[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
||||||
uint8_t tempkey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
||||||
char *fptr;
|
|
||||||
|
|
||||||
if (strlen(Cmd) < 3) return usage_hf14_nested();
|
if (strlen(Cmd) < 3) return usage_hf14_nested();
|
||||||
|
|
||||||
char cmdp, ctmp;
|
char cmdp, ctmp;
|
||||||
cmdp = tolower(param_getchar(Cmd, 0));
|
cmdp = tolower(param_getchar(Cmd, 0));
|
||||||
blockNo = param_get8(Cmd, 1);
|
uint8_t blockNo = param_get8(Cmd, 1);
|
||||||
ctmp = tolower(param_getchar(Cmd, 2));
|
ctmp = tolower(param_getchar(Cmd, 2));
|
||||||
|
|
||||||
if (ctmp != 'a' && ctmp != 'b') {
|
if (ctmp != 'a' && ctmp != 'b') {
|
||||||
|
@ -1195,10 +1187,10 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
PrintAndLogEx(SUCCESS, "enter nested attack");
|
PrintAndLogEx(SUCCESS, "enter nested attack");
|
||||||
|
|
||||||
// nested sectors
|
// nested sectors
|
||||||
iterations = 0;
|
// int iterations = 0;
|
||||||
bool calibrate = true;
|
bool calibrate = true;
|
||||||
|
|
||||||
for (i = 0; i < MIFARE_SECTOR_RETRY; i++) {
|
for (int i = 0; i < MIFARE_SECTOR_RETRY; i++) {
|
||||||
for (uint8_t sectorNo = 0; sectorNo < SectorsCnt; ++sectorNo) {
|
for (uint8_t sectorNo = 0; sectorNo < SectorsCnt; ++sectorNo) {
|
||||||
for (trgKeyType = 0; trgKeyType < 2; ++trgKeyType) {
|
for (trgKeyType = 0; trgKeyType < 2; ++trgKeyType) {
|
||||||
|
|
||||||
|
@ -1217,11 +1209,11 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
break;
|
break;
|
||||||
case -4 : //key not found
|
case -4 : //key not found
|
||||||
calibrate = false;
|
calibrate = false;
|
||||||
iterations++;
|
// iterations++;
|
||||||
continue;
|
continue;
|
||||||
case -5 :
|
case -5 :
|
||||||
calibrate = false;
|
calibrate = false;
|
||||||
iterations++;
|
// iterations++;
|
||||||
e_sector[sectorNo].foundKey[trgKeyType] = 1;
|
e_sector[sectorNo].foundKey[trgKeyType] = 1;
|
||||||
e_sector[sectorNo].Key[trgKeyType] = bytes_to_num(keyBlock, 6);
|
e_sector[sectorNo].Key[trgKeyType] = bytes_to_num(keyBlock, 6);
|
||||||
|
|
||||||
|
@ -1243,7 +1235,7 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
|
|
||||||
// 20160116 If Sector A is found, but not Sector B, try just reading it of the tag?
|
// 20160116 If Sector A is found, but not Sector B, try just reading it of the tag?
|
||||||
PrintAndLogEx(INFO, "trying to read key B...");
|
PrintAndLogEx(INFO, "trying to read key B...");
|
||||||
for (i = 0; i < SectorsCnt; i++) {
|
for (int i = 0; i < SectorsCnt; i++) {
|
||||||
// KEY A but not KEY B
|
// KEY A but not KEY B
|
||||||
if (e_sector[i].foundKey[0] && !e_sector[i].foundKey[1]) {
|
if (e_sector[i].foundKey[0] && !e_sector[i].foundKey[1]) {
|
||||||
|
|
||||||
|
@ -1283,7 +1275,7 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
if (transferToEml) {
|
if (transferToEml) {
|
||||||
// fast push mode
|
// fast push mode
|
||||||
conn.block_after_ACK = true;
|
conn.block_after_ACK = true;
|
||||||
for (i = 0; i < SectorsCnt; i++) {
|
for (int i = 0; i < SectorsCnt; i++) {
|
||||||
mfEmlGetMem(keyBlock, FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1, 1);
|
mfEmlGetMem(keyBlock, FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1, 1);
|
||||||
|
|
||||||
if (e_sector[i].foundKey[0])
|
if (e_sector[i].foundKey[0])
|
||||||
|
@ -1303,12 +1295,12 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
|
|
||||||
// Create dump file
|
// Create dump file
|
||||||
if (createDumpFile) {
|
if (createDumpFile) {
|
||||||
fptr = GenerateFilename("hf-mf-", "-key.bin");
|
char *fptr = GenerateFilename("hf-mf-", "-key.bin");
|
||||||
if (fptr == NULL) {
|
if (fptr == NULL) {
|
||||||
free(e_sector);
|
free(e_sector);
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
}
|
}
|
||||||
|
FILE *fkeys;
|
||||||
if ((fkeys = fopen(fptr, "wb")) == NULL) {
|
if ((fkeys = fopen(fptr, "wb")) == NULL) {
|
||||||
PrintAndLogEx(WARNING, "could not create file " _YELLOW_("%s"), fptr);
|
PrintAndLogEx(WARNING, "could not create file " _YELLOW_("%s"), fptr);
|
||||||
free(e_sector);
|
free(e_sector);
|
||||||
|
@ -1316,7 +1308,9 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLogEx(SUCCESS, "saving keys to binary file " _YELLOW_("%s"), fptr);
|
PrintAndLogEx(SUCCESS, "saving keys to binary file " _YELLOW_("%s"), fptr);
|
||||||
for (i = 0; i < SectorsCnt; i++) {
|
uint8_t standart[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||||
|
uint8_t tempkey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||||
|
for (int i = 0; i < SectorsCnt; i++) {
|
||||||
if (e_sector[i].foundKey[0]) {
|
if (e_sector[i].foundKey[0]) {
|
||||||
num_to_bytes(e_sector[i].Key[0], 6, tempkey);
|
num_to_bytes(e_sector[i].Key[0], 6, tempkey);
|
||||||
fwrite(tempkey, 1, 6, fkeys);
|
fwrite(tempkey, 1, 6, fkeys);
|
||||||
|
@ -1324,7 +1318,7 @@ static int CmdHF14AMfNested(const char *Cmd) {
|
||||||
fwrite(&standart, 1, 6, fkeys);
|
fwrite(&standart, 1, 6, fkeys);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i < SectorsCnt; i++) {
|
for (int i = 0; i < SectorsCnt; i++) {
|
||||||
if (e_sector[i].foundKey[1]) {
|
if (e_sector[i].foundKey[1]) {
|
||||||
num_to_bytes(e_sector[i].Key[1], 6, tempkey);
|
num_to_bytes(e_sector[i].Key[1], 6, tempkey);
|
||||||
fwrite(tempkey, 1, 6, fkeys);
|
fwrite(tempkey, 1, 6, fkeys);
|
||||||
|
@ -2756,7 +2750,6 @@ static int CmdHF14AMfEKeyPrn(const char *Cmd) {
|
||||||
int i;
|
int i;
|
||||||
uint8_t numSectors;
|
uint8_t numSectors;
|
||||||
uint8_t data[16];
|
uint8_t data[16];
|
||||||
uint64_t keyA, keyB;
|
|
||||||
|
|
||||||
char c = tolower(param_getchar(Cmd, 0));
|
char c = tolower(param_getchar(Cmd, 0));
|
||||||
if (c == 'h')
|
if (c == 'h')
|
||||||
|
@ -2777,8 +2770,8 @@ static int CmdHF14AMfEKeyPrn(const char *Cmd) {
|
||||||
PrintAndLogEx(WARNING, "error get block %d", FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1);
|
PrintAndLogEx(WARNING, "error get block %d", FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
keyA = bytes_to_num(data, 6);
|
uint64_t keyA = bytes_to_num(data, 6);
|
||||||
keyB = bytes_to_num(data + 10, 6);
|
uint64_t keyB = bytes_to_num(data + 10, 6);
|
||||||
PrintAndLogEx(NORMAL, "|%03d| %012" PRIx64 " | %012" PRIx64 " |", i, keyA, keyB);
|
PrintAndLogEx(NORMAL, "|%03d| %012" PRIx64 " | %012" PRIx64 " |", i, keyA, keyB);
|
||||||
}
|
}
|
||||||
PrintAndLogEx(NORMAL, "|---|----------------|----------------|");
|
PrintAndLogEx(NORMAL, "|---|----------------|----------------|");
|
||||||
|
@ -2875,9 +2868,7 @@ static int CmdHF14AMfCSetBlk(const char *Cmd) {
|
||||||
|
|
||||||
static int CmdHF14AMfCLoad(const char *Cmd) {
|
static int CmdHF14AMfCLoad(const char *Cmd) {
|
||||||
|
|
||||||
uint8_t buf8[16] = {0x00};
|
|
||||||
uint8_t fillFromEmulator = 0;
|
uint8_t fillFromEmulator = 0;
|
||||||
int blockNum, flags = 0;
|
|
||||||
bool fillFromJson = false;
|
bool fillFromJson = false;
|
||||||
bool fillFromBin = false;
|
bool fillFromBin = false;
|
||||||
char fileName[50] = {0};
|
char fileName[50] = {0};
|
||||||
|
@ -2895,7 +2886,9 @@ static int CmdHF14AMfCLoad(const char *Cmd) {
|
||||||
|
|
||||||
|
|
||||||
if (fillFromEmulator) {
|
if (fillFromEmulator) {
|
||||||
for (blockNum = 0; blockNum < 16 * 4; blockNum += 1) {
|
for (int blockNum = 0; blockNum < 16 * 4; blockNum += 1) {
|
||||||
|
int flags = 0;
|
||||||
|
uint8_t buf8[16] = {0x00};
|
||||||
if (mfEmlGetMem(buf8, blockNum, 1)) {
|
if (mfEmlGetMem(buf8, blockNum, 1)) {
|
||||||
PrintAndLogEx(WARNING, "Cant get block: %d", blockNum);
|
PrintAndLogEx(WARNING, "Cant get block: %d", blockNum);
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -2949,7 +2942,8 @@ static int CmdHF14AMfCLoad(const char *Cmd) {
|
||||||
|
|
||||||
PrintAndLogEx(INFO, "Copying to magic card");
|
PrintAndLogEx(INFO, "Copying to magic card");
|
||||||
|
|
||||||
blockNum = 0;
|
int blockNum = 0;
|
||||||
|
int flags = 0;
|
||||||
while (datalen) {
|
while (datalen) {
|
||||||
|
|
||||||
// switch on field and send magic sequence
|
// switch on field and send magic sequence
|
||||||
|
@ -2992,17 +2986,15 @@ static int CmdHF14AMfCLoad(const char *Cmd) {
|
||||||
|
|
||||||
static int CmdHF14AMfCGetBlk(const char *Cmd) {
|
static int CmdHF14AMfCGetBlk(const char *Cmd) {
|
||||||
uint8_t data[16] = {0};
|
uint8_t data[16] = {0};
|
||||||
uint8_t blockNo = 0;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
char ctmp = tolower(param_getchar(Cmd, 0));
|
char ctmp = tolower(param_getchar(Cmd, 0));
|
||||||
if (strlen(Cmd) < 1 || ctmp == 'h') return usage_hf14_cgetblk();
|
if (strlen(Cmd) < 1 || ctmp == 'h') return usage_hf14_cgetblk();
|
||||||
|
|
||||||
blockNo = param_get8(Cmd, 0);
|
uint8_t blockNo = param_get8(Cmd, 0);
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "--block number:%2d ", blockNo);
|
PrintAndLogEx(NORMAL, "--block number:%2d ", blockNo);
|
||||||
|
|
||||||
res = mfCGetBlock(blockNo, data, MAGIC_SINGLE);
|
int res = mfCGetBlock(blockNo, data, MAGIC_SINGLE);
|
||||||
if (res) {
|
if (res) {
|
||||||
PrintAndLogEx(WARNING, "Can't read block. error=%d", res);
|
PrintAndLogEx(WARNING, "Can't read block. error=%d", res);
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
|
@ -3028,13 +3020,11 @@ static int CmdHF14AMfCGetBlk(const char *Cmd) {
|
||||||
|
|
||||||
static int CmdHF14AMfCGetSc(const char *Cmd) {
|
static int CmdHF14AMfCGetSc(const char *Cmd) {
|
||||||
uint8_t data[16] = {0};
|
uint8_t data[16] = {0};
|
||||||
uint8_t sector = 0;
|
|
||||||
int i, res, flags;
|
|
||||||
|
|
||||||
char ctmp = tolower(param_getchar(Cmd, 0));
|
char ctmp = tolower(param_getchar(Cmd, 0));
|
||||||
if (strlen(Cmd) < 1 || ctmp == 'h') return usage_hf14_cgetsc();
|
if (strlen(Cmd) < 1 || ctmp == 'h') return usage_hf14_cgetsc();
|
||||||
|
|
||||||
sector = param_get8(Cmd, 0);
|
uint8_t sector = param_get8(Cmd, 0);
|
||||||
if (sector > 39) {
|
if (sector > 39) {
|
||||||
PrintAndLogEx(WARNING, "Sector number must be less then 40");
|
PrintAndLogEx(WARNING, "Sector number must be less then 40");
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
|
@ -3049,13 +3039,13 @@ static int CmdHF14AMfCGetSc(const char *Cmd) {
|
||||||
start = 128 + (sector - 32) * 16;
|
start = 128 + (sector - 32) * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = MAGIC_INIT + MAGIC_WUPC;
|
int flags = MAGIC_INIT + MAGIC_WUPC;
|
||||||
|
|
||||||
for (i = 0; i < blocks; i++) {
|
for (int i = 0; i < blocks; i++) {
|
||||||
if (i == 1) flags = 0;
|
if (i == 1) flags = 0;
|
||||||
if (i == blocks - 1) flags = MAGIC_HALT + MAGIC_OFF;
|
if (i == blocks - 1) flags = MAGIC_HALT + MAGIC_OFF;
|
||||||
|
|
||||||
res = mfCGetBlock(start + i, data, flags);
|
int res = mfCGetBlock(start + i, data, flags);
|
||||||
if (res) {
|
if (res) {
|
||||||
PrintAndLogEx(WARNING, "Can't read block. %d error=%d", start + i, res);
|
PrintAndLogEx(WARNING, "Can't read block. %d error=%d", start + i, res);
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
|
@ -3075,10 +3065,9 @@ static int CmdHF14AMfCSave(const char *Cmd) {
|
||||||
int i, len, flags;
|
int i, len, flags;
|
||||||
uint8_t numblocks = 0, cmdp = 0;
|
uint8_t numblocks = 0, cmdp = 0;
|
||||||
uint16_t bytes = 0;
|
uint16_t bytes = 0;
|
||||||
char ctmp;
|
|
||||||
|
|
||||||
while (param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
while (param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
||||||
ctmp = tolower(param_getchar(Cmd, cmdp));
|
char ctmp = tolower(param_getchar(Cmd, cmdp));
|
||||||
switch (ctmp) {
|
switch (ctmp) {
|
||||||
case 'e':
|
case 'e':
|
||||||
useuid = true;
|
useuid = true;
|
||||||
|
|
|
@ -1038,12 +1038,7 @@ static void estimate_sum_a8(void) {
|
||||||
static int read_nonce_file(char *filename) {
|
static int read_nonce_file(char *filename) {
|
||||||
FILE *fnonces = NULL;
|
FILE *fnonces = NULL;
|
||||||
char progress_text[80] = "";
|
char progress_text[80] = "";
|
||||||
size_t bytes_read;
|
|
||||||
uint8_t trgBlockNo;
|
|
||||||
uint8_t trgKeyType;
|
|
||||||
uint8_t read_buf[9];
|
uint8_t read_buf[9];
|
||||||
uint32_t nt_enc1, nt_enc2;
|
|
||||||
uint8_t par_enc;
|
|
||||||
|
|
||||||
num_acquired_nonces = 0;
|
num_acquired_nonces = 0;
|
||||||
if ((fnonces = fopen(filename, "rb")) == NULL) {
|
if ((fnonces = fopen(filename, "rb")) == NULL) {
|
||||||
|
@ -1052,21 +1047,21 @@ static int read_nonce_file(char *filename) {
|
||||||
}
|
}
|
||||||
snprintf(progress_text, 80, "Reading nonces from file %s...", filename);
|
snprintf(progress_text, 80, "Reading nonces from file %s...", filename);
|
||||||
hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0);
|
hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0);
|
||||||
bytes_read = fread(read_buf, 1, 6, fnonces);
|
size_t bytes_read = fread(read_buf, 1, 6, fnonces);
|
||||||
if (bytes_read != 6) {
|
if (bytes_read != 6) {
|
||||||
PrintAndLogEx(WARNING, "File reading error.");
|
PrintAndLogEx(WARNING, "File reading error.");
|
||||||
fclose(fnonces);
|
fclose(fnonces);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cuid = bytes_to_num(read_buf, 4);
|
cuid = bytes_to_num(read_buf, 4);
|
||||||
trgBlockNo = bytes_to_num(read_buf + 4, 1);
|
uint8_t trgBlockNo = bytes_to_num(read_buf + 4, 1);
|
||||||
trgKeyType = bytes_to_num(read_buf + 5, 1);
|
uint8_t trgKeyType = bytes_to_num(read_buf + 5, 1);
|
||||||
|
|
||||||
bytes_read = fread(read_buf, 1, 9, fnonces);
|
bytes_read = fread(read_buf, 1, 9, fnonces);
|
||||||
while (bytes_read == 9) {
|
while (bytes_read == 9) {
|
||||||
nt_enc1 = bytes_to_num(read_buf, 4);
|
uint32_t nt_enc1 = bytes_to_num(read_buf, 4);
|
||||||
nt_enc2 = bytes_to_num(read_buf + 4, 4);
|
uint32_t nt_enc2 = bytes_to_num(read_buf + 4, 4);
|
||||||
par_enc = bytes_to_num(read_buf + 8, 1);
|
uint8_t par_enc = bytes_to_num(read_buf + 8, 1);
|
||||||
add_nonce(nt_enc1, par_enc >> 4);
|
add_nonce(nt_enc1, par_enc >> 4);
|
||||||
add_nonce(nt_enc2, par_enc & 0x0f);
|
add_nonce(nt_enc2, par_enc & 0x0f);
|
||||||
num_acquired_nonces += 2;
|
num_acquired_nonces += 2;
|
||||||
|
@ -1416,14 +1411,12 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initialize) {
|
if (!initialize) {
|
||||||
uint32_t nt_enc1, nt_enc2;
|
|
||||||
uint8_t par_enc;
|
|
||||||
uint16_t num_sampled_nonces = resp.oldarg[2];
|
uint16_t num_sampled_nonces = resp.oldarg[2];
|
||||||
uint8_t *bufp = resp.data.asBytes;
|
uint8_t *bufp = resp.data.asBytes;
|
||||||
for (uint16_t i = 0; i < num_sampled_nonces; i += 2) {
|
for (uint16_t i = 0; i < num_sampled_nonces; i += 2) {
|
||||||
nt_enc1 = bytes_to_num(bufp, 4);
|
uint32_t nt_enc1 = bytes_to_num(bufp, 4);
|
||||||
nt_enc2 = bytes_to_num(bufp + 4, 4);
|
uint32_t nt_enc2 = bytes_to_num(bufp + 4, 4);
|
||||||
par_enc = bytes_to_num(bufp + 8, 1);
|
uint8_t par_enc = bytes_to_num(bufp + 8, 1);
|
||||||
|
|
||||||
//PrintAndLogEx(NORMAL, "Encrypted nonce: %08x, encrypted_parity: %02x\n", nt_enc1, par_enc >> 4);
|
//PrintAndLogEx(NORMAL, "Encrypted nonce: %08x, encrypted_parity: %02x\n", nt_enc1, par_enc >> 4);
|
||||||
num_acquired_nonces += add_nonce(nt_enc1, par_enc >> 4);
|
num_acquired_nonces += add_nonce(nt_enc1, par_enc >> 4);
|
||||||
|
|
|
@ -1051,9 +1051,6 @@ uint32_t GetHF14AMfU_Type(void) {
|
||||||
|
|
||||||
TagTypeUL_t tagtype = UNKNOWN;
|
TagTypeUL_t tagtype = UNKNOWN;
|
||||||
iso14a_card_select_t card;
|
iso14a_card_select_t card;
|
||||||
uint8_t version[10] = {0x00};
|
|
||||||
int status = 0;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if (!ul_select(&card)) return UL_ERROR;
|
if (!ul_select(&card)) return UL_ERROR;
|
||||||
|
|
||||||
|
@ -1066,7 +1063,8 @@ uint32_t GetHF14AMfU_Type(void) {
|
||||||
|
|
||||||
if (card.uid[0] != 0x05) {
|
if (card.uid[0] != 0x05) {
|
||||||
|
|
||||||
len = ulev1_getVersion(version, sizeof(version));
|
uint8_t version[10] = {0x00};
|
||||||
|
int len = ulev1_getVersion(version, sizeof(version));
|
||||||
DropField();
|
DropField();
|
||||||
|
|
||||||
switch (len) {
|
switch (len) {
|
||||||
|
@ -1112,7 +1110,7 @@ uint32_t GetHF14AMfU_Type(void) {
|
||||||
|
|
||||||
// do UL_C check first...
|
// do UL_C check first...
|
||||||
uint8_t nonce[11] = {0x00};
|
uint8_t nonce[11] = {0x00};
|
||||||
status = ulc_requestAuthentication(nonce, sizeof(nonce));
|
int status = ulc_requestAuthentication(nonce, sizeof(nonce));
|
||||||
DropField();
|
DropField();
|
||||||
if (status > 1) {
|
if (status > 1) {
|
||||||
tagtype = UL_C;
|
tagtype = UL_C;
|
||||||
|
@ -1944,10 +1942,8 @@ static int CmdHF14AMfUDump(const char *Cmd) {
|
||||||
|
|
||||||
iso14a_card_select_t card;
|
iso14a_card_select_t card;
|
||||||
mfu_dump_t dump_file_data;
|
mfu_dump_t dump_file_data;
|
||||||
uint8_t get_pack[] = {0, 0};
|
|
||||||
uint8_t get_version[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
uint8_t get_version[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
uint8_t get_counter_tearing[][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
|
uint8_t get_counter_tearing[][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
|
||||||
uint8_t dummy_pack[] = {0, 0};
|
|
||||||
uint8_t get_signature[32];
|
uint8_t get_signature[32];
|
||||||
memset(get_signature, 0, sizeof(get_signature));
|
memset(get_signature, 0, sizeof(get_signature));
|
||||||
|
|
||||||
|
@ -1955,6 +1951,7 @@ static int CmdHF14AMfUDump(const char *Cmd) {
|
||||||
// VERSION, SIGNATURE, COUNTERS, TEARING, PACK,
|
// VERSION, SIGNATURE, COUNTERS, TEARING, PACK,
|
||||||
if (!(tagtype & UL_C || tagtype & UL)) {
|
if (!(tagtype & UL_C || tagtype & UL)) {
|
||||||
//attempt to read pack
|
//attempt to read pack
|
||||||
|
uint8_t get_pack[] = {0, 0};
|
||||||
if (!ul_auth_select(&card, tagtype, true, authKeyPtr, get_pack, sizeof(get_pack))) {
|
if (!ul_auth_select(&card, tagtype, true, authKeyPtr, get_pack, sizeof(get_pack))) {
|
||||||
//reset pack
|
//reset pack
|
||||||
get_pack[0] = 0;
|
get_pack[0] = 0;
|
||||||
|
@ -1969,9 +1966,10 @@ static int CmdHF14AMfUDump(const char *Cmd) {
|
||||||
memcpy(data + (pages * 4) - 4, get_pack, sizeof(get_pack));
|
memcpy(data + (pages * 4) - 4, get_pack, sizeof(get_pack));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasAuthKey)
|
if (hasAuthKey) {
|
||||||
|
uint8_t dummy_pack[] = {0, 0};
|
||||||
ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack));
|
ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack));
|
||||||
else
|
} else
|
||||||
ul_select(&card);
|
ul_select(&card);
|
||||||
|
|
||||||
ulev1_getVersion(get_version, sizeof(get_version));
|
ulev1_getVersion(get_version, sizeof(get_version));
|
||||||
|
@ -1981,9 +1979,10 @@ static int CmdHF14AMfUDump(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
DropField();
|
DropField();
|
||||||
if (hasAuthKey)
|
if (hasAuthKey) {
|
||||||
|
uint8_t dummy_pack[] = {0, 0};
|
||||||
ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack));
|
ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack));
|
||||||
else
|
} else
|
||||||
ul_select(&card);
|
ul_select(&card);
|
||||||
|
|
||||||
ulev1_readSignature(get_signature, sizeof(get_signature));
|
ulev1_readSignature(get_signature, sizeof(get_signature));
|
||||||
|
|
|
@ -898,7 +898,6 @@ int EM4x50Read(const char *Cmd, bool verbose) {
|
||||||
// get rid of leading crap
|
// get rid of leading crap
|
||||||
snprintf(tmp, sizeof(tmp), "%i", skip);
|
snprintf(tmp, sizeof(tmp), "%i", skip);
|
||||||
CmdLtrim(tmp);
|
CmdLtrim(tmp);
|
||||||
bool pTest;
|
|
||||||
bool AllPTest = true;
|
bool AllPTest = true;
|
||||||
// now work through remaining buffer printing out data blocks
|
// now work through remaining buffer printing out data blocks
|
||||||
block = 0;
|
block = 0;
|
||||||
|
@ -930,7 +929,7 @@ int EM4x50Read(const char *Cmd, bool verbose) {
|
||||||
//set DemodBufferLen to just one block
|
//set DemodBufferLen to just one block
|
||||||
DemodBufferLen = skip / clk;
|
DemodBufferLen = skip / clk;
|
||||||
//test parities
|
//test parities
|
||||||
pTest = EM_ByteParityTest(DemodBuffer, DemodBufferLen, 5, 9, 0);
|
bool pTest = EM_ByteParityTest(DemodBuffer, DemodBufferLen, 5, 9, 0);
|
||||||
pTest &= EM_EndParityTest(DemodBuffer, DemodBufferLen, 5, 9, 0);
|
pTest &= EM_EndParityTest(DemodBuffer, DemodBufferLen, 5, 9, 0);
|
||||||
AllPTest &= pTest;
|
AllPTest &= pTest;
|
||||||
//get output
|
//get output
|
||||||
|
|
|
@ -89,9 +89,8 @@ static int CmdIndalaDemod(const char *Cmd) {
|
||||||
setClockGrid(g_DemodClock, g_DemodStartIdx + (idx * g_DemodClock));
|
setClockGrid(g_DemodClock, g_DemodStartIdx + (idx * g_DemodClock));
|
||||||
|
|
||||||
//convert UID to HEX
|
//convert UID to HEX
|
||||||
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
|
uint32_t uid1 = bytebits_to_byte(DemodBuffer, 32);
|
||||||
uid1 = bytebits_to_byte(DemodBuffer, 32);
|
uint32_t uid2 = bytebits_to_byte(DemodBuffer + 32, 32);
|
||||||
uid2 = bytebits_to_byte(DemodBuffer + 32, 32);
|
|
||||||
uint64_t foo = (((uint64_t)uid1 << 32) & 0x1FFFFFFF) | (uid2 & 0x7FFFFFFF);
|
uint64_t foo = (((uint64_t)uid1 << 32) & 0x1FFFFFFF) | (uid2 & 0x7FFFFFFF);
|
||||||
|
|
||||||
if (DemodBufferLen == 64) {
|
if (DemodBufferLen == 64) {
|
||||||
|
@ -137,11 +136,11 @@ static int CmdIndalaDemod(const char *Cmd) {
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
uid3 = bytebits_to_byte(DemodBuffer + 64, 32);
|
uint32_t uid3 = bytebits_to_byte(DemodBuffer + 64, 32);
|
||||||
uid4 = bytebits_to_byte(DemodBuffer + 96, 32);
|
uint32_t uid4 = bytebits_to_byte(DemodBuffer + 96, 32);
|
||||||
uid5 = bytebits_to_byte(DemodBuffer + 128, 32);
|
uint32_t uid5 = bytebits_to_byte(DemodBuffer + 128, 32);
|
||||||
uid6 = bytebits_to_byte(DemodBuffer + 160, 32);
|
uint32_t uid6 = bytebits_to_byte(DemodBuffer + 160, 32);
|
||||||
uid7 = bytebits_to_byte(DemodBuffer + 192, 32);
|
uint32_t uid7 = bytebits_to_byte(DemodBuffer + 192, 32);
|
||||||
PrintAndLogEx(
|
PrintAndLogEx(
|
||||||
SUCCESS
|
SUCCESS
|
||||||
, "Indala Found - bitlength %d, Raw 0x%x%08x%08x%08x%08x%08x%08x"
|
, "Indala Found - bitlength %d, Raw 0x%x%08x%08x%08x%08x%08x%08x"
|
||||||
|
@ -288,9 +287,9 @@ static int CmdIndalaDemodAlt(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//convert UID to HEX
|
//convert UID to HEX
|
||||||
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
|
|
||||||
int idx;
|
int idx;
|
||||||
uid1 = uid2 = 0;
|
uint32_t uid1 = 0;
|
||||||
|
uint32_t uid2 = 0;
|
||||||
|
|
||||||
if (uidlen == 64) {
|
if (uidlen == 64) {
|
||||||
for (idx = 0; idx < 64; idx++) {
|
for (idx = 0; idx < 64; idx++) {
|
||||||
|
@ -304,7 +303,11 @@ static int CmdIndalaDemodAlt(const char *Cmd) {
|
||||||
}
|
}
|
||||||
PrintAndLogEx(SUCCESS, "UID | %s (%x%08x)", showbits, uid1, uid2);
|
PrintAndLogEx(SUCCESS, "UID | %s (%x%08x)", showbits, uid1, uid2);
|
||||||
} else {
|
} else {
|
||||||
uid3 = uid4 = uid5 = uid6 = uid7 = 0;
|
uint32_t uid3 = 0;
|
||||||
|
uint32_t uid4 = 0;
|
||||||
|
uint32_t uid5 = 0;
|
||||||
|
uint32_t uid6 = 0;
|
||||||
|
uint32_t uid7 = 0;
|
||||||
|
|
||||||
for (idx = 0; idx < 224; idx++) {
|
for (idx = 0; idx < 224; idx++) {
|
||||||
uid1 = (uid1 << 1) | (uid2 >> 31);
|
uid1 = (uid1 << 1) | (uid2 >> 31);
|
||||||
|
|
|
@ -284,20 +284,19 @@ static int CmdLFNedapChk(const char *Cmd) {
|
||||||
//uint8_t last = GetParity(data, EVEN, 62);
|
//uint8_t last = GetParity(data, EVEN, 62);
|
||||||
//PrintAndLogEx(NORMAL, "TEST PARITY:: %d | %d ", DemodBuffer[62], last);
|
//PrintAndLogEx(NORMAL, "TEST PARITY:: %d | %d ", DemodBuffer[62], last);
|
||||||
|
|
||||||
uint8_t cl = 0x1D, ch = 0x1D, carry = 0;
|
uint8_t cl = 0x1D, ch = 0x1D;
|
||||||
uint8_t al, bl, temp;
|
|
||||||
|
|
||||||
for (int i = len; i >= 0; --i) {
|
for (int i = len; i >= 0; --i) {
|
||||||
al = data[i];
|
uint8_t al = data[i];
|
||||||
for (int j = 8; j > 0; --j) {
|
for (int j = 8; j > 0; --j) {
|
||||||
|
|
||||||
bl = al ^ ch;
|
uint8_t bl = al ^ ch;
|
||||||
//PrintAndLogEx(NORMAL, "BL %02x | CH %02x \n", al, ch);
|
//PrintAndLogEx(NORMAL, "BL %02x | CH %02x \n", al, ch);
|
||||||
|
|
||||||
carry = (cl & 0x80) ? 1 : 0;
|
uint8_t carry = (cl & 0x80) ? 1 : 0;
|
||||||
cl <<= 1;
|
cl <<= 1;
|
||||||
|
|
||||||
temp = (ch & 0x80) ? 1 : 0;
|
uint8_t temp = (ch & 0x80) ? 1 : 0;
|
||||||
ch = (ch << 1) | carry;
|
ch = (ch << 1) | carry;
|
||||||
carry = temp;
|
carry = temp;
|
||||||
|
|
||||||
|
@ -305,7 +304,7 @@ static int CmdLFNedapChk(const char *Cmd) {
|
||||||
al <<= 1;
|
al <<= 1;
|
||||||
|
|
||||||
carry = (bl & 0x80) ? 1 : 0;
|
carry = (bl & 0x80) ? 1 : 0;
|
||||||
bl <<= 1;
|
// bl <<= 1;
|
||||||
|
|
||||||
if (carry) {
|
if (carry) {
|
||||||
cl ^= 0x21;
|
cl ^= 0x21;
|
||||||
|
|
|
@ -213,7 +213,6 @@ int detectPresco(uint8_t *dest, size_t *size) {
|
||||||
// convert base 12 ID to sitecode & usercode & 8 bit other unknown code
|
// convert base 12 ID to sitecode & usercode & 8 bit other unknown code
|
||||||
int getWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5) {
|
int getWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5) {
|
||||||
|
|
||||||
uint8_t val = 0;
|
|
||||||
bool hex = false, errors = false;
|
bool hex = false, errors = false;
|
||||||
uint8_t cmdp = 0;
|
uint8_t cmdp = 0;
|
||||||
char id[11];
|
char id[11];
|
||||||
|
@ -250,8 +249,8 @@ int getWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode
|
||||||
if (errors || cmdp == 0) return PM3_EINVARG;
|
if (errors || cmdp == 0) return PM3_EINVARG;
|
||||||
|
|
||||||
if (!hex) {
|
if (!hex) {
|
||||||
|
uint8_t val = 0;
|
||||||
for (int index = 0; index < strlen(id); ++index) {
|
for (int index = 0; index < strlen(id); ++index) {
|
||||||
|
|
||||||
// Get value from number string.
|
// Get value from number string.
|
||||||
if (id[index] == '*')
|
if (id[index] == '*')
|
||||||
val = 10;
|
val = 10;
|
||||||
|
|
|
@ -154,28 +154,27 @@ static int CmdPyramidDemod(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t fmtLen = size - j - 8;
|
uint8_t fmtLen = size - j - 8;
|
||||||
uint32_t fc, cardnum, code1;
|
|
||||||
|
|
||||||
if (fmtLen == 26) {
|
if (fmtLen == 26) {
|
||||||
fc = bytebits_to_byte(bits + 73, 8);
|
uint32_t fc = bytebits_to_byte(bits + 73, 8);
|
||||||
cardnum = bytebits_to_byte(bits + 81, 16);
|
uint32_t cardnum = bytebits_to_byte(bits + 81, 16);
|
||||||
code1 = bytebits_to_byte(bits + 72, fmtLen);
|
uint32_t code1 = bytebits_to_byte(bits + 72, fmtLen);
|
||||||
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi3, rawHi2, rawHi, rawLo);
|
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi3, rawHi2, rawHi, rawLo);
|
||||||
} else if (fmtLen == 45) {
|
} else if (fmtLen == 45) {
|
||||||
fmtLen = 42; //end = 10 bits not 7 like 26 bit fmt
|
fmtLen = 42; //end = 10 bits not 7 like 26 bit fmt
|
||||||
fc = bytebits_to_byte(bits + 53, 10);
|
uint32_t fc = bytebits_to_byte(bits + 53, 10);
|
||||||
cardnum = bytebits_to_byte(bits + 63, 32);
|
uint32_t cardnum = bytebits_to_byte(bits + 63, 32);
|
||||||
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Raw: %08x%08x%08x%08x", fmtLen, fc, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
||||||
/*
|
/*
|
||||||
} else if (fmtLen > 32) {
|
} else if (fmtLen > 32) {
|
||||||
cardnum = bytebits_to_byte(bits + 81, 16);
|
uint32_t cardnum = bytebits_to_byte(bits + 81, 16);
|
||||||
//code1 = bytebits_to_byte(bits+(size-fmtLen),fmtLen-32);
|
//uint32_t code1 = bytebits_to_byte(bits+(size-fmtLen),fmtLen-32);
|
||||||
//code2 = bytebits_to_byte(bits+(size-32),32);
|
//code2 = bytebits_to_byte(bits+(size-32),32);
|
||||||
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
cardnum = bytebits_to_byte(bits + 81, 16);
|
uint32_t cardnum = bytebits_to_byte(bits + 81, 16);
|
||||||
//code1 = bytebits_to_byte(bits+(size-fmtLen),fmtLen);
|
//uint32_t code1 = bytebits_to_byte(bits+(size-fmtLen),fmtLen);
|
||||||
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
PrintAndLogEx(SUCCESS, "Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -918,9 +918,8 @@ static bool testBitRate(uint8_t readRate, uint8_t clk) {
|
||||||
bool test(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk, bool *Q5) {
|
bool test(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk, bool *Q5) {
|
||||||
|
|
||||||
if (DemodBufferLen < 64) return false;
|
if (DemodBufferLen < 64) return false;
|
||||||
uint8_t si;
|
|
||||||
for (uint8_t idx = 28; idx < 64; idx++) {
|
for (uint8_t idx = 28; idx < 64; idx++) {
|
||||||
si = idx;
|
uint8_t si = idx;
|
||||||
if (PackBits(si, 28, DemodBuffer) == 0x00) continue;
|
if (PackBits(si, 28, DemodBuffer) == 0x00) continue;
|
||||||
|
|
||||||
uint8_t safer = PackBits(si, 4, DemodBuffer);
|
uint8_t safer = PackBits(si, 4, DemodBuffer);
|
||||||
|
|
|
@ -694,7 +694,6 @@ bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms
|
||||||
ms_timeout += communication_delay();
|
ms_timeout += communication_delay();
|
||||||
|
|
||||||
__atomic_store_n(&timeout_start_time, msclock(), __ATOMIC_SEQ_CST);
|
__atomic_store_n(&timeout_start_time, msclock(), __ATOMIC_SEQ_CST);
|
||||||
uint64_t tmp_clk;
|
|
||||||
|
|
||||||
// Wait until the command is received
|
// Wait until the command is received
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -705,7 +704,7 @@ bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_clk = __atomic_load_n(&timeout_start_time, __ATOMIC_SEQ_CST);
|
uint64_t tmp_clk = __atomic_load_n(&timeout_start_time, __ATOMIC_SEQ_CST);
|
||||||
if ((ms_timeout != (size_t) -1) && (msclock() - tmp_clk > ms_timeout))
|
if ((ms_timeout != (size_t) -1) && (msclock() - tmp_clk > ms_timeout))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -778,7 +777,6 @@ static bool dl_it(uint8_t *dest, uint32_t bytes, uint32_t start_index, PacketRes
|
||||||
|
|
||||||
uint32_t bytes_completed = 0;
|
uint32_t bytes_completed = 0;
|
||||||
__atomic_store_n(&timeout_start_time, msclock(), __ATOMIC_SEQ_CST);
|
__atomic_store_n(&timeout_start_time, msclock(), __ATOMIC_SEQ_CST);
|
||||||
uint64_t tmp_clk;
|
|
||||||
|
|
||||||
// Add delay depending on the communication channel & speed
|
// Add delay depending on the communication channel & speed
|
||||||
if (ms_timeout != (size_t) -1)
|
if (ms_timeout != (size_t) -1)
|
||||||
|
@ -815,7 +813,7 @@ static bool dl_it(uint8_t *dest, uint32_t bytes, uint32_t start_index, PacketRes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_clk = __atomic_load_n(&timeout_start_time, __ATOMIC_SEQ_CST);
|
uint64_t tmp_clk = __atomic_load_n(&timeout_start_time, __ATOMIC_SEQ_CST);
|
||||||
if (msclock() - tmp_clk > ms_timeout) {
|
if (msclock() - tmp_clk > ms_timeout) {
|
||||||
PrintAndLogEx(FAILED, "Timed out while trying to download data from device");
|
PrintAndLogEx(FAILED, "Timed out while trying to download data from device");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -279,14 +279,13 @@ static int CodeCmp(const char *code1, const char *code2) {
|
||||||
|
|
||||||
const APDUCode *GetAPDUCode(uint8_t sw1, uint8_t sw2) {
|
const APDUCode *GetAPDUCode(uint8_t sw1, uint8_t sw2) {
|
||||||
char buf[6] = {0};
|
char buf[6] = {0};
|
||||||
int res;
|
|
||||||
int mineq = APDUCodeTableLen;
|
int mineq = APDUCodeTableLen;
|
||||||
int mineqindx = 0;
|
int mineqindx = 0;
|
||||||
|
|
||||||
sprintf(buf, "%02X%02X", sw1, sw2);
|
sprintf(buf, "%02X%02X", sw1, sw2);
|
||||||
|
|
||||||
for (int i = 0; i < APDUCodeTableLen; i++) {
|
for (int i = 0; i < APDUCodeTableLen; i++) {
|
||||||
res = CodeCmp(APDUCodeTable[i].ID, buf);
|
int res = CodeCmp(APDUCodeTable[i].ID, buf);
|
||||||
|
|
||||||
// equal
|
// equal
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
|
|
|
@ -220,9 +220,9 @@ int COSEGetECDSAKey(uint8_t *data, size_t datalen, bool verbose, uint8_t *public
|
||||||
}
|
}
|
||||||
|
|
||||||
// d - private key
|
// d - private key
|
||||||
uint8_t private_key[128] = {0};
|
|
||||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -4);
|
res = CborMapGetKeyById(&parser, &map, data, datalen, -4);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
uint8_t private_key[128] = {0};
|
||||||
res = CborGetBinStringValue(&map, private_key, sizeof(private_key), &len);
|
res = CborGetBinStringValue(&map, private_key, sizeof(private_key), &len);
|
||||||
cbor_check(res);
|
cbor_check(res);
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
|
|
@ -397,10 +397,6 @@ static int generate_fpga_version_info(FILE *infile[], char *infile_names[], int
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
FILE **infiles;
|
|
||||||
char **infile_names;
|
|
||||||
FILE *outfile;
|
|
||||||
|
|
||||||
if (argc == 1 || argc == 2) {
|
if (argc == 1 || argc == 2) {
|
||||||
usage();
|
usage();
|
||||||
return (EXIT_FAILURE);
|
return (EXIT_FAILURE);
|
||||||
|
@ -408,7 +404,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
if (!strcmp(argv[1], "-d")) { // Decompress
|
if (!strcmp(argv[1], "-d")) { // Decompress
|
||||||
|
|
||||||
infiles = calloc(1, sizeof(FILE *));
|
FILE **infiles = calloc(1, sizeof(FILE *));
|
||||||
if (argc != 4) {
|
if (argc != 4) {
|
||||||
usage();
|
usage();
|
||||||
free(infiles);
|
free(infiles);
|
||||||
|
@ -420,7 +416,7 @@ int main(int argc, char **argv) {
|
||||||
free(infiles);
|
free(infiles);
|
||||||
return (EXIT_FAILURE);
|
return (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
outfile = fopen(argv[3], "wb");
|
FILE *outfile = fopen(argv[3], "wb");
|
||||||
if (outfile == NULL) {
|
if (outfile == NULL) {
|
||||||
fprintf(stderr, "Error. Cannot open output file %s\n\n", argv[3]);
|
fprintf(stderr, "Error. Cannot open output file %s\n\n", argv[3]);
|
||||||
free(infiles);
|
free(infiles);
|
||||||
|
@ -450,8 +446,8 @@ int main(int argc, char **argv) {
|
||||||
num_input_files = argc - 2;
|
num_input_files = argc - 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
infiles = calloc(num_input_files, sizeof(FILE *));
|
FILE **infiles = calloc(num_input_files, sizeof(FILE *));
|
||||||
infile_names = calloc(num_input_files, sizeof(char *));
|
char **infile_names = calloc(num_input_files, sizeof(char *));
|
||||||
for (uint16_t i = 0; i < num_input_files; i++) {
|
for (uint16_t i = 0; i < num_input_files; i++) {
|
||||||
infile_names[i] = argv[i + ((hardnested_mode || generate_version_file) ? 2 : 1)];
|
infile_names[i] = argv[i + ((hardnested_mode || generate_version_file) ? 2 : 1)];
|
||||||
infiles[i] = fopen(infile_names[i], "rb");
|
infiles[i] = fopen(infile_names[i], "rb");
|
||||||
|
@ -462,7 +458,7 @@ int main(int argc, char **argv) {
|
||||||
return (EXIT_FAILURE);
|
return (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
outfile = fopen(argv[argc - 1], "wb");
|
FILE *outfile = fopen(argv[argc - 1], "wb");
|
||||||
if (outfile == NULL) {
|
if (outfile == NULL) {
|
||||||
fprintf(stderr, "Error. Cannot open output file %s\n\n", argv[argc - 1]);
|
fprintf(stderr, "Error. Cannot open output file %s\n\n", argv[argc - 1]);
|
||||||
free(infile_names);
|
free(infile_names);
|
||||||
|
|
|
@ -257,17 +257,15 @@ void hash0(uint64_t c, uint8_t k[8]) {
|
||||||
// z0-z7 6 bits each : 48 bits
|
// z0-z7 6 bits each : 48 bits
|
||||||
uint8_t x = (c & 0xFF00000000000000) >> 56;
|
uint8_t x = (c & 0xFF00000000000000) >> 56;
|
||||||
uint8_t y = (c & 0x00FF000000000000) >> 48;
|
uint8_t y = (c & 0x00FF000000000000) >> 48;
|
||||||
int n;
|
|
||||||
uint8_t zn, zn4, _zn, _zn4;
|
|
||||||
uint64_t zP = 0;
|
uint64_t zP = 0;
|
||||||
|
|
||||||
for (n = 0; n < 4 ; n++) {
|
for (int n = 0; n < 4 ; n++) {
|
||||||
zn = getSixBitByte(c, n);
|
uint8_t zn = getSixBitByte(c, n);
|
||||||
|
|
||||||
zn4 = getSixBitByte(c, n + 4);
|
uint8_t zn4 = getSixBitByte(c, n + 4);
|
||||||
|
|
||||||
_zn = (zn % (63 - n)) + n;
|
uint8_t _zn = (zn % (63 - n)) + n;
|
||||||
_zn4 = (zn4 % (64 - n)) + n;
|
uint8_t _zn4 = (zn4 % (64 - n)) + n;
|
||||||
|
|
||||||
pushbackSixBitByte(&zP, _zn, n);
|
pushbackSixBitByte(&zP, _zn, n);
|
||||||
pushbackSixBitByte(&zP, _zn4, n + 4);
|
pushbackSixBitByte(&zP, _zn4, n + 4);
|
||||||
|
@ -300,9 +298,8 @@ void hash0(uint64_t c, uint8_t k[8]) {
|
||||||
|
|
||||||
printState("0|0|z~", zTilde);
|
printState("0|0|z~", zTilde);
|
||||||
|
|
||||||
int i;
|
// int zerocounter = 0 ;
|
||||||
int zerocounter = 0 ;
|
for (int i = 0; i < 8; i++) {
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
// the key on index i is first a bit from y
|
// the key on index i is first a bit from y
|
||||||
// then six bits from z,
|
// then six bits from z,
|
||||||
// then a bit from p
|
// then a bit from p
|
||||||
|
@ -340,9 +337,9 @@ void hash0(uint64_t c, uint8_t k[8]) {
|
||||||
k[i] |= zTilde_i & 0x7E;
|
k[i] |= zTilde_i & 0x7E;
|
||||||
k[i] |= (~p_i) & 1;
|
k[i] |= (~p_i) & 1;
|
||||||
}
|
}
|
||||||
if ((k[i] & 1) == 0) {
|
// if ((k[i] & 1) == 0) {
|
||||||
zerocounter++;
|
// zerocounter++;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -45,7 +45,7 @@ uint32_t intersection(uint64_t *listA, uint64_t *listB) {
|
||||||
uint32_t nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint32_t ar, uint64_t par_info, uint64_t ks_info, uint64_t **keys) {
|
uint32_t nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint32_t ar, uint64_t par_info, uint64_t ks_info, uint64_t **keys) {
|
||||||
struct Crypto1State *states;
|
struct Crypto1State *states;
|
||||||
uint32_t i, pos;
|
uint32_t i, pos;
|
||||||
uint8_t bt, ks3x[8], par[8][8];
|
uint8_t ks3x[8], par[8][8];
|
||||||
uint64_t key_recovered;
|
uint64_t key_recovered;
|
||||||
uint64_t *keylist;
|
uint64_t *keylist;
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ uint32_t nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint32_t ar, uint64_t
|
||||||
|
|
||||||
for (pos = 0; pos < 8; pos++) {
|
for (pos = 0; pos < 8; pos++) {
|
||||||
ks3x[7 - pos] = (ks_info >> (pos * 8)) & 0x0F;
|
ks3x[7 - pos] = (ks_info >> (pos * 8)) & 0x0F;
|
||||||
bt = (par_info >> (pos * 8)) & 0xFF;
|
uint8_t bt = (par_info >> (pos * 8)) & 0xFF;
|
||||||
|
|
||||||
par[7 - pos][0] = (bt >> 0) & 1;
|
par[7 - pos][0] = (bt >> 0) & 1;
|
||||||
par[7 - pos][1] = (bt >> 1) & 1;
|
par[7 - pos][1] = (bt >> 1) & 1;
|
||||||
|
|
|
@ -339,16 +339,16 @@ int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo,
|
||||||
while (p1 <= statelists[0].tail.sltail && p2 <= statelists[1].tail.sltail) {
|
while (p1 <= statelists[0].tail.sltail && p2 <= statelists[1].tail.sltail) {
|
||||||
if (Compare16Bits(p1, p2) == 0) {
|
if (Compare16Bits(p1, p2) == 0) {
|
||||||
|
|
||||||
struct Crypto1State savestate, *savep = &savestate;
|
struct Crypto1State savestate;
|
||||||
savestate = *p1;
|
savestate = *p1;
|
||||||
while (Compare16Bits(p1, savep) == 0 && p1 <= statelists[0].tail.sltail) {
|
while (Compare16Bits(p1, &savestate) == 0 && p1 <= statelists[0].tail.sltail) {
|
||||||
*p3 = *p1;
|
*p3 = *p1;
|
||||||
lfsr_rollback_word(p3, statelists[0].nt ^ statelists[0].uid, 0);
|
lfsr_rollback_word(p3, statelists[0].nt ^ statelists[0].uid, 0);
|
||||||
p3++;
|
p3++;
|
||||||
p1++;
|
p1++;
|
||||||
}
|
}
|
||||||
savestate = *p2;
|
savestate = *p2;
|
||||||
while (Compare16Bits(p2, savep) == 0 && p2 <= statelists[1].tail.sltail) {
|
while (Compare16Bits(p2, &savestate) == 0 && p2 <= statelists[1].tail.sltail) {
|
||||||
*p4 = *p2;
|
*p4 = *p2;
|
||||||
lfsr_rollback_word(p4, statelists[1].nt ^ statelists[1].uid, 0);
|
lfsr_rollback_word(p4, statelists[1].nt ^ statelists[1].uid, 0);
|
||||||
p4++;
|
p4++;
|
||||||
|
@ -710,10 +710,6 @@ void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool i
|
||||||
}
|
}
|
||||||
|
|
||||||
int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) {
|
int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) {
|
||||||
uint32_t nt = 0; // tag challenge
|
|
||||||
uint32_t nr_enc = 0; // encrypted reader challenge
|
|
||||||
uint32_t ar_enc = 0; // encrypted reader response
|
|
||||||
uint32_t at_enc = 0; // encrypted tag response
|
|
||||||
if (traceState == TRACE_ERROR)
|
if (traceState == TRACE_ERROR)
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
|
|
||||||
|
@ -831,6 +827,10 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) {
|
||||||
break;
|
break;
|
||||||
case TRACE_AUTH_OK:
|
case TRACE_AUTH_OK:
|
||||||
if (len == 4) {
|
if (len == 4) {
|
||||||
|
uint32_t nt = 0; // tag challenge
|
||||||
|
uint32_t nr_enc = 0; // encrypted reader challenge
|
||||||
|
uint32_t ar_enc = 0; // encrypted reader response
|
||||||
|
uint32_t at_enc = 0; // encrypted tag response
|
||||||
traceState = TRACE_IDLE;
|
traceState = TRACE_IDLE;
|
||||||
// encrypted tag response
|
// encrypted tag response
|
||||||
at_enc = bytes_to_num(data, 4);
|
at_enc = bytes_to_num(data, 4);
|
||||||
|
|
|
@ -167,12 +167,11 @@ static int l_unpack(lua_State *L) { /** unpack(f,s, [init]) */
|
||||||
case OP_HEX: {
|
case OP_HEX: {
|
||||||
luaL_Buffer buf;
|
luaL_Buffer buf;
|
||||||
char hdigit = '0';
|
char hdigit = '0';
|
||||||
int val = 0;
|
|
||||||
luaL_buffinit(L, &buf);
|
luaL_buffinit(L, &buf);
|
||||||
N++;
|
N++;
|
||||||
if (i + N > len) {done = 1; break;}
|
if (i + N > len) {done = 1; break;}
|
||||||
for (unsigned int ii = i; ii < i + N; ii++) {
|
for (unsigned int ii = i; ii < i + N; ii++) {
|
||||||
val = s[ii] & 0xF0;
|
int val = s[ii] & 0xF0;
|
||||||
val = val >> 4;
|
val = val >> 4;
|
||||||
hdigit = HEXDIGITS(val);
|
hdigit = HEXDIGITS(val);
|
||||||
luaL_addlstring(&buf, &hdigit, 1);
|
luaL_addlstring(&buf, &hdigit, 1);
|
||||||
|
|
|
@ -338,6 +338,7 @@ static int l_WaitForResponseTimeout(lua_State *L) {
|
||||||
|
|
||||||
memcpy(foo + n, &resp.ng, sizeof(resp.ng));
|
memcpy(foo + n, &resp.ng, sizeof(resp.ng));
|
||||||
n += sizeof(resp.ng);
|
n += sizeof(resp.ng);
|
||||||
|
(void) n;
|
||||||
|
|
||||||
//Push it as a string
|
//Push it as a string
|
||||||
lua_pushlstring(L, (const char *)&foo, sizeof(foo));
|
lua_pushlstring(L, (const char *)&foo, sizeof(foo));
|
||||||
|
@ -995,7 +996,7 @@ static int l_T55xx_detect(lua_State *L) {
|
||||||
//
|
//
|
||||||
static int l_ndefparse(lua_State *L) {
|
static int l_ndefparse(lua_State *L) {
|
||||||
|
|
||||||
size_t len = 0, size;
|
size_t size;
|
||||||
|
|
||||||
//Check number of arguments
|
//Check number of arguments
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
|
@ -1021,7 +1022,6 @@ static int l_ndefparse(lua_State *L) {
|
||||||
for (int i = 0; i < size; i += 2) {
|
for (int i = 0; i < size; i += 2) {
|
||||||
sscanf(&p_data[i], "%02x", &tmp);
|
sscanf(&p_data[i], "%02x", &tmp);
|
||||||
data[i >> 1] = tmp & 0xFF;
|
data[i >> 1] = tmp & 0xFF;
|
||||||
len++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -234,13 +234,13 @@ void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) {
|
||||||
uint8_t *rsrc = (uint8_t *)src;
|
uint8_t *rsrc = (uint8_t *)src;
|
||||||
uint16_t si = 0;
|
uint16_t si = 0;
|
||||||
for (uint16_t i = 0; i < n; i++) {
|
for (uint16_t i = 0; i < n; i++) {
|
||||||
if ((rsrc[i] == '\x1b')
|
if ((i < n - 1)
|
||||||
&& (i < n - 1)
|
&& (rsrc[i] == '\x1b')
|
||||||
&& (rsrc[i + 1] >= 0x40)
|
&& (rsrc[i + 1] >= 0x40)
|
||||||
&& (rsrc[i + 1] <= 0x5F)) { // entering ANSI sequence
|
&& (rsrc[i + 1] <= 0x5F)) { // entering ANSI sequence
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
if ((rsrc[i] == '[') && (i < n - 1)) { // entering CSI sequence
|
if ((i < n - 1) && (rsrc[i] == '[')) { // entering CSI sequence
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
while ((i < n - 1) && (rsrc[i] >= 0x30) && (rsrc[i] <= 0x3F)) { // parameter bytes
|
while ((i < n - 1) && (rsrc[i] >= 0x30) && (rsrc[i] <= 0x3F)) { // parameter bytes
|
||||||
|
|
|
@ -29,10 +29,9 @@ extern void bucket_sort_intersect(uint32_t *const estart, uint32_t *const estop,
|
||||||
|
|
||||||
// write back intersecting buckets as sorted list.
|
// write back intersecting buckets as sorted list.
|
||||||
// fill in bucket_info with head and tail of the bucket contents in the list and number of non-empty buckets.
|
// fill in bucket_info with head and tail of the bucket contents in the list and number of non-empty buckets.
|
||||||
uint32_t nonempty_bucket;
|
|
||||||
for (uint32_t i = 0; i < 2; i++) {
|
for (uint32_t i = 0; i < 2; i++) {
|
||||||
p1 = start[i];
|
p1 = start[i];
|
||||||
nonempty_bucket = 0;
|
uint32_t nonempty_bucket = 0;
|
||||||
for (uint32_t j = 0x00; j <= 0xff; j++) {
|
for (uint32_t j = 0x00; j <= 0xff; j++) {
|
||||||
if (bucket[0][j].bp != bucket[0][j].head && bucket[1][j].bp != bucket[1][j].head) { // non-empty intersecting buckets only
|
if (bucket[0][j].bp != bucket[0][j].head && bucket[1][j].bp != bucket[1][j].head) { // non-empty intersecting buckets only
|
||||||
bucket_info->bucket_info[i][nonempty_bucket].head = p1;
|
bucket_info->bucket_info[i][nonempty_bucket].head = p1;
|
||||||
|
|
|
@ -369,12 +369,12 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb) {
|
||||||
*/
|
*/
|
||||||
static uint16_t *dist = 0;
|
static uint16_t *dist = 0;
|
||||||
int nonce_distance(uint32_t from, uint32_t to) {
|
int nonce_distance(uint32_t from, uint32_t to) {
|
||||||
uint16_t x, i;
|
|
||||||
if (!dist) {
|
if (!dist) {
|
||||||
dist = calloc(2 << 16, sizeof(uint8_t));
|
dist = calloc(2 << 16, sizeof(uint8_t));
|
||||||
if (!dist)
|
if (!dist)
|
||||||
return -1;
|
return -1;
|
||||||
for (x = i = 1; i; ++i) {
|
uint16_t x = 1;
|
||||||
|
for (uint16_t i = 1; i; ++i) {
|
||||||
dist[(x & 0xff) << 8 | x >> 8] = i;
|
dist[(x & 0xff) << 8 | x >> 8] = i;
|
||||||
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
||||||
}
|
}
|
||||||
|
@ -412,12 +412,12 @@ uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd) {
|
||||||
uint32_t *candidates = calloc(4 << 10, sizeof(uint8_t));
|
uint32_t *candidates = calloc(4 << 10, sizeof(uint8_t));
|
||||||
if (!candidates) return 0;
|
if (!candidates) return 0;
|
||||||
|
|
||||||
uint32_t c, entry;
|
int size = 0;
|
||||||
int size = 0, i, good;
|
|
||||||
|
|
||||||
for (i = 0; i < 1 << 21; ++i) {
|
for (int i = 0; i < 1 << 21; ++i) {
|
||||||
for (c = 0, good = 1; good && c < 8; ++c) {
|
int good = 1;
|
||||||
entry = i ^ fastfwd[isodd][c];
|
for (uint32_t c = 0; good && c < 8; ++c) {
|
||||||
|
uint32_t entry = i ^ fastfwd[isodd][c];
|
||||||
good &= (BIT(ks[c], isodd) == filter(entry >> 1));
|
good &= (BIT(ks[c], isodd) == filter(entry >> 1));
|
||||||
good &= (BIT(ks[c], isodd + 2) == filter(entry));
|
good &= (BIT(ks[c], isodd + 2) == filter(entry));
|
||||||
}
|
}
|
||||||
|
@ -434,24 +434,24 @@ uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd) {
|
||||||
* helper function which eliminates possible secret states using parity bits
|
* helper function which eliminates possible secret states using parity bits
|
||||||
*/
|
*/
|
||||||
static struct Crypto1State *check_pfx_parity(uint32_t prefix, uint32_t rresp, uint8_t parities[8][8], uint32_t odd, uint32_t even, struct Crypto1State *sl, uint32_t no_par) {
|
static struct Crypto1State *check_pfx_parity(uint32_t prefix, uint32_t rresp, uint8_t parities[8][8], uint32_t odd, uint32_t even, struct Crypto1State *sl, uint32_t no_par) {
|
||||||
uint32_t ks1, nr, ks2, rr, ks3, c, good = 1;
|
uint32_t good = 1;
|
||||||
|
|
||||||
for (c = 0; good && c < 8; ++c) {
|
for (uint32_t c = 0; good && c < 8; ++c) {
|
||||||
sl->odd = odd ^ fastfwd[1][c];
|
sl->odd = odd ^ fastfwd[1][c];
|
||||||
sl->even = even ^ fastfwd[0][c];
|
sl->even = even ^ fastfwd[0][c];
|
||||||
|
|
||||||
lfsr_rollback_bit(sl, 0, 0);
|
lfsr_rollback_bit(sl, 0, 0);
|
||||||
lfsr_rollback_bit(sl, 0, 0);
|
lfsr_rollback_bit(sl, 0, 0);
|
||||||
|
|
||||||
ks3 = lfsr_rollback_bit(sl, 0, 0);
|
uint32_t ks3 = lfsr_rollback_bit(sl, 0, 0);
|
||||||
ks2 = lfsr_rollback_word(sl, 0, 0);
|
uint32_t ks2 = lfsr_rollback_word(sl, 0, 0);
|
||||||
ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1);
|
uint32_t ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1);
|
||||||
|
|
||||||
if (no_par)
|
if (no_par)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
nr = ks1 ^ (prefix | c << 5);
|
uint32_t nr = ks1 ^ (prefix | c << 5);
|
||||||
rr = ks2 ^ rresp;
|
uint32_t rr = ks2 ^ rresp;
|
||||||
|
|
||||||
good &= evenparity32(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24);
|
good &= evenparity32(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24);
|
||||||
good &= evenparity32(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16);
|
good &= evenparity32(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16);
|
||||||
|
|
|
@ -51,16 +51,14 @@ void init_table(CrcType_t crctype) {
|
||||||
|
|
||||||
void generate_table(uint16_t polynomial, bool refin) {
|
void generate_table(uint16_t polynomial, bool refin) {
|
||||||
|
|
||||||
uint16_t i, j, crc, c;
|
for (uint16_t i = 0; i < 256; i++) {
|
||||||
|
uint16_t c, crc = 0;
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
crc = 0;
|
|
||||||
if (refin)
|
if (refin)
|
||||||
c = reflect8(i) << 8;
|
c = reflect8(i) << 8;
|
||||||
else
|
else
|
||||||
c = i << 8;
|
c = i << 8;
|
||||||
|
|
||||||
for (j = 0; j < 8; j++) {
|
for (uint16_t j = 0; j < 8; j++) {
|
||||||
|
|
||||||
if ((crc ^ c) & 0x8000)
|
if ((crc ^ c) & 0x8000)
|
||||||
crc = (crc << 1) ^ polynomial;
|
crc = (crc << 1) ^ polynomial;
|
||||||
|
@ -109,11 +107,10 @@ uint16_t crc16_fast(uint8_t const *d, size_t n, uint16_t initval, bool refin, bo
|
||||||
|
|
||||||
// bit looped solution TODO REMOVED
|
// bit looped solution TODO REMOVED
|
||||||
uint16_t update_crc16_ex(uint16_t crc, uint8_t c, uint16_t polynomial) {
|
uint16_t update_crc16_ex(uint16_t crc, uint8_t c, uint16_t polynomial) {
|
||||||
uint16_t i, v, tmp = 0;
|
uint16_t tmp = 0;
|
||||||
|
uint16_t v = (crc ^ c) & 0xff;
|
||||||
|
|
||||||
v = (crc ^ c) & 0xff;
|
for (uint16_t i = 0; i < 8; i++) {
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
|
|
||||||
if ((tmp ^ v) & 1)
|
if ((tmp ^ v) & 1)
|
||||||
tmp = (tmp >> 1) ^ polynomial;
|
tmp = (tmp >> 1) ^ polynomial;
|
||||||
|
@ -133,9 +130,8 @@ uint16_t Crc16(uint8_t const *d, size_t length, uint16_t remainder, uint16_t pol
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
return (~remainder);
|
return (~remainder);
|
||||||
|
|
||||||
uint8_t c;
|
|
||||||
for (uint32_t i = 0; i < length; ++i) {
|
for (uint32_t i = 0; i < length; ++i) {
|
||||||
c = d[i];
|
uint8_t c = d[i];
|
||||||
if (refin) c = reflect8(c);
|
if (refin) c = reflect8(c);
|
||||||
|
|
||||||
// xor in at msb
|
// xor in at msb
|
||||||
|
|
|
@ -333,7 +333,7 @@ void getNextHigh(uint8_t *samples, size_t size, int high, size_t *i) {
|
||||||
|
|
||||||
// load wave counters
|
// load wave counters
|
||||||
bool loadWaveCounters(uint8_t *samples, size_t size, int lowToLowWaveLen[], int highToLowWaveLen[], int *waveCnt, int *skip, int *minClk, int *high, int *low) {
|
bool loadWaveCounters(uint8_t *samples, size_t size, int lowToLowWaveLen[], int highToLowWaveLen[], int *waveCnt, int *skip, int *minClk, int *high, int *low) {
|
||||||
size_t i = 0, firstLow, firstHigh;
|
size_t i = 0;
|
||||||
//size_t testsize = (size < 512) ? size : 512;
|
//size_t testsize = (size < 512) ? size : 512;
|
||||||
|
|
||||||
// just noise - no super good detection. good enough
|
// just noise - no super good detection. good enough
|
||||||
|
@ -352,10 +352,10 @@ bool loadWaveCounters(uint8_t *samples, size_t size, int lowToLowWaveLen[], int
|
||||||
// populate tmpbuff buffer with pulse lengths
|
// populate tmpbuff buffer with pulse lengths
|
||||||
while (i < size) {
|
while (i < size) {
|
||||||
// measure from low to low
|
// measure from low to low
|
||||||
firstLow = i;
|
size_t firstLow = i;
|
||||||
//find first high point for this wave
|
//find first high point for this wave
|
||||||
getNextHigh(samples, size, *high, &i);
|
getNextHigh(samples, size, *high, &i);
|
||||||
firstHigh = i;
|
size_t firstHigh = i;
|
||||||
|
|
||||||
getNextLow(samples, size, *low, &i);
|
getNextLow(samples, size, *low, &i);
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ uint16_t usart_rxdata_available(void) {
|
||||||
|
|
||||||
uint32_t usart_read_ng(uint8_t *data, size_t len) {
|
uint32_t usart_read_ng(uint8_t *data, size_t len) {
|
||||||
if (len == 0) return 0;
|
if (len == 0) return 0;
|
||||||
uint32_t packetSize, nbBytesRcv = 0;
|
uint32_t nbBytesRcv = 0;
|
||||||
uint32_t try = 0;
|
uint32_t try = 0;
|
||||||
// uint32_t highest_observed_try = 0;
|
// uint32_t highest_observed_try = 0;
|
||||||
// Empirical max try observed: 3000000 / USART_BAUD_RATE
|
// Empirical max try observed: 3000000 / USART_BAUD_RATE
|
||||||
|
@ -129,7 +129,7 @@ uint32_t usart_read_ng(uint8_t *data, size_t len) {
|
||||||
while (len) {
|
while (len) {
|
||||||
uint32_t available = usart_rxdata_available();
|
uint32_t available = usart_rxdata_available();
|
||||||
|
|
||||||
packetSize = MIN(available, len);
|
uint32_t packetSize = MIN(available, len);
|
||||||
if (available > 0) {
|
if (available > 0) {
|
||||||
// Dbprintf_usb("Dbg USART ask %d bytes, available %d bytes, packetsize %d bytes", len, available, packetSize);
|
// Dbprintf_usb("Dbg USART ask %d bytes, available %d bytes, packetsize %d bytes", len, available, packetSize);
|
||||||
// highest_observed_try = MAX(highest_observed_try, try);
|
// highest_observed_try = MAX(highest_observed_try, try);
|
||||||
|
|
|
@ -766,11 +766,10 @@ int usb_write(const uint8_t *data, const size_t len) {
|
||||||
//* \brief Send Data through the control endpoint
|
//* \brief Send Data through the control endpoint
|
||||||
//*----------------------------------------------------------------------------
|
//*----------------------------------------------------------------------------
|
||||||
void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) {
|
void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) {
|
||||||
uint32_t cpt = 0;
|
|
||||||
AT91_REG csr;
|
AT91_REG csr;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cpt = MIN(length, AT91C_EP_CONTROL_SIZE);
|
uint32_t cpt = MIN(length, AT91C_EP_CONTROL_SIZE);
|
||||||
length -= cpt;
|
length -= cpt;
|
||||||
|
|
||||||
while (cpt--)
|
while (cpt--)
|
||||||
|
|
|
@ -428,12 +428,12 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb) {
|
||||||
*/
|
*/
|
||||||
static uint16_t *dist = 0;
|
static uint16_t *dist = 0;
|
||||||
int nonce_distance(uint32_t from, uint32_t to) {
|
int nonce_distance(uint32_t from, uint32_t to) {
|
||||||
uint16_t x, i;
|
|
||||||
if (!dist) {
|
if (!dist) {
|
||||||
dist = calloc(2 << 16, sizeof(uint8_t));
|
dist = calloc(2 << 16, sizeof(uint8_t));
|
||||||
if (!dist)
|
if (!dist)
|
||||||
return -1;
|
return -1;
|
||||||
for (x = i = 1; i; ++i) {
|
uint16_t x = 1;
|
||||||
|
for (uint16_t i = 1; i; ++i) {
|
||||||
dist[(x & 0xff) << 8 | x >> 8] = i;
|
dist[(x & 0xff) << 8 | x >> 8] = i;
|
||||||
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
int main(const int argc, const char *argv[]) {
|
int main(const int argc, const char *argv[]) {
|
||||||
struct Crypto1State *state;
|
struct Crypto1State *state;
|
||||||
uint32_t pos, uid, nt, nr, rr, nr_diff;
|
uint32_t pos, uid, nt, nr, rr;
|
||||||
uint8_t bt, i, ks3x[8], par[8][8];
|
uint8_t ks3x[8], par[8][8];
|
||||||
uint64_t key_recovered;
|
uint64_t key_recovered;
|
||||||
uint64_t par_info;
|
uint64_t par_info;
|
||||||
uint64_t ks_info;
|
uint64_t ks_info;
|
||||||
|
@ -28,9 +28,9 @@ int main(const int argc, const char *argv[]) {
|
||||||
|
|
||||||
for (pos = 0; pos < 8; pos++) {
|
for (pos = 0; pos < 8; pos++) {
|
||||||
ks3x[7 - pos] = (ks_info >> (pos * 8)) & 0x0f;
|
ks3x[7 - pos] = (ks_info >> (pos * 8)) & 0x0f;
|
||||||
bt = (par_info >> (pos * 8)) & 0xff;
|
uint8_t bt = (par_info >> (pos * 8)) & 0xff;
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
par[7 - pos][i] = (bt >> i) & 0x01;
|
par[7 - pos][i] = (bt >> i) & 0x01;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,8 @@ int main(const int argc, const char *argv[]) {
|
||||||
printf("|diff|{nr} |ks3|ks3^5|parity |\n");
|
printf("|diff|{nr} |ks3|ks3^5|parity |\n");
|
||||||
printf("+----+--------+---+-----+---------------+\n");
|
printf("+----+--------+---+-----+---------------+\n");
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
nr_diff = nr | i << 5;
|
uint32_t nr_diff = nr | i << 5;
|
||||||
printf("| %02x |%08x| %01x | %01x |", i << 5, nr_diff, ks3x[i], ks3x[i] ^ 5);
|
printf("| %02x |%08x| %01x | %01x |", i << 5, nr_diff, ks3x[i], ks3x[i] ^ 5);
|
||||||
|
|
||||||
for (pos = 0; pos < 7; pos++)
|
for (pos = 0; pos < 7; pos++)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue