xref: /rk3399_rockchip-uboot/tools/rockchip/trust_merger.h (revision 4d06e4de7476158c62ed3d6d477492cc9bb27ba3)
123ba6841SJoseph Chen /*
223ba6841SJoseph Chen  * Rockchip trust image generator
323ba6841SJoseph Chen  *
423ba6841SJoseph Chen  * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
523ba6841SJoseph Chen  * Peter, Software Engineering, <superpeter.cai@gmail.com>.
623ba6841SJoseph Chen  *
723ba6841SJoseph Chen  * SPDX-License-Identifier:	GPL-2.0+
823ba6841SJoseph Chen  */
923ba6841SJoseph Chen #ifndef TRUST_MERGER_H
1023ba6841SJoseph Chen #define TRUST_MERGER_H
1123ba6841SJoseph Chen 
1223ba6841SJoseph Chen #include <stdint.h>
1323ba6841SJoseph Chen #include <stdio.h>
1423ba6841SJoseph Chen #include <stdlib.h>
1523ba6841SJoseph Chen #include <string.h>
1623ba6841SJoseph Chen #include <memory.h>
1723ba6841SJoseph Chen #include <stdbool.h>
1823ba6841SJoseph Chen 
1923ba6841SJoseph Chen 
2023ba6841SJoseph Chen #define VERSION             "v1.0 (2015-06-15)"
2123ba6841SJoseph Chen #define DO_ALIGN(a, b)	(((a) > 0) ? ((((a) - 1) / (b) + 1) * (b)) : (a))
2223ba6841SJoseph Chen 
2323ba6841SJoseph Chen 
2423ba6841SJoseph Chen /* config file */
2523ba6841SJoseph Chen #define SEC_VERSION         "[VERSION]"
2623ba6841SJoseph Chen #define SEC_BL30            "[BL30_OPTION]"
2723ba6841SJoseph Chen #define SEC_BL31            "[BL31_OPTION]"
2823ba6841SJoseph Chen #define SEC_BL32            "[BL32_OPTION]"
2923ba6841SJoseph Chen #define SEC_BL33            "[BL33_OPTION]"
3023ba6841SJoseph Chen #define SEC_OUT             "[OUTPUT]"
3123ba6841SJoseph Chen 
3223ba6841SJoseph Chen #define OPT_MAJOR           "MAJOR"
3323ba6841SJoseph Chen #define OPT_MINOR           "MINOR"
3423ba6841SJoseph Chen #define OPT_SEC             "SEC"
3523ba6841SJoseph Chen #define OPT_PATH            "PATH"
3623ba6841SJoseph Chen #define OPT_ADDR            "ADDR"
3723ba6841SJoseph Chen #define OPT_OUT_PATH        "PATH"
3823ba6841SJoseph Chen 
3923ba6841SJoseph Chen /* options */
4023ba6841SJoseph Chen #define OPT_VERBOSE         "--verbose"
4123ba6841SJoseph Chen #define OPT_HELP            "--help"
4223ba6841SJoseph Chen #define OPT_VERSION         "--version"
4323ba6841SJoseph Chen #define OPT_MERGE           "--pack"
4423ba6841SJoseph Chen #define OPT_UNPACK          "--unpack"
4523ba6841SJoseph Chen #define OPT_SUBFIX          "--subfix"
4623ba6841SJoseph Chen #define OPT_REPLACE         "--replace"
47e311da24SJoseph Chen #define OPT_PREPATH         "--prepath"
4823ba6841SJoseph Chen #define OPT_RSA		    "--rsa"
4923ba6841SJoseph Chen #define OPT_SHA		    "--sha"
5023ba6841SJoseph Chen #define OPT_SIZE	    "--size"
5175828958SJoseph Chen #define OPT_IGNORE_BL32     "--ignore-bl32"
5223ba6841SJoseph Chen 
5323ba6841SJoseph Chen #define DEF_MAJOR           0
5423ba6841SJoseph Chen #define DEF_MINOR           0
5523ba6841SJoseph Chen #define DEF_BL30_PATH       "bl30.bin"
5623ba6841SJoseph Chen #define DEF_BL31_PATH       "bl31.bin"
5723ba6841SJoseph Chen #define DEF_BL32_PATH       "bl32.bin"
5823ba6841SJoseph Chen #define DEF_BL33_PATH       "bl33.bin"
5923ba6841SJoseph Chen 
6023ba6841SJoseph Chen #define DEF_OUT_PATH        "trust.img"
6123ba6841SJoseph Chen 
6223ba6841SJoseph Chen #define DEF_CONFIG_FILE     "RKTRUST.ini"
6323ba6841SJoseph Chen 
6423ba6841SJoseph Chen 
6523ba6841SJoseph Chen #define MAX_LINE_LEN        256
6623ba6841SJoseph Chen #define SCANF_EAT(in)       fscanf(in, "%*[ \r\n\t/]")
6723ba6841SJoseph Chen 
6823ba6841SJoseph Chen #define ENTRY_ALIGN         (2048)
6923ba6841SJoseph Chen 
7023ba6841SJoseph Chen enum {
7123ba6841SJoseph Chen 	BL30_SEC = 0,
7223ba6841SJoseph Chen 	BL31_SEC,
7323ba6841SJoseph Chen 	BL32_SEC,
7423ba6841SJoseph Chen 	BL33_SEC,
7523ba6841SJoseph Chen 	BL_MAX_SEC
7623ba6841SJoseph Chen };
7723ba6841SJoseph Chen 
7823ba6841SJoseph Chen 
7923ba6841SJoseph Chen 
8023ba6841SJoseph Chen typedef struct {
8123ba6841SJoseph Chen 	bool		sec;
8223ba6841SJoseph Chen 	uint32_t	id;
8323ba6841SJoseph Chen 	char		path[MAX_LINE_LEN];
8423ba6841SJoseph Chen 	uint32_t	addr;
8523ba6841SJoseph Chen 	uint32_t	offset;
8623ba6841SJoseph Chen 	uint32_t	size;
8723ba6841SJoseph Chen 	uint32_t	align_size;
8823ba6841SJoseph Chen } bl_entry_t;
8923ba6841SJoseph Chen 
9023ba6841SJoseph Chen typedef struct {
9123ba6841SJoseph Chen 	uint16_t	major;
9223ba6841SJoseph Chen 	uint16_t	minor;
9323ba6841SJoseph Chen 	bl_entry_t	bl3x[BL_MAX_SEC];
9423ba6841SJoseph Chen 	char	outPath[MAX_LINE_LEN];
9523ba6841SJoseph Chen } OPT_T;
9623ba6841SJoseph Chen 
9723ba6841SJoseph Chen 
9823ba6841SJoseph Chen #define TRUST_HEAD_TAG			"BL3X"
9923ba6841SJoseph Chen #define SIGNATURE_SIZE			256
10023ba6841SJoseph Chen #define TRUST_HEADER_SIZE		2048
10123ba6841SJoseph Chen 
10223ba6841SJoseph Chen typedef struct {
10323ba6841SJoseph Chen 	uint32_t tag;
10423ba6841SJoseph Chen 	uint32_t version;
10523ba6841SJoseph Chen 	uint32_t flags;
10623ba6841SJoseph Chen 	uint32_t size;
10723ba6841SJoseph Chen 	uint32_t reserved[4];
10823ba6841SJoseph Chen 	uint32_t RSA_N[64];
10923ba6841SJoseph Chen 	uint32_t RSA_E[64];
11023ba6841SJoseph Chen 	uint32_t RSA_C[64];
11123ba6841SJoseph Chen } TRUST_HEADER, *PTRUST_HEADER;
11223ba6841SJoseph Chen 
11323ba6841SJoseph Chen 
11423ba6841SJoseph Chen typedef struct {
11523ba6841SJoseph Chen 	uint32_t HashData[8];
11623ba6841SJoseph Chen 	uint32_t LoadAddr;
117*4d06e4deSzain wang 	uint32_t LoadSize;
118*4d06e4deSzain wang 	uint32_t reserved[2];
11923ba6841SJoseph Chen } COMPONENT_DATA, *PCOMPONENT_DATA;
12023ba6841SJoseph Chen 
12123ba6841SJoseph Chen 
12223ba6841SJoseph Chen typedef struct {
12323ba6841SJoseph Chen 	uint32_t ComponentID;
12423ba6841SJoseph Chen 	uint32_t StorageAddr;
12523ba6841SJoseph Chen 	uint32_t ImageSize;
12623ba6841SJoseph Chen 	uint32_t reserved;
12723ba6841SJoseph Chen } TRUST_COMPONENT, *PTRUST_COMPONENT;
12823ba6841SJoseph Chen 
12923ba6841SJoseph Chen #define EI_NIDENT	16
13023ba6841SJoseph Chen #define ELF_MAGIC 0x464c457f
13123ba6841SJoseph Chen 
13223ba6841SJoseph Chen typedef struct {
13323ba6841SJoseph Chen 	uint8_t	e_ident[EI_NIDENT];
13423ba6841SJoseph Chen 	uint16_t	e_type;
13523ba6841SJoseph Chen 	uint16_t	e_machine;
13623ba6841SJoseph Chen 	uint32_t	e_version;
13723ba6841SJoseph Chen 	uint32_t	e_entry;  /* Entry point */
13823ba6841SJoseph Chen 	uint32_t	e_phoff;
13923ba6841SJoseph Chen 	uint32_t	e_shoff;
14023ba6841SJoseph Chen 	uint32_t	e_flags;
14123ba6841SJoseph Chen 	uint16_t	e_ehsize;
14223ba6841SJoseph Chen 	uint16_t	e_phentsize;
14323ba6841SJoseph Chen 	uint16_t	e_phnum;
14423ba6841SJoseph Chen 	uint16_t	e_shentsize;
14523ba6841SJoseph Chen 	uint16_t	e_shnum;
14623ba6841SJoseph Chen 	uint16_t	e_shstrndx;
14723ba6841SJoseph Chen } Elf32_Ehdr;
14823ba6841SJoseph Chen 
14923ba6841SJoseph Chen typedef struct {
15023ba6841SJoseph Chen 	uint8_t	e_ident[EI_NIDENT];	/* ELF "magic number" */
15123ba6841SJoseph Chen 	uint16_t e_type;
15223ba6841SJoseph Chen 	uint16_t e_machine;
15323ba6841SJoseph Chen 	uint32_t e_version;
15423ba6841SJoseph Chen 	uint64_t e_entry;		/* Entry point virtual address */
15523ba6841SJoseph Chen 	uint64_t e_phoff;		/* Program header table file offset */
15623ba6841SJoseph Chen 	uint64_t e_shoff;		/* Section header table file offset */
15723ba6841SJoseph Chen 	uint32_t e_flags;
15823ba6841SJoseph Chen 	uint16_t e_ehsize;
15923ba6841SJoseph Chen 	uint16_t e_phentsize;
16023ba6841SJoseph Chen 	uint16_t e_phnum;
16123ba6841SJoseph Chen 	uint16_t e_shentsize;
16223ba6841SJoseph Chen 	uint16_t e_shnum;
16323ba6841SJoseph Chen 	uint16_t e_shstrndx;
16423ba6841SJoseph Chen } Elf64_Ehdr;
16523ba6841SJoseph Chen 
16623ba6841SJoseph Chen typedef struct {
16723ba6841SJoseph Chen 	uint32_t	p_type;
16823ba6841SJoseph Chen 	uint32_t	p_offset;
16923ba6841SJoseph Chen 	uint32_t	p_vaddr;
17023ba6841SJoseph Chen 	uint32_t	p_paddr;
17123ba6841SJoseph Chen 	uint32_t	p_filesz;
17223ba6841SJoseph Chen 	uint32_t	p_memsz;
17323ba6841SJoseph Chen 	uint32_t	p_flags;
17423ba6841SJoseph Chen 	uint32_t	p_align;
17523ba6841SJoseph Chen } Elf32_Phdr;
17623ba6841SJoseph Chen 
17723ba6841SJoseph Chen typedef struct {
17823ba6841SJoseph Chen 	uint32_t p_type;
17923ba6841SJoseph Chen 	uint32_t p_flags;
18023ba6841SJoseph Chen 	uint64_t p_offset;		/* Segment file offset */
18123ba6841SJoseph Chen 	uint64_t p_vaddr;		/* Segment virtual address */
18223ba6841SJoseph Chen 	uint64_t p_paddr;		/* Segment physical address */
18323ba6841SJoseph Chen 	uint64_t p_filesz;		/* Segment size in file */
18423ba6841SJoseph Chen 	uint64_t p_memsz;		/* Segment size in memory */
18523ba6841SJoseph Chen 	uint64_t p_align;		/* Segment alignment, file & memory */
18623ba6841SJoseph Chen } Elf64_Phdr;
18723ba6841SJoseph Chen 
18823ba6841SJoseph Chen #endif /* TRUST_MERGER_H */
189