defendkey: script signing tool: support upgrade check [5/5]
authorZhongfu Luo <zhongfu.luo@amlogic.com>
Thu, 27 Dec 2018 09:47:20 +0000 (17:47 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 27 Dec 2018 10:02:28 +0000 (02:02 -0800)
PD#SWPL-3204

Problem:
GXL/TXLX/G12A/G12B: script signing tool need to support defendkey

Solution:
1.change dtb decrypt process

Verify:
GXL/TXLX/G12A/G12B skt board verify pass

Change-Id: I165db827dec82837edb8a4a5197090bbd79d536d
Signed-off-by: Zhongfu Luo <zhongfu.luo@amlogic.com>
drivers/amlogic/defendkey/defendkey.c
drivers/amlogic/defendkey/securekey.h

index 1a71623..0a63c34 100644 (file)
@@ -134,8 +134,8 @@ static long defendkey_compat_ioctl(struct file *filp,
 static ssize_t defendkey_read(struct file *file,
        char __user *buf, size_t count, loff_t *ppos)
 {
-       int i, ret;
-       unsigned long copy_base, copy_size;
+       int ret;
+       unsigned long copy_base, copy_size, mem_base_phy, check_offset;
 
        switch (decrypt_dtb) {
        case e_upgrade_check:
@@ -143,29 +143,44 @@ static ssize_t defendkey_read(struct file *file,
                return ret_error;
        case e_decrypt_dtb_success:
        {
-               for (i = 0; i <= count/mem_size; i++) {
-                       copy_size = mem_size;
-                       copy_base = (unsigned long)buf+i*mem_size;
-                       if ((i+1)*mem_size > count)
-                               copy_size = count - mem_size*i;
-                       ret = copy_to_user((void __user *)copy_base,
-                               (const void *)mem_base_virt, copy_size);
-                       if (ret) {
-                               pr_err("%s:copy_to_user fail! ret:%d\n",
-                                       __func__, ret);
-                               return ret_fail;
-                       }
-               //__dma_flush_area((const void *)mem_base_virt, copy_size);
+               mem_base_phy = virt_to_phys(mem_base_virt);
+
+               check_offset = aml_sec_boot_check(AML_D_Q_IMG_SIG_HDR_SIZE,
+                       mem_base_phy, mem_size, 0);
+               if (AML_D_Q_IMG_SIG_HDR_SIZE == (check_offset & 0xFFFF))
+                       check_offset = (check_offset >> 16) & 0xFFFF;
+               else
+                       check_offset = 0;
+
+               if (check_offset)
+                       memmove((void *)mem_base_virt,
+                               (void *)mem_base_virt + check_offset, mem_size);
+
+               if (mem_size < count) {
+                       pr_err("%s:data size overflow!\n", __func__);
+                       return ret_fail;
                }
-               if (!ret) {
+
+               copy_base = (unsigned long)buf;
+               copy_size = count;
+               ret = copy_to_user((void __user *)copy_base,
+                       (const void *)mem_base_virt, copy_size);
+               if (ret) {
+                       pr_err("%s:copy_to_user fail! ret:%d\n",
+                               __func__, ret);
+                       ret = ret_fail;
+               } else {
                        pr_info("%s: copy data to user successfully!\n",
                                __func__);
-                       return ret_success;
+                       ret = ret_success;
                }
+
        }
        default:
                return ret_error;
        }
+
+       return ret;
 }
 
 static ssize_t defendkey_write(struct file *file,
@@ -357,6 +372,7 @@ static struct class defendkey_class = {
 static int __init early_defendkey_para(char *buf)
 {
        int ret;
+       struct page *page = NULL;
 
        if (!buf)
                return -EINVAL;
@@ -368,6 +384,12 @@ static int __init early_defendkey_para(char *buf)
                return -EINVAL;
        }
 
+       page = pfn_to_page(defendkey_rmem.base >> PAGE_SHIFT);
+       if (PageHighMem(page)) {
+               pr_err("invalid boot args \"defendkey\"\n");
+               return -EINVAL;
+       }
+
        pr_info("%s, base:%lx, size:%lx\n",
                __func__, defendkey_rmem.base, defendkey_rmem.size);
 
index 717352c..1473a59 100644 (file)
@@ -18,6 +18,7 @@
 #if (defined CONFIG_ARM64) || (defined CONFIG_ARM64_A32)
 #define AML_D_P_UPGRADE_CHECK   (0x80)
 #define AML_D_P_IMG_DECRYPT     (0x40)
+#define AML_D_Q_IMG_SIG_HDR_SIZE        (0x100)
 #define AML_DATA_PROCESS               (0x820000FF)
 #define GET_SHARE_MEM_INPUT_BASE       0x82000020