/* * * 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) // #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 // /* ------------------------------ */ #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_