| /* |
| * |
| * Copyright 2016,2020 NXP |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <stddef.h> |
| #include <assert.h> |
| #include <string.h> |
| |
| #include "global_platf.h" |
| #include "smCom.h" |
| |
| #include "scp.h" |
| #include "sm_apdu.h" |
| #include "sm_errors.h" |
| |
| #include "nxLog_hostLib.h" |
| #include "nxEnsure.h" |
| |
| /** |
| * Send a select command to the card manager |
| * |
| * \param[in] appletName Pointer to a buffer containing the applet name. |
| * \param[in] appletNameLen Length of the applet name. |
| * \param[out] responseData Pointer to a buffer that will contain response data (excluding status word). |
| * \param[in,out] responseDataLen IN: size of pResponse buffer passed as argument; OUT: Length of response data retrieved |
| * |
| * \retval ::SW_OK Upon successfull execution |
| */ |
| U16 GP_Select(void *conn_ctx, const U8 *appletName, U16 appletNameLen, U8 *responseData, U16 *responseDataLen) |
| { |
| U16 rv = ERR_COMM_ERROR; |
| U32 u32RXLen = *responseDataLen; |
| |
| uint8_t tx_buf[MAX_APDU_BUF_LENGTH]; |
| uint16_t tx_len; |
| |
| ENSURE_OR_GO_CLEANUP(NULL != responseData); |
| ENSURE_OR_GO_CLEANUP(0 != responseDataLen); |
| ENSURE_OR_GO_CLEANUP(appletNameLen < 255); |
| /* cla+ins+p1+p2+lc+appletNameLen+le */ |
| ENSURE_OR_GO_CLEANUP(sizeof(tx_buf) > (6 + appletNameLen)); |
| |
| tx_buf[0] = CLA_ISO7816; |
| tx_buf[1] = INS_GP_SELECT; |
| tx_buf[2] = 4; |
| tx_buf[3] = 0; |
| |
| tx_len = 0 /* for indentation */ |
| + 1 /* CLA */ |
| + 1 /* INS */ |
| + 1 /* P1 */ |
| + 1 /* P2 */; |
| if (appletNameLen > 0) { |
| tx_buf[4] = (uint8_t)appletNameLen; // We have done ENSURE_OR_GO_CLEANUP(appletNameLen < 255); |
| tx_len = tx_len + 1 /* Lc */ |
| + appletNameLen /* Payload */ |
| + 1 /* Le */; |
| memcpy(&tx_buf[5], appletName, appletNameLen); |
| } |
| else { |
| tx_len = tx_len /* for indentation */ |
| + 0 /* No Lc */ |
| + 1 /* Le */; |
| } |
| tx_buf[tx_len - 1] = 0; /* Le */ |
| |
| // apdu_t * pApdu = (apdu_t *) &apdu; |
| // U8 isOk = 0x00; |
| |
| // pApdu->cla = CLA_ISO7816; |
| // pApdu->ins = INS_GP_SELECT; |
| // pApdu->p1 = 0x04; |
| // pApdu->p2 = 0x00; |
| |
| rv = smCom_TransceiveRaw(conn_ctx, tx_buf, tx_len, responseData, &u32RXLen); |
| if (rv == SW_OK && u32RXLen >= 2) { |
| *responseDataLen = u32RXLen - 2; |
| rv = responseData[u32RXLen - 2]; |
| rv <<= 8; |
| rv |= responseData[u32RXLen - 1]; |
| } |
| |
| cleanup: |
| return rv; |
| } |