mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
Added hf iclass sam --info
Added hf iclass sam --info command that skips any card communication command and just interacts with the SAM to return: 1- Sam Firmware Version 2- Sam Firmware ID 3- Sam Serial Number
This commit is contained in:
parent
0a4b67bd7e
commit
7fb5716ea3
5 changed files with 94 additions and 12 deletions
|
@ -218,7 +218,7 @@ out:
|
||||||
*
|
*
|
||||||
* @return Status code indicating success or failure of the operation.
|
* @return Status code indicating success or failure of the operation.
|
||||||
*/
|
*/
|
||||||
int sam_get_version(void) {
|
int sam_get_version(bool info) {
|
||||||
int res = PM3_SUCCESS;
|
int res = PM3_SUCCESS;
|
||||||
|
|
||||||
if (g_dbglevel >= DBG_DEBUG) {
|
if (g_dbglevel >= DBG_DEBUG) {
|
||||||
|
@ -268,18 +268,18 @@ int sam_get_version(void) {
|
||||||
}
|
}
|
||||||
uint8_t *sam_version_an = sam_find_asn1_node(sam_response_an, 0x80);
|
uint8_t *sam_version_an = sam_find_asn1_node(sam_response_an, 0x80);
|
||||||
if (sam_version_an == NULL) {
|
if (sam_version_an == NULL) {
|
||||||
if (g_dbglevel >= DBG_ERROR) DbpString("SAM get version failed");
|
if (g_dbglevel >= DBG_ERROR) DbpString(_RED_("SAM: get version failed"));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
uint8_t *sam_build_an = sam_find_asn1_node(sam_response_an, 0x81);
|
uint8_t *sam_build_an = sam_find_asn1_node(sam_response_an, 0x81);
|
||||||
if (sam_build_an == NULL) {
|
if (sam_build_an == NULL) {
|
||||||
if (g_dbglevel >= DBG_ERROR) DbpString("SAM get firmware ID failed");
|
if (g_dbglevel >= DBG_ERROR) DbpString(_RED_("SAM: get firmware ID failed"));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (g_dbglevel >= DBG_INFO) {
|
if (g_dbglevel >= DBG_INFO || info) {
|
||||||
DbpString("SAM get version successful");
|
DbpString(_BLUE_("-- SAM Information --"));
|
||||||
Dbprintf("Firmware version: %X.%X", sam_version_an[2], sam_version_an[3]);
|
Dbprintf(_YELLOW_("Firmware version: ")"%X.%X", sam_version_an[2], sam_version_an[3]);
|
||||||
Dbprintf("Firmware ID: ");
|
Dbprintf(_YELLOW_("Firmware ID : "));
|
||||||
Dbhexdump(sam_build_an[1], sam_build_an + 2, false);
|
Dbhexdump(sam_build_an[1], sam_build_an + 2, false);
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -298,6 +298,75 @@ out:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sam_get_serial_number(void) {
|
||||||
|
int res = PM3_SUCCESS;
|
||||||
|
|
||||||
|
if (g_dbglevel >= DBG_DEBUG) {
|
||||||
|
DbpString("start sam_get_serial_number");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *response = BigBuf_calloc(ISO7816_MAX_FRAME);
|
||||||
|
uint16_t response_len = ISO7816_MAX_FRAME;
|
||||||
|
|
||||||
|
uint8_t payload[] = {
|
||||||
|
0xa0, 0x02, // <- SAM command
|
||||||
|
0x96, 0x00 // <- get serial number
|
||||||
|
};
|
||||||
|
uint16_t payload_len = sizeof(payload);
|
||||||
|
|
||||||
|
sam_send_payload(
|
||||||
|
0x44, 0x0a, 0x44,
|
||||||
|
payload,
|
||||||
|
&payload_len,
|
||||||
|
response,
|
||||||
|
&response_len
|
||||||
|
);
|
||||||
|
|
||||||
|
//resp:
|
||||||
|
//c1 64 00 00 00
|
||||||
|
// bd 0e <- SAM response
|
||||||
|
// 8a 0c <- get serial number response
|
||||||
|
// 61 01 13 51 22 66 6e 15 3e 1b ff ff
|
||||||
|
//90 00
|
||||||
|
|
||||||
|
if (g_dbglevel >= DBG_DEBUG) {
|
||||||
|
DbpString("end sam_get_serial_number");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response[5] != 0xbd) {
|
||||||
|
Dbprintf("Invalid SAM response");
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
uint8_t *sam_response_an = sam_find_asn1_node(response + 5, 0x8a);
|
||||||
|
if (sam_response_an == NULL) {
|
||||||
|
if (g_dbglevel >= DBG_ERROR) DbpString(_RED_("SAM: get response failed"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
uint8_t *sam_serial_an = sam_response_an + 2;
|
||||||
|
if (sam_serial_an == NULL) {
|
||||||
|
if (g_dbglevel >= DBG_ERROR) DbpString(_RED_("SAM get serial number failed"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dbprintf(_YELLOW_("Sam Serial Number: "));
|
||||||
|
Dbhexdump(sam_response_an[1],sam_serial_an, false);
|
||||||
|
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
res = PM3_ESOFT;
|
||||||
|
|
||||||
|
out:
|
||||||
|
BigBuf_free();
|
||||||
|
|
||||||
|
if (g_dbglevel >= DBG_DEBUG) {
|
||||||
|
DbpString("end sam_get_serial_number");
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -39,7 +39,8 @@ int sam_send_payload(
|
||||||
uint16_t *response_len
|
uint16_t *response_len
|
||||||
);
|
);
|
||||||
|
|
||||||
int sam_get_version(void);
|
int sam_get_version(bool info);
|
||||||
|
int sam_get_serial_number(void);
|
||||||
|
|
||||||
uint8_t *sam_find_asn1_node(const uint8_t *root, const uint8_t type);
|
uint8_t *sam_find_asn1_node(const uint8_t *root, const uint8_t type);
|
||||||
void sam_append_asn1_node(const uint8_t *root, const uint8_t *node, uint8_t type, const uint8_t *const data, uint8_t len);
|
void sam_append_asn1_node(const uint8_t *root, const uint8_t *node, uint8_t type, const uint8_t *const data, uint8_t len);
|
||||||
|
|
|
@ -338,11 +338,14 @@ int sam_picopass_get_pacs(PacketCommandNG *c) {
|
||||||
const bool breakOnNrMac = !!(flags & BITMASK(2));
|
const bool breakOnNrMac = !!(flags & BITMASK(2));
|
||||||
const bool preventEpurseUpdate = !!(flags & BITMASK(3));
|
const bool preventEpurseUpdate = !!(flags & BITMASK(3));
|
||||||
const bool shallow_mod = !!(flags & BITMASK(4));
|
const bool shallow_mod = !!(flags & BITMASK(4));
|
||||||
|
const bool info = !!(flags & BITMASK(5));
|
||||||
|
|
||||||
uint8_t *cmd = c->data.asBytes + 1;
|
uint8_t *cmd = c->data.asBytes + 1;
|
||||||
uint16_t cmd_len = c->length - 1;
|
uint16_t cmd_len = c->length - 1;
|
||||||
|
|
||||||
int res = PM3_EFAILED;
|
int res = PM3_EFAILED;
|
||||||
|
uint8_t sam_response[ISO7816_MAX_FRAME] = { 0x00 };
|
||||||
|
uint8_t sam_response_len = 0;
|
||||||
|
|
||||||
clear_trace();
|
clear_trace();
|
||||||
I2C_Reset_EnterMainProgram();
|
I2C_Reset_EnterMainProgram();
|
||||||
|
@ -351,7 +354,12 @@ int sam_picopass_get_pacs(PacketCommandNG *c) {
|
||||||
StartTicks();
|
StartTicks();
|
||||||
|
|
||||||
// step 1: ping SAM
|
// step 1: ping SAM
|
||||||
sam_get_version();
|
sam_get_version(info);
|
||||||
|
|
||||||
|
if(info){
|
||||||
|
sam_get_serial_number();
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (!skipDetect) {
|
if (!skipDetect) {
|
||||||
// step 2: get card information
|
// step 2: get card information
|
||||||
|
@ -371,8 +379,6 @@ int sam_picopass_get_pacs(PacketCommandNG *c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// step 3: SamCommand RequestPACS, relay NFC communication
|
// step 3: SamCommand RequestPACS, relay NFC communication
|
||||||
uint8_t sam_response[ISO7816_MAX_FRAME] = { 0x00 };
|
|
||||||
uint8_t sam_response_len = 0;
|
|
||||||
res = sam_send_request_iso15(cmd, cmd_len, sam_response, &sam_response_len, shallow_mod, breakOnNrMac, preventEpurseUpdate);
|
res = sam_send_request_iso15(cmd, cmd_len, sam_response, &sam_response_len, shallow_mod, breakOnNrMac, preventEpurseUpdate);
|
||||||
if (res != PM3_SUCCESS) {
|
if (res != PM3_SUCCESS) {
|
||||||
goto err;
|
goto err;
|
||||||
|
|
|
@ -282,7 +282,7 @@ int sam_seos_get_pacs(PacketCommandNG *c) {
|
||||||
StartTicks();
|
StartTicks();
|
||||||
|
|
||||||
// step 1: ping SAM
|
// step 1: ping SAM
|
||||||
sam_get_version();
|
sam_get_version(false);
|
||||||
|
|
||||||
if (skipDetect == false) {
|
if (skipDetect == false) {
|
||||||
// step 2: get card information
|
// step 2: get card information
|
||||||
|
|
|
@ -5904,6 +5904,7 @@ static int CmdHFiClassSAM(const char *Cmd) {
|
||||||
arg_lit0("p", "prevent", "fake epurse update"),
|
arg_lit0("p", "prevent", "fake epurse update"),
|
||||||
arg_lit0(NULL, "shallow", "shallow mod"),
|
arg_lit0(NULL, "shallow", "shallow mod"),
|
||||||
arg_strx0("d", "data", "<hex>", "DER encoded command to send to SAM"),
|
arg_strx0("d", "data", "<hex>", "DER encoded command to send to SAM"),
|
||||||
|
arg_lit0(NULL, "info", "get SAM infos (version, serial number)"),
|
||||||
arg_param_end
|
arg_param_end
|
||||||
};
|
};
|
||||||
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
|
@ -5915,6 +5916,7 @@ static int CmdHFiClassSAM(const char *Cmd) {
|
||||||
bool break_nrmac = arg_get_lit(ctx, 5);
|
bool break_nrmac = arg_get_lit(ctx, 5);
|
||||||
bool prevent = arg_get_lit(ctx, 6);
|
bool prevent = arg_get_lit(ctx, 6);
|
||||||
bool shallow_mod = arg_get_lit(ctx, 7);
|
bool shallow_mod = arg_get_lit(ctx, 7);
|
||||||
|
bool info = arg_get_lit(ctx, 9);
|
||||||
|
|
||||||
uint8_t flags = 0;
|
uint8_t flags = 0;
|
||||||
if (disconnect_after) {
|
if (disconnect_after) {
|
||||||
|
@ -5937,6 +5939,10 @@ static int CmdHFiClassSAM(const char *Cmd) {
|
||||||
flags |= BITMASK(4);
|
flags |= BITMASK(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info) {
|
||||||
|
flags |= BITMASK(5);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t data[PM3_CMD_DATA_SIZE] = {0};
|
uint8_t data[PM3_CMD_DATA_SIZE] = {0};
|
||||||
data[0] = flags;
|
data[0] = flags;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue