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)77 static 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