mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-11 07:46:09 -07:00
fix iclass write
thanks to prof_abrasive && go_tus
This commit is contained in:
parent
fc249a8e13
commit
671ff89fcb
1 changed files with 18 additions and 10 deletions
|
@ -1473,7 +1473,7 @@ void CodeIClassCommand(const uint8_t * cmd, int len)
|
||||||
for(j = 0; j < 4; j++) {
|
for(j = 0; j < 4; j++) {
|
||||||
for(k = 0; k < 4; k++) {
|
for(k = 0; k < 4; k++) {
|
||||||
if(k == (b & 3)) {
|
if(k == (b & 3)) {
|
||||||
ToSend[++ToSendMax] = 0x0f;
|
ToSend[++ToSendMax] = 0xf0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ToSend[++ToSendMax] = 0x00;
|
ToSend[++ToSendMax] = 0x00;
|
||||||
|
@ -1671,7 +1671,7 @@ uint8_t handshakeIclassTag_ext(uint8_t *card_data, bool use_credit_key)
|
||||||
|
|
||||||
return read_status;
|
return read_status;
|
||||||
}
|
}
|
||||||
uint8_t handshakeIclassTag(uint8_t *card_data){
|
uint8_t handshakeIclassTag(uint8_t *card_data) {
|
||||||
return handshakeIclassTag_ext(card_data, false);
|
return handshakeIclassTag_ext(card_data, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1983,19 +1983,27 @@ void iClass_Dump(uint8_t blockno, uint8_t numblks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool iClass_WriteBlock_ext(uint8_t blockNo, uint8_t *data) {
|
bool iClass_WriteBlock_ext(uint8_t blockNo, uint8_t *data) {
|
||||||
uint8_t write[] = { ICLASS_CMD_UPDATE, blockNo, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t write[] = { ICLASS_CMD_UPDATE, blockNo, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
//uint8_t readblockdata[10];
|
//uint8_t readblockdata[10];
|
||||||
//write[1] = blockNo;
|
//write[1] = blockNo;
|
||||||
memcpy(write+2, data, 12); // data + mac
|
memcpy(write+2, data, 12); // data + mac
|
||||||
|
char *wrCmd = (char *)(write+1);
|
||||||
|
uint16_t wrCrc = iclass_crc16(wrCmd, 13);
|
||||||
|
write[14] = wrCrc >> 8;
|
||||||
|
write[15] = wrCrc & 0xff;
|
||||||
uint8_t resp[] = {0,0,0,0,0,0,0,0,0,0};
|
uint8_t resp[] = {0,0,0,0,0,0,0,0,0,0};
|
||||||
bool isOK;
|
bool isOK = false;
|
||||||
|
|
||||||
isOK = sendCmdGetResponseWithRetries(write,sizeof(write),resp,sizeof(resp),10);
|
isOK = sendCmdGetResponseWithRetries(write,sizeof(write),resp,sizeof(resp),10);
|
||||||
if (isOK) {
|
if (isOK) { //if reader responded correctly
|
||||||
//Dbprintf("WriteResp: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",resp[0],resp[1],resp[2],resp[3],resp[4],resp[5],resp[6],resp[7],resp[8],resp[9]);
|
//Dbprintf("WriteResp: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",resp[0],resp[1],resp[2],resp[3],resp[4],resp[5],resp[6],resp[7],resp[8],resp[9]);
|
||||||
if (memcmp(write+2,resp,8)) {
|
if (memcmp(write+2,resp,8)) { //if response is not equal to write values
|
||||||
|
if (blockNo != 3 && blockNo != 4) { //if not programming key areas (note key blocks don't get programmed with actual key data it is xor data)
|
||||||
//error try again
|
//error try again
|
||||||
isOK = sendCmdGetResponseWithRetries(write,sizeof(write),resp,sizeof(resp),10);
|
isOK = sendCmdGetResponseWithRetries(write,sizeof(write),resp,sizeof(resp),10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return isOK;
|
return isOK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue