179 lines
10 KiB
C
179 lines
10 KiB
C
/***********************************************************************************************************************
|
|
* FILE DESCRIPTION
|
|
* ------------------------------------------------------------------------------------------------------------------*/
|
|
/** \file
|
|
* \brief Implementation of a download check by using an embedded validation structure
|
|
* Declaration of functions, variables and constants
|
|
*
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* COPYRIGHT
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* \par Copyright
|
|
* \verbatim
|
|
* Copyright (c) 2026 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
|
|
*/
|
|
/**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* TEMPLATE REVISION HISTORY
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* Version Date Author Change Id Description
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* 01.00.00 2016-07-01 visci - Initial version
|
|
* 01.01.00 2017-02-03 vadcel ESCAN00093858 Added support for compatibility check
|
|
* Added blank check functionality
|
|
* Added API for external public key
|
|
* Reworked return value handling
|
|
* 01.01.01 2017-11-09 visci ESCAN00096836 No changes
|
|
* 01.01.02 2018-03-23 visdkl ESCAN00097287 Bootloader does not properly use configuration of CLASS_DDD
|
|
* 01.02.00 2018-06-15 visci ESCAN00098963 Corrected return value for public key read failure
|
|
* 01.03.00 2019-01-25 visci ESCAN00098904 Improved verification sequence
|
|
* ESCAN00101065 Alignment for Blank Check is not applied correctly
|
|
* ESCAN00101321 Added option to skip download segment check
|
|
* 01.03.01 2019-02-06 visci ESCAN00102005 No changes
|
|
* 01.04.00 2019-06-14 visci ESCAN00102956 No changes
|
|
* ESCAN00102957 No changes
|
|
* 01.05.00 2019-06-25 visdlm ESCAN00103492 Added gap fill mechanism
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* REVISION HISTORY
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* Version Date Author Change Id Description
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* 05.00.00 2022-08-15 vistmo FBL-5514 Support Additional OTA functionality
|
|
* ESCAN00112435 No changes
|
|
* ESCAN00112575 No changes
|
|
* 05.01.00 2022-10-04 jschmitding FBL-5917 No changes
|
|
* ESCAN00113919 No changes
|
|
* 05.01.01 2022-10-17 fmenke ESCAN00112879 No changes
|
|
* 05.01.02 2023-01-13 fmenke ESCAN00112890 No changes
|
|
* ESCAN00113612 No changes
|
|
* 05.02.00 2023-02-09 vistmo ESCAN00112972 No changes
|
|
* ESCAN00113292 No changes
|
|
* ESCAN00113835 No changes
|
|
* ESCAN00113843 No changes
|
|
* ESCAN00113764 No changes
|
|
* FBL-6438 No changes
|
|
* 05.02.01 2023-05-11 fmenke ESCAN00113831 No changes
|
|
* 05.03.00 2023-07-24 fmenke FBL-7335 No changes
|
|
* 05.03.01 2023-08-31 lhopfhauer ESCAN00115494 No changes
|
|
* 05.03.02 2024-07-16 erizk ESCAN00117344 No changes
|
|
* 05.03.03 2025-02-06 virchl ESCAN00118587 No changes
|
|
* 05.04.00 2025-02-28 jjohnson FBL-10065 No changes
|
|
* 05.04.01 2025-06-10 jostravsky ESCAN00120315 No changes
|
|
* 05.04.02 2025-07-08 visarcmijo ESCAN00119833 No changes
|
|
* 05.05.00 2025-09-01 fmenke FBL-11218 No changes
|
|
* ESCAN00120917 No changes
|
|
* 05.06.00 2025-10-28 mpatil FBL-11690 No changes
|
|
* 05.07.00 2026-01-13 dganesh FBL-12162 No changes
|
|
**********************************************************************************************************************/
|
|
|
|
#ifndef FBL_VALSTRUCT_OEM_H
|
|
#define FBL_VALSTRUCT_OEM_H
|
|
|
|
/***********************************************************************************************************************
|
|
* DEFINES
|
|
**********************************************************************************************************************/
|
|
|
|
#if defined( FBL_ENABLE_VALSTRUCT )
|
|
|
|
/** Specify default options for validation structure processing */
|
|
# define FBL_VALSTRUCT_OPTION_DEFAULT (FBL_VALSTRUCT_OPTION_NONE)
|
|
|
|
/** Maximum number of blocks in validation struct */
|
|
# if !defined( FBL_VALSTRUCT_BLOCKCOUNT_MAX )
|
|
/* At least two segments required for SBL */
|
|
# define FBL_VALSTRUCT_BLOCKCOUNT_MAX (SWM_DATA_MAX_NOAR - 2u)
|
|
# endif
|
|
|
|
/** Size of validation struct members */
|
|
# if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC )
|
|
# define FBL_VALSTRUCT_TAG_SIZE 0x00u
|
|
# define FBL_VALSTRUCT_VERSION_SIZE 0x02u
|
|
# define FBL_VALSTRUCT_BLOCKCOUNT_SIZE 0x02u
|
|
# define FBL_VALSTRUCT_BLOCKADDRESS_SIZE 0x04u
|
|
# define FBL_VALSTRUCT_BLOCKLENGTH_SIZE 0x04u
|
|
# define FBL_VALSTRUCT_BLOCKCHECKSUM_SIZE 0x20u
|
|
# define FBL_VALSTRUCT_VALIDATESUM_SIZE 0x00u
|
|
# else
|
|
# define FBL_VALSTRUCT_TAG_SIZE 0x04u
|
|
# define FBL_VALSTRUCT_VERSION_SIZE 0x00u
|
|
# define FBL_VALSTRUCT_BLOCKCOUNT_SIZE 0x02u
|
|
# define FBL_VALSTRUCT_BLOCKADDRESS_SIZE 0x04u
|
|
# define FBL_VALSTRUCT_BLOCKLENGTH_SIZE 0x04u
|
|
# define FBL_VALSTRUCT_BLOCKCHECKSUM_SIZE 0x02u
|
|
# define FBL_VALSTRUCT_VALIDATESUM_SIZE 0x02u
|
|
# endif /* SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC */
|
|
|
|
/** Supported Valstruct version can be overwritten */
|
|
# ifndef FBL_VALSTRUCT_VERSION
|
|
# define FBL_VALSTRUCT_VERSION 0x0000u
|
|
# endif /* FBL_VALSTRUCT_VERSION */
|
|
|
|
/** Define supported structure versions */
|
|
# define FblValStructIsVersionSupported(ver) ((FBL_VALSTRUCT_VERSION == (ver)) ? kFblValStructOk : kFblValStructNotAuthentic)
|
|
|
|
/** Provide base address of validation structure and signature as well as the respective download segment dimension */
|
|
|
|
/****** Ford (CCC + DDD use case, signature embedded before validation structure ******/
|
|
# if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC )
|
|
/* Block header points to the verification structure, the signature is located below */
|
|
# define FblValStructGetSigAddress(block) ((block)->headerAddress - SEC_VERIFY_CLASS_CCC_VERIFY_SIZE)
|
|
# define FblValStructGetVsAddress(block) ((block)->headerAddress)
|
|
# define FblValStructGetVsSegAddress(block) FblValStructGetSigAddress(block)
|
|
# define FblValStructGetVsSegLength(vsLength) (SEC_VERIFY_CLASS_CCC_VERIFY_SIZE + (vsLength))
|
|
|
|
/* Provide signature data */
|
|
# define FblValStructGetSignature(block, buffer) (tFblValStructResult)((SEC_VERIFY_CLASS_CCC_VERIFY_SIZE == \
|
|
FblReadProm(FblValStructGetSigAddress(block), (buffer), SEC_VERIFY_CLASS_CCC_VERIFY_SIZE)) ? \
|
|
kFblValStructOk : kFblValStructMemoryReadError)
|
|
|
|
# if defined( FBL_VALSTRUCT_ENABLE_EXTERNAL_KEY )
|
|
/** Provide public key */
|
|
# define FblValStructGetPublicKey(key) ApplFblReadVerificationKey(key)
|
|
# endif
|
|
# else /* SEC_ENABLE_SECURITY_CLASS_DDD */
|
|
/* Block header points to the verification structure */
|
|
# define FblValStructGetVsAddress(block) ((block)->headerAddress)
|
|
# define FblValStructGetVsSegAddress(block) FblValStructGetVsAddress(block)
|
|
# define FblValStructGetVsSegLength(vsLength) (vsLength)
|
|
# endif /* SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC */
|
|
|
|
/** Provide segment list with address, length and checksum for each segment */
|
|
# define FblValStructGetSegmentList(block, segList) FblDiagGetSegmentList(block, segList)
|
|
|
|
/** Options only relevant for OTA */
|
|
|
|
# if defined( FBL_ENABLE_GAP_FILL )
|
|
# if defined( FBL_VALSTRUCT_ENABLE_GAP_FILL) || \
|
|
defined( FBL_VALSTRUCT_DISABLE_GAP_FILL )
|
|
/* Valstruct gap fill handling explicitly defined outside */
|
|
# else
|
|
# define FBL_VALSTRUCT_ENABLE_GAP_FILL
|
|
# endif /* FBL_VALSTRUCT_ENABLE_GAP_FILL */
|
|
# endif /* FBL_ENABLE_GAP_FILL */
|
|
|
|
#endif /* FBL_ENABLE_VALSTRUCT */
|
|
|
|
/** OEM specific return code mapping (tFblValStructResult) */
|
|
#define kFblValStructOk 0u
|
|
#define kFblValStructNotAuthentic 1u
|
|
#define kFblValStructInvalidFormat 2u
|
|
#define kFblValStructBlockNumberMismatch 3u
|
|
#define kFblValStructChecksumValueMismatch 4u
|
|
#define kFblValStructMemoryReadError 5u
|
|
#define kFblValStructBlockMismatch 6u
|
|
#define kFblValStructKeyError 7u
|
|
#define kFblValStructBlankCheckFailed 8u
|
|
#define kFblValStructGapFillFailed 9u
|
|
|
|
#endif /* FBL_VALSTRUCT_OEM_H */
|
|
|
|
/***********************************************************************************************************************
|
|
* END OF FILE: FBL_VALSTRUCT_OEM.H
|
|
**********************************************************************************************************************/
|