265 lines
7 KiB
C
265 lines
7 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#ifndef __TOOL_MSG_H__
|
|
#define __TOOL_MSG_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define BOOT_MAGIC_NUMBER 0xBE57EC1C
|
|
#define BOOT_HASH_TYPE_MD5 1
|
|
#define BOOT_HASH_TYPE_SHA256 2
|
|
#define BOOT_KEY_TYPE_RSA2048 1
|
|
#define BOOT_KEY_TYPE_ECDSA192 2
|
|
#define BOOT_KEY_TYPE_ECDSA256 3
|
|
|
|
#define SEC_KEY_VERSION 0
|
|
#define BOOT_STRUCT_VERSION 0
|
|
|
|
#define PREFIX_CHAR 0xBE
|
|
|
|
#define KEY_LEN (4 + 256 + 256)
|
|
#define SIG_LEN 256
|
|
#define HASH_LEN 32
|
|
|
|
#ifndef MAX_TOOL_MSG_DATA_LEN
|
|
// Max msg: flash cmd msg with 4-byte address and 16-byte data (1 + 4 + 16)
|
|
#define MAX_TOOL_MSG_DATA_LEN 21
|
|
#endif
|
|
|
|
#define MAX_READ_DATA_LEN 16
|
|
#define MAX_WRITE_DATA_LEN 16
|
|
#define MAX_FLASH_CMD_DATA_LEN 16
|
|
|
|
#define MIN_SIGNED_CODE_SIZE 32
|
|
|
|
#ifdef SECURE_BOOT_V1
|
|
#define BOOT_STRUCT_V1_OFFSET_TO_SIGN(b) \
|
|
((unsigned char *)&((struct boot_struct_v1_t *)(b))->hdr.security)
|
|
#define BOOT_STRUCT_V1_LEN_TO_SIGN \
|
|
((unsigned long)&((struct boot_struct_v1_t *)0)->sig[0] - \
|
|
(unsigned long)&((struct boot_struct_v1_t *)0)->hdr.security)
|
|
#endif
|
|
|
|
#define SEC_KEY_OFFSET_TO_HASH(b) \
|
|
((unsigned char *)&((struct sec_key_struct_t *)(b))->version)
|
|
#define SEC_KEY_LEN_TO_HASH \
|
|
((unsigned long)&((struct sec_key_struct_t *)0)->hash[0] - \
|
|
(unsigned long)&((struct sec_key_struct_t *)0)->version)
|
|
|
|
#define SIG_MSG_OVERHEAD 8
|
|
#define SIG_MSG_V1_EXTRA_DATA_LEN (sizeof(struct boot_struct_v1_t) + sizeof(struct code_sig_struct_t))
|
|
#define SIG_MSG_V1_TOTAL_LEN (SIG_MSG_OVERHEAD + SIG_MSG_V1_EXTRA_DATA_LEN)
|
|
#define SIG_MSG_EXTRA_DATA_LEN (sizeof(struct boot_struct_t) + sizeof(struct code_sig_struct_t))
|
|
#define SIG_MSG_TOTAL_LEN (SIG_MSG_OVERHEAD + SIG_MSG_EXTRA_DATA_LEN)
|
|
|
|
#define CODE_MSG_OVERHEAD 8
|
|
#define BURN_DATA_MSG_OVERHEAD 16
|
|
|
|
#define SECTOR_SIZE_64K (1 << 16)
|
|
#define SECTOR_SIZE_32K (1 << 15)
|
|
#define SECTOR_SIZE_16K (1 << 14)
|
|
#define SECTOR_SIZE_4K (1 << 12)
|
|
|
|
#define MSG_TOTAL_LEN(msg) (sizeof(struct msg_hdr_t) + ((struct msg_hdr_t *)(msg))->len + 1)
|
|
|
|
enum MSG_TYPE {
|
|
TYPE_SYS = 0x00,
|
|
TYPE_READ = 0x01,
|
|
TYPE_WRITE = 0x02,
|
|
TYPE_BULK_READ = 0x03,
|
|
#if defined(TEST_OVER_THE_AIR_ENANBLED)
|
|
TYPE_EXT_WRITE = 0x04,
|
|
TYPE_BULK_WRITE_START = 0x05,
|
|
TYPE_BULK_WRITE_DATA = 0x06,
|
|
#endif
|
|
TYPE_NOTIF = 0x10,
|
|
TYPE_SYNC = 0x50,
|
|
TYPE_SIG_INFO = 0x51,
|
|
TYPE_SIG = 0x52,
|
|
TYPE_CODE_INFO = 0x53,
|
|
TYPE_CODE = 0x54,
|
|
TYPE_RUN = 0x55,
|
|
TYPE_SECTOR_SIZE = 0x60,
|
|
TYPE_ERASE_BURN_START = 0x61,
|
|
TYPE_ERASE_BURN_DATA = 0x62,
|
|
TYPE_OBSOLETED_63 = 0x63,
|
|
TYPE_OBSOLETED_64 = 0x64,
|
|
TYPE_FLASH_CMD = 0x65,
|
|
TYPE_GET_SECTOR_INFO = 0x66,
|
|
TYPE_SEC_REG_ERASE_BURN_START = 0x67,
|
|
TYPE_SEC_REG_ERASE_BURN_DATA = 0x68,
|
|
|
|
// Extended types
|
|
TYPE_PROD_TEST = 0x81,
|
|
TYPE_RUNTIME_CMD = 0x82,
|
|
TYPE_BT_CALIB_CMD = 0x83,
|
|
TYPE_PROTO_EL = 0xA0,
|
|
|
|
TYPE_INVALID = 0xFF,
|
|
};
|
|
|
|
enum SYS_CMD_TYPE {
|
|
SYS_CMD_REBOOT = 0xF1,
|
|
SYS_CMD_SHUTDOWN = 0xF2,
|
|
SYS_CMD_FLASH_BOOT = 0xF3,
|
|
SYS_CMD_SET_BOOTMODE = 0xE1,
|
|
SYS_CMD_CLR_BOOTMODE = 0xE2,
|
|
SYS_CMD_GET_BOOTMODE = 0xE3,
|
|
SYS_CMD_SET_DLD_RATE = 0xD1,
|
|
};
|
|
|
|
enum ERR_CODE {
|
|
ERR_NONE = 0x00,
|
|
ERR_LEN = 0x01,
|
|
ERR_CHECKSUM = 0x02,
|
|
ERR_NOT_SYNC = 0x03,
|
|
ERR_NOT_SEC = 0x04,
|
|
ERR_SYNC_WORD = 0x05,
|
|
ERR_SYS_CMD = 0x06,
|
|
ERR_DATA_ADDR = 0x07,
|
|
ERR_DATA_LEN = 0x08,
|
|
ERR_ACCESS_RIGHT = 0x09,
|
|
|
|
ERR_TYPE_INVALID = 0x0F,
|
|
|
|
//ERR_BOOT_OK = 0x10,
|
|
ERR_BOOT_MAGIC = 0x11,
|
|
ERR_BOOT_SEC = 0x12,
|
|
ERR_BOOT_HASH_TYPE = 0x13,
|
|
ERR_BOOT_KEY_TYPE = 0x14,
|
|
ERR_BOOT_KEY_LEN = 0x15,
|
|
ERR_BOOT_SIG_LEN = 0x16,
|
|
ERR_BOOT_SIG = 0x17,
|
|
ERR_BOOT_CRC = 0x18,
|
|
ERR_BOOT_LEN = 0x19,
|
|
ERR_SIG_CODE_SIZE = 0x1A,
|
|
ERR_SIG_SIG_LEN = 0x1B,
|
|
ERR_SIG_INFO_MISSING = 0x1C,
|
|
ERR_BOOT_KEY_ID = 0x1D,
|
|
ERR_BOOT_HASH = 0x1E,
|
|
|
|
ERR_CODE_OK = 0x20,
|
|
ERR_BOOT_MISSING = 0x21,
|
|
ERR_CODE_SIZE_SIG = 0x22,
|
|
ERR_CODE_ADDR_SIZE = 0x23,
|
|
ERR_CODE_INFO_MISSING = 0x24,
|
|
ERR_CODE_CRC = 0x25,
|
|
ERR_CODE_SIG = 0x26,
|
|
|
|
ERR_CODE_MISSING = 0x31,
|
|
ERR_VERSION = 0x32,
|
|
|
|
ERR_BURN_OK = 0x60,
|
|
ERR_SECTOR_SIZE = 0x61,
|
|
ERR_SECTOR_SEQ_OVERFLOW = 0x62,
|
|
ERR_BURN_INFO_MISSING = 0x63,
|
|
ERR_SECTOR_DATA_LEN = 0x64,
|
|
ERR_SECTOR_DATA_CRC = 0x65,
|
|
ERR_SECTOR_SEQ = 0x66,
|
|
ERR_ERASE_FLSH = 0x67,
|
|
ERR_BURN_FLSH = 0x68,
|
|
ERR_VERIFY_FLSH = 0x69,
|
|
ERR_FLASH_CMD = 0x6A,
|
|
|
|
ERR_TYPE_MISMATCHED = 0xE1,
|
|
ERR_SEQ_MISMATCHED = 0xE2,
|
|
ERR_BUF_TOO_SMALL = 0xE3,
|
|
|
|
ERR_INTERNAL = 0xFF,
|
|
};
|
|
|
|
enum PARSE_STATE {
|
|
PARSE_HEADER,
|
|
PARSE_DATA,
|
|
PARSE_EXTRA,
|
|
};
|
|
|
|
struct msg_hdr_t {
|
|
unsigned char prefix;
|
|
unsigned char type;
|
|
unsigned char seq;
|
|
unsigned char len;
|
|
};
|
|
|
|
struct message_t {
|
|
struct msg_hdr_t hdr;
|
|
// data and 1-byte check_sum
|
|
unsigned char data[MAX_TOOL_MSG_DATA_LEN + 1];
|
|
};
|
|
|
|
struct sec_key_struct_t {
|
|
unsigned int magic;
|
|
unsigned short version;
|
|
unsigned char hash_type;
|
|
unsigned char key_type;
|
|
unsigned short key_len;
|
|
unsigned short sig_len;
|
|
unsigned int reserved[5];
|
|
unsigned char key[KEY_LEN];
|
|
unsigned char hash[HASH_LEN];
|
|
};
|
|
|
|
struct boot_hdr_v1_t {
|
|
unsigned int magic;
|
|
unsigned short security;
|
|
unsigned char hash_type;
|
|
unsigned char key_type;
|
|
unsigned short key_len;
|
|
unsigned short sig_len;
|
|
unsigned int build_info_start;
|
|
};
|
|
|
|
struct boot_struct_v1_t {
|
|
struct boot_hdr_v1_t hdr;
|
|
unsigned char key[KEY_LEN];
|
|
unsigned char sig[SIG_LEN];
|
|
};
|
|
|
|
struct boot_hdr_t {
|
|
unsigned int magic;
|
|
unsigned short security;
|
|
unsigned short version;
|
|
unsigned int reserved;
|
|
unsigned int build_info_start;
|
|
};
|
|
|
|
struct boot_struct_t {
|
|
struct boot_hdr_t hdr;
|
|
unsigned int reserved[4];
|
|
};
|
|
|
|
struct code_sig_struct_t {
|
|
unsigned int code_size;
|
|
unsigned short sig_len;
|
|
unsigned short reserved;
|
|
unsigned char sig[SIG_LEN];
|
|
};
|
|
|
|
struct exec_struct_t {
|
|
unsigned int entry;
|
|
unsigned int param;
|
|
unsigned int sp;
|
|
unsigned int exec_addr;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|