396 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			396 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /******************************************************************************
 | |
|   * \attention
 | |
|   *
 | |
|   * <h2><center>© COPYRIGHT 2020 STMicroelectronics</center></h2>
 | |
|   *
 | |
|   * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
 | |
|   * You may not use this file except in compliance with the License.
 | |
|   * You may obtain a copy of the License at:
 | |
|   *
 | |
|   *        www.st.com/myliberty
 | |
|   *
 | |
|   * Unless required by applicable law or agreed to in writing, software 
 | |
|   * distributed under the License is distributed on an "AS IS" BASIS, 
 | |
|   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
 | |
|   * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 | |
|   * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
 | |
|   * See the License for the specific language governing permissions and
 | |
|   * limitations under the License.
 | |
|   *
 | |
| ******************************************************************************/
 | |
| 
 | |
| /*
 | |
|  *      PROJECT:   ST25R391x firmware
 | |
|  *      Revision:
 | |
|  *      LANGUAGE:  ISO C99
 | |
|  */
 | |
| 
 | |
| /*! \file rfal_t4t.h
 | |
|  *
 | |
|  *  \author Gustavo Patricio
 | |
|  *
 | |
|  *  \brief Provides convenience methods and definitions for T4T (ISO7816-4)
 | |
|  *  
 | |
|  *  This module provides an interface to exchange T4T APDUs according to 
 | |
|  *  NFC Forum T4T and ISO7816-4
 | |
|  *  
 | |
|  *  This implementation was based on the following specs:
 | |
|  *    - ISO/IEC 7816-4  3rd Edition 2013-04-15
 | |
|  *    - NFC Forum T4T Technical Specification 1.0 2017-08-28
 | |
|  *  
 | |
|  * \addtogroup RFAL
 | |
|  * @{
 | |
|  *
 | |
|  * \addtogroup RFAL-AL
 | |
|  * \brief RFAL Abstraction Layer
 | |
|  * @{
 | |
|  *
 | |
|  * \addtogroup T4T
 | |
|  * \brief RFAL T4T Module
 | |
|  * @{
 | |
|  *  
 | |
|  */
 | |
| 
 | |
| #ifndef RFAL_T4T_H
 | |
| #define RFAL_T4T_H
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * INCLUDES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| #include "platform.h"
 | |
| #include "st_errno.h"
 | |
| #include "rfal_rf.h"
 | |
| #include "rfal_isoDep.h"
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * GLOBAL DEFINES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #define RFAL_T4T_MAX_CAPDU_PROLOGUE_LEN \
 | |
|     4U /*!< Command-APDU prologue length (CLA INS P1 P2)                    */
 | |
| #define RFAL_T4T_LE_LEN 1U /*!< Le Expected Response Length (short field coding)                */
 | |
| #define RFAL_T4T_LC_LEN 1U /*!< Lc Data field length  (short field coding)                      */
 | |
| #define RFAL_T4T_MAX_RAPDU_SW1SW2_LEN \
 | |
|     2U /*!< SW1 SW2 length                                                  */
 | |
| #define RFAL_T4T_CLA 0x00U /*!< Class byte (contains 00h because secure message are not used)   */
 | |
| 
 | |
| #define RFAL_T4T_ISO7816_P1_SELECT_BY_DF_NAME \
 | |
|     0x04U /*!< P1 value for Select by name                                     */
 | |
| #define RFAL_T4T_ISO7816_P1_SELECT_BY_FILEID \
 | |
|     0x00U /*!< P1 value for Select by file identifier                          */
 | |
| #define RFAL_T4T_ISO7816_P2_SELECT_FIRST_OR_ONLY_OCCURENCE \
 | |
|     0x00U /*!<      b2b1 P2 value for First or only occurence                  */
 | |
| #define RFAL_T4T_ISO7816_P2_SELECT_RETURN_FCI_TEMPLATE \
 | |
|     0x00U /*!< b4b3      P2 value for Return FCI template                      */
 | |
