sw_services:xilsecure_v1_0: indentation changes after code review

Changed indentation after code review.
This commit is contained in:
Bhavik Ameta 2015-03-12 18:24:58 +05:30 committed by Nava kishore Manne
parent 888308d4a2
commit ad78049acf
5 changed files with 424 additions and 507 deletions

View file

@ -74,7 +74,7 @@
* Waits for AES completion for keyload.
*
* @param InstancePtr is a pointer to the XSecure_Aes instance.
* @param @param CsuDmaPtr is the pointer to the XCsuDma instance.
* @param CsuDmaPtr is the pointer to the XCsuDma instance.
* @param KeySel is the key source for decryption, can be KUP or device key
* @param Iv is pointer to the Initialization Vector for decryption
* @param Key is the pointer to Aes decryption key in case KUP key is used
@ -82,13 +82,13 @@
*
* @return XST_SUCCESS if initialization was successful.
*
* @note None
*
******************************************************************************/
s32 XSecure_AesInitialize(XSecure_Aes *InstancePtr, XCsuDma *CsuDmaPtr,
u32 KeySel, u32* Iv, u32* Key)
u32 KeySel, u32* Iv, u32* Key)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(CsuDmaPtr != NULL);
Xil_AssertNonvoid(Iv != NULL);
@ -99,8 +99,8 @@ s32 XSecure_AesInitialize(XSecure_Aes *InstancePtr, XCsuDma *CsuDmaPtr,
InstancePtr->Iv = Iv;
/*
* Clarify if Aes block expects IV in big or small endian, swap endianness
* of Iv likewise
* Clarify if Aes block expects IV in big or small endian, swap
* endianness of Iv likewise
*/
InstancePtr->Key = Key;
@ -117,19 +117,19 @@ s32 XSecure_AesInitialize(XSecure_Aes *InstancePtr, XCsuDma *CsuDmaPtr,
*
* @return None
*
* @note None
*
******************************************************************************/
static void XSecure_AesWaitKeyLoad(XSecure_Aes *InstancePtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
volatile u32 Status;
do {
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_STS_OFFSET);
XSECURE_CSU_AES_STS_OFFSET);
} while (!((u32)Status & XSECURE_CSU_AES_STS_KEY_INIT_DONE));
}
@ -138,23 +138,22 @@ static void XSecure_AesWaitKeyLoad(XSecure_Aes *InstancePtr)
*
* Waits for AES completion.
*
* @param InstancePtr is a pointer to the XSecure_Aes instance.
* @param InstancePtr is a pointer to the XSecure_Aes instance.
*
* @return None
*
* @note None
******************************************************************************/
static void XSecure_AesWaitForDone(XSecure_Aes *InstancePtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
volatile u32 Status;
do {
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_STS_OFFSET);
XSECURE_CSU_AES_STS_OFFSET);
} while ((u32)Status & XSECURE_CSU_AES_STS_AES_BUSY);
}
@ -167,19 +166,19 @@ static void XSecure_AesWaitForDone(XSecure_Aes *InstancePtr)
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_AesReset(XSecure_Aes *InstancePtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_RESET_OFFSET, XSECURE_CSU_AES_RESET);
XSECURE_CSU_AES_RESET_OFFSET, XSECURE_CSU_AES_RESET);
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_RESET_OFFSET, 0x0U);
XSECURE_CSU_AES_RESET_OFFSET, 0x0U);
//replaced mb here
}
@ -192,32 +191,32 @@ void XSecure_AesReset(XSecure_Aes *InstancePtr)
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_AesKeyZero(XSecure_Aes *InstancePtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
volatile u32 Status;
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_CLR_OFFSET);
XSECURE_CSU_AES_KEY_CLR_OFFSET);
Status |= InstancePtr->KeySel;
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_CLR_OFFSET, (u32)Status);
XSECURE_CSU_AES_KEY_CLR_OFFSET, (u32)Status);
Status &= ~InstancePtr->KeySel;
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_CLR_OFFSET, (u32)Status);
XSECURE_CSU_AES_KEY_CLR_OFFSET, (u32)Status);
do {
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_STS_OFFSET);
XSECURE_CSU_AES_STS_OFFSET);
} while ((InstancePtr->KeySel << 8) == ((u32)Status &
(InstancePtr->KeySel << 8)));
(InstancePtr->KeySel << 8)));
}
/*****************************************************************************/
@ -229,36 +228,32 @@ void XSecure_AesKeyZero(XSecure_Aes *InstancePtr)
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_AesKeySelNLoad(XSecure_Aes *InstancePtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
if(InstancePtr->KeySel == XSECURE_CSU_AES_KEY_SRC_DEV)
{
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_SRC_OFFSET, XSECURE_CSU_AES_KEY_SRC_DEV);
XSECURE_CSU_AES_KEY_SRC_OFFSET, XSECURE_CSU_AES_KEY_SRC_DEV);
}
else
{
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_SRC_OFFSET,
XSECURE_CSU_AES_KEY_SRC_KUP);
XSECURE_CSU_AES_KEY_SRC_OFFSET,
XSECURE_CSU_AES_KEY_SRC_KUP);
}
/**
* Trig loading of key.
*/
/* Trig loading of key. */
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KEY_LOAD_OFFSET,
XSECURE_CSU_AES_KEY_LOAD);
XSECURE_CSU_AES_KEY_LOAD_OFFSET,
XSECURE_CSU_AES_KEY_LOAD);
/**
* Wait for AES key loading.
*/
/* Wait for AES key loading.*/
XSecure_AesWaitKeyLoad(InstancePtr);
}
@ -268,19 +263,20 @@ void XSecure_AesKeySelNLoad(XSecure_Aes *InstancePtr)
* Function for doing encryption using h/w AES engine.
*
* @param InstancePtr is a pointer to the XSecure_Aes instance.
* @param Dst is pointer to location where encrypted output will be written.
* @param Dst is pointer to location where encrypted output will
* be written.
* @param Src is pointer to input data for encryption.
* @param Len is the size of input data in bytes
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 Len)
u32 Len)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(Dst != NULL);
Xil_AssertVoid(Src != NULL);
@ -288,9 +284,7 @@ void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 SssCfg = 0U;
/**
* Configure the SSS for AES.
*/
/* Configure the SSS for AES.*/
u32 SssDma = XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC_AES);
u32 SssAes = XSecure_SssInputAes(XSECURE_CSU_SSS_SRC_SRC_DMA);
@ -298,35 +292,27 @@ void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
XSecure_SssSetup(SssCfg);
/**
* Configure the AES for Encryption.
*/
/* Configure the AES for Encryption.*/
XSecure_WriteReg(InstancePtr->BaseAddress, XSECURE_CSU_AES_CFG_OFFSET,
XSECURE_CSU_AES_CFG_ENC);
XSECURE_CSU_AES_CFG_ENC);
/**
* Start the message.
*/
/* Start the message.*/
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_START_MSG_OFFSET,
XSECURE_CSU_AES_START_MSG);
XSECURE_CSU_AES_START_MSG_OFFSET,
XSECURE_CSU_AES_START_MSG);
/**
* Push IV into the AES engine.
*/
/* Push IV into the AES engine.*/
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)InstancePtr->Iv,
XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
(u64)InstancePtr->Iv,
XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL);
/**
* Configure the CSU DMA Tx/Rx.
*/
/* Configure the CSU DMA Tx/Rx.*/
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL, (u64) Dst,
(Len + XSECURE_SECURE_GCM_TAG_SIZE)/4U, 0);
(Len + XSECURE_SECURE_GCM_TAG_SIZE)/4U, 0);
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL, (u64) Src,
XSECURE_SECURE_GCM_TAG_SIZE/4U, 1);
XSECURE_SECURE_GCM_TAG_SIZE/4U, 1);
/**
* Wait for Dst/Src DMA done.
@ -334,9 +320,7 @@ void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL);
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL);
/**
* Wait for AES encryption completion.
*/
/* Wait for AES encryption completion.*/
XSecure_AesWaitForDone(InstancePtr);
}
@ -346,22 +330,21 @@ void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
* Function for doing decryption using h/w AES engine.
*
* @param InstancePtr is a pointer to the XSecure_Aes instance.
* @param Dst is pointer to location where encrypted output will be written.
* @param Dst is pointer to location where encrypted data will be written
* @param Src is pointer to input data for encryption.
* @param Tag is pointer to the GCM tag used for authentication
* @param Len is the length of the output data expected after decryption.
* @param Flag denotes whether the block is Secure header or data block
*
* @return
* -returns 1 if GCM tag matching was successful
* @return returns 1 if GCM tag matching was successful
*
* @note None
*
******************************************************************************/
static u32 XSecure_AesDecryptBlk(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
const u8 *Tag, u32 Len, u32 Flag)
static u32 XSecure_AesDecryptBlk(XSecure_Aes *InstancePtr, u8 *Dst,
const u8 *Src, const u8 *Tag, u32 Len, u32 Flag)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(Dst != NULL);
Xil_AssertNonvoid(Src != NULL);
@ -369,143 +352,116 @@ static u32 XSecure_AesDecryptBlk(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Sr
volatile u32 Status = 0U;
/*
* Start the message.
*/
/* Start the message. */
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_START_MSG_OFFSET,
XSECURE_CSU_AES_START_MSG);
XSECURE_CSU_AES_START_MSG_OFFSET,
XSECURE_CSU_AES_START_MSG);
/*
* Push IV into the AES engine.
*/
/* Push IV into the AES engine. */
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)InstancePtr->Iv, XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
(u64)InstancePtr->Iv, XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL);
/**
* Enable CSU DMA Src channel for byte swapping.
*/
/* Enable CSU DMA Src channel for byte swapping.*/
XCsuDma_Configure ConfigurValues = {0};
XCsuDma_GetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
&ConfigurValues);
&ConfigurValues);
ConfigurValues.EndianType = 1U;
XCsuDma_SetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
&ConfigurValues);
&ConfigurValues);
if(Flag)
{
/**
* This means we are decrypting Block of the boot image.
* Enable CSU DMA Dst channel for byte swapping.
*/
/*
* This means we are decrypting Block of the boot image.
* Enable CSU DMA Dst channel for byte swapping.
*/
XCsuDma_GetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL,
&ConfigurValues);
&ConfigurValues);
ConfigurValues.EndianType = 1U;
XCsuDma_SetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL,
&ConfigurValues);
/*
* Configure the CSU DMA Tx/Rx for the incoming Block.
*/
&ConfigurValues);
/* Configure the CSU DMA Tx/Rx for the incoming Block. */
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL,
(u64)Dst, Len/4U, 0);
(u64)Dst, Len/4U, 0);
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)Src, Len/4U, 0);
(u64)Src, Len/4U, 0);
/*
* Wait for the Dst DMA completion.
*/
/* Wait for the Dst DMA completion. */
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL);
/*
* Disble CSU DMA Dst channel for byte swapping.
*/
/* Disble CSU DMA Dst channel for byte swapping. */
XCsuDma_GetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL,
&ConfigurValues);
&ConfigurValues);
ConfigurValues.EndianType = 0U;
XCsuDma_SetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_DST_CHANNEL,
&ConfigurValues);
&ConfigurValues);
/*
* Configure AES engine to push decrypted Key and IV in the block,
* to the CSU KEY and IV registers.
* Configure AES engine to push decrypted Key and IV in the
* block to the CSU KEY and IV registers.
*/
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KUP_WR_OFFSET,
XSECURE_CSU_AES_IV_WR | XSECURE_CSU_AES_KUP_WR);
XSECURE_CSU_AES_KUP_WR_OFFSET,
XSECURE_CSU_AES_IV_WR | XSECURE_CSU_AES_KUP_WR);
}
else
{
/*
* This means we are decrypting the Secure header.
* Configure AES engine to push decrypted IV in the Secure header,
* to the CSU IV register.
* Configure AES engine to push decrypted IV in the Secure
* header to the CSU IV register.
*/
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KUP_WR_OFFSET,
XSECURE_CSU_AES_IV_WR | XSECURE_CSU_AES_KUP_WR);
XSECURE_CSU_AES_KUP_WR_OFFSET,
XSECURE_CSU_AES_IV_WR | XSECURE_CSU_AES_KUP_WR);
}
/*
* Push the Secure header/footer for decrypting next blocks KEY and IV.
*/
/* Push the Secure header/footer for decrypting next blocks KEY and IV. */
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)(Src + Len), XSECURE_SECURE_HDR_SIZE/4U, 1);
(u64)(Src + Len), XSECURE_SECURE_HDR_SIZE/4U, 1);
/*
* Wait for the Src DMA completion.
*/
/* Wait for the Src DMA completion. */
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL);
/*
* Restore Key write register to 0.
*/
/* Restore Key write register to 0. */
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_KUP_WR_OFFSET, 0x0);
XSECURE_CSU_AES_KUP_WR_OFFSET, 0x0);
/*
* Push the GCM tag.
*/
/* Push the GCM tag. */
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL, (u64)Tag,
XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
XSECURE_SECURE_GCM_TAG_SIZE/4U, 0);
/*
* Wait for the Src DMA completion.
*/
/* Wait for the Src DMA completion. */
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL);
/*
* Disable CSU DMA Src channel for byte swapping.
*/
/* Disable CSU DMA Src channel for byte swapping. */
XCsuDma_GetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
&ConfigurValues);
&ConfigurValues);
ConfigurValues.EndianType = 0U;
XCsuDma_SetConfig(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
&ConfigurValues);
&ConfigurValues);
/*
* Wait for AES Decryption completion.
*/
/* Wait for AES Decryption completion. */
XSecure_AesWaitForDone(InstancePtr);
/*
* Get the AES status to know if GCM check passed.
*/
/* Get the AES status to know if GCM check passed. */
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_STS_OFFSET) &
XSECURE_CSU_AES_STS_GCM_TAG_OK;
XSECURE_CSU_AES_STS_OFFSET) &
XSECURE_CSU_AES_STS_GCM_TAG_OK;
return !!Status;
}
@ -514,62 +470,63 @@ static u32 XSecure_AesDecryptBlk(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Sr
/**
*
* This function will handle the AES-GCM Decryption.
*
* The Multiple key(a.k.a Key Rolling) or Single key
* Encrypted images will have the same format,
* such that it will have the following:
*
* Secure header --> Dummy AES Key of 32byte +
* Block 0 IV of 12byte +
* DLC for Block 0 of 4byte +
* GCM tag of 16byte(Un-Enc).
* Block N --> Boot Image Data for Block N of n size +
* Block N+1 AES key of 32byte +
* Block N+1 IV of 12byte +
* GCM tag for Block N of 16byte(Un-Enc).
*
* The Secure header and Block 0 will be decrypted using
* Device key or user provide key.
* If more than 1 blocks are found then the key and IV
* obtained from previous block will be used for decryption
*
*
* 1> Read the 1st 64bytes and decrypt 48 bytes using
* the selected Device key.
* 2> Decrypt the 0th block using the IV + Size from step 2
* and selected device key.
* 3> After decryption we will get decrypted data+KEY+IV+Blk
* Size so store the KEY/IV into KUP/IV registers.
* 4> Using Blk size, IV and Next Block Key information
* start decrypting the next block.
* 5> if the Current Image size > Total image length,
* go to next step 8. Else go back to step 5
* 6> If there are failures, return error code
* 7> If we have reached this step means the decryption is SUCCESS.
*
*
* The Multiple key(a.k.a Key Rolling) or Single key
* Encrypted images will have the same format,
* such that it will have the following:
*
* Secure header --> Dummy AES Key of 32byte +
* Block 0 IV of 12byte +
* DLC for Block 0 of 4byte +
* GCM tag of 16byte(Un-Enc).
* Block N --> Boot Image Data for Block N of n size +
* Block N+1 AES key of 32byte +
* Block N+1 IV of 12byte +
* GCM tag for Block N of 16byte(Un-Enc).
*
* The Secure header and Block 0 will be decrypted using
* Device key or user provide key.
* If more than 1 blocks are found then the key and IV
* obtained from previous block will be used for decryption
*
*
* 1> Read the 1st 64bytes and decrypt 48 bytes using
* the selected Device key.
* 2> Decrypt the 0th block using the IV + Size from step 2
* and selected device key.
* 3> After decryption we will get decrypted data+KEY+IV+Blk
* Size so store the KEY/IV into KUP/IV registers.
* 4> Using Blk size, IV and Next Block Key information
* start decrypting the next block.
* 5> if the Current Image size > Total image length,
* go to next step 8. Else go back to step 5
* 6> If there are failures, return error code
* 7> If we have reached this step means the decryption is SUCCESS.
*
*
*
* @param InstancePtr is a pointer to the XSecure_Aes instance.
* @param Src is the pointer to encrypted data source location
* @param Dst is the pointer to location where decrypted data will be written
* @param Dst is the pointer to location where decrypted data will be
* written.
* @param Length is the expected total length of decrypted image expected.
*
* @return u32 ErrorCode
*
* @note None
*
******************************************************************************/
u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 Length)
u32 Length)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(Dst != NULL);
Xil_AssertNonvoid(Src != NULL);
u32 SssCfg = 0x0U;
volatile u32 Status=0x0U;
u32 ErrorCode = XSECURE_CSU_AES_DECRYPTION_DONE ;
u32 ErrorCode = XSECURE_CSU_AES_DECRYPTION_DONE ;
u32 CurrentImgLen = 0x0U;
u32 NextBlkLen = 0x0U;
u32 PrevBlkLen = 0x0U;
@ -579,9 +536,7 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 BlockCnt = 0x0U;
u32 ImageLen = 0x0U;
/*
* Configure the SSS for AES.
*/
/* Configure the SSS for AES. */
u32 SssDma = XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC_AES);
u32 SssAes = XSecure_SssInputAes(XSECURE_CSU_SSS_SRC_SRC_DMA);
@ -589,9 +544,7 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
XSecure_SssSetup(SssCfg);
/*
* Configure AES for Decryption
*/
/* Configure AES for Decryption */
XSecure_WriteReg(InstancePtr->BaseAddress, XSECURE_CSU_AES_CFG_OFFSET,
XSECURE_CSU_AES_CFG_DEC);
@ -601,9 +554,7 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
SrcAddr = (u8 *)Src ;
GcmTagAddr = SrcAddr + XSECURE_SECURE_HDR_SIZE;
/*
* Clear AES contents by reseting it.
*/
/* Clear AES contents by reseting it. */
XSecure_AesReset(InstancePtr);
if(InstancePtr->KeySel == XSECURE_CSU_AES_KEY_SRC_DEV)
@ -616,15 +567,14 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 Addr=0U;
for(Count = 0U; Count < 8U; Count++)
{
/*
* Helion AES block expects the key in big-endian.
*/
/* Helion AES block expects the key in big-endian. */
Value = Xil_Htonl(InstancePtr->Key[Count]);
Addr = InstancePtr->BaseAddress + XSECURE_CSU_AES_KUP_0_OFFSET
+ (Count * 4);
XSecure_Out32(Addr, Value);
Addr = InstancePtr->BaseAddress +
XSECURE_CSU_AES_KUP_0_OFFSET
+ (Count * 4);
XSecure_Out32(Addr, Value);
}
XSecure_AesKeySelNLoad(InstancePtr);
}
@ -633,19 +583,14 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
{
PrevBlkLen = NextBlkLen;
/*
* Start decryption of Secure-Header/Block/Footer.
*/
/* Start decryption of Secure-Header/Block/Footer. */
Status = XSecure_AesDecryptBlk(InstancePtr, DestAddr,
(const u8 *)SrcAddr,
((const u8 *)GcmTagAddr),
NextBlkLen,
BlockCnt);
(const u8 *)SrcAddr,
((const u8 *)GcmTagAddr),
NextBlkLen, BlockCnt);
/*
* If decryption failed then return error.
*/
/* If decryption failed then return error. */
if(0U == (u32)Status)
{
ErrorCode= XSECURE_CSU_AES_GCM_TAG_MISMATCH;
@ -657,11 +602,9 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
* Size is in 32-bit words so mul it with 4
*/
NextBlkLen = Xil_Htonl(XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_AES_IV_3_OFFSET)) * 4;
XSECURE_CSU_AES_IV_3_OFFSET)) * 4;
/*
* Update the current image size.
*/
/* Update the current image size. */
CurrentImgLen += NextBlkLen;
if(0U == NextBlkLen)
@ -697,9 +640,7 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
if(BlockCnt > 0U)
{
/*
* Update DestAddr and SrcAddr for next Block decryption.
*/
/* Update DestAddr and SrcAddr for next Block decryption. */
DestAddr += PrevBlkLen;
SrcAddr = (GcmTagAddr + XSECURE_SECURE_GCM_TAG_SIZE);
/*
@ -711,26 +652,18 @@ u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
}
else
{
/*
* Update SrcAddr for Block-0
*/
/* Update SrcAddr for Block-0 */
SrcAddr = (SrcAddr + XSECURE_SECURE_HDR_SIZE +
XSECURE_SECURE_GCM_TAG_SIZE);
/*
* Point IV to the CSU IV register.
*/
XSECURE_SECURE_GCM_TAG_SIZE);
/* Point IV to the CSU IV register. */
InstancePtr->Iv = (u32 *)(InstancePtr->BaseAddress +
XSECURE_CSU_AES_IV_0_OFFSET);
XSECURE_CSU_AES_IV_0_OFFSET);
}
/*
* Update the GcmTagAddr to get GCM-TAG for next block.
*/
/* Update the GcmTagAddr to get GCM-TAG for next block. */
GcmTagAddr = SrcAddr + NextBlkLen + XSECURE_SECURE_HDR_SIZE;
/*
* Update block count.
*/
/* Update block count. */
BlockCnt++;
}while(1);

