| /* Copyright 2020 NXP |
| |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include "se05x_perso_api_int.h" |
| #include "smCom.h" |
| #include "global_platf.h" |
| #include "nxEnsure.h" |
| #include "string.h" |
| |
| #ifdef FLOW_VERBOSE |
| #define NX_LOG_ENABLE_HOSTLIB_DEBUG 1 |
| #endif |
| // #define NX_LOG_ENABLE_HOSTLIB_DEBUG 1 |
| |
| #include "nxLog_hostLib.h" |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| static smStatus_t Se05x_API_Perso_SetAU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, const uint8_t *in_buf, size_t in_bufLen, const char *szP1P2); |
| static smStatus_t Se05x_API_Perso_GetAU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t *out_buf, size_t *out_bufLen, const char *szP1P2); |
| static smStatus_t Se05x_API_Perso_SetU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t in_value, const char *szP1P2); |
| static smStatus_t Se05x_API_Perso_GetU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t *out_value, const char *szP1P2); |
| //static smStatus_t Se05x_API_Perso_SetU16( |
| // pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint16_t in_value, const char *szP1P2); |
| //static smStatus_t Se05x_API_Perso_GetU16( |
| // pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint16_t *out_value, const char *szP1P2); |
| |
| smStatus_t Se05x_API_Perso_SelectApplet(pSe05xSession_t session_ctx) |
| { |
| const uint8_t SE05x_PersoApplet[] = se05x_perso_APPLET_AID; |
| uint8_t rsp[100] = {0}; |
| U16 rspLen = sizeof(rsp); |
| U16 status = GP_Select(session_ctx->conn_ctx, SE05x_PersoApplet, sizeof(SE05x_PersoApplet), rsp, &rspLen); |
| return (smStatus_t)status; |
| } |
| |
| #define SE05X_API_PERSO_AU8_CREATE_BODY_SET(P1P2) \ |
| return Se05x_API_Perso_SetAU8(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, in_buf, in_bufLen, #P1P2) |
| |
| #define SE05X_API_PERSO_AU8_CREATE_BODY_GET(P1P2) \ |
| return Se05x_API_Perso_GetAU8(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, out_buf, out_bufLen, #P1P2) |
| |
| #define SE05X_API_PERSO_U8_CREATE_BODY_SET(P1P2) \ |
| return Se05x_API_Perso_SetU8(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, in_value, #P1P2) |
| |
| #define SE05X_API_PERSO_U8_CREATE_BODY_GET(P1P2) \ |
| return Se05x_API_Perso_GetU8(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, out_value, #P1P2) |
| |
| #define SE05X_API_PERSO_U16_CREATE_BODY_SET(P1P2) \ |
| return Se05x_API_Perso_SetU16(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, in_value, #P1P2) |
| |
| #define SE05X_API_PERSO_U16_CREATE_BODY_GET(P1P2) \ |
| return Se05x_API_Perso_GetU16(session_ctx, kSE05x_Cfg_##P1P2##_P1P2, out_value, #P1P2) |
| |
| #define SE05X_API_PERSO_U8_CREATE_API_BODY(P1P2) \ |
| SE05X_API_PERSO_U8_CREATE_API_SET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_U8_CREATE_BODY_SET(P1P2); \ |
| } \ |
| SE05X_API_PERSO_U8_CREATE_API_GET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_U8_CREATE_BODY_GET(P1P2); \ |
| } |
| |
| #define SE05X_API_PERSO_U16_CREATE_API_BODY(P1P2) \ |
| SE05X_API_PERSO_U16_CREATE_API_SET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_U16_CREATE_BODY_SET(P1P2); \ |
| } \ |
| SE05X_API_PERSO_U16_CREATE_API_GET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_U16_CREATE_BODY_GET(P1P2); \ |
| } |
| |
| #define SE05X_API_PERSO_AU8_CREATE_API_BODY(P1P2) \ |
| SE05X_API_PERSO_AU8_CREATE_API_SET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_AU8_CREATE_BODY_SET(P1P2); \ |
| } \ |
| SE05X_API_PERSO_AU8_CREATE_API_GET(P1P2) \ |
| { \ |
| SE05X_API_PERSO_AU8_CREATE_BODY_GET(P1P2); \ |
| } |
| |
| /* clang-format off */ |
| |
| #if 0 |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_SAK_COMPLETE); |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_L3_ACTIVATION_CONTROL); |
| #endif |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_ATS_CURRENT_HISTLEN_CHARS); |
| #if 0 |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_ATQA_MSB); |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_ATQA_LSB); |
| #endif |
| SE05X_API_PERSO_U8_CREATE_API_BODY(7816_ATR_COLD_HIST_LEN_CHARS); |
| SE05X_API_PERSO_U8_CREATE_API_BODY(7816_ATR_WARM_HIST_LEN_CHARS); |
| SE05X_API_PERSO_U8_CREATE_API_BODY(I2C_SLAVE_ADDRESS); |
| SE05X_API_PERSO_U8_CREATE_API_BODY(I2C_PARAMS); |
| #if 0 |
| SE05X_API_PERSO_U8_CREATE_API_BODY(PRSWL_ENABLED); |
| #endif |
| SE05X_API_PERSO_U8_CREATE_API_BODY(FIPS_MODE_ENABLED); |
| |
| #if 0 |
| #define kSE05x_Cfg_TCL_ATS_IF_CHARS_P1P2 kSE05x_Cfg_TCL_ATS_IF_P1P2 |
| SE05X_API_PERSO_U8_CREATE_API_BODY(TCL_ATS_IF_CHARS); |
| |
| SE05X_API_PERSO_U16_CREATE_API_BODY(OS_TIMER_INIT); |
| SE05X_API_PERSO_U16_CREATE_API_BODY(OS_TIMER_UPDATE_THRESHOLD); |
| SE05X_API_PERSO_U16_CREATE_API_BODY(GP_CONFIG); |
| |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(TCL_ATS_IF); |
| #endif |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(TCL_ATS_HISTCHARS); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(7816_ATR_COLD_HIST); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(7816_ATR_WARM_HIST); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(ATR_I2C_IF_BYTES); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(CIP_I2C_IF_BYTES); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(ATR_CIP_I2C_HIST_CHARS); |
| SE05X_API_PERSO_AU8_CREATE_API_BODY(DELETE_OS_MODULE); |
| |
| /* clang-format on */ |
| |
| #ifndef MIN |
| #define MIN(X, Y) (X < Y ? X : Y) |
| #endif |
| |
| static smStatus_t Se05x_API_Perso_GetAU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t *out_buf, size_t *out_bufLen, const char *szP1P2) |
| { |
| smStatus_t status = SM_NOT_OK; |
| uint8_t cmd_frame[7] = { |
| /* i=0 */ 0x80, |
| /* i=1 */ SE05X_PERSO_INS_READ, // read |
| /* i=2 */ 0, // P1 - Added later |
| /* i=3 */ 0, // P2 - Added later |
| /* i=4 */ 0x01, // Lc |
| /* i=5 */ 0x00, // MAX Expected Len. Added later |
| /* i=6 */ 0x00, |
| }; |
| uint8_t full_rsp[2 + 1 + 255]; |
| U32 full_rspLen = sizeof(full_rsp); |
| const uint8_t u8P1 = 0xFF & (p1p2 >> 8); |
| const uint8_t u8P2 = 0xFF & (p1p2); |
| ENSURE_OR_GO_CLEANUP(out_bufLen != NULL); |
| ENSURE_OR_GO_CLEANUP(out_buf != NULL); |
| ENSURE_OR_GO_CLEANUP(*out_bufLen > 0); |
| ENSURE_OR_GO_CLEANUP(*out_bufLen <= 255); |
| |
| cmd_frame[2] = u8P1; |
| cmd_frame[3] = u8P2; |
| cmd_frame[5] = sizeof(full_rsp) - 3; // (uint8_t)*out_bufLen; |
| |
| LOG_D("Reading %s", szP1P2); |
| status = smCom_TransceiveRaw(session_ctx->conn_ctx, cmd_frame, sizeof(cmd_frame), full_rsp, &full_rspLen); |
| ENSURE_OR_GO_CLEANUP(SM_OK == status); |
| status = SM_NOT_OK; |
| ENSURE_OR_GO_CLEANUP(full_rspLen >= (2 + 1)); |
| ENSURE_OR_GO_CLEANUP(full_rsp[0] == u8P1); |
| ENSURE_OR_GO_CLEANUP(full_rsp[1] == u8P2); |
| //ENSURE_OR_GO_CLEANUP((*out_bufLen) >= full_rsp[2]); |
| //ENSURE_OR_GO_CLEANUP((*out_bufLen) >= (full_rspLen - 3 - 2)); |
| memcpy(out_buf, &full_rsp[3], MIN(full_rspLen - 3 - 2, *out_bufLen)); |
| *out_bufLen = MIN(full_rspLen - 3 - 2, *out_bufLen); |
| status = SM_OK; |
| cleanup: |
| return status; |
| } |
| |
| static smStatus_t Se05x_API_Perso_GetU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t *out_value, const char *szP1P2) |
| { |
| size_t rxBufLen = 1; |
| return Se05x_API_Perso_GetAU8(session_ctx, p1p2, out_value, &rxBufLen, szP1P2); |
| } |
| |
| #if 0 |
| static smStatus_t Se05x_API_Perso_GetU16( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint16_t *out_value, const char *szP1P2) |
| { |
| size_t rxBufLen = 2; |
| uint8_t out_u8[2]; |
| smStatus_t status = Se05x_API_Perso_GetAU8(session_ctx, p1p2, out_u8, &rxBufLen, szP1P2); |
| if (SM_OK == status) { |
| *out_value = out_u8[0]; |
| *out_value <<= 8; |
| *out_value |= out_u8[1]; |
| } |
| return status; |
| } |
| #endif |
| |
| static smStatus_t Se05x_API_Perso_SetAU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, const uint8_t *in_buf, size_t in_bufLen, const char *szP1P2) |
| { |
| smStatus_t status = SM_NOT_OK; |
| uint8_t cmd_frame[5 + 255] = { |
| /* i=0 */ 0x80, |
| /* i=1 */ SE05X_PERSO_INS_WRITE, // read |
| /* i=2 */ 0, // P1 - Added later |
| /* i=3 */ 0, // P2 - Added later |
| /* i=4 */ 0x00, // Lc = To be added later |
| /* i=5 */ // Buffer Added later |
| }; |
| U16 cmd_frameLen; |
| ; |
| uint8_t full_rsp[2 + 1 + 255]; |
| U32 full_rspLen = sizeof(full_rsp); |
| const uint8_t u8P1 = 0xFF & (p1p2 >> 8); |
| const uint8_t u8P2 = 0xFF & (p1p2); |
| ENSURE_OR_GO_CLEANUP(in_bufLen > 0); |
| ENSURE_OR_GO_CLEANUP(in_bufLen <= 255); |
| ENSURE_OR_GO_CLEANUP(in_buf != NULL); |
| |
| cmd_frame[2] = u8P1; |
| cmd_frame[3] = u8P2; |
| cmd_frame[4] = (uint8_t)in_bufLen; |
| cmd_frameLen = 4 + 1 + (uint8_t)in_bufLen; |
| memcpy(&cmd_frame[5], in_buf, in_bufLen); |
| LOG_D("Writing %s", szP1P2); |
| status = smCom_TransceiveRaw(session_ctx->conn_ctx, cmd_frame, cmd_frameLen, full_rsp, &full_rspLen); |
| ENSURE_OR_GO_CLEANUP(SM_OK == status); |
| ENSURE_OR_GO_CLEANUP(full_rspLen == 2); |
| uint16_t rv; |
| rv = full_rsp[0]; |
| rv <<= 8; |
| rv |= full_rsp[1]; |
| status = (smStatus_t)rv; |
| |
| cleanup: |
| return status; |
| } |
| |
| static smStatus_t Se05x_API_Perso_SetU8( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint8_t in_value, const char *szP1P2) |
| { |
| return Se05x_API_Perso_SetAU8(session_ctx, p1p2, &in_value, 1, szP1P2); |
| } |
| |
| #if 0 |
| static smStatus_t Se05x_API_Perso_SetU16( |
| pSe05xSession_t session_ctx, SE05x_Cfg_P1P2_t p1p2, uint16_t in_value, const char *szP1P2) |
| { |
| uint8_t v[2]; |
| v[0] = (uint8_t)(in_value >> 8 * 1); |
| v[1] = (uint8_t)(in_value >> 8 * 0); |
| return Se05x_API_Perso_SetAU8(session_ctx, p1p2, v, 2, szP1P2); |
| } |
| #endif |