| #define RFAL_T4T_ISO7816_P2_SELECT_NO_RESPONSE_DATA \
 | |
|     0x0CU /*!< b4b3      P2 value for No response data                         */
 | |
| 
 | |
| #define RFAL_T4T_ISO7816_STATUS_COMPLETE \
 | |
|     0x9000U /*!< Command completed \ Normal processing - No further qualification*/
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * GLOBAL VARIABLES
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * GLOBAL TYPES
 | |
| ******************************************************************************
 | |
| */
 | |
| /*! NFC-A T4T Command-APDU structure */
 | |
| typedef struct {
 | |
|     uint8_t CLA; /*!< Class byte                                         */
 | |
|     uint8_t INS; /*!< Instruction byte                                   */
 | |
|     uint8_t P1; /*!< Parameter byte 1                                   */
 | |
|     uint8_t P2; /*!< Parameter byte 2                                   */
 | |
|     uint8_t Lc; /*!< Data field length                                  */
 | |
|     bool LcFlag; /*!< Lc flag (append Lc when true)                      */
 | |
|     uint8_t Le; /*!< Expected Response Length                           */
 | |
|     bool LeFlag; /*!< Le flag (append Le when true)                      */
 | |
| 
 | |
|     rfalIsoDepApduBufFormat* cApduBuf; /*!< Command-APDU buffer  (Tx)                          */
 | |
|     uint16_t* cApduLen; /*!< Command-APDU Length                                */
 | |
| } rfalT4tCApduParam;
 | |
| 
 | |
| /*! NFC-A T4T Response-APDU structure */
 | |
| typedef struct {
 | |
|     rfalIsoDepApduBufFormat* rApduBuf; /*!< Response-APDU buffer (Rx)                          */
 | |
|     uint16_t rcvdLen; /*!< Full response length                               */
 | |
|     uint16_t rApduBodyLen; /*!< Response body length                               */
 | |
|     uint16_t statusWord; /*!< R-APDU Status Word SW1|SW2                         */
 | |
| } rfalT4tRApduParam;
 | |
| 
 | |
| /*! NFC-A T4T command set    T4T 1.0 & ISO7816-4 2013 Table 4 */
 | |
| typedef enum {
 | |
|     RFAL_T4T_INS_SELECT = 0xA4U, /*!< T4T Select                                         */
 | |
|     RFAL_T4T_INS_READBINARY = 0xB0U, /*!< T4T ReadBinary                                     */
 | |
|     RFAL_T4T_INS_UPDATEBINARY = 0xD6U, /*!< T4T UpdateBinay                                    */
 | |
|     RFAL_T4T_INS_READBINARY_ODO = 0xB1U, /*!< T4T ReadBinary using ODO                           */
 | |
|     RFAL_T4T_INS_UPDATEBINARY_ODO =
 | |
|         0xD7U /*!< T4T UpdateBinay using ODO                          */
 | |
| } rfalT4tCmds;
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * GLOBAL FUNCTION PROTOTYPES
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose APDU
 | |
|  *  
 | |
|  * This method computes a C-APDU according to NFC Forum T4T and ISO7816-4.
 | |
|  * 
 | |
|  * If C-APDU contains data to be sent, it must be placed inside the buffer
 | |
|  *   rfalT4tTxRxApduParam.txRx.cApduBuf.apdu and signaled by Lc
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * \see rfalT4TPollerParseRAPDU()
 | |
|  *
 | |
|  * \warning The ISO-DEP module is used to perform the tranceive. Usually 
 | |
|  *          activation has been done via ISO-DEP activatiavtion. If not
 | |
|  *          please call rfalIsoDepInitialize() before.
 | |
|  * 
 | |
|  * \param[in,out] apduParam : APDU parameters
 | |
|  *                            apduParam.cApduLen will contain the APDU length 
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeCAPDU(const rfalT4tCApduParam* apduParam);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Parse R-APDU
 | |
|  *  
 | |