View file

@ -57,7 +57,7 @@
* in the following way:
*
* - XSecure_AesInitialize(XSecure_Aes *InstancePtr, XCsuDma *CsuDmaPtr,
* u32 KeySel, u32* Iv, u32* Key)
* u32 KeySel, u32* Iv, u32* Key)
*
* The key for decryption can be the device key or user provided key.
* KeySel variable denotes the key to be used. In case the key is user
@ -69,9 +69,9 @@
*
*
* @note
* -The format of encrypted data(boot image) has to be exactly as
* specified by the bootgen. Any encrypted data has to start with a
* secure header first and then the data blocks.
* -The format of encrypted data(boot image) has to be exactly as
* specified by the bootgen. Any encrypted data has to start with a
* secure header first and then the data blocks.
*
* <pre>
* MODIFICATION HISTORY:
@ -91,56 +91,68 @@
/************************** Include Files ***********************************/
#include "xsecure_hw.h"
#include "../../../include/xcsudma.h"
#include "xcsudma.h"
#include "xstatus.h"
#include "xil_io.h"
/************************** Constant Definitions ****************************/
#define XSECURE_CSU_AES_STS_AES_BUSY (1U << 0) /**< AES busy */
#define XSECURE_CSU_AES_STS_AES_READY (1U << 1) /**< Ready to Receive Data */
#define XSECURE_CSU_AES_STS_AES_DONE (1U << 2) /**< Operation Complete */
#define XSECURE_CSU_AES_STS_GCM_TAG_OK (1U << 3) /**< GCM Tag Passed */
#define XSECURE_CSU_AES_STS_KEY_INIT_DONE (1U << 4) /**< Key Initialized */
#define XSECURE_CSU_AES_STS_AES_KEY_ZERO (1U << 8) /**< AES key zeroed */
#define XSECURE_CSU_AES_STS_KUP_ZEROED (1U << 9) /**< KUP key Zeroed */
#define XSECURE_CSU_AES_STS_BOOT_KEY_ZERO (1U << 10) /**< Boot Key zeroed */
#define XSECURE_CSU_AES_STS_OKR_ZERO (1U << 11) /**< Operational Key zeroed */
#define XSECURE_CSU_AES_STS_AES_BUSY (1U << 0) /**< AES busy */
#define XSECURE_CSU_AES_STS_AES_READY (1U << 1)
/**< Ready to Receive Data */
#define XSECURE_CSU_AES_STS_AES_DONE (1U << 2)
/**< Operation Complete */
#define XSECURE_CSU_AES_STS_GCM_TAG_OK (1U << 3) /**< GCM Tag Passed */
#define XSECURE_CSU_AES_STS_KEY_INIT_DONE (1U << 4)
/**< Key Initialize */
#define XSECURE_CSU_AES_STS_AES_KEY_ZERO (1U << 8)
/**< AES key zeroed */
#define XSECURE_CSU_AES_STS_KUP_ZEROED (1U << 9) /**< KUP key Zeroed */
#define XSECURE_CSU_AES_STS_BOOT_KEY_ZERO (1U << 10)
/**< Boot Key zeroed */
#define XSECURE_CSU_AES_STS_OKR_ZERO (1U << 11)
/**< Operational Key zeroed */
#define XSECURE_CSU_AES_KEY_SRC_KUP (0x0U) /**< KUP key source */
#define XSECURE_CSU_AES_KEY_SRC_DEV (0x1U) /**< Device Key source */
#define XSECURE_CSU_AES_KEY_SRC_KUP (0x0U) /**< KUP key source */
#define XSECURE_CSU_AES_KEY_SRC_DEV (0x1U) /**< Device Key source */
#define XSECURE_CSU_AES_KEY_LOAD (1U << 0) /**< Load AES key from Source */
#define XSECURE_CSU_AES_KEY_LOAD (1U << 0)
/**< Load AES key from Source */
#define XSECURE_CSU_AES_START_MSG (1U << 0) /**< AES Start message */
#define XSECURE_CSU_AES_START_MSG (1U << 0) /**< AES Start message */
#define XSECURE_CSU_AES_KUP_WR (1U << 0) /**< Direct AES Output to KUP */
#define XSECURE_CSU_AES_IV_WR (1U << 1)
/**< Direct AES Output to IV Reg */
#define XSECURE_CSU_AES_KUP_WR (1U << 0)
/**< Direct AES Output to KUP */
#define XSECURE_CSU_AES_IV_WR (1U << 1)
/**< Direct AES Output to IV Reg */
#define XSECURE_CSU_AES_RESET (1U << 0) /**< Reset Value */
#define XSECURE_CSU_AES_RESET (1U << 0) /**< Reset Value */
#define XSECURE_CSU_AES_KEY_ZERO (1U << 0) /**< set AES key to zero */
#define XSECURE_CSU_AES_KUP_ZERO (1U << 1) /**< Set KUP Reg. to zero */
#define XSECURE_CSU_AES_KEY_ZERO (1U << 0)
/**< set AES key to zero */
#define XSECURE_CSU_AES_KUP_ZERO (1U << 1)
/**< Set KUP Reg. to zero */
#define XSECURE_CSU_AES_CFG_DEC (0x0U) /**< AES mode Decrypt */
#define XSECURE_CSU_AES_CFG_ENC (0x1U) /**< AES Mode Encrypt */
#define XSECURE_CSU_AES_CFG_DEC (0x0U) /**< AES mode Decrypt */
#define XSECURE_CSU_AES_CFG_ENC (0x1U) /**< AES Mode Encrypt */
#define XSECURE_CSU_KUP_WR (1U << 0) /**< Direct output to KUP */
#define XSECURE_CSU_IV_WR (1U << 4) /**< image length mismatch */
#define XSECURE_CSU_KUP_WR (1U << 0)
/**< Direct output to KUP */
#define XSECURE_CSU_IV_WR (1U << 4)
/**< image length mismatch */
/*
* Error Codes and Statuses
*/
#define XSECURE_CSU_AES_DECRYPTION_DONE 0U
/**< AES Decryption successful */
#define XSECURE_CSU_AES_GCM_TAG_MISMATCH 1U /**< user provided GCM tag does
not match calculated tag */
#define XSECURE_CSU_AES_IMAGE_LEN_MISMATCH 2U /**< image length mismatch */
/* Error Codes and Statuses */
#define XSECURE_CSU_AES_DECRYPTION_DONE (0U)
/**< AES Decryption successful */
#define XSECURE_CSU_AES_GCM_TAG_MISMATCH (1U)
/**< user provided GCM tag does
not match calculated tag */
#define XSECURE_CSU_AES_IMAGE_LEN_MISMATCH (2U)
/**< image length mismatch */
#define XSECURE_SECURE_HDR_SIZE (48U)
/**< Secure Header Size in Bytes*/
#define XSECURE_SECURE_GCM_TAG_SIZE (16U) /**< GCM Tag Size in Bytes */
#define XSECURE_SECURE_HDR_SIZE (48U)
/**< Secure Header Size in Bytes*/
#define XSECURE_SECURE_GCM_TAG_SIZE (16U) /**< GCM Tag Size in Bytes */
/************************** Type Definitions ********************************/
@ -159,35 +171,20 @@ typedef struct {
/************************** Function Prototypes ******************************/
/*
* Initialization Functions
*/
/* Initialization Functions */
s32 XSecure_AesInitialize(XSecure_Aes *InstancePtr, XCsuDma *CsuDmaPtr,
u32 KeySel, u32* Iv, u32* Key);
u32 KeySel, u32* Iv, u32* Key);
void XSecure_AesKeySelNLoad(XSecure_Aes *InstancePtr);
/*
* Decryption
*/
/* Decryption */
u32 XSecure_AesDecrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 Length);
u32 Length);
/*
* Encryption
*/
/* Encryption */
void XSecure_AesEncrypt(XSecure_Aes *InstancePtr, u8 *Dst, const u8 *Src,
u32 Len);
u32 Len);
/*
* Reset
*/
/* Reset */
void XSecure_AesReset(XSecure_Aes *InstancePtr);
/*
* Additional configuration
*/
void XSecure_AesKeyZero(XSecure_Aes *InstancePtr) ;
#endif /* XSECURE_AES_H_ */

