board:samsung: add u-boot-mmc.bin sign check to thor
authorInha Song <ideal.song@samsung.com>
Mon, 28 Oct 2013 06:52:53 +0000 (15:52 +0900)
committerJoonyoung Shim <jy0922.shim@samsung.com>
Thu, 15 Jan 2015 06:35:38 +0000 (15:35 +0900)
Changes:
- add call to check_board_signature() before do dfu_write in thor downlaoder

new files:
- board/samsung/common/sig_header.c
- include/samsung/sighdr.h

Signed-off-by: Inha Song <ideal.song@samsung.com>
Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
board/samsung/common/Makefile
board/samsung/common/sig_header.c [new file with mode: 0644]
drivers/usb/gadget/f_thor.c
include/samsung/sighdr.h [new file with mode: 0644]

index 93347ef..701ef79 100644 (file)
@@ -8,6 +8,7 @@
 obj-$(CONFIG_SOFT_I2C_MULTI_BUS) += multi_i2c.o
 obj-$(CONFIG_USBDOWNLOAD_GADGET) += gadget.o
 obj-$(CONFIG_MISC_COMMON) += misc.o
+obj-$(CONFIG_SIG) += sig_header.o
 
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_BOARD_COMMON)     += board.o
diff --git a/board/samsung/common/sig_header.c b/board/samsung/common/sig_header.c
new file mode 100644 (file)
index 0000000..0219d59
--- /dev/null
@@ -0,0 +1,52 @@
+#include <common.h>
+#include <samsung/sighdr.h>
+
+//static struct sig_header *
+
+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) {
+               printf("no sign found\n");
+               debug("can't found signature\n");
+               return 1;
+       }
+
+       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 (strcmp(fname, "u-boot-mmc.bin"))
+               return 0;
+
+       /* can't found signature in target - download continue */
+       ret = get_image_signature(&bh_target, (phys_addr_t)CONFIG_SYS_TEXT_BASE,
+                                       size);
+       if (ret)
+               return 0;
+
+       /* can't found signature in address - download stop */
+       ret = get_image_signature(&bh_addr, dn_addr, size);
+       if (ret)
+               return -1;
+
+       if (strncmp(bh_target.bd_name, bh_addr.bd_name,
+                   ARRAY_SIZE(bh_target.bd_name))) {
+               debug("board name Inconsistency\n");
+               return -1;
+       }
+
+       debug("board signature check OK\n");
+
+       return 0;
+}
index c490463..18d4bde 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/usb/cdc.h>
 #include <g_dnl.h>
 #include <dfu.h>
+#include <samsung/sighdr.h>
 #include <libtizen.h>
 #include <samsung/misc.h>
 #include <linux/input.h>
@@ -232,6 +233,16 @@ 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) {
+               printf("Wrong board signature in file: %s.\n", f_name);
+               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 (file)
index 0000000..571e010
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __HEADER_H__
+#define __HEADER_H__
+
+#define HDR_BOOT_MAGIC         0x744f6f42      /* BoOt */
+
+#define HDR_SIZE               sizeof(struct sig_header)
+
+/* 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