From b8c2e2531f9159ab3d5e7e9a52167d552879afc4 Mon Sep 17 00:00:00 2001 From: kormax <3392860+kormax@users.noreply.github.com> Date: Sun, 12 Apr 2026 12:40:20 +0300 Subject: [PATCH] Annotate more FeliCa commands with 'hf felica list' --- client/src/cmdhflist.c | 114 ++++++++++++++++++++++++++++++++++++----- include/protocols.h | 21 ++++++++ 2 files changed, 121 insertions(+), 14 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 80738644f..a4d12523f 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1972,48 +1972,77 @@ void annotateLegic(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { } void annotateFelica(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { - switch (cmd[3]) { - case FELICA_POLL_REQ: + if (cmdsize < 4) { + snprintf(exp, size, "?"); + return; + } + + uint16_t cmd_code = cmd[3]; + if (cmd_code >= 0xC0 && cmdsize > 4) { + // Command codes >= 0xC0 include a second-byte subcommand/function code. + cmd_code = (uint16_t)((cmd_code << 8) | cmd[4]); + } + + switch (cmd_code) { + case FELICA_POLL_REQ: { + // Polling request code is byte 6 of the trace frame. + if (cmdsize > 6) { + if (cmd[6] == 0x01) { + snprintf(exp, size, "POLLING (SYSTEM CODE)"); + break; + } + if (cmd[6] == 0x02) { + snprintf(exp, size, "POLLING (COMMUNICATION PERFORMANCE)"); + break; + } + } snprintf(exp, size, "POLLING"); break; + } case FELICA_POLL_ACK: - snprintf(exp, size, "POLL ACK"); + snprintf(exp, size, "POLLING ACK"); break; case FELICA_REQSRV_REQ: snprintf(exp, size, "REQUEST SERVICE"); break; case FELICA_REQSRV_ACK: - snprintf(exp, size, "REQ SERV ACK"); + snprintf(exp, size, "REQUEST SERVICE ACK"); break; case FELICA_REQRESP_REQ: snprintf(exp, size, "REQUEST RESPONSE"); break; case FELICA_REQRESP_ACK: - snprintf(exp, size, "REQ RESP ACK"); + snprintf(exp, size, "REQUEST RESPONSE ACK"); break; case FELICA_RDBLK_REQ: - snprintf(exp, size, "READ BLK"); + snprintf(exp, size, "READ WITHOUT ENCRYPTION"); break; case FELICA_RDBLK_ACK: - snprintf(exp, size, "READ BLK ACK"); + snprintf(exp, size, "READ WITHOUT ENCRYPTION ACK"); break; case FELICA_WRTBLK_REQ: - snprintf(exp, size, "WRITE BLK"); + snprintf(exp, size, "WRITE WITHOUT ENCRYPTION"); break; case FELICA_WRTBLK_ACK: - snprintf(exp, size, "WRITE BLK ACK"); + snprintf(exp, size, "WRITE WITHOUT ENCRYPTION ACK"); break; case FELICA_SRCHSYSCODE_REQ: snprintf(exp, size, "SEARCH SERVICE CODE"); break; case FELICA_SRCHSYSCODE_ACK: - snprintf(exp, size, "SSC ACK"); + snprintf(exp, size, "SEARCH SERVICE CODE ACK"); break; case FELICA_REQSYSCODE_REQ: snprintf(exp, size, "REQUEST SYSTEM CODE"); break; case FELICA_REQSYSCODE_ACK: - snprintf(exp, size, "RSC ACK"); + snprintf(exp, size, "REQUEST SYSTEM CODE ACK"); + break; + case FELICA_REQBLKINFO_REQ: + snprintf(exp, size, "REQUEST BLOCK INFORMATION"); + break; + case FELICA_REQBLKINFO_ACK: + snprintf(exp, size, "REQUEST BLOCK INFORMATION ACK"); break; case FELICA_AUTH1_REQ: snprintf(exp, size, "AUTH 1"); @@ -2045,11 +2074,53 @@ void annotateFelica(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case FELICA_GET_NODE_LIST_ACK: snprintf(exp, size, "REQUEST CODE LIST ACK"); break; + case FELICA_REQBLKINFO_EX_REQ: + snprintf(exp, size, "REQUEST BLOCK INFORMATION EX"); + break; + case FELICA_REQBLKINFO_EX_ACK: + snprintf(exp, size, "REQUEST BLOCK INFORMATION EX ACK"); + break; + case FELICA_SET_PARAMETER_REQ: + snprintf(exp, size, "SET PARAMETER"); + break; + case FELICA_SET_PARAMETER_ACK: + snprintf(exp, size, "SET PARAMETER ACK"); + break; + case FELICA_GET_CONTAINER_ISSUE_INFO_REQ: + snprintf(exp, size, "GET CONTAINER ISSUE INFO"); + break; + case FELICA_GET_CONTAINER_ISSUE_INFO_ACK: + snprintf(exp, size, "GET CONTAINER ISSUE INFO ACK"); + break; + case FELICA_GET_AREA_INFO_REQ: + snprintf(exp, size, "GET AREA INFO"); + break; + case FELICA_GET_AREA_INFO_ACK: + snprintf(exp, size, "GET AREA INFO ACK"); + break; + case FELICA_GET_NODE_PROPERTY_REQ: + snprintf(exp, size, "GET NODE PROPERTY"); + break; + case FELICA_GET_NODE_PROPERTY_ACK: + snprintf(exp, size, "GET NODE PROPERTY ACK"); + break; + case FELICA_GET_CONTAINER_PROPERTY_REQ: + snprintf(exp, size, "GET CONTAINER PROPERTY"); + break; + case FELICA_GET_CONTAINER_PROPERTY_ACK: + snprintf(exp, size, "GET CONTAINER PROPERTY ACK"); + break; case FELICA_REQSRV2_REQ: snprintf(exp, size, "REQUEST SERVICE v2"); break; case FELICA_REQSRV2_ACK: - snprintf(exp, size, "REQ SERV v2 ACK"); + snprintf(exp, size, "REQUEST SERVICE v2 ACK"); + break; + case FELICA_INTERNAL_AUTH_READ_REQ: + snprintf(exp, size, "INTERNAL AUTHENTICATE AND READ"); + break; + case FELICA_INTERNAL_AUTH_READ_ACK: + snprintf(exp, size, "INTERNAL AUTHENTICATE AND READ ACK"); break; case FELICA_GETSTATUS_REQ: snprintf(exp, size, "GET STATUS"); @@ -2057,11 +2128,17 @@ void annotateFelica(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case FELICA_GETSTATUS_ACK: snprintf(exp, size, "GET STATUS ACK"); break; + case FELICA_GETPLATFORMINFO_REQ: + snprintf(exp, size, "GET PLATFORM INFO"); + break; + case FELICA_GETPLATFORMINFO_ACK: + snprintf(exp, size, "GET PLATFORM INFO ACK"); + break; case FELICA_REQUEST_SPEC_VERSION_REQ: snprintf(exp, size, "REQUEST SPEC VERSION"); break; case FELICA_REQUEST_SPEC_VERSION_ACK: - snprintf(exp, size, "REQUEST SPEC ACK"); + snprintf(exp, size, "REQUEST SPEC VERSION ACK"); break; case FELICA_RESET_MODE_REQ: snprintf(exp, size, "RESET MODE"); @@ -2097,7 +2174,16 @@ void annotateFelica(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { snprintf(exp, size, "UPDATE RANDOM ID"); break; case FELICA_UPDATE_RNDID_ACK: - snprintf(exp, size, "URI ACK"); + snprintf(exp, size, "UPDATE RANDOM ID ACK"); + break; + case FELICA_GET_CONTAINER_ID_REQ: + snprintf(exp, size, "GET CONTAINER ID"); + break; + case FELICA_GET_CONTAINER_ID_ACK: + snprintf(exp, size, "GET CONTAINER ID ACK"); + break; + case FELICA_ECHO_REQ: + snprintf(exp, size, "ECHO"); break; default : snprintf(exp, size, "?"); diff --git a/include/protocols.h b/include/protocols.h index 098c84041..58b5041c0 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -837,6 +837,9 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define FELICA_REQSYSCODE_REQ 0x0c #define FELICA_REQSYSCODE_ACK 0x0d +#define FELICA_REQBLKINFO_REQ 0x0e +#define FELICA_REQBLKINFO_ACK 0x0f + #define FELICA_AUTH1_REQ 0x10 #define FELICA_AUTH1_ACK 0x11 @@ -852,15 +855,30 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define FELICA_GET_NODE_LIST_REQ 0x1a #define FELICA_GET_NODE_LIST_ACK 0x1b +#define FELICA_REQBLKINFO_EX_REQ 0x1e +#define FELICA_REQBLKINFO_EX_ACK 0x1f + +#define FELICA_SET_PARAMETER_REQ 0x20 +#define FELICA_SET_PARAMETER_ACK 0x21 + #define FELICA_GET_CONTAINER_ISSUE_INFO_REQ 0x22 #define FELICA_GET_CONTAINER_ISSUE_INFO_ACK 0x23 +#define FELICA_GET_AREA_INFO_REQ 0x24 +#define FELICA_GET_AREA_INFO_ACK 0x25 + +#define FELICA_GET_NODE_PROPERTY_REQ 0x28 +#define FELICA_GET_NODE_PROPERTY_ACK 0x29 + #define FELICA_GET_CONTAINER_PROPERTY_REQ 0x2e #define FELICA_GET_CONTAINER_PROPERTY_ACK 0x2f #define FELICA_REQSRV2_REQ 0x32 #define FELICA_REQSRV2_ACK 0x33 +#define FELICA_INTERNAL_AUTH_READ_REQ 0x34 +#define FELICA_INTERNAL_AUTH_READ_ACK 0x35 + #define FELICA_GETSTATUS_REQ 0x38 #define FELICA_GETSTATUS_ACK 0x39 @@ -890,6 +908,9 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define FELICA_GET_CONTAINER_ID_REQ 0x70 #define FELICA_GET_CONTAINER_ID_ACK 0x71 +// Echo is a two-byte command (F000). +#define FELICA_ECHO_REQ 0xF000 + // FeliCa SYSTEM list #define SYSTEMCODE_ANY 0xffff // ANY #define SYSTEMCODE_FELICA_LITE 0x88b4 // FeliCa Lite