View file

@ -77,19 +77,21 @@ extern "C" {
/************************** Constant Definitions *****************************/
#define XSECURE_CSU_REG_BASE_ADDR (0xFFCA0000U) /**< CSU base address */
#define XSECURE_CSU_DMA_BASE (0xFFC80000U) /**< CSUDMA base address */
#define XSECURE_CSU_REG_BASE_ADDR (0xFFCA0000U)
/**< CSU base address */
#define XSECURE_CSU_DMA_BASE (0xFFC80000U)
/**< CSUDMA base address */
#define XSECURE_CSU_SHA3_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x2000U)
/**< SHA3 base address */
#define XSECURE_CSU_CTRL_REG (XSECURE_CSU_REG_BASE_ADDR + 0x4U) /**< CSU control reg. */
#define XSECURE_CSU_SSS_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x8U) /**< CSU SSS base address */
#define XSECURE_CSU_AES_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x1000U)
/**< CSU AES base address */
#define XSECURE_CSU_RSA_BASE (0xFFCE0000U)
/**< RSA reg. base address */
#define XSECURE_CSU_SHA3_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x2000U)
/**< SHA3 base address */
#define XSECURE_CSU_CTRL_REG (XSECURE_CSU_REG_BASE_ADDR + 0x4U)
/**< CSU control reg. */
#define XSECURE_CSU_SSS_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x8U)
/**< CSU SSS base address */
#define XSECURE_CSU_AES_BASE (XSECURE_CSU_REG_BASE_ADDR + 0x1000U)
/**< CSU AES base address */
#define XSECURE_CSU_RSA_BASE (0xFFCE0000U)
/**< RSA reg. base address */
/** @name Register Map
@ -97,13 +99,14 @@ extern "C" {
* Register offsets for the SHA module.
* @{
*/
#define XSECURE_CSU_SHA3_START_OFFSET (0x00U) /**< SHA start message */
#define XSECURE_CSU_SHA3_RESET_OFFSET (0x04U) /**< Reset Register */
#define XSECURE_CSU_SHA3_DONE_OFFSET (0x08U) /**< SHA Done Register */
#define XSECURE_CSU_SHA3_START_OFFSET (0x00U) /**< SHA start message */
#define XSECURE_CSU_SHA3_RESET_OFFSET (0x04U) /**< Reset Register */
#define XSECURE_CSU_SHA3_DONE_OFFSET (0x08U) /**< SHA Done Register */
#define XSECURE_CSU_SHA3_DIGEST_0_OFFSET (0x10U) /**< SHA3 Digest: Reg 0 */
#define XSECURE_CSU_SHA3_DIGEST_11_OFFSET (0x34U)
/**< SHA3 Digest: Last Register */
#define XSECURE_CSU_SHA3_DIGEST_0_OFFSET (0x10U)
/**< SHA3 Digest: Reg 0 */
#define XSECURE_CSU_SHA3_DIGEST_11_OFFSET (0x34U)
/**< SHA3 Digest: Last Register */
/* @} */
/** @name Register Map
@ -111,34 +114,30 @@ extern "C" {
* Register offsets for the AES module.
* @{
*/
#define XSECURE_CSU_AES_STS_OFFSET (0x00U) /**< AES Status */
#define XSECURE_CSU_AES_KEY_SRC_OFFSET (0x04U) /**< AES Key Source */
#define XSECURE_CSU_AES_KEY_LOAD_OFFSET (0x08U) /**< AES Key Load Reg */
#define XSECURE_CSU_AES_STS_OFFSET (0x00U) /**< AES Status */
#define XSECURE_CSU_AES_KEY_SRC_OFFSET (0x04U) /**< AES Key Source */
#define XSECURE_CSU_AES_KEY_LOAD_OFFSET (0x08U) /**< AES Key Load Reg */
#define XSECURE_CSU_AES_START_MSG_OFFSET (0x0CU) /**< AES Start Message */
#define XSECURE_CSU_AES_RESET_OFFSET (0x10U) /**< AES Reset Register */
#define XSECURE_CSU_AES_KEY_CLR_OFFSET (0x14U) /**< AES Key Clear */
#define XSECURE_CSU_AES_CFG_OFFSET (0x18U)/**< AES Operational Mode */
#define XSECURE_CSU_AES_KUP_WR_OFFSET (0x1CU)
/**< AES KUP Write Control */
#define XSECURE_CSU_AES_RESET_OFFSET (0x10U) /**< AES Reset Register */
#define XSECURE_CSU_AES_KEY_CLR_OFFSET (0x14U) /**< AES Key Clear */
#define XSECURE_CSU_AES_CFG_OFFSET (0x18U)
/**< AES Operational Mode */
#define XSECURE_CSU_AES_KUP_WR_OFFSET (0x1CU)
/**< AES KUP Write Control */
#define XSECURE_CSU_AES_KUP_0_OFFSET (0x20U)
/**< AES Key Update 0 */
#define XSECURE_CSU_AES_KUP_1_OFFSET (0x24U) /**< AES Key Update 1 */
#define XSECURE_CSU_AES_KUP_2_OFFSET (0x28U) /**< AES Key Update 2 */
#define XSECURE_CSU_AES_KUP_3_OFFSET (0x2CU) /**< AES Key Update 3 */
#define XSECURE_CSU_AES_KUP_4_OFFSET (0x30U) /**< AES Key Update 4 */
#define XSECURE_CSU_AES_KUP_5_OFFSET (0x34U) /**< AES Key Update 5 */
#define XSECURE_CSU_AES_KUP_6_OFFSET (0x38U) /**< AES Key Update 6 */
#define XSECURE_CSU_AES_KUP_7_OFFSET (0x3CU) /**< AES Key Update 7 */
#define XSECURE_CSU_AES_KUP_0_OFFSET (0x20U) /**< AES Key Update 0 */
#define XSECURE_CSU_AES_KUP_1_OFFSET (0x24U) /**< AES Key Update 1 */
#define XSECURE_CSU_AES_KUP_2_OFFSET (0x28U) /**< AES Key Update 2 */
#define XSECURE_CSU_AES_KUP_3_OFFSET (0x2CU) /**< AES Key Update 3 */
#define XSECURE_CSU_AES_KUP_4_OFFSET (0x30U) /**< AES Key Update 4 */
#define XSECURE_CSU_AES_KUP_5_OFFSET (0x34U) /**< AES Key Update 5 */
#define XSECURE_CSU_AES_KUP_6_OFFSET (0x38U) /**< AES Key Update 6 */
#define XSECURE_CSU_AES_KUP_7_OFFSET (0x3CU) /**< AES Key Update 7 */
#define XSECURE_CSU_AES_IV_0_OFFSET (0x40U) /**< AES IV 0 */
#define XSECURE_CSU_AES_IV_1_OFFSET (0x44U) /**< AES IV 1 */
#define XSECURE_CSU_AES_IV_2_OFFSET (0x48U) /**< AES IV 2 */
#define XSECURE_CSU_AES_IV_3_OFFSET (0x4CU) /**< AES IV 3 */
#define XSECURE_CSU_AES_IV_0_OFFSET (0x40U) /**< AES IV 0 */
#define XSECURE_CSU_AES_IV_1_OFFSET (0x44U) /**< AES IV 1 */
#define XSECURE_CSU_AES_IV_2_OFFSET (0x48U) /**< AES IV 2 */
#define XSECURE_CSU_AES_IV_3_OFFSET (0x4CU) /**< AES IV 3 */
/* @} */
@ -147,83 +146,81 @@ extern "C" {
* Register offsets for the RSA module.
* @{
*/
#define XSECURE_CSU_RSA_WRITE_DATA_OFFSET (0x00U)
/**< RAM write data offset */
#define XSECURE_CSU_RSA_WRITE_ADDR_OFFSET (0x04U)
/**< RAM write address offset */
#define XSECURE_CSU_RSA_READ_DATA_OFFSET (0x08U)
/**< RAM data read offset */
#define XSECURE_CSU_RSA_READ_ADDR_OFFSET (0x0CU)
/**< RAM read offset */
#define XSECURE_CSU_RSA_CONTROL_OFFSET (0x10U)
/**< RSA Control Reg */
#define XSECURE_CSU_RSA_WRITE_DATA_OFFSET (0x00U)
/**< RAM write data offset */
#define XSECURE_CSU_RSA_WRITE_ADDR_OFFSET (0x04U)
/**< RAM write address offset */
#define XSECURE_CSU_RSA_READ_DATA_OFFSET (0x08U)
/**< RAM data read offset */
#define XSECURE_CSU_RSA_READ_ADDR_OFFSET (0x0CU)
/**< RAM read offset */
#define XSECURE_CSU_RSA_CONTROL_OFFSET (0x10U)
/**< RSA Control Reg */
#define XSECURE_CSU_RSA_STATUS_OFFSET (0x14U)
/**< Status Register */
#define XSECURE_CSU_RSA_STATUS_OFFSET (0x14U)
/**< Status Register */
#define XSECURE_CSU_RSA_MINV0_OFFSET (0x18U)
/**< RSA MINV(Mod 32 Inverse) 0 */
#define XSECURE_CSU_RSA_MINV1_OFFSET (0x1CU)
/**< RSA MINV 1 */
#define XSECURE_CSU_RSA_MINV2_OFFSET (0x20U) /**< RSA MINV 2 */
#define XSECURE_CSU_RSA_MINV3_OFFSET (0x24U) /**< RSA MINV 3 */
#define XSECURE_CSU_RSA_ZERO_OFFSET (0x28U) /**< RSA Zero offset */
#define XSECURE_CSU_RSA_MINV0_OFFSET (0x18U)
/**< RSA MINV(Mod 32 Inverse) 0 */
#define XSECURE_CSU_RSA_MINV1_OFFSET (0x1CU)
/**< RSA MINV 1 */
#define XSECURE_CSU_RSA_MINV2_OFFSET (0x20U) /**< RSA MINV 2 */
#define XSECURE_CSU_RSA_MINV3_OFFSET (0x24U) /**< RSA MINV 3 */
#define XSECURE_CSU_RSA_ZERO_OFFSET (0x28U) /**< RSA Zero offset */
#define XSECURE_CSU_RSA_WR_DATA_0_OFFSET (0x2cU) /**< Write Data 0 */
#define XSECURE_CSU_RSA_WR_DATA_1_OFFSET (0x30U) /**< Write Data 1 */
#define XSECURE_CSU_RSA_WR_DATA_2_OFFSET (0x34U) /**< Write Data 2 */
#define XSECURE_CSU_RSA_WR_DATA_3_OFFSET (0x38U) /**< Write Data 3 */
#define XSECURE_CSU_RSA_WR_DATA_4_OFFSET (0x3cU) /**< Write Data 4 */
#define XSECURE_CSU_RSA_WR_DATA_5_OFFSET (0x40U) /**< Write Data 5 */
#define XSECURE_CSU_RSA_WR_ADDR_OFFSET (0x44U)
/**< Write address in RSA RAM */
#define XSECURE_CSU_RSA_WR_DATA_0_OFFSET (0x2cU) /**< Write Data 0 */
#define XSECURE_CSU_RSA_WR_DATA_1_OFFSET (0x30U) /**< Write Data 1 */
#define XSECURE_CSU_RSA_WR_DATA_2_OFFSET (0x34U) /**< Write Data 2 */
#define XSECURE_CSU_RSA_WR_DATA_3_OFFSET (0x38U) /**< Write Data 3 */
#define XSECURE_CSU_RSA_WR_DATA_4_OFFSET (0x3cU) /**< Write Data 4 */
#define XSECURE_CSU_RSA_WR_DATA_5_OFFSET (0x40U) /**< Write Data 5 */
#define XSECURE_CSU_RSA_WR_ADDR_OFFSET (0x44U)
/**< Write address in RSA RAM */
#define XSECURE_CSU_RSA_RD_DATA_0_OFFSET (0x48U) /**< Read Data 0 */
#define XSECURE_CSU_RSA_RD_DATA_1_OFFSET (0x4cU) /**< Read Data 1 */
#define XSECURE_CSU_RSA_RD_DATA_2_OFFSET (0x50U) /**< Read Data 2 */
#define XSECURE_CSU_RSA_RD_DATA_3_OFFSET (0x54U) /**< Read Data 3 */
#define XSECURE_CSU_RSA_RD_DATA_4_OFFSET (0x58U) /**< Read Data 4 */
#define XSECURE_CSU_RSA_RD_DATA_5_OFFSET (0x5cU) /**< Read Data 5 */
#define XSECURE_CSU_RSA_RD_ADDR_OFFSET (0x60U)
/**< Read address in RSA RAM */
#define XSECURE_CSU_RSA_RD_DATA_0_OFFSET (0x48U) /**< Read Data 0 */
#define XSECURE_CSU_RSA_RD_DATA_1_OFFSET (0x4cU) /**< Read Data 1 */
#define XSECURE_CSU_RSA_RD_DATA_2_OFFSET (0x50U) /**< Read Data 2 */
#define XSECURE_CSU_RSA_RD_DATA_3_OFFSET (0x54U) /**< Read Data 3 */
#define XSECURE_CSU_RSA_RD_DATA_4_OFFSET (0x58U) /**< Read Data 4 */
#define XSECURE_CSU_RSA_RD_DATA_5_OFFSET (0x5cU) /**< Read Data 5 */
#define XSECURE_CSU_RSA_RD_ADDR_OFFSET (0x60U)
/**< Read address in RSA RAM */
/* @} */
/**************************** Type Definitions *******************************/
/*
* Definition for SSS reg Source bits.
*/
/* Definition for SSS reg Source bits. */
typedef enum
{
XSECURE_CSU_SSS_SRC_PCAP = 0x3U,
XSECURE_CSU_SSS_SRC_SRC_DMA = 0x5U,
XSECURE_CSU_SSS_SRC_AES = 0xAU,
XSECURE_CSU_SSS_SRC_PSTP = 0xCU,
XSECURE_CSU_SSS_SRC_NONE = 0x0U,
XSECURE_CSU_SSS_SRC_MASK = 0xFU
}XSECURE_CSU_SSS_SRC;
XSECURE_CSU_SSS_SRC_PCAP = 0x3U, /**< SSS source is PCAP */
XSECURE_CSU_SSS_SRC_SRC_DMA = 0x5U, /**< SSS source is DMA */
XSECURE_CSU_SSS_SRC_AES = 0xAU, /**< SSS source is AES */
XSECURE_CSU_SSS_SRC_PSTP = 0xCU, /**< SSS source is PSTP */
XSECURE_CSU_SSS_SRC_NONE = 0x0U, /**< NO Source */
XSECURE_CSU_SSS_SRC_MASK = 0xFU /**< Mask for SSS source */
}XSECURE_CSU_SSS_SRC; /**< SSS source values */
/**
* Definition for SSS reg Destination bits.
*/
typedef enum
{
XSECURE_CSU_SSS_PCAP_SHIFT = 0U,
XSECURE_CSU_SSS_DMA_SHIFT = 4U,
XSECURE_CSU_SSS_AES_SHIFT = 8U,
XSECURE_CSU_SSS_SHA_SHIFT = 12U,
XSECURE_CSU_SSS_PSTP_SHIFT = 16U
}XSECURE_CSU_SSS_DEST_SHIFT;
XSECURE_CSU_SSS_PCAP_SHIFT = 0U,/**< Offset for destination PCAP */
XSECURE_CSU_SSS_DMA_SHIFT = 4U, /**< Offset for destination DMA */
XSECURE_CSU_SSS_AES_SHIFT = 8U, /**< Offset for destination AES */
XSECURE_CSU_SSS_SHA_SHIFT = 12U,/**< Offset for destination SHA */
XSECURE_CSU_SSS_PSTP_SHIFT = 16U/**< Offset for destination PSTP */
}XSECURE_CSU_SSS_DEST_SHIFT; /**<.Offset for SSS destination.*/
/***************** Macros (Inline Functions) Definitions *********************/
/****************************************************************************/
/*****************************************************************************/
/**
* Read a CSU register.
*
* @param BaseAddress contains the base address of the device.
* @param RegOffset contains the offset from the base address of the
* device.
* @param RegOffset contains the offset from the base address of
* the device.
*
* @return The value read from the register.
*
@ -232,30 +229,30 @@ typedef enum
*
******************************************************************************/
#define XSecure_ReadReg(BaseAddress, RegOffset) \
Xil_In32((BaseAddress) + (RegOffset))
Xil_In32((BaseAddress) + (RegOffset))
/***************************************************************************/
/**
* Write a CSU register.
*
* @param BaseAddress contains the base address of the device.
* @param RegOffset contains the offset from the base address of the
* device.
* @param RegisterValue is the value to be written to the register.
* @param RegOffset contains the offset from the base address of
* the device.
* @param RegisterValue is the value to be written to the register
*
* @return None.
*
* @note C-Style signature:
* void XSecure_WriteReg(u32 BaseAddress, int RegOffset,
* u16 RegisterValue)
* void XSecure_WriteReg(u32 BaseAddress, int RegOffset,
* u16 RegisterValue)
*
******************************************************************************/
#define XSecure_WriteReg(BaseAddress, RegOffset, RegisterValue) \
Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue))
Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue))
#define XSecure_In32(Addr) Xil_In32(Addr)
#define XSecure_In32(Addr) Xil_In32(Addr)
#define XSecure_In64(Addr) Xil_In64(Addr)
#define XSecure_In64(Addr) Xil_In64(Addr)
#define XSecure_Out32(Addr, Data) Xil_Out32(Addr, Data)
@ -274,13 +271,13 @@ typedef enum
* @return None.
*
* @note C-Style signature:
* void XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC Src)
* void XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC Src)
*
******************************************************************************/
static inline u32 XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC Src)
{
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_DMA_SHIFT);
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_DMA_SHIFT);
}
/***************************************************************************/
@ -292,13 +289,13 @@ static inline u32 XSecure_SssInputDstDma(XSECURE_CSU_SSS_SRC Src)
* @return None.
*
* @note C-Style signature:
* void XSecure_SssInputAes(XSECURE_CSU_SSS_SRC Src)
* void XSecure_SssInputAes(XSECURE_CSU_SSS_SRC Src)
*
******************************************************************************/
static inline u32 XSecure_SssInputAes(XSECURE_CSU_SSS_SRC Src)
{
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_AES_SHIFT);
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_AES_SHIFT);
}
/***************************************************************************/
@ -310,13 +307,13 @@ static inline u32 XSecure_SssInputAes(XSECURE_CSU_SSS_SRC Src)
* @return None.
*
* @note C-Style signature:
* void XSecure_SssInputSha3(XSECURE_CSU_SSS_SRC Src)
* void XSecure_SssInputSha3(XSECURE_CSU_SSS_SRC Src)
*
******************************************************************************/
static inline u32 XSecure_SssInputSha3(XSECURE_CSU_SSS_SRC Src)
{
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_SHA_SHIFT);
Src &= XSECURE_CSU_SSS_SRC_MASK;
return (Src << XSECURE_CSU_SSS_SHA_SHIFT);
}
/***************************************************************************/
@ -324,21 +321,17 @@ static inline u32 XSecure_SssInputSha3(XSECURE_CSU_SSS_SRC Src)
* Set up the CSU Secure Stream Switch configuration
*
* @param Cfg contains the 32 bit value to be written into SSS config
* register
* register
*
* @return None.
*
* @note C-Style signature:
* void XSecure_SssSetup(u32 Cfg)
* void XSecure_SssSetup(u32 Cfg)
*
******************************************************************************/
static inline void XSecure_SssSetup(u32 Cfg)
{
//XSecure_Out32(XSECURE_CSU_SSS_BASE,
// (XSecure_In32(XSECURE_CSU_SSS_BASE) | Cfg));
XSecure_Out32(XSECURE_CSU_SSS_BASE, Cfg);
}
/************************** Function Prototypes ******************************/

