• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3  * Licensed under the Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *     http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8  * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9  * PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  */
12 
13 
14 #include "img_load.h"
15 
16 #include <securec.h>
17 #include "set_teeos_cfg.h"
18 
19 uintptr_t get_buf_addr(const char *part_name);
20 int32_t storage_read(const char *part_name, uint32_t part_size, uintptr_t buf_addr);
21 int32_t verify_sign(uintptr_t buf_addr);
22 int32_t rsa_decrypt(uintptr_t buf_addr);
23 
read_teeos(const char * part_name,uint32_t part_size)24 static uintptr_t read_teeos(const char *part_name, uint32_t part_size)
25 {
26     int32_t ret;
27     uintptr_t buf_addr = get_buf_addr(part_name);
28 
29     ret = storage_read(part_name, part_size, buf_addr);
30     if (ret != 0)
31         return 0;
32 
33     return buf_addr;
34 }
35 
verify_teeos(uintptr_t buf_addr)36 static int32_t verify_teeos(uintptr_t buf_addr)
37 {
38     int32_t ret;
39     ret = verify_sign(buf_addr);
40 
41     return ret;
42 }
43 
decrypt_teeos(uintptr_t buf_addr)44 static int32_t decrypt_teeos(uintptr_t buf_addr)
45 {
46     int32_t ret;
47 
48     ret = rsa_decrypt(buf_addr);
49 
50     return ret;
51 }
52 
copy_teeos(uintptr_t buf_addr,uint64_t dst_addr)53 static int32_t copy_teeos(uintptr_t buf_addr, uint64_t dst_addr)
54 {
55     struct secure_img_header *img_header = (struct secure_img_header*)buf_addr;
56     void *src_ptr = (void *)(uintptr_t)((uint64_t)(uintptr_t)img_header + img_header->kernel_offset);
57     uint32_t size = img_header->kernel_size;
58 
59     if (memcpy_s((void *)(uintptr_t)dst_addr, size, src_ptr, size) != EOK)
60         return -1;
61 
62     return 0;
63 }
64 
load_teeos(const char * part_name,uint32_t part_size,...)65 int32_t load_teeos(const char *part_name, uint32_t part_size, ...)
66 {
67     /* 1st step: copy teeos to ram from flash */
68     uintptr_t buf_addr = read_teeos(part_name, part_size);
69     if (buf_addr == 0) {
70         teelog("read teeos failed\n");
71         return -1;
72     }
73 
74     /* 2nd step: verify teeos */
75     if (verify_teeos(buf_addr) != 0) {
76         teelog("verify teeos failed\n");
77         return -1;
78     }
79 
80     /* 3rd step: decrypt teeos */
81     if (decrypt_teeos(buf_addr) != 0) {
82         teelog("decrypt teeos failed\n");
83         return -1;
84     }
85 
86     /* 4th step: copy teeos to destination */
87     uint64_t teeos_boot_addr = get_teeos_code_start();
88     if (teeos_boot_addr == 0) {
89         teelog("get teeos start addr error\n");
90         return -1;
91     }
92 
93     if (copy_teeos(buf_addr, teeos_boot_addr) != 0) {
94         teelog("copy to teeos failed\n");
95         return -1;
96     }
97 
98     (void)part_name;
99     (void)part_size;
100 
101     return 0;
102 }
103