607 lines
28 KiB
C
607 lines
28 KiB
C
/***********************************************************************************************************************
|
|
* FILE DESCRIPTION
|
|
* ------------------------------------------------------------------------------------------------------------------*/
|
|
/** \file
|
|
* \brief SecureBoot implementation
|
|
*
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* COPYRIGHT
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* \par Copyright
|
|
* \verbatim
|
|
* Copyright (c) 2025 by Vector Informatik GmbH. All rights reserved.
|
|
*
|
|
* This software is copyright protected and proprietary to Vector Informatik GmbH.
|
|
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
|
|
* All other rights remain with Vector Informatik GmbH.
|
|
* \endverbatim
|
|
*/
|
|
/**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* REVISION HISTORY
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* Version Date Author Change Id Description
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* 01.00.00 2020-01-07 visrie FBL-524 Initial release
|
|
* 01.00.01 2020-04-27 visrie FBL-1773 No changes
|
|
* 02.00.00 2020-05-19 vistbe FBL-1016 Support EcuM_Init() mechanism
|
|
* 02.01.00 2021-01-19 visrie FBL-2648 Added support of new SecureBoot verify variant
|
|
* FBL-2641 Updated to new API version
|
|
* 02.02.00 2021-09-03 visjdn FBL-3352 No changes
|
|
* 02.03.00 2023-06-21 vistbe FBL-4814 Add support for OTA
|
|
* 02.03.01 2024-05-16 viswmo ESCAN00117059 Signature failure is not reported
|
|
* 02.04.00 2024-11-18 vismix FBL-9654 Optimize startup times for secure boot
|
|
* 02.05.00 2025-01-24 vikatya PIO-1340 SecureBoot for selected blocks
|
|
* 02.06.00 2025-02-19 visrie FBL-10209 Support total length for confirmation mode
|
|
**********************************************************************************************************************/
|
|
|
|
#define FBL_SECBOOT_SOURCE
|
|
|
|
/***********************************************************************************************************************
|
|
* INCLUDES
|
|
**********************************************************************************************************************/
|
|
|
|
#include "fbl_inc.h"
|
|
#include "Std_Types.h"
|
|
#include "Csm.h"
|
|
#include "bm_types.h"
|
|
#include "bm_hdr.h"
|
|
#include "fbl_secboot.h"
|
|
|
|
#if defined( FBLSB_ENABLE_COPY_FLASH_DRIVER )
|
|
# include "FlashRom.h"
|
|
#endif /* FBLSB_ENABLE_COPY_FLASH_DRIVER */
|
|
|
|
/***********************************************************************************************************************
|
|
* VERSION
|
|
**********************************************************************************************************************/
|
|
|
|
#if ( FBLLIB_SECBOOT_VHSM_VERSION != 0x0206u ) || \
|
|
( FBLLIB_SECBOOT_VHSM_RELEASE_VERSION != 0x00u )
|
|
# error "Error in FBL_SECBOOT.C: Source and Header file are inconsistent!"
|
|
#endif
|
|
|
|
#if ( FBLLIB_SECBOOT_VHSM_VERSION != _FBLLIB_SECBOOT_VHSM_VERSION ) || \
|
|
( FBLLIB_SECBOOT_VHSM_RELEASE_VERSION != _FBLLIB_SECBOOT_VHSM_RELEASE_VERSION )
|
|
# error "Error in FBL_SECBOOT.C: Source and v_ver.h are inconsistent!"
|
|
#endif
|
|
|
|
/***********************************************************************************************************************
|
|
* DEFINES
|
|
**********************************************************************************************************************/
|
|
|
|
/** Watchdog triggered every n-th cycle (has to power of two) */
|
|
#if !defined( FBLSB_WATCHDOG_CYCLE_COUNT )
|
|
# define FBLSB_WATCHDOG_CYCLE_COUNT 0x20u
|
|
#endif
|
|
/** Trigger watchdog every n-th cycle */
|
|
#define FBLSB_TRIGGER_WATCHDOG(cycle) \
|
|
{ \
|
|
if (((cycle) & (FBLSB_WATCHDOG_CYCLE_COUNT - 1u)) == 0x00u) \
|
|
{ \
|
|
(void)FblLookForWatchdog(); \
|
|
} \
|
|
}
|
|
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_HEADER 20u /* Magic Pattern (16) + Revision (4) */
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_GROUPID 4u /* GroupId */
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_NO_SEGMENTS 2u /* Nr of Segments */
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_BASE (FBLSB_VHSM_AUTHENTICATION_HEADER_GROUPID + FBLSB_VHSM_AUTHENTICATION_HEADER_NO_SEGMENTS)
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_SEGMENT 42u /* Address (4) + Length (4) + Mode (2) + Hash (32) */
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_SIGNATURE_LENGTH 4u /* Length field containing the actual length of the signature */
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_SEGMENTS(noOfSegments) \
|
|
((noOfSegments) * FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_SEGMENT)
|
|
#define FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH(noOfSegments) \
|
|
(FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_BASE + FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH_SEGMENTS(noOfSegments))
|
|
|
|
/***********************************************************************************************************************
|
|
* TYPEDEFS
|
|
**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* GLOBAL DATA
|
|
**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* LOCAL DATA
|
|
**********************************************************************************************************************/
|
|
#define FBLSB_START_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
V_MEMRAM0 static V_MEMRAM1 tFblSbExtErrCode V_MEMRAM2 sbExtErrCode;
|
|
|
|
#define FBLSB_STOP_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
/***********************************************************************************************************************
|
|
* LOCAL FUNCTION PROTOTYPES
|
|
**********************************************************************************************************************/
|
|
#define FBLSB_START_SEC_CODE
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
#if defined( FBLSB_ENABLE_GENERATE_CMAC )
|
|
static tFblLength FblSb_GetAuthenticationHeaderLength(const V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 * dataPtr);
|
|
static tFblResult FblSb_UpdateCommonMac(V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHeader, vuint32 macId);
|
|
#endif /* FBLSB_ENABLE_GENERATE_CMAC */
|
|
|
|
/***********************************************************************************************************************
|
|
* EXTERNAL DATA
|
|
**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* LOCAL FUNCTIONS
|
|
**********************************************************************************************************************/
|
|
|
|
#if defined( FBLSB_ENABLE_GENERATE_CMAC )
|
|
/***********************************************************************************************************************
|
|
* FblSb_GetAuthenticationHeaderLength
|
|
**********************************************************************************************************************/
|
|
/*! \brief Calculates the length of the vHsm authentication header
|
|
* \param[in] dataPtr Pointer to the groupId of the vHsm authentication header
|
|
* \return Length of the authentication header
|
|
**********************************************************************************************************************/
|
|
static tFblLength FblSb_GetAuthenticationHeaderLength(const V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 * dataPtr)
|
|
{
|
|
tFblLength authHeaderLength;
|
|
vuint32 noOfSegments;
|
|
|
|
noOfSegments = FblMemGetInteger(FBLSB_VHSM_AUTHENTICATION_HEADER_NO_SEGMENTS, &dataPtr[FBLSB_VHSM_AUTHENTICATION_HEADER_GROUPID]);
|
|
authHeaderLength = FBLSB_VHSM_AUTHENTICATION_HEADER_LENGTH(noOfSegments);
|
|
|
|
return authHeaderLength;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_UpdateCommonMac
|
|
**********************************************************************************************************************/
|
|
/*! \brief Generate and write the common MACs
|
|
* \param[in] bmHeader Pointer to the bmHdrHeader structure
|
|
* \param[in] macId MAC operation identifier
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise
|
|
**********************************************************************************************************************/
|
|
/* PRQA S 3673, 6010, 6030, 6080 1 */ /* MD_MSR_Rule8.13, MD_MSR_STPTH, MD_MSR_STCYC, MD_MSR_STMIF */
|
|
static tFblResult FblSb_UpdateCommonMac(V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHeader, vuint32 macId)
|
|
{
|
|
tFblResult result = kFblOk;
|
|
Crypto_VerifyResultType verifyResult = CRYPTO_E_VER_NOT_OK;
|
|
uint32 jobId = 0u;
|
|
const uint8 * dataPtr;
|
|
uint32 dataLength = 0u;
|
|
uint32 signatureAddress = 0u;
|
|
uint32 signatureLength = 0u;
|
|
|
|
/* Check if mac operation is configured. */
|
|
if (macId != FBLBMHDR_MAC_OP_REF_NOT_USED)
|
|
{
|
|
/* Check if the SecureBootGroup can be updated */
|
|
if (macId < FBLSB_NUM_OF_MAC_OPERATIONS)
|
|
{
|
|
/* Check if SecureBootUpdate is actually required */
|
|
if ((FblSb_GetVerificationMethodOfMacOperation(macId) == FBLSB_VERIFICATIONMETHOD_INTERNAL)
|
|
# if defined( FBL_ENABLE_OTA )
|
|
&& (vOtaM_IsOpenedPartitionOfRoleActive() == E_OK)
|
|
# endif /* FBL_ENABLE_OTA */
|
|
)
|
|
{
|
|
jobId = FblSb_GetCsmJobIdOfMacUpdate();
|
|
dataPtr = (const uint8 *)bmHeader->bmAuthenticationHeaderAddress; /* PRQA S 0306 */ /* MD_FblLibSecBoot_0306 */
|
|
dataLength = FblSb_GetAuthenticationHeaderLength(dataPtr);
|
|
result = ApplFblSbGetSignatureInfo(bmHeader, macId, &signatureAddress, &signatureLength);
|
|
|
|
assertFblGen((result == kFblOk), kFblSysAssertParameterOutOfRange);
|
|
|
|
if (result == kFblOk)
|
|
{
|
|
/* PRQA S 0306 2 */ /* MD_FblLibSecBoot_0306 */
|
|
if (E_OK == Csm_SignatureVerify(jobId, CRYPTO_OPERATIONMODE_SINGLECALL, dataPtr, dataLength,
|
|
(P2CONST(uint8, AUTOMATIC, CSM_APPL_VAR))signatureAddress, signatureLength, &verifyResult))
|
|
{
|
|
if (verifyResult != CRYPTO_E_VER_OK)
|
|
{
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_SIGNATURE;
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
}
|
|
else if (FblSb_IsConfirmationModeOfMacOperation(macId))
|
|
{
|
|
boolean inactivePartition = FALSE;
|
|
|
|
jobId = FblSb_GetCsmJobIdOfMacConfirmationMode();
|
|
dataPtr = (const uint8 *)bmHeader->bmAuthenticationHeaderAddress; /* PRQA S 0306 */ /* MD_FblLibSecBoot_0306 */
|
|
dataLength = FBLSB_VHSM_AUTHENTICATION_HEADER_HEADER;
|
|
dataLength += FblSb_GetAuthenticationHeaderLength(&dataPtr[FBLSB_VHSM_AUTHENTICATION_HEADER_HEADER]);
|
|
signatureLength = FblMemGetInteger(FBLSB_VHSM_AUTHENTICATION_HEADER_SIGNATURE_LENGTH, &dataPtr[dataLength]); /* Extract actual signature length */
|
|
dataLength += FBLSB_VHSM_AUTHENTICATION_HEADER_SIGNATURE_LENGTH;
|
|
dataLength += signatureLength;
|
|
|
|
# if defined( FBL_ENABLE_OTA )
|
|
if (vOtaM_IsOpenedPartitionOfRoleInactive() == E_OK)
|
|
{
|
|
inactivePartition = TRUE;
|
|
}
|
|
# endif /* FBL_ENABLE_OTA */
|
|
|
|
if (E_OK == Csm_SignatureVerify(jobId, CRYPTO_OPERATIONMODE_SINGLECALL, dataPtr, dataLength,
|
|
(P2CONST(uint8, AUTOMATIC, CSM_APPL_VAR))&inactivePartition, sizeof(inactivePartition), &verifyResult))
|
|
{
|
|
if (verifyResult != CRYPTO_E_VER_OK)
|
|
{
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_SIGNATURE;
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* This block has no SecureBootGroup and therefore can not be updated */
|
|
result = kFblFailed;
|
|
}
|
|
|
|
if ( (result != kFblOk)
|
|
&& (sbExtErrCode == FBLSB_EXT_ERR_CODE_NONE) )
|
|
{
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_GENERAL;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
#endif /* FBLSB_ENABLE_GENERATE_CMAC */
|
|
|
|
/***********************************************************************************************************************
|
|
* GLOBAL FUNCTIONS
|
|
**********************************************************************************************************************/
|
|
|
|
#if defined( FBLSB_ENABLE_COPY_FLASH_DRIVER )
|
|
/***********************************************************************************************************************
|
|
* FblUpdCopyFlashDriver
|
|
***********************************************************************************************************************/
|
|
/*! \brief Copies the flashdriver from the ROM table into flashCode buffer
|
|
***********************************************************************************************************************/
|
|
void FblSb_CopyFlashDriver( void )
|
|
{
|
|
vuint16 index;
|
|
|
|
/* flashCode buffer location must match the flashdriver start address */
|
|
# if defined( FLASH_DRIVER_RELOCATABLE )
|
|
# else
|
|
if ( (flashCode == (IO_U8 *)FLASHDRV_BLOCK0_ADDRESS) )
|
|
# endif /* FLASH_DRIVER_RELOCATABLE */
|
|
{
|
|
/* Copy all flash driver code from ROM into the flashCode buffer */
|
|
for (index = 0u; index < FLASHDRV_BLOCK0_LENGTH; index++)
|
|
{
|
|
FBLSB_TRIGGER_WATCHDOG(index);
|
|
flashCode[index] = FLASHDRV_DECRYPTDATA(flashDrvBlk0[index]);
|
|
}
|
|
}
|
|
}
|
|
#endif /* FBLSB_ENABLE_COPY_FLASH_DRIVER */
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_Init
|
|
***********************************************************************************************************************/
|
|
/*! \brief Initializes the SecureBoot module
|
|
* \details Initializes the complete crypto stack
|
|
***********************************************************************************************************************/
|
|
void FblSb_Init(void)
|
|
{
|
|
/* Crypto stack is initialized via EcuM_Init */
|
|
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_NONE;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_VerifyFblLbt
|
|
**********************************************************************************************************************/
|
|
/*! \brief Verifies the BmHdrHeader and the LogicalBlockTable of the bootloader
|
|
* \param[in] fblHeader Pointer to the FBL Header
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise or when the feature is disabled
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_VerifyFblLbt(const V_MEMRAM1 tFblHeader V_MEMRAM2 V_MEMRAM3 * fblHeader)
|
|
{
|
|
tFblResult result = kFblFailed;
|
|
#if defined( FBLBM_ENABLE_SECURE_BOOT )
|
|
# if defined( FBLBM_ENABLE_FBLLBT_VERIFICATION )
|
|
Crypto_VerifyResultType verifyResult = CRYPTO_E_VER_NOT_OK;
|
|
uint32 jobId = 0u;
|
|
uint32 groupId = 0u;
|
|
# endif /* FBLBM_ENABLE_FBLLBT_VERIFICATION */
|
|
#endif /* FBLBM_ENABLE_SECURE_BOOT */
|
|
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 2 */ /* MD_MSR_DummyStmt */
|
|
(void)fblHeader;
|
|
#endif
|
|
|
|
#if defined( FBLBM_ENABLE_SECURE_BOOT )
|
|
# if defined( FBLBM_ENABLE_FBLLBT_VERIFICATION )
|
|
jobId = FblSb_GetCsmJobIdOfMacVerify();
|
|
groupId = FblSb_GetGroupIdOfMacOperation(FBLSB_SECOND_AUTH_MAC_OPERATION_ID);
|
|
|
|
/* Verify the FBL-Header and the LBT */
|
|
if (Csm_MacVerify(jobId, CRYPTO_OPERATIONMODE_SINGLECALL, (uint8 *)&groupId, sizeof(groupId), NULL_PTR, 0u, &verifyResult) == E_OK)
|
|
{
|
|
result = kFblOk;
|
|
}
|
|
|
|
if ((result == kFblOk) && (verifyResult != CRYPTO_E_VER_OK))
|
|
{
|
|
result = kFblFailed;
|
|
}
|
|
# endif /* FBLBM_ENABLE_FBLLBT_VERIFICATION */
|
|
#endif /* FBLBM_ENABLE_SECURE_BOOT */
|
|
|
|
return result;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_VerifyHeader
|
|
**********************************************************************************************************************/
|
|
/*! \brief Verifies the header
|
|
* \param[in] bmHdrHeader Pointer to the FblBmHdrHeader structure
|
|
* \return Result of operation
|
|
* kFblFailed always (unsupported feature)
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_VerifyHeader(const V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHdrHeader)
|
|
{
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 2 */ /* MD_MSR_DummyStmt */
|
|
(void)bmHdrHeader;
|
|
#endif
|
|
|
|
return kFblFailed;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_VerifyHeaderRom
|
|
**********************************************************************************************************************/
|
|
/*! \brief Verifies the MAC of the BmHdrHeader structure at a specific address
|
|
* \param[in] bmHeaderAddress Address of the bmHdrHeader structure
|
|
* \param[in] bmHdrHeader Pointer to the FblBmHdrHeader structure
|
|
* \return kFblFailed always (unsupported feature)
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_VerifyHeaderRom(tFblAddress bmHeaderAddress, const V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHdrHeader)
|
|
{
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 2 */ /* MD_MSR_DummyStmt */
|
|
(void)bmHeaderAddress;
|
|
(void)bmHdrHeader;
|
|
#endif
|
|
|
|
return kFblFailed;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_UpdateInitialSegments
|
|
**********************************************************************************************************************/
|
|
/*! \brief Updates the SecureBootSegments based on the initial values.
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_UpdateInitialSegments(void)
|
|
{
|
|
tFblResult result = kFblOk;
|
|
Crypto_VerifyResultType verifyResult;
|
|
uint32 jobId;
|
|
vuint32 macOperationIdx;
|
|
uint32 groupId;
|
|
|
|
/* Iterrate over the configuration */
|
|
for (macOperationIdx = 0u; ((macOperationIdx < FBLSB_NUM_OF_MAC_OPERATIONS) && (result == kFblOk)); macOperationIdx++)
|
|
{
|
|
jobId = FblSb_GetCsmJobIdOfMacVerifyForceSequential();
|
|
|
|
if (FblSb_IsVerifyForceSequentialOfMacOperation(macOperationIdx))
|
|
{
|
|
result = kFblFailed;
|
|
verifyResult = CRYPTO_E_VER_NOT_OK;
|
|
groupId = FblSb_GetGroupIdOfMacOperation(macOperationIdx);
|
|
if (Csm_MacVerify(jobId, CRYPTO_OPERATIONMODE_SINGLECALL, (uint8 *)&groupId, sizeof(groupId), NULL_PTR, 0u, &verifyResult) == E_OK)
|
|
{
|
|
if (verifyResult == CRYPTO_E_VER_OK)
|
|
{
|
|
result = kFblOk;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_VerifySegments
|
|
**********************************************************************************************************************/
|
|
/*! \brief Verifies the segments
|
|
* \details Triggers a verification of the configured SecureBootGroup.
|
|
* \param[in] bmHdrHeader Pointer to the FblBmHdrHeader structure
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_VerifySegments(const V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHdrHeader)
|
|
{
|
|
tFblResult result = kFblFailed;
|
|
Crypto_VerifyResultType verifyResult = CRYPTO_E_VER_NOT_OK;
|
|
uint32 macId = FblBmHdr_GetFblSbMacId(bmHdrHeader->bmTargetHandle);
|
|
uint32 jobId;
|
|
uint32 groupId;
|
|
|
|
/* Check if mac operation is configured. */
|
|
if (macId != FBLBMHDR_MAC_OP_REF_NOT_USED)
|
|
{
|
|
if (macId < FBLSB_NUM_OF_MAC_OPERATIONS)
|
|
{
|
|
jobId = FblSb_GetCsmJobIdOfMacVerify();
|
|
groupId = FblSb_GetGroupIdOfMacOperation(macId);
|
|
if (E_OK == Csm_MacVerify(jobId, CRYPTO_OPERATIONMODE_SINGLECALL, (uint8 *)&groupId, sizeof(groupId), NULL_PTR, 0u, &verifyResult))
|
|
{
|
|
result = kFblOk;
|
|
}
|
|
}
|
|
|
|
if( (result == kFblOk)
|
|
&& (verifyResult != CRYPTO_E_VER_OK))
|
|
{
|
|
result = kFblFailed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result = kFblOk;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#if defined( FBLSB_ENABLE_GENERATE_CMAC )
|
|
/***********************************************************************************************************************
|
|
* FblSb_UpdateFblMac
|
|
**********************************************************************************************************************/
|
|
/*! \brief Generate and write the necessary MACs for the FBL
|
|
* \param[in] fblHeader Pointer to the FBL Header
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise
|
|
**********************************************************************************************************************/
|
|
tFblResult FblSb_UpdateFblMac(V_MEMROM1 tFblHeader V_MEMROM2 V_MEMROM3 * fblHeader)
|
|
{
|
|
tFblResult result = kFblFailed;
|
|
tFblBmHdrHeader bmHeader = { 0u };
|
|
vuint32 macId = 0u;
|
|
|
|
/* Clear any previous errors */
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_NONE;
|
|
|
|
/* Read BM Header */
|
|
/* PRQA S 0306 1 */ /* MD_FblLibSecBoot_0306 */
|
|
if (FblReadProm((tFblAddress)fblHeader->bmHeader, (vuint8 *)&bmHeader, sizeof(bmHeader)) == sizeof(bmHeader))
|
|
{
|
|
result = FblBmHdrCheckConsistency(&bmHeader);
|
|
}
|
|
else
|
|
{
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_MEMORY;
|
|
}
|
|
|
|
if (result == kFblOk)
|
|
{
|
|
/* Update the MAC for the first validation structure, used for all FBL segments */
|
|
macId = FblBmHdr_GetFblSbMacId(bmHeader.bmTargetHandle);
|
|
result = FblSb_UpdateCommonMac(&bmHeader, macId);
|
|
}
|
|
|
|
#if defined( FBLBM_ENABLE_SECURE_BOOT )
|
|
# if defined( FBLBM_ENABLE_FBLLBT_VERIFICATION )
|
|
if (result == kFblOk)
|
|
{
|
|
/* Now update the MAC of the second validation structure */
|
|
bmHeader.bmAuthenticationHeaderAddress = FBLSB_SECOND_AUTH_HEADER_ADDRESS;
|
|
result = FblSb_UpdateCommonMac(&bmHeader, FBLSB_SECOND_AUTH_MAC_OPERATION_ID);
|
|
}
|
|
# endif /* FBLBM_ENABLE_FBLLBT_VERIFICATION */
|
|
#endif /* FBLBM_ENABLE_SECURE_BOOT */
|
|
|
|
return result;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_UpdateBlockMac
|
|
**********************************************************************************************************************/
|
|
/*! \brief Generate and write the necessary MACs for a logical block
|
|
* \param[in] blockDescriptor Pointer to the logical block
|
|
* \param[in] segmentList Pointer to the segments
|
|
* \return Result of operation
|
|
* kFblOk when operation succeeded
|
|
* kFblFailed otherwise
|
|
**********************************************************************************************************************/
|
|
/* PRQA S 3673 2 */ /* MD_MSR_Rule8.13 */
|
|
tFblResult FblSb_UpdateBlockMac(const V_MEMRAM1 tBlockDescriptor V_MEMRAM2 V_MEMRAM3 * blockDescriptor,
|
|
V_MEMRAM1 FL_SegmentListType V_MEMRAM2 V_MEMRAM3 * segmentList)
|
|
{
|
|
tFblResult result = kFblFailed;
|
|
tFblBmHdrHeader bmHeader = { 0u };
|
|
vuint32 macId = 0u;
|
|
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 2 */ /* MD_MSR_DummyStmt */
|
|
(void)segmentList;
|
|
#endif
|
|
|
|
/* Clear any previous errors */
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_NONE;
|
|
|
|
/* Read BM Header */
|
|
if (FblReadProm(blockDescriptor->bmHeaderAddress, (vuint8 *)&bmHeader, sizeof(bmHeader)) == sizeof(bmHeader))
|
|
{
|
|
result = FblBmHdrCheckConsistency(&bmHeader);
|
|
}
|
|
else
|
|
{
|
|
sbExtErrCode = FBLSB_EXT_ERR_CODE_MEMORY;
|
|
}
|
|
|
|
if (result == kFblOk)
|
|
{
|
|
macId = FblBmHdr_GetFblSbMacId(bmHeader.bmTargetHandle);
|
|
result = FblSb_UpdateCommonMac(&bmHeader, macId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
#endif /* FBLSB_ENABLE_GENERATE_CMAC */
|
|
|
|
/***********************************************************************************************************************
|
|
* FblSb_GetExtendedErrorCode
|
|
**********************************************************************************************************************/
|
|
/*! \brief Returns an extended error information from previous call to FblSb_UpdateBlockMac/FblSb_UpdateFblMac
|
|
* \return Extended error code
|
|
**********************************************************************************************************************/
|
|
tFblSbExtErrCode FblSb_GetExtendedErrorCode(void)
|
|
{
|
|
return sbExtErrCode;
|
|
}
|
|
|
|
#define FBLSB_STOP_SEC_CODE
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
/***********************************************************************************************************************
|
|
* MISRA
|
|
**********************************************************************************************************************/
|
|
|
|
/* Justification for module-specific MISRA deviations:
|
|
|
|
MD_FblLibSecBoot_0306:
|
|
Reason: Address conversion between integer values and pointers is required to allow for hardware independent
|
|
configuration and address range checks.
|
|
Risk: The size of integer required to hold the result of a pointer cast is implementation-defined.
|
|
Prevention: The size of the respective integer data type which holds the address value is adapted on a hardware
|
|
specific basis. The correctness of the respective implementation is verified by runtime tests.
|
|
|
|
*/
|
|
|
|
/***********************************************************************************************************************
|
|
* END OF FILE: FBL_SECBOOT.C
|
|
**********************************************************************************************************************/
|