Files
NxpNfcRdLib/.svn/pristine/a6/a625b2e8a0b330e6c3d5ae1d132173ee612c52be.svn-base
2024-07-08 21:03:06 +08:00

130 lines
6.9 KiB
Plaintext

/*
* Copyright (c), NXP Semiconductors Gratkorn / Austria
*
* (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
* Internal AES Functions for Crypto Library
* $Author$
* $Revision$ (v07.10.00)
* $Date$
*
* History:
* SLe: Generated 19. May 2009
*
*/
#ifndef PHCRYPTOSYM_SW_AES_INT_H
#define PHCRYPTOSYM_SW_AES_INT_H
#include <ph_Status.h>
#include <ph_RefDefs.h>
#include <phCryptoSym.h>
/** \defgroup phCryptoSym_Sw_AES_Internals Internals
* \brief Software implementation of the AES algorithm
* @{
*/
/**
* \brief Performs the combined SubBytes and Shift Rows step of the AES Algorithm for encryption as defined in Chap. 5.1.1, 5.1.2 of FIPS-197.
* First Row remains untouched, second row is shifted by 1 pos, third row is shifted by 2 pos, fourth row is shifted by 3 pos.
* \return None
*/
void phCryptoSym_Sw_Aes_SubBytesShiftRows(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState /**< [InOut] 16 byte array containing the state to operate on */
);
/**
* \brief Performs the combined SubBytes and Shift Rows step of the AES Algorithm for encryption as defined in Chap. 5.3.1, 5.3.2 of FIPS-197.
* First Row remains untouched, second row is shifted by 3 pos, third row is shifted by 2 pos, fourth row is shifted by 1 pos.
* \return None
*/
void phCryptoSym_Sw_Aes_InvSubBytesShiftRows(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState /**< [InOut] 16 byte array containing the state to operate on */
);
/**
* \brief Performs the MixColumn step of the AES Algorithm for encryption as defined in Chap. 5.1.3 of FIPS-197.
* The input bytes are multiplied as specified in the algorithm. The compile flag #PH_CRYPTOSYM_SW_ROM_OPTIMIZATION
* specifies whether all values to be multiplied with are taken from the lookup tables phCryptoSym_Sw_Aes_times2 and
* phCryptoSym_Sw_Aes_times3 or if phCryptoSym_Sw_Aes_times3 is calculated out of the XOR of phCryptoSym_Sw_Aes_times2 and
* the relevant value itself.
* \return None
*/
void phCryptoSym_Sw_Aes_MixColumns(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState /**< [InOut] 16 byte array containing the state to operate on */
);
/**
* \brief Performs the MixColumn step of the AES Algorithm for encryption as defined in Chap. 5.3.3 of FIPS-197.
* The input bytes are multiplied as specified in the algorithm. The compile flag #PH_CRYPTOSYM_SW_ROM_OPTIMIZATION
* specifies whether all values to be multiplied with are taken from the lookup tables phCryptoSym_Sw_Aes_times9,
* phCryptoSym_Sw_Aes_timesB, phCryptoSym_Sw_Aes_timesD and phCryptoSym_Sw_Aes_timesE or if the following simplifications are used:
* phCryptoSym_Sw_Aes_timesD = phCryptoSym_Sw_Aes_timesC XOR the value itself
* phCryptoSym_Sw_Aes_timesE = phCryptoSym_Sw_Aes_timesC XOR phCryptoSym_Sw_Aes_times2
* \return None
*/
void phCryptoSym_Sw_Aes_InvMixColumns(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState /**< [InOut] 16 byte array containing the state to operate on */
);
/**
* \brief Performs the AddRoundKey step of the AES Algorithm for encryption and decryption as defined in Chap. 5.1.4 and 5.3.4 of FIPS-197.
* The input state is XORed with the relevant round key.
* There are two compile options that come together with AddRoundKey:
*
* #PH_CRYPTOSYM_SW_ONLINE_KEYSCHEDULING is not defined:
* In that case, the round keys have been calculated already upfront in the phCryptoSym_Sw_Aes_KeyExpansion function. The round keys are stored in
* pDataParams->pKey using the following framing:
* ORIGINAL KEY || RK1 || RK2 || ... || RKn
* In total, there are a maximum of 14 Round keys + the original key = 13*16 + 32 = 240 bytes
* Thus, the function simply picks the correct 16 byte chunk out of the round keys according to the bCnt provided.
*
* #PH_CRYPTOSYM_SW_ONLINE_KEYSCHEDULING is defined:
* In that case, the round keys are calculated online.
* The pDataParams->pKey array has a size of 32 bytes in that case. This key is copied into a local 32 bytes buffer,
* which then is provided to the AddRoundKey function to always update the next 16 bytes of round key according to the
* algorithm. There are three options available for that function:
* - PH_CRYPTOSYM_KEYSCHEDULE_ENCRYPTION: Increments pNkCurrent
* - PH_CRYPTOSYM_KEYSCHEDULE_DECRYPTION: Decrements pNkCurrent
* - PH_CRYPTOSYM_KEYSCHEDULE_DECRYPTION_PREPARE: Increments pNkCurrent, but does not perform a XOR operation with the state.
* \return None
*/
#ifndef PH_CRYPTOSYM_SW_ONLINE_KEYSCHEDULING
void phCryptoSym_Sw_Aes_AddRoundKey(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState, /**< [InOut] 16 byte array containing the state to operate on */
uint8_t PH_MEMLOC_BUF * pKey, /**< [In] 240 byte array containing all round keys to be used. */
uint8_t bCnt /**< [In] Current round. Used by the function to pick the correct round key*/
);
#else /* PH_CRYPTOSYM_SW_ONLINE_KEYSCHEDULING */
#define PH_CRYPTOSYM_KEYSCHEDULE_ENCRYPTION 0x0FU
#define PH_CRYPTOSYM_KEYSCHEDULE_DECRYPTION 0xC0U
#define PH_CRYPTOSYM_KEYSCHEDULE_DECRYPTION_PREPARE 0x30U
void phCryptoSym_Sw_Aes_AddRoundKey(
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pState, /**< [InOut] 16 byte array containing the state to operate on */
uint8_t PH_CRYTOSYM_SW_FAST_RAM * pKey, /**< [In] 32 byte array containing the current round key buffer. */
/**< NOTE: always the same buffer has to be applied within one encryption. */
/**< NOTE: if this is the original key buffer, the key is overwritten!. */
uint8_t * pNkCurrent, /**< [In] Current Nk value. (= numCurRound*4U) */
uint8_t bNk, /**< [In] Nk for the currently loaded key type. AES128: 4, AES192: 6, AES256: 8 */
uint8_t bMode /**< [In] Option byte indicating whether we have encryption, decryption or key preparation. */
);
#endif /* PH_CRYPTOSYM_SW_ONLINE_KEYSCHEDULING */
/** @}
* end of phCryptoSym_Sw_AES_Internals group
*/
#endif /* PHCRYPTOSYM_SW_AES_INT_H */