blob: 62af6070f66549cd295c3e7060ae4edc1e592704 [file] [log] [blame]
/*
*
* 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;
}