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