From: Jaehoon Chung Date: Mon, 20 Nov 2017 06:09:37 +0000 (+0900) Subject: misc: sig_header: add the checking board signature X-Git-Tag: submit/tizen/20180327.075642~36 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=01e6216b8c2bba21c32837c78d212f2ab4d11d5b;p=profile%2Fcommon%2Fplatform%2Fkernel%2Fu-boot-artik7.git misc: sig_header: add the checking board signature This patch is based on Inha's patch. Refer to commit dae47ef49af9 "gadged: thor: add board signatrue check when download 'u-boot-mmc.bin" Changed from orignal version: - Moved the location from samsung board directory to misc driver directory First version added by: Signed-off-by: Inha Song Upgrade: Signed-off-by: Przemyslaw Marczak Change-Id: Ia63fe8fd71b8c26ce20507e8126183ab4c55644c Signed-off-by: Jaehoon Chung --- diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 63f85a6707..b14c0152ce 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -40,3 +40,4 @@ obj-$(CONFIG_RESET) += reset-uclass.o obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o obj-$(CONFIG_SENSORID) += sensorid-uclass.o obj-$(CONFIG_SENSORID_ARTIK) += sensorid_artik.o +obj-$(CONFIG_SIG) += sig_header.o diff --git a/drivers/misc/sig_header.c b/drivers/misc/sig_header.c new file mode 100644 index 0000000000..9d62c14479 --- /dev/null +++ b/drivers/misc/sig_header.c @@ -0,0 +1,59 @@ +#include +#include +#include + +static int get_image_signature(struct sig_header *hdr, + phys_addr_t base_addr, + phys_size_t size) +{ + memcpy((void *)hdr, (const void *)(base_addr + size - HDR_SIZE), + HDR_SIZE); + + if (hdr->magic != HDR_BOOT_MAGIC) + return -EFAULT; + + return 0; +} + +int check_board_signature(char *fname, phys_addr_t dn_addr, phys_size_t size) +{ + struct sig_header bh_target; + struct sig_header bh_addr; + int ret; + + /* u-boot-mmc.bin */ + if (strncmp(fname, "u-boot-mmc.bin", 14)) + return 0; + + /* can't found signature in target - download continue */ + ret = get_image_signature(&bh_target, (phys_addr_t)CONFIG_SYS_TEXT_BASE, + CONFIG_SIG_IMAGE_SIZE); + if (ret) + return 0; + + printf("U-Boot signature: \"%.*s\"\n", 16, bh_target.bd_name); + + if (size != CONFIG_SIG_IMAGE_SIZE) { + printf("Bad file size for: %s.\n", fname); + printf("Expected: %#x bytes, has: %#x bytes.\n", + CONFIG_SIG_IMAGE_SIZE, (unsigned)size); + return -EINVAL; + } + printf("%s ", fname); + /* can't found signature in address - download stop */ + ret = get_image_signature(&bh_addr, dn_addr, CONFIG_SIG_IMAGE_SIZE); + if (ret) { + printf("signature not found.\n"); + return -EFAULT; + } + printf("signature: \"%.*s\". ", 16, bh_addr.bd_name); + + if (strncmp(bh_target.bd_name, bh_addr.bd_name, + ARRAY_SIZE(bh_target.bd_name))) { + printf("Invalid!\n"); + return -EPERM; + } + + printf("OK!\n"); + return 0; +} diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index 74443fe767..479066e185 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -228,6 +229,14 @@ static int download_tail(long long int left, int cnt) return -ENXIO; } +#ifdef CONFIG_SIG + /* check board signature when download u-boot-mmc.bin */ + ret = check_board_signature(f_name, (phys_addr_t)transfer_buffer, + (phys_size_t)thor_file_size); + if (ret) + return ret; +#endif + if (left) { ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { diff --git a/include/samsung/sighdr.h b/include/samsung/sighdr.h new file mode 100644 index 0000000000..f97f51d776 --- /dev/null +++ b/include/samsung/sighdr.h @@ -0,0 +1,23 @@ +#ifndef __HEADER_H__ +#define __HEADER_H__ + +#define HDR_BOOT_MAGIC 0x744f6f42 /* BoOt */ + +#define HDR_SIZE sizeof(struct sig_header) + +/* Size of u-boot-mmc.bin - should be always padded to 1MB */ +#define CONFIG_SIG_IMAGE_SIZE SZ_1M + +/* HDR_SIZE - 512 */ +struct sig_header { + uint32_t magic; /* image magic number */ + uint32_t size; /* image data size */ + uint32_t valid; /* valid flag */ + char date[12]; /* image creation timestamp - YYMMDDHH */ + char version[24]; /* image version */ + char bd_name[16]; /* target board name */ + char reserved[448]; /* reserved */ +}; + +int check_board_signature(char *fname, phys_addr_t dn_addr, phys_size_t size); +#endif