mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
cardhelper
This commit is contained in:
parent
5c2d4a0bbd
commit
dfd408db8d
3 changed files with 21 additions and 10 deletions
|
@ -870,19 +870,18 @@ static int CmdHFiClassDecrypt(const char *Cmd) {
|
||||||
PrintAndLogEx(WARNING, "Actual file len " _YELLOW_("%u") "vs HID app-limit len " _YELLOW_("%u"), decryptedlen, applimit * 8);
|
PrintAndLogEx(WARNING, "Actual file len " _YELLOW_("%u") "vs HID app-limit len " _YELLOW_("%u"), decryptedlen, applimit * 8);
|
||||||
PrintAndLogEx(INFO, "Setting limit to " _GREEN_("%u"), limit * 8);
|
PrintAndLogEx(INFO, "Setting limit to " _GREEN_("%u"), limit * 8);
|
||||||
}
|
}
|
||||||
|
uint8_t numblocks4userid = GetNumberBlocksForUserId(decrypted + (6 * 8));
|
||||||
|
|
||||||
for (uint16_t blocknum = 0; blocknum < limit; ++blocknum) {
|
for (uint16_t blocknum = 0; blocknum < limit; ++blocknum) {
|
||||||
|
|
||||||
uint8_t idx = blocknum * 8;
|
uint8_t idx = blocknum * 8;
|
||||||
memcpy(enc_data, decrypted + idx, 8);
|
memcpy(enc_data, decrypted + idx, 8);
|
||||||
|
|
||||||
// block 7 or higher, and not empty 0xFF
|
if (aa1_encryption == RFU || aa1_encryption == None)
|
||||||
// look inside block 6 to determine if aa1 is encrypted.
|
continue;
|
||||||
if (blocknum > 6 && memcmp(enc_data, empty, 8) != 0) {
|
|
||||||
|
|
||||||
if (aa1_encryption == RFU || aa1_encryption == None)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
// Decrypted block 7,8,9 if configured.
|
||||||
|
if (blocknum > 6 && blocknum <= 6 + numblocks4userid && memcmp(enc_data, empty, 8) != 0) {
|
||||||
if (use_sc) {
|
if (use_sc) {
|
||||||
Decrypt(enc_data, decrypted + idx);
|
Decrypt(enc_data, decrypted + idx);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define CARD_INS_DECRYPT 0x01
|
#define CARD_INS_DECRYPT 0x01
|
||||||
#define CARD_INS_ENCRYPT 0x02
|
#define CARD_INS_ENCRYPT 0x02
|
||||||
#define CARD_INS_DECODE 0x06
|
#define CARD_INS_DECODE 0x06
|
||||||
|
#define CARD_INS_NUMBLOCKS 0x07
|
||||||
static uint8_t cmd[] = {0x96, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
static uint8_t cmd[] = {0x96, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
// look for CryptoHelper
|
// look for CryptoHelper
|
||||||
|
@ -64,6 +65,7 @@ bool Encrypt(uint8_t *src, uint8_t *dest) {
|
||||||
return executeCrypto(CARD_INS_ENCRYPT, src, dest);
|
return executeCrypto(CARD_INS_ENCRYPT, src, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call with block6
|
||||||
void DecodeBlock6(uint8_t *src) {
|
void DecodeBlock6(uint8_t *src) {
|
||||||
int resp_len = 0;
|
int resp_len = 0;
|
||||||
uint8_t resp[254] = {0};
|
uint8_t resp[254] = {0};
|
||||||
|
@ -81,3 +83,12 @@ void DecodeBlock6(uint8_t *src) {
|
||||||
PrintAndLogEx(SUCCESS, "%.*s", resp_len - 11, resp + 9);
|
PrintAndLogEx(SUCCESS, "%.*s", resp_len - 11, resp + 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call with block6
|
||||||
|
uint8_t GetNumberBlocksForUserId(uint8_t *src) {
|
||||||
|
int resp_len = 0;
|
||||||
|
uint8_t resp[254] = {0};
|
||||||
|
uint8_t c[] = {0x96, CARD_INS_NUMBLOCKS, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
memcpy(c + 5, src, 8);
|
||||||
|
ExchangeAPDUSC(true, c, sizeof(c), false, true, resp, sizeof(resp), &resp_len);
|
||||||
|
return resp[8];
|
||||||
|
}
|
|
@ -18,4 +18,5 @@ bool IsCryptoHelperPresent(void);
|
||||||
bool Encrypt(uint8_t *src, uint8_t *dest);
|
bool Encrypt(uint8_t *src, uint8_t *dest);
|
||||||
bool Decrypt(uint8_t *src, uint8_t *dest);
|
bool Decrypt(uint8_t *src, uint8_t *dest);
|
||||||
void DecodeBlock6(uint8_t *src);
|
void DecodeBlock6(uint8_t *src);
|
||||||
|
uint8_t GetNumberBlocksForUserId(uint8_t *src);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue