/* | |
* | |
* Copyright 2016 NXP | |
* SPDX-License-Identifier: Apache-2.0 | |
*/ | |
/** | |
* @par Description | |
* This file defines the API of the APDU parser for AX host library. | |
* @par History | |
* 1.0 31-mar-2014 : Initial version | |
* | |
*/ | |
#ifndef _SM_APDU_H_ | |
#define _SM_APDU_H_ | |
#include "apduComm.h" | |
#include "sm_types.h" | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
#ifdef A71_IGNORE_PARAM_CHECK | |
#error "Do not remove API parameter check" | |
#endif | |
/* ------------------------------ */ | |
#define MAX_APDU_BUF_LENGTH (256 + 1024) // This value has not been optimized for TGT_A71CH (256+64) | |
#define MAX_EXT_APDU_BUF_LENGTH (32769) // extended APDU Max supported Len is 0x7FFF + 2 bytes status code | |
#define APDU_HEADER_LENGTH (5) | |
#define APDU_EXTENDED_HEADER_LENGTH (7) | |
#define EXT_CASE4_APDU_OVERHEAD (9) | |
#define SCP03_OVERHEAD (24) // padding (=16) + mac (=8) | |
#define RSP_APDU_STATUS_OVERHEAD (2) | |
#define APDU_STD_MAX_DATA (255) | |
// <Should be in a TLV specific header file> | |
#ifdef TGT_A70CI | |
#define TAG_SST_IDENTIFIER (0x01) | |
#define TAG_SST_INDEX (0x02) | |
#define TAG_ECC_PRIVATE_KEY (0x03) | |
#define TAG_ECC_PUBLIC_KEY (0x04) | |
#define TAG_SHARED_SECRET (0x05) | |
#define TAG_RSA_PRIVATE_KEY_P (0x06) | |
#define TAG_RSA_PRIVATE_KEY_Q (0x07) | |
#define TAG_RSA_PRIVATE_KEY_DP (0x08) | |
#define TAG_RSA_PRIVATE_KEY_DQ (0x09) | |
#define TAG_RSA_PRIVATE_KEY_IPQ (0x0A) | |
#define TAG_PUBLIC_KEY (0x0B) | |
#define TAG_AES_KEY (0x0C) | |
#define TAG_AUTH_PUBLIC_KEY_ID (0x0D) | |
#define TAG_CONTEXT (0x0F) | |
#define TAG_DIRECTION (0x10) | |
#define TAG_IV (0x11) | |
#define TAG_INPUT_DATA (0x12) | |
#define TAG_OUTPUT_DATA (0x13) | |
#define TAG_AUTHENTICATION_DATA (0x14) | |
#define TAG_GMAC_DATA (0x15) | |
#define TAG_GMAC_LENGTH (0x16) | |
#define TAG_KEYWRAP_ALGO (0x17) | |
#define TAG_HASH (0x18) | |
#define TAG_SIGNATURE (0x19) | |
#define TAG_VERIFICATION (0x1A) | |
#define TAG_CERTIFICATE (0x1B) | |
#define TAG_SIZE (0x1C) | |
#define TAG_SALT (0x1E) | |
#elif defined(TGT_A70CM) | |
#define TAG_DLMS_SECURITY_BYTE (0x00) | |
#define TAG_SST_IDENTIFIER (0x01) | |
#define TAG_SST_INDEX (0x02) | |
#define TAG_ECC_PRIVATE_KEY (0x03) | |
#define TAG_ECC_PUBLIC_KEY (0x04) | |
#define TAG_SHARED_SECRET (0x05) | |
#define TAG_RSA_PRIVATE_KEY_P (0x06) | |
#define TAG_RSA_PRIVATE_KEY_Q (0x07) | |
#define TAG_RSA_PRIVATE_KEY_DP (0x08) | |
#define TAG_RSA_PRIVATE_KEY_DQ (0x09) | |
#define TAG_RSA_PRIVATE_KEY_IPQ (0x0A) | |
#define TAG_RSA_PUBLIC_KEY_MOD (0x0B) | |
#define TAG_AES_KEY (0x0C) | |
#define TAG_WRAPPED_AES_KEY (0x0D) | |
#define TAG_CONTEXT (0x0E) | |
#define TAG_DIRECTION (0x0F) | |
#define TAG_IV (0x10) | |
#define TAG_INPUT_DATA (0x11) | |
#define TAG_OUTPUT_DATA (0x12) | |
#define TAG_AUTHENTICATION_DATA (0x13) | |
#define TAG_GMAC_DATA (0x14) | |
#define TAG_GMAC_LENGTH (0x15) | |
#define TAG_KEYWRAP_ALGO (0x16) | |
#define TAG_HASH (0x17) | |
#define TAG_SIGNATURE (0x18) | |
#define TAG_DLMS_AK_INDEX (0x19) | |
#define TAG_VERIFICATION (0x1A) | |
#define TAG_CERTIFICATE (0x1B) | |
#define TAG_OFFSET (0x1C) | |
#define TAG_SIZE (0x1D) | |
#define TAG_SST_WRAPPING_KEY_INDEX (0x1E) | |
#else // | |
/// @cond not_relevant_for_A71ch & A71cl | |
#define TAG_DLMS_SECURITY_BYTE (0x00) | |
#define TAG_SST_IDENTIFIER (0x01) | |
#define TAG_SST_INDEX (0x02) | |
#define TAG_ECC_PRIVATE_KEY (0x03) | |
#define TAG_ECC_PUBLIC_KEY (0x04) | |
#define TAG_SHARED_SECRET (0x05) | |
#define TAG_RSA_PRIVATE_KEY_P (0x06) | |
#define TAG_RSA_PRIVATE_KEY_Q (0x07) | |
#define TAG_RSA_PRIVATE_KEY_DP (0x08) | |
#define TAG_RSA_PRIVATE_KEY_DQ (0x09) | |
#define TAG_SST_IDENTIFIER2 (0x0A) | |
#define TAG_SST_INDEX2 (0x0B) | |
#define TAG_AES_KEY (0x0C) | |
#define TAG_WRAPPED_AES_KEY (0x0D) | |
#define TAG_CONTEXT (0x0E) | |
#define TAG_DIRECTION (0x0F) | |
#define TAG_IV (0x10) | |
#define TAG_INPUT_DATA (0x11) | |
#define TAG_OUTPUT_DATA (0x12) | |
#define TAG_AUTHENTICATION_DATA (0x13) | |
#define TAG_GMAC_DATA (0x14) | |
#define TAG_GMAC_LENGTH (0x15) | |
#define TAG_KEYWRAP_ALGO (0x16) | |
#define TAG_HASH (0x17) | |
#define TAG_SIGNATURE (0x18) | |
#define TAG_STATE (0x19) | |
#define TAG_VERIFICATION (0x1A) | |
#define TAG_CERTIFICATE (0x1B) | |
#define TAG_OFFSET (0x1C) | |
#define TAG_SIZE (0x1D) | |
#define TAG_SST_WRAPPING_KEY_INDEX (0x1E) | |
#define TAG_INTERFACE (0x1F) | |
#define TAG_CHUNK_NUMBER (0x23) | |
#define TAG_SCP_MIN_SEC_LEVEL (0x24) | |
#define TAG_STATUS_WORD (0x25) | |
/// @endcond | |
#endif // TGT_A70CI | |
// </Should be in a TLV specific header file> | |
/* ------------------------------ */ | |
#define AX_CLA (0x80) | |
// #define SW_WARNING_FILE_DEACTIVATED (0x6283) | |
// #define SW_WARNING_FILE_TERMINATED (0x6285) | |
#define SW_WRONG_LENGTH (0x6700) //!< ISO7816-4 defined status word: Wrong Length of data | |
#define SW_SECURE_MESSAGING_NOT_SUPPORTED (0x6882) //!< ISO7816-4 defined status word | |
#define SW_SECURITY_STATUS_NOT_SATISFIED (0x6982) //!< ISO7816-4 defined status word | |
#define SW_DATA_INVALID (0x6984) //!< ISO7816-4 defined status word | |
#define SW_CONDITIONS_NOT_SATISFIED (0x6985) //!< ISO7816-4 defined status word: Conditions of use not satisfied, e.g. a command is not allowed, the provided identifier is not applicable or the index is out of range. | |
#define SW_COMMAND_NOT_ALLOWED (0x6986) //!< ISO7816-4 defined status word | |
#define SW_WRONG_DATA (0x6A80) //!< ISO7816-4 defined status word: Wrong data, e.g. the command does not have the right parameters or a parameter is not correct (size, structure). | |
#define SW_FILE_NOT_FOUND (0x6A82) //!< ISO7816-4 defined status word | |
#define SW_INCORRECT_P1P2 (0x6A86) //!< ISO7816-4 defined status word: Incorrect P1-P2 parameters | |
#define SW_INS_NOT_SUPPORTED (0x6D00) //!< ISO7816-4 defined status word: INS byte not supported | |
#define SW_CLA_NOT_SUPPORTED (0x6E00) //!< ISO7816-4 defined status word: CLA byte not supported | |
#define SW_NO_ERROR (0x9000) //!< ISO7816-4 defined status word | |
#define USE_STANDARD_APDU_LEN 0 //!< Create a standard length APDU. | |
#define USE_EXTENDED_APDU_LEN 1 //!< Create an extended length APDU. | |
#define SESSION_ID_LEN 4 | |
U8 SetApduHeader(apdu_t * pApdu, U8 extendedLength); | |
U8 AllocateAPDUBuffer(apdu_t * pApdu); | |
U8 FreeAPDUBuffer(apdu_t * pApdu); | |
void smApduAdaptLcLe(apdu_t *pApdu, U16 lc, U16 le); | |
void smApduAdaptLc(apdu_t *pApdu, U16 lc); | |
void smApduAdaptLe(apdu_t *pApdu, U16 le); | |
// U16 GetStatusWord(apdu_t *pApdu); | |
U16 smGetSw(apdu_t *pApdu, U8 *pIsOk); | |
void set_SessionId_Tlv(U32 sessionId); | |
U16 AddTlvItem(apdu_t * pApdu, U16 tag, U16 dataLength, const U8 *pValue); | |
U16 ParseResponse(apdu_t * pApdu, U16 expectedTag, U16 * pLen, U8* pValue); | |
U16 AddStdCmdData(apdu_t * pApdu, U16 dataLen, const U8 *data); | |
U16 smApduGetResponseBody(apdu_t *pApdu, U8 *buf, U16 *bufLen); | |
U16 smApduAppendCmdData(apdu_t * pApdu, const U8 *data, U16 dataLen); | |
U16 smApduAdaptChkSum(apdu_t *pApdu, U16 chkSum); | |
/** | |
* @brief Check and convert given hex string to array of bytes to buffer. | |
* | |
* Memory allocation needs to be done by the caller, boundary checks on the output | |
* are performed, null-termination is always added. | |
* @param[in] str: The binary data to convert. | |
* @param[in] buffer: buffer to which converted array to be copied. | |
* @param[in] buffer_len: Size of the available buffer for sanity check. | |
* @param[out] len: The length of the binary data written to buffer. | |
* @return True if conversion is successful. | |
*/ | |
bool smApduGetArrayBytes(char *str, size_t *len, uint8_t * buffer, size_t buffer_len); | |
/** | |
* @brief Parse given apdu command and return command data offset and command data length along with case-id as described in ISO/IEC FDIS 7816-3 spec. | |
* | |
* @param[in] apdu: Buffer containing APDU command. | |
* @param[in] apduLen: The length of APDU command. | |
* @param[out] data_offset: Offset of data field if present. | |
* @param[out] dataLen: Length of data field (LC field value) if present. | |
* @param[out] apdu_case: APDU txrx case accoring to 7816 spec. | |
* @return True if APDU command has valid format. | |
*/ | |
bool smApduGetTxRxCase(uint8_t *apdu, size_t apduLen, size_t* data_offset, size_t *dataLen, apduTxRx_case_t *apdu_case); | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif //_SM_APDU_H_ |