View file

@ -80,21 +80,16 @@
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param CsuDmaPtr is the pointer to the XCsuDma instance.
*
* @return
* @return XST_SUCCESS if initialization was successful
*
* - XST_SUCCESS if initialization was successful
*
* @note
*
* The base address is initialized directly with value from xsecure_hw.h
* @note The base address is initialized directly with value from
* xsecure_hw.h
*
*****************************************************************************/
s32 XSecure_Sha3Initialize(XSecure_Sha3 *InstancePtr, XCsuDma* CsuDmaPtr)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(CsuDmaPtr != NULL);
@ -104,7 +99,9 @@ s32 XSecure_Sha3Initialize(XSecure_Sha3 *InstancePtr, XCsuDma* CsuDmaPtr)
return XST_SUCCESS;
}
/*****************************************************************************
/*****************************************************************************/
/**
* Generate padding for the SHA-3 engine
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param Dst is the pointer to location where padding is to be applied
@ -112,12 +109,12 @@ s32 XSecure_Sha3Initialize(XSecure_Sha3 *InstancePtr, XCsuDma* CsuDmaPtr)
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_Sha3Padd(XSecure_Sha3 *InstancePtr, u8 *Dst, u32 MsgLen)
{
/*
* Assert validates the input arguments
*/
/* Assert validates the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(Dst != NULL);
@ -125,57 +122,60 @@ void XSecure_Sha3Padd(XSecure_Sha3 *InstancePtr, u8 *Dst, u32 MsgLen)
Dst[0] = 0x1U;
Dst[MsgLen -1U] |= 0x80U;
}
/*****************************************************************************
/*****************************************************************************/
/**
*
* Configure SSS and start the SHA-3 engine
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_Sha3Start(XSecure_Sha3 *InstancePtr)
{
/*
* Asserts validate the input arguments
*/
/* Asserts validate the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
InstancePtr->Sha3Len = 0U;
/*
* Reset SHA3 engine.
*/
XSecure_WriteReg(InstancePtr->BaseAddress, XSECURE_CSU_SHA3_RESET_OFFSET,
XSECURE_CSU_SHA3_RESET_RESET);
/* Reset SHA3 engine. */
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_SHA3_RESET_OFFSET,
XSECURE_CSU_SHA3_RESET_RESET);
XSecure_WriteReg(InstancePtr->BaseAddress, XSECURE_CSU_SHA3_RESET_OFFSET, 0U);
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_SHA3_RESET_OFFSET, 0U);
/*
* Configure the SSS for SHA3 hashing.
*/
/* Configure the SSS for SHA3 hashing. */
XSecure_SssSetup(XSecure_SssInputSha3(XSECURE_CSU_SSS_SRC_SRC_DMA));
/*
* Start SHA3 engine.
*/
XSecure_WriteReg(InstancePtr->BaseAddress, XSECURE_CSU_SHA3_START_OFFSET,
XSECURE_CSU_SHA3_START_START);
/* Start SHA3 engine. */
XSecure_WriteReg(InstancePtr->BaseAddress,
XSECURE_CSU_SHA3_START_OFFSET,
XSECURE_CSU_SHA3_START_START);
}
/*****************************************************************************
/*****************************************************************************/
/**
*
* Update hash for new input data block
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param Data is the pointer to the input data for hashing
* @param The Size of the input data in bytes
* @param Data is the pointer to the input data for hashing
* @param Size of the input data in bytes
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_Sha3Update(XSecure_Sha3 *InstancePtr, const u8 *Data,
const u32 Size)
const u32 Size)
{
/*
* Asserts validate the input arguments
*/
/* Asserts validate the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(Data != NULL);
Xil_AssertVoid(Size != (u32)0x00U);
@ -183,27 +183,25 @@ void XSecure_Sha3Update(XSecure_Sha3 *InstancePtr, const u8 *Data,
InstancePtr->Sha3Len += Size;
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)Data, (u32)Size/4, 0);
(u64)Data, (u32)Size/4, 0);
/*
* Checking the CSU DMA done bit should be enough.
*/
/* Checking the CSU DMA done bit should be enough. */
XCsuDma_WaitForDone(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL);
}
/*****************************************************************************
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_Sha3WaitForDone(XSecure_Sha3 *InstancePtr)
{
/*
* Asserts validate the input arguments
*/
/* Asserts validate the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
volatile u32 Status;
@ -211,26 +209,30 @@ void XSecure_Sha3WaitForDone(XSecure_Sha3 *InstancePtr)
do
{
Status = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_SHA3_DONE_OFFSET);
XSECURE_CSU_SHA3_DONE_OFFSET);
} while (XSECURE_CSU_SHA3_DONE_DONE !=
((u32)Status & XSECURE_CSU_SHA3_DONE_DONE));
}
/*****************************************************************************
/*****************************************************************************/
/**
*
* Sending the last data and padding when blocksize is not multiple of 104
* bytes
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param Hash is the pointer to location where resulting hash will be
* written
* @param Hash is the pointer to location where resulting hash will be
* written
*
* @return None
*
* @note None
*
*****************************************************************************/
void XSecure_Sha3Finish(XSecure_Sha3 *InstancePtr, u8 *Hash)
{
/*
* Asserts validate the input arguments
*/
/* Asserts validate the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(Hash != NULL);
@ -244,9 +246,9 @@ void XSecure_Sha3Finish(XSecure_Sha3 *InstancePtr, u8 *Hash)
XSecure_Sha3Padd(InstancePtr, XSecure_RsaSha3Array, PartialLen);
XCsuDma_Transfer(InstancePtr->CsuDmaPtr, XCSUDMA_SRC_CHANNEL,
(u64)XSecure_RsaSha3Array, PartialLen/4, 1);
(u64)XSecure_RsaSha3Array, PartialLen/4, 1);
/* Check the SHA3 DONE bit. */
/* Check the SHA3 DONE bit. */
XSecure_Sha3WaitForDone(InstancePtr);
/* If requested, read out the Hash in reverse order. */
@ -257,29 +259,33 @@ void XSecure_Sha3Finish(XSecure_Sha3 *InstancePtr, u8 *Hash)
for (Index=0U; Index < 12U; Index++)
{
Val = XSecure_ReadReg(InstancePtr->BaseAddress,
XSECURE_CSU_SHA3_DIGEST_0_OFFSET + (Index * 4));
XSECURE_CSU_SHA3_DIGEST_0_OFFSET + (Index * 4));
HashPtr[11U - Index] = Val;
}
}
}
/*****************************************************************************
/*****************************************************************************/
/**
*
* Calculate SHA-3 Digest on the given input data
*
* @param InstancePtr is a pointer to the XSecure_Sha3 instance.
* @param In is the pointer to the input data for hashing
* @param Size of the input data
* @param Out is the pointer to location where resulting hash will be written
* @param Out is the pointer to location where resulting hash will be
* written.
*
* @return None
*
* @note None
*
******************************************************************************/
void XSecure_Sha3Digest(XSecure_Sha3 *InstancePtr, const u8 *In, const u32 Size,
u8 *Out)
u8 *Out)
{
/*
* Asserts validate the input arguments
*/
/* Asserts validate the input arguments */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(In != NULL);
Xil_AssertVoid(Size != (u32)0x00U);

View file

@ -84,22 +84,22 @@ extern "C" {
/***************************** Include Files *********************************/
#include "xsecure_hw.h"
#include "../../../include/xcsudma.h"
#include "xcsudma.h"
#include "xil_assert.h"
/************************** Constant Definitions ****************************/
/**
* CSU SHA3 Memory Map
*/
#define XSECURE_CSU_SHA3_START_START (1U << 0) /**< SHA Start Message */
#define XSECURE_CSU_SHA3_START_START (1U << 0) /**< SHA Start Message */
#define XSECURE_CSU_SHA3_RESET_RESET (1U << 0) /**< SHA Reset Value */
#define XSECURE_CSU_SHA3_RESET_RESET (1U << 0) /**< SHA Reset Value */
#define XSECURE_CSU_SHA3_DONE_DONE (1U << 0) /**< SHA Done */
#define XSECURE_CSU_SHA3_DONE_DONE (1U << 0) /**< SHA Done */
#define XSECURE_SHA3_BLOCK_LEN (104U) /**< SHA min block length */
#define XSECURE_SHA3_BLOCK_LEN (104U) /**< SHA min block length */
#define XSECURE_SHA3_LAST_PACKET (0x1U) /**< Last Data Packet */
#define XSECURE_SHA3_LAST_PACKET (0x1U) /**< Last Data Packet */
/***************************** Type Definitions******************************/
@ -109,37 +109,25 @@ extern "C" {
* instance.
*/
typedef struct {
u32 BaseAddress; /**< Device Base Address */
u32 BaseAddress; /**< Device Base Address */
XCsuDma *CsuDmaPtr; /**< Pointer to CSU DMA Instance */
u32 Sha3Len; /**< SHA3 Input Length */
} XSecure_Sha3;
/***************************** Function Prototypes ***************************/
/*
* Initialization
*/
s32 XSecure_Sha3Initialize(XSecure_Sha3 *InstancePtr, XCsuDma *CsuDmaPtr);
/* Initialization */
s32 XSecure_Sha3Initialize(XSecure_Sha3 *InstancePtr, XCsuDma *CsuDmaPtr);
void XSecure_Sha3Start(XSecure_Sha3 *InstancePtr);
/*
* Data Transfer
*/
/* Data Transfer */
void XSecure_Sha3Update(XSecure_Sha3 *InstancePtr, const u8 *Data,
const u32 Size);
const u32 Size);
void XSecure_Sha3Finish(XSecure_Sha3 *InstancePtr, u8 *Hash);
/*
* Complete SHA digest calculation
*/
/* Complete SHA digest calculation */
void XSecure_Sha3Digest(XSecure_Sha3 *InstancePtr, const u8 *In,
const u32 Size, u8 *Out);
/*
* Utility Functions
*/
void XSecure_Sha3Padd(XSecure_Sha3 *InstancePtr, u8 *Dst, u32 MsgLen);
void XSecure_Sha3WaitForDone(XSecure_Sha3 *InstancePtr);
const u32 Size, u8 *Out);
#ifdef __cplusplus
extern "C" }