1*23ba6841SJoseph Chen /* 2*23ba6841SJoseph Chen * Rockchip trust image generator 3*23ba6841SJoseph Chen * 4*23ba6841SJoseph Chen * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd 5*23ba6841SJoseph Chen * Peter, Software Engineering, <superpeter.cai@gmail.com>. 6*23ba6841SJoseph Chen * 7*23ba6841SJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 8*23ba6841SJoseph Chen */ 9*23ba6841SJoseph Chen #ifndef TRUST_MERGER_H 10*23ba6841SJoseph Chen #define TRUST_MERGER_H 11*23ba6841SJoseph Chen 12*23ba6841SJoseph Chen #include <stdint.h> 13*23ba6841SJoseph Chen #include <stdio.h> 14*23ba6841SJoseph Chen #include <stdlib.h> 15*23ba6841SJoseph Chen #include <string.h> 16*23ba6841SJoseph Chen #include <memory.h> 17*23ba6841SJoseph Chen #include <stdbool.h> 18*23ba6841SJoseph Chen 19*23ba6841SJoseph Chen 20*23ba6841SJoseph Chen #define VERSION "v1.0 (2015-06-15)" 21*23ba6841SJoseph Chen #define DO_ALIGN(a, b) (((a) > 0) ? ((((a) - 1) / (b) + 1) * (b)) : (a)) 22*23ba6841SJoseph Chen 23*23ba6841SJoseph Chen 24*23ba6841SJoseph Chen /* config file */ 25*23ba6841SJoseph Chen #define SEC_VERSION "[VERSION]" 26*23ba6841SJoseph Chen #define SEC_BL30 "[BL30_OPTION]" 27*23ba6841SJoseph Chen #define SEC_BL31 "[BL31_OPTION]" 28*23ba6841SJoseph Chen #define SEC_BL32 "[BL32_OPTION]" 29*23ba6841SJoseph Chen #define SEC_BL33 "[BL33_OPTION]" 30*23ba6841SJoseph Chen #define SEC_OUT "[OUTPUT]" 31*23ba6841SJoseph Chen 32*23ba6841SJoseph Chen #define OPT_MAJOR "MAJOR" 33*23ba6841SJoseph Chen #define OPT_MINOR "MINOR" 34*23ba6841SJoseph Chen #define OPT_SEC "SEC" 35*23ba6841SJoseph Chen #define OPT_PATH "PATH" 36*23ba6841SJoseph Chen #define OPT_ADDR "ADDR" 37*23ba6841SJoseph Chen #define OPT_OUT_PATH "PATH" 38*23ba6841SJoseph Chen 39*23ba6841SJoseph Chen /* options */ 40*23ba6841SJoseph Chen #define OPT_VERBOSE "--verbose" 41*23ba6841SJoseph Chen #define OPT_HELP "--help" 42*23ba6841SJoseph Chen #define OPT_VERSION "--version" 43*23ba6841SJoseph Chen #define OPT_MERGE "--pack" 44*23ba6841SJoseph Chen #define OPT_UNPACK "--unpack" 45*23ba6841SJoseph Chen #define OPT_SUBFIX "--subfix" 46*23ba6841SJoseph Chen #define OPT_REPLACE "--replace" 47*23ba6841SJoseph Chen #define OPT_RSA "--rsa" 48*23ba6841SJoseph Chen #define OPT_SHA "--sha" 49*23ba6841SJoseph Chen #define OPT_SIZE "--size" 50*23ba6841SJoseph Chen 51*23ba6841SJoseph Chen #define DEF_MAJOR 0 52*23ba6841SJoseph Chen #define DEF_MINOR 0 53*23ba6841SJoseph Chen #define DEF_BL30_PATH "bl30.bin" 54*23ba6841SJoseph Chen #define DEF_BL31_PATH "bl31.bin" 55*23ba6841SJoseph Chen #define DEF_BL32_PATH "bl32.bin" 56*23ba6841SJoseph Chen #define DEF_BL33_PATH "bl33.bin" 57*23ba6841SJoseph Chen 58*23ba6841SJoseph Chen #define DEF_OUT_PATH "trust.img" 59*23ba6841SJoseph Chen 60*23ba6841SJoseph Chen #define DEF_CONFIG_FILE "RKTRUST.ini" 61*23ba6841SJoseph Chen 62*23ba6841SJoseph Chen 63*23ba6841SJoseph Chen #define MAX_LINE_LEN 256 64*23ba6841SJoseph Chen #define SCANF_EAT(in) fscanf(in, "%*[ \r\n\t/]") 65*23ba6841SJoseph Chen 66*23ba6841SJoseph Chen #define ENTRY_ALIGN (2048) 67*23ba6841SJoseph Chen 68*23ba6841SJoseph Chen enum { 69*23ba6841SJoseph Chen BL30_SEC = 0, 70*23ba6841SJoseph Chen BL31_SEC, 71*23ba6841SJoseph Chen BL32_SEC, 72*23ba6841SJoseph Chen BL33_SEC, 73*23ba6841SJoseph Chen BL_MAX_SEC 74*23ba6841SJoseph Chen }; 75*23ba6841SJoseph Chen 76*23ba6841SJoseph Chen 77*23ba6841SJoseph Chen 78*23ba6841SJoseph Chen typedef struct { 79*23ba6841SJoseph Chen bool sec; 80*23ba6841SJoseph Chen uint32_t id; 81*23ba6841SJoseph Chen char path[MAX_LINE_LEN]; 82*23ba6841SJoseph Chen uint32_t addr; 83*23ba6841SJoseph Chen uint32_t offset; 84*23ba6841SJoseph Chen uint32_t size; 85*23ba6841SJoseph Chen uint32_t align_size; 86*23ba6841SJoseph Chen } bl_entry_t; 87*23ba6841SJoseph Chen 88*23ba6841SJoseph Chen typedef struct { 89*23ba6841SJoseph Chen uint16_t major; 90*23ba6841SJoseph Chen uint16_t minor; 91*23ba6841SJoseph Chen bl_entry_t bl3x[BL_MAX_SEC]; 92*23ba6841SJoseph Chen char outPath[MAX_LINE_LEN]; 93*23ba6841SJoseph Chen } OPT_T; 94*23ba6841SJoseph Chen 95*23ba6841SJoseph Chen 96*23ba6841SJoseph Chen #define TRUST_HEAD_TAG "BL3X" 97*23ba6841SJoseph Chen #define SIGNATURE_SIZE 256 98*23ba6841SJoseph Chen #define TRUST_HEADER_SIZE 2048 99*23ba6841SJoseph Chen 100*23ba6841SJoseph Chen typedef struct { 101*23ba6841SJoseph Chen uint32_t tag; 102*23ba6841SJoseph Chen uint32_t version; 103*23ba6841SJoseph Chen uint32_t flags; 104*23ba6841SJoseph Chen uint32_t size; 105*23ba6841SJoseph Chen uint32_t reserved[4]; 106*23ba6841SJoseph Chen uint32_t RSA_N[64]; 107*23ba6841SJoseph Chen uint32_t RSA_E[64]; 108*23ba6841SJoseph Chen uint32_t RSA_C[64]; 109*23ba6841SJoseph Chen } TRUST_HEADER, *PTRUST_HEADER; 110*23ba6841SJoseph Chen 111*23ba6841SJoseph Chen 112*23ba6841SJoseph Chen typedef struct { 113*23ba6841SJoseph Chen uint32_t HashData[8]; 114*23ba6841SJoseph Chen uint32_t LoadAddr; 115*23ba6841SJoseph Chen uint32_t reserved[3]; 116*23ba6841SJoseph Chen } COMPONENT_DATA, *PCOMPONENT_DATA; 117*23ba6841SJoseph Chen 118*23ba6841SJoseph Chen 119*23ba6841SJoseph Chen typedef struct { 120*23ba6841SJoseph Chen uint32_t ComponentID; 121*23ba6841SJoseph Chen uint32_t StorageAddr; 122*23ba6841SJoseph Chen uint32_t ImageSize; 123*23ba6841SJoseph Chen uint32_t reserved; 124*23ba6841SJoseph Chen } TRUST_COMPONENT, *PTRUST_COMPONENT; 125*23ba6841SJoseph Chen 126*23ba6841SJoseph Chen #define EI_NIDENT 16 127*23ba6841SJoseph Chen #define ELF_MAGIC 0x464c457f 128*23ba6841SJoseph Chen 129*23ba6841SJoseph Chen typedef struct { 130*23ba6841SJoseph Chen uint8_t e_ident[EI_NIDENT]; 131*23ba6841SJoseph Chen uint16_t e_type; 132*23ba6841SJoseph Chen uint16_t e_machine; 133*23ba6841SJoseph Chen uint32_t e_version; 134*23ba6841SJoseph Chen uint32_t e_entry; /* Entry point */ 135*23ba6841SJoseph Chen uint32_t e_phoff; 136*23ba6841SJoseph Chen uint32_t e_shoff; 137*23ba6841SJoseph Chen uint32_t e_flags; 138*23ba6841SJoseph Chen uint16_t e_ehsize; 139*23ba6841SJoseph Chen uint16_t e_phentsize; 140*23ba6841SJoseph Chen uint16_t e_phnum; 141*23ba6841SJoseph Chen uint16_t e_shentsize; 142*23ba6841SJoseph Chen uint16_t e_shnum; 143*23ba6841SJoseph Chen uint16_t e_shstrndx; 144*23ba6841SJoseph Chen } Elf32_Ehdr; 145*23ba6841SJoseph Chen 146*23ba6841SJoseph Chen typedef struct { 147*23ba6841SJoseph Chen uint8_t e_ident[EI_NIDENT]; /* ELF "magic number" */ 148*23ba6841SJoseph Chen uint16_t e_type; 149*23ba6841SJoseph Chen uint16_t e_machine; 150*23ba6841SJoseph Chen uint32_t e_version; 151*23ba6841SJoseph Chen uint64_t e_entry; /* Entry point virtual address */ 152*23ba6841SJoseph Chen uint64_t e_phoff; /* Program header table file offset */ 153*23ba6841SJoseph Chen uint64_t e_shoff; /* Section header table file offset */ 154*23ba6841SJoseph Chen uint32_t e_flags; 155*23ba6841SJoseph Chen uint16_t e_ehsize; 156*23ba6841SJoseph Chen uint16_t e_phentsize; 157*23ba6841SJoseph Chen uint16_t e_phnum; 158*23ba6841SJoseph Chen uint16_t e_shentsize; 159*23ba6841SJoseph Chen uint16_t e_shnum; 160*23ba6841SJoseph Chen uint16_t e_shstrndx; 161*23ba6841SJoseph Chen } Elf64_Ehdr; 162*23ba6841SJoseph Chen 163*23ba6841SJoseph Chen typedef struct { 164*23ba6841SJoseph Chen uint32_t p_type; 165*23ba6841SJoseph Chen uint32_t p_offset; 166*23ba6841SJoseph Chen uint32_t p_vaddr; 167*23ba6841SJoseph Chen uint32_t p_paddr; 168*23ba6841SJoseph Chen uint32_t p_filesz; 169*23ba6841SJoseph Chen uint32_t p_memsz; 170*23ba6841SJoseph Chen uint32_t p_flags; 171*23ba6841SJoseph Chen uint32_t p_align; 172*23ba6841SJoseph Chen } Elf32_Phdr; 173*23ba6841SJoseph Chen 174*23ba6841SJoseph Chen typedef struct { 175*23ba6841SJoseph Chen uint32_t p_type; 176*23ba6841SJoseph Chen uint32_t p_flags; 177*23ba6841SJoseph Chen uint64_t p_offset; /* Segment file offset */ 178*23ba6841SJoseph Chen uint64_t p_vaddr; /* Segment virtual address */ 179*23ba6841SJoseph Chen uint64_t p_paddr; /* Segment physical address */ 180*23ba6841SJoseph Chen uint64_t p_filesz; /* Segment size in file */ 181*23ba6841SJoseph Chen uint64_t p_memsz; /* Segment size in memory */ 182*23ba6841SJoseph Chen uint64_t p_align; /* Segment alignment, file & memory */ 183*23ba6841SJoseph Chen } Elf64_Phdr; 184*23ba6841SJoseph Chen 185*23ba6841SJoseph Chen #endif /* TRUST_MERGER_H */ 186