1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Copyright 2018-2019 NXP 4 */ 5 6 #ifndef __CONTAINER_HEADER_H_ 7 #define __CONTAINER_HEADER_H_ 8 9 #include <linux/sizes.h> 10 #include <linux/types.h> 11 12 #define IV_MAX_LEN 32 13 #define HASH_MAX_LEN 64 14 15 #if IS_ENABLED(CONFIG_IMX_PQC_SUPPORT) 16 #define CONTAINER_HDR_ALIGNMENT 0x4000 17 #else 18 #define CONTAINER_HDR_ALIGNMENT 0x400 19 #endif 20 #define CONTAINER_HDR_EMMC_OFFSET 0 21 #define CONTAINER_HDR_MMCSD_OFFSET SZ_32K 22 #define CONTAINER_HDR_QSPI_OFFSET SZ_4K 23 #define CONTAINER_HDR_NAND_OFFSET SZ_128M 24 25 #define CONTAINER_HDR_TAG 0x87 26 #define CONTAINER_HDR_VERSION 0 27 28 struct container_hdr { 29 u8 version; 30 u8 length_lsb; 31 u8 length_msb; 32 u8 tag; 33 u32 flags; 34 u16 sw_version; 35 u8 fuse_version; 36 u8 num_images; 37 u16 sig_blk_offset; 38 u16 reserved; 39 } __packed; 40 41 struct boot_img_t { 42 u32 offset; 43 u32 size; 44 u64 dst; 45 u64 entry; 46 u32 hab_flags; 47 u32 meta; 48 u8 hash[HASH_MAX_LEN]; 49 u8 iv[IV_MAX_LEN]; 50 } __packed; 51 52 struct signature_block_hdr { 53 u8 version; 54 u8 length_lsb; 55 u8 length_msb; 56 u8 tag; 57 u16 cert_offset; 58 u16 srk_table_offset; 59 u16 signature_offset; 60 u16 blob_offset; 61 u32 reserved; 62 } __packed; 63 64 struct generate_key_blob_hdr { 65 u8 version; 66 u8 length_lsb; 67 u8 length_msb; 68 u8 tag; 69 u8 flags; 70 u8 size; 71 u8 algorithm; 72 u8 mode; 73 } __packed; 74 75 int get_container_size(ulong addr, u16 *header_length); 76 valid_container_hdr(struct container_hdr * container)77static inline bool valid_container_hdr(struct container_hdr *container) 78 { 79 #if IS_ENABLED(CONFIG_IMX_PQC_SUPPORT) 80 return (container->tag == CONTAINER_HDR_TAG || 81 container->tag == 0x82) && 82 (container->version == CONTAINER_HDR_VERSION || 83 container->version == 0x2); 84 #else 85 return container->tag == CONTAINER_HDR_TAG && 86 container->version == CONTAINER_HDR_VERSION; 87 #endif 88 } 89 #endif 90