|  * This method parses a R-APDU according to NFC Forum T4T and ISO7816-4.
 | |
|  * It will extract the data length and check if the Satus word is expected.
 | |
|  *
 | |
|  * \param[in,out] apduParam : APDU parameters
 | |
|  *                            apduParam.rApduBodyLen will contain the data length 
 | |
|  *                            apduParam.statusWord will contain the SW1 and SW2 
 | |
|  * 
 | |
|  * \return ERR_REQUEST      : Status word (SW1 SW2) different from 9000
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerParseRAPDU(rfalT4tRApduParam* apduParam);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Select Application APDU
 | |
|  *  
 | |
|  * This method computes a Select Application APDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      aid      : Application ID to be used
 | |
|  * \param[in]      aidLen   : Application ID length
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeSelectAppl(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     const uint8_t* aid,
 | |
|     uint8_t aidLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Select File APDU
 | |
|  *  
 | |
|  * This method computes a Select File APDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      fid      : File ID to be used
 | |
|  * \param[in]      fidLen   : File ID length
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeSelectFile(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     const uint8_t* fid,
 | |
|     uint8_t fidLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Select File APDU for Mapping Version 1
 | |
|  *  
 | |
|  * This method computes a Select File APDU according to NFC Forum T4TOP_v1.0
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      fid      : File ID to be used
 | |
|  * \param[in]      fidLen   : File ID length
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeSelectFileV1Mapping(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     const uint8_t* fid,
 | |
|     uint8_t fidLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Read Data APDU
 | |
|  *  
 | |
|  * This method computes a Read Data APDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      offset   : File offset
 | |
|  * \param[in]      expLen   : Expected length (Le)
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeReadData(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     uint16_t offset,
 | |
|     uint8_t expLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Read Data ODO APDU
 | |
|  *  
 | |
|  * This method computes a Read Data ODO APDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      offset   : File offset
 | |
|  * \param[in]      expLen   : Expected length (Le)
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeReadDataODO(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     uint32_t offset,
 | |
|     uint8_t expLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Write Data APDU
 | |
|  *  
 | |
|  * This method computes a Write Data APDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      offset   : File offset
 | |
|  * \param[in]      data     : Data to be written
 | |
|  * \param[in]      dataLen  : Data length to be written (Lc)
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeWriteData(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     uint16_t offset,
 | |
|     const uint8_t* data,
 | |
|     uint8_t dataLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  * \brief  T4T Compose Write Data ODO APDU
 | |
|  *  
 | |
|  * This method computes a Write Data ODO sAPDU according to NFC Forum T4T
 | |
|  *
 | |
|  * To transceive the formed APDU the ISO-DEP layer shall be used
 | |
|  *
 | |
|  * \see rfalIsoDepStartApduTransceive()
 | |
|  * \see rfalIsoDepGetApduTransceiveStatus()
 | |
|  * 
 | |
|  * \param[out]     cApduBuf : buffer where the C-APDU will be placed
 | |
|  * \param[in]      offset   : File offset
 | |
|  * \param[in]      data     : Data to be written
 | |
|  * \param[in]      dataLen  : Data length to be written (Lc)
 | |
|  * \param[out]     cApduLen : Composed C-APDU length
 | |
|  * 
 | |
|  * \return ERR_PARAM        : Invalid parameter
 | |
|  * \return ERR_PROTO        : Protocol error
 | |
|  * \return ERR_NONE         : No error
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalT4TPollerComposeWriteDataODO(
 | |
|     rfalIsoDepApduBufFormat* cApduBuf,
 | |
|     uint32_t offset,
 | |
|     const uint8_t* data,
 | |
|     uint8_t dataLen,
 | |
|     uint16_t* cApduLen);
 | |
| 
 | |
| #endif /* RFAL_T4T_H */
 | |
| 
 | |
| /**
 | |
|   * @}
 | |
|   *
 | |
|   * @}
 | |
|   *
 | |
|   * @}
 | |
|   */
 | 
