/* * Copyright (c), NXP Semiconductors Bangalore / India * * (C)NXP Semiconductors * All rights are reserved. Reproduction in whole or in part is * prohibited without the written consent of the copyright owner. * NXP reserves the right to make changes without notice at any time. * NXP makes no warranty, expressed, implied or statutory, including but * not limited to any implied warranty of merchantability or fitness for any * particular purpose, or that the use will not infringe any third party patent, * copyright or trademark. NXP must not be liable for any loss or damage * arising from its use. */ /** \file * Generic MIFARE DESFire(R) EV1 Application Component of Reader Library Framework. * $Author: Purnank G (ing05193) $ * $Revision: 5916 $ (v4.040.05.011646) * $Date: 2016-09-14 18:30:24 +0530 (Wed, 14 Sep 2016) $ * * History: * Santosh Araballi: Generated 31. August 2010 * */ #ifndef PHALMFDF_H #define PHALMFDF_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef NXPBUILD__PHAL_MFDF /** \defgroup phalMfdf MIFARE DESFire (R) * \brief These Functions implement the MIFARE DESFire(R) EV1 commands. * @{ */ /** * \name Other Options for various Functions */ /** @{ */ #define PHAL_MFDF_NOT_AUTHENTICATED 0xFFU /**< No authentication. */ #define PHAL_MFDF_COMMUNICATION_PLAIN 0x00U /**< Plain mode of communication. */ #define PHAL_MFDF_COMMUNICATION_MACD 0x10U /**< MAC mode of communication. */ #define PHAL_MFDF_COMMUNICATION_ENC 0x30U /**< Enciphered mode of communication. */ #define PHAL_MFDF_ADDITIONAL_INFO 0x00A1 /**< Option for getconfig to get additional info of a generic error. */ /** @} */ /** \name phalMfdf Custom Error Codes */ /** @{ */ #define PHAL_MFDF_NO_CHANGES (PH_ERR_CUSTOM_BEGIN+0) /**< MF DF Response - No changes done to backup files. */ #define PHAL_MFDF_ERR_OUT_OF_EEPROM_ERROR (PH_ERR_CUSTOM_BEGIN+1) /**< MF DF Response - Insufficient NV-Memory. */ #define PHAL_MFDF_ERR_NO_SUCH_KEY (PH_ERR_CUSTOM_BEGIN+2) /**< MF DF Invalid key number specified. */ #define PHAL_MFDF_ERR_PERMISSION_DENIED (PH_ERR_CUSTOM_BEGIN+3) /**< MF DF Current configuration/status does not allow the requested command. */ #define PHAL_MFDF_ERR_APPLICATION_NOT_FOUND (PH_ERR_CUSTOM_BEGIN+4) /**< MF DF Requested AID not found on PICC. */ #define PHAL_MFDF_ERR_BOUNDARY_ERROR (PH_ERR_CUSTOM_BEGIN+5) /**< MF DF Attempt to read/write data from/to beyond the files/record's limits. */ #define PHAL_MFDF_ERR_COMMAND_ABORTED (PH_ERR_CUSTOM_BEGIN+6) /**< MF DF Previous cmd not fully completed. Not all frames were requested or provided by the PCD. */ #define PHAL_MFDF_ERR_COUNT (PH_ERR_CUSTOM_BEGIN+7) /**< MF DF Num. of applns limited to 28. No additional applications possible. */ #define PHAL_MFDF_ERR_DUPLICATE (PH_ERR_CUSTOM_BEGIN+8) /**< MF DF File/Application with same number already exists. */ #define PHAL_MFDF_ERR_FILE_NOT_FOUND (PH_ERR_CUSTOM_BEGIN+9) /**< MF DF Specified file number does not exist. */ #define PHAL_MFDF_ERR_PICC_CRYPTO (PH_ERR_CUSTOM_BEGIN+10) /**< MF DF Crypto error returned by PICC. */ #define PHAL_MFDF_ERR_PARAMETER_ERROR (PH_ERR_CUSTOM_BEGIN+11) /**< MF DF Parameter value error returned by PICC. */ #define PHAL_MFDF_ERR_DF_GEN_ERROR (PH_ERR_CUSTOM_BEGIN+12) /**< MF DF DesFire Generic error. Check additional Info. */ #define PHAL_MFDF_ERR_DF_7816_GEN_ERROR (PH_ERR_CUSTOM_BEGIN+13) /**< MF DF ISO 7816 Generic error. Check Additional Info. */ /** @} */ /** @} */ #endif /* NXPBUILD__PHAL_MFDF */ #ifdef NXPBUILD__PHAL_MFDF_SW /** * \defgroup phalMfdf_Sw Component : Software */ /*@{*/ #define PHAL_MFDF_SW_ID 0x01U /**< ID for Software MF DesFire layer. */ /** * \brief struct phalMfdf_Sw_DataParams_t * */ typedef struct { uint16_t wId; /**< Layer ID for this component, NEVER MODIFY! */ void * pPalMifareDataParams; /**< Pointer to the parameter structure of the palMifare component. */ void * pKeyStoreDataParams; /**< Pointer to the parameter structure of the KeyStore layer. */ void * pCryptoDataParamsEnc; /**< Pointer to the parameter structure of the Crypto layer for encryption. */ void * pCryptoRngDataParams; /**< Pointer to the parameter structure of the CryptoRng layer. */ void * pHalDataParams; /**< Pointer to the HAL parameters structure. */ uint8_t bSessionKey[24]; /**< Session key for this authentication */ uint8_t bKeyNo; /**< key number against which this authentication is done */ uint8_t bIv[16]; /**< Max size of IV can be 16 bytes */ uint8_t bAuthMode; /**< Authenticate (0x0A), AuthISO (0x1A), AuthAES (0xAA) */ uint8_t pAid[3]; /**< Aid of the currently selected application */ uint8_t bCryptoMethod; /**< DES,3DES, 3K3DES or AES */ uint8_t bWrappedMode; /**< Wrapped APDU mode. All native commands need to be sent wrapped in ISO 7816 APDUs. */ uint16_t wCrc; /**< 2 Byte CRC initial value in Authenticate mode. */ uint32_t dwCrc; /**< 4 Byte CRC initial value in 0x1A, 0xAA mode. */ uint16_t wAdditionalInfo; /**< Specific error codes for Desfire generic errors. */ uint16_t wPayLoadLen; /**< Amount of data to be read. Required for Enc read to verify CRC. */ uint8_t bLastBlockBuffer[16]; /**< Buffer to store last Block of encrypted data in case of chaining. */ uint8_t bLastBlockIndex; /**< Last Block Buffer Index. */ } phalMfdf_Sw_DataParams_t; /** * \brief Initialise this layer. * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. */ phStatus_t phalMfdf_Sw_Init( phalMfdf_Sw_DataParams_t * pDataParams, /**< [In] Pointer to this layer's parameter structure. */ uint16_t wSizeOfDataParams, /**< [In] Specifies the size of the data parameter structure */ void * pPalMifareDataParams, /**< [In] Pointer to a palMifare component context. */ void * pKeyStoreDataParams, /**< [In] Pointer to Key Store data parameters. */ void * pCryptoDataParamsEnc, /**< [In] Pointer to a Crypto component context for encryption. */ void * pCryptoRngDataParams, /**< [In] Pointer to a CryptoRng component context. */ void * pHalDataParams /**< [In] Pointer to the HAL parameters structure. */ ); /** @} */ #endif /* NXPBUILD__PHAL_MFDF_SW */ #ifdef NXPBUILD__PHAL_MFDF /** \addtogroup phalMfdf * @{ */ /** * \name PICC level Commands */ /** @{ */ #ifdef NXPRDLIB_REM_GEN_INTFS #include "../comps/phalMfdf/src/Sw/phalMfdf_Sw.h" #define phalMfdf_CreateApplication(pDataParams,bOption,pAid,bKeySettings1,bKeySettings2,pISOFileId,pISODFName,bISODFNameLen) \ phalMfdf_Sw_CreateApplication((phalMfdf_Sw_DataParams_t *)pDataParams,bOption,pAid,bKeySettings1,bKeySettings2,pISOFileId,pISODFName,bISODFNameLen) #define phalMfdf_SelectApplication( pDataParams, pAppId) \ phalMfdf_Sw_SelectApplication( (phalMfdf_Sw_DataParams_t *)pDataParams, pAppId) #define phalMfdf_GetVersion(pDataParams, pVerInfo) \ phalMfdf_Sw_GetVersion((phalMfdf_Sw_DataParams_t *)pDataParams, pVerInfo) #define phalMfdf_CreateStdDataFile(pDataParams,bOption,bFileNo,pISOFileId,bCommSett,pAccessRights,pFileSize) \ phalMfdf_Sw_CreateStdDataFile((phalMfdf_Sw_DataParams_t *)pDataParams,bOption,bFileNo,pISOFileId,bCommSett,pAccessRights,pFileSize) #define phalMfdf_WriteData(pDataParams,bCommOption,bFileNo,pOffset,pTxData,pTxDataLen) \ phalMfdf_Sw_WriteData((phalMfdf_Sw_DataParams_t *)pDataParams,bCommOption,bFileNo,pOffset,pTxData,pTxDataLen) #define phalMfdf_IsoSelectFile(pDataParams,bOption,bSelector,pFid,pDFname,bDFnameLen,ppFCI,pwFCILen) \ phalMfdf_Sw_IsoSelectFile((phalMfdf_Sw_DataParams_t *)pDataParams,bOption,bSelector,pFid,pDFname,bDFnameLen,ppFCI,pwFCILen) #define phalMfdf_IsoReadBinary(pDataParams,wOption,bOffset,bSfid,bBytesToRead,ppRxBuffer,pBytesRead) \ phalMfdf_Sw_IsoReadBinary((phalMfdf_Sw_DataParams_t *)pDataParams,wOption,bOffset,bSfid,bBytesToRead,ppRxBuffer,pBytesRead) #define phalMfdf_IsoUpdateBinary(pDataParams,bOffset,bSfid,pData,bDataLen) \ phalMfdf_Sw_IsoUpdateBinary((phalMfdf_Sw_DataParams_t *)pDataParams,bOffset,bSfid,pData,bDataLen) #define phalMfdf_GetConfig(pDataParams, wConfig, pValue) \ phalMfdf_Sw_GetConfig((phalMfdf_Sw_DataParams_t *)pDataParams, wConfig, pValue) #define phalMfdf_SetConfig(pDataParams, wConfig, wValue) \ phalMfdf_Sw_SetConfig((phalMfdf_Sw_DataParams_t *)pDataParams, wConfig, wValue) #endif /* NXPRDLIB_REM_GEN_INTFS */ #ifndef NXPRDLIB_REM_GEN_INTFS /* Without optimization */ /** * \brief Creates new applications on the PICC * * bOption value can be \n * \li 01 meaning wISOFileId is supplied \n * \li 02 meaning pISODFName is present \n * \li 03 meaning both wISOFileId and pISODFName are present \n * \li 00 meaning both not present * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_CreateApplication( void * pDataParams, /**< [In] Pointer to this layers param structure */ uint8_t bOption, /**< [In] Option parameter. */ uint8_t * pAid, /**< [In] array of 3 bytes. */ uint8_t bKeySettings1, /**< [In] 1 byte. */ uint8_t bKeySettings2, /**< [In] 1 byte. */ uint8_t * pISOFileId, /**< [In] 2 btyes ISO File ID. */ uint8_t * pISODFName, /**< [In] 1 to 16 Bytes. Can also be NULL. */ uint8_t bISODFNameLen /**< [In] Size of pISODFName if that is present. */ ); /** * \brief Selects one particular application on the PICC for * further access * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_SelectApplication( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t * pAid /**< [In] 3 byte AID. LSB First. */ ); /** * \brief Returns manufacturing related data of the PICC * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_GetVersion( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t * pVerInfo /**< [Out] 28bytes of version info. User has to parse this. */ ); /** @} */ /** * \name Application level Commands */ /** @{ */ /** * \brief Creates files for storage of plain unformatted user data within * an existing application on the PICC * * \remarks * If bOption==1, it means pIsoFileId is present and is valid. * If bOption=0, it means pIsoFileId is not present. \n * * Communication option (bCommSett) Possible Values are:\n * \li #PHAL_MFDF_COMMUNICATION_PLAIN * \li #PHAL_MFDF_COMMUNICATION_ENC * \li #PHAL_MFDF_COMMUNICATION_MACD * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_CreateStdDataFile( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t bOption, /**< [In] option parameter. 0x00 means wISOFileId is not provided. 0x01 means wISOFileId is provided and is valid */ uint8_t bFileNo, /**< [In] file number. */ uint8_t * pISOFileId, /**< [In] ISO File ID. */ uint8_t bCommSett, /**< [In] communication settings. */ uint8_t * pAccessRights, /**< [In] 2 byte access rights. Sent LSB first to PICC. */ uint8_t * pFileSize /**< [In] 3bytes. Sent LSB first to PICC. */ ); /** @} */ /** * \name Data Manipulation Commands */ /** @{ */ phStatus_t phalMfdf_WriteData( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t bCommOption, /**< [In] Communication Mode. Plain, Mac'd or encrypted. */ uint8_t bFileNo, /**< [In] 1 byte file number. */ uint8_t * pOffset, /**< [In] 3 bytes offset. LSB First. */ uint8_t * pTxData, /**< [in] Data to be written. */ uint8_t * pTxDataLen /**< [in] 3 bytes. length of data to be written. */ ); /** @} */ /** * \name ISO 7816 COMMANDS */ /** @{ */ /** * \brief ISO Select * * \remarks * bSelector = 0x00 => Selection by 2 byte file Id. \n * bSelector = 0x02 => Select EF under current DF. Fid = EF id \n * bSelector = 0x04 => Selection by DF Name. DFName and len is then valid \n * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_IsoSelectFile( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t bOption, /**< [In] If bOption == 00 FCI is returned. If 0x0C no FCI returned. */ uint8_t bSelector, /**< [In] bSelector equals either 0x00 or 0x02 or 0x04. */ uint8_t * pFid, /**< [In] two byte file id. Send LSB first. */ uint8_t * pDFname, /**< [In] DFName upto 16 bytes. valid only when bOption = 0x04. */ uint8_t bDFnameLen, /**< [In] Length of DFName string provided by the user. */ uint8_t ** ppFCI, /**< [Out] File control information. */ uint16_t * pwFCILen /**< [Out] Length of FCI returned. */ ); /** * \brief ISO Read Binary * \c wOption can be one of:\n * \li #PH_EXCHANGE_DEFAULT * \li #PH_EXCHANGE_RXCHAINING * * If status of #PH_ERR_SUCCESS_CHAINING is returned * Recall this function with wOption PH_EXCHANGE_RXCHAINING to * get remaining data. * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval #PH_ERR_SUCCESS_CHAINING operation success with chaining. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_IsoReadBinary( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint16_t wOption, /**< [In] #PH_EXCHANGE_DEFAULT or #PH_EXCHANGE_RXCHAINING. */ uint8_t bOffset, /**< [In] Offset from where to read. */ uint8_t bSfid, /**< [In] Short ISO File Id. Bit 7 should be 1 to indicate Sfid is supplied. Else it is treated as MSB of 2Byte offset. */ uint8_t bBytesToRead, /**< [In] number of bytes to read. If 0, then entire file to be read. */ uint8_t ** ppRxBuffer, /**< [Out] buffer where the read bytes will be stored. */ uint16_t * pBytesRead /**< [Out] number of bytes read. */ ); /** * \brief Iso Update Binary * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlying component. */ phStatus_t phalMfdf_IsoUpdateBinary( void * pDataParams, /**< [In] Pointer to this layers param structure. */ uint8_t bOffset, /**< [In] Offset from where to write. */ uint8_t bSfid, /**< [In] Short ISO File Id. Bit 7 should be 1 to indicate Sfid is supplied Else it is treated as MSB of 2Byte offset. */ uint8_t * pData, /**< [In] data to be written. */ uint8_t bDataLen /**< [In] number of bytes to write. */ ); /** @} */ /** * \name Miscellaneous functions */ /** @{ */ /** * \brief Perform a GetConfig command. * * \c wConfig can be one of:\n * \li #PHAL_MFDF_ADDITIONAL_INFO * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlaying component. */ phStatus_t phalMfdf_GetConfig( void * pDataParams, /**< [In] Pointer to this layers parameter structure. */ uint16_t wConfig, /**< [In] Item to read. */ uint16_t * pValue /**< [Out] Read value. */ ); /** * \brief Perform a SetConfig command. * * \c wConfig can:\n * \li #PHAL_MFDF_ADDITIONAL_INFO * * \return Status code * \retval #PH_ERR_SUCCESS Operation successful. * \retval Other Depending on implementation and underlaying component. */ phStatus_t phalMfdf_SetConfig( void * pDataParams, /**< [In] Pointer to this layers parameter structure. */ uint16_t wConfig, /**< [In] Item to set. */ uint16_t wValue /**< [In] Value to set. */ ); /** @} */ /** @} */ #endif /* Without optimization */ #endif /* NXPBUILD__PHAL_MFDF */ #ifdef __cplusplus } /* Extern C */ #endif #endif /* PHALMFDF_H */