1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <keymaster.h>
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <boot_rkimg.h>
9*4882a593Smuzhiyun #include <malloc.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <optee_include/OpteeClientApiLib.h>
12*4882a593Smuzhiyun #include <optee_include/tee_client_api.h>
13*4882a593Smuzhiyun #include <optee_include/tee_api_defines.h>
14*4882a593Smuzhiyun
read_from_keymaster(uint8_t * filename,uint32_t filename_size,uint8_t * data,uint32_t size)15*4882a593Smuzhiyun TEEC_Result read_from_keymaster(uint8_t *filename,
16*4882a593Smuzhiyun uint32_t filename_size,
17*4882a593Smuzhiyun uint8_t *data,
18*4882a593Smuzhiyun uint32_t size)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun TEEC_Result TeecResult;
21*4882a593Smuzhiyun TEEC_Context TeecContext;
22*4882a593Smuzhiyun TEEC_Session TeecSession;
23*4882a593Smuzhiyun uint32_t ErrorOrigin;
24*4882a593Smuzhiyun TEEC_UUID tempuuid = { 0x1b484ea5,
25*4882a593Smuzhiyun 0x698b,
26*4882a593Smuzhiyun 0x4142,
27*4882a593Smuzhiyun { 0x82, 0xb8, 0x3a,
28*4882a593Smuzhiyun 0xcf, 0x16, 0xe9,
29*4882a593Smuzhiyun 0x9e, 0x2a } };
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun TEEC_UUID *TeecUuid = &tempuuid;
32*4882a593Smuzhiyun TEEC_Operation TeecOperation = {0};
33*4882a593Smuzhiyun struct blk_desc *dev_desc;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun dev_desc = rockchip_get_bootdev();
36*4882a593Smuzhiyun if (!dev_desc) {
37*4882a593Smuzhiyun printf("%s: dev_desc is NULL!\n", __func__);
38*4882a593Smuzhiyun return -TEEC_ERROR_GENERIC;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun debug("read_from_keymaster start\n");
42*4882a593Smuzhiyun OpteeClientApiLibInitialize();
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
47*4882a593Smuzhiyun TEEC_NONE,
48*4882a593Smuzhiyun TEEC_NONE,
49*4882a593Smuzhiyun TEEC_NONE);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /*0 nand or emmc "security" partition , 1 rpmb*/
52*4882a593Smuzhiyun TeecOperation.params[0].value.a =
53*4882a593Smuzhiyun (dev_desc->if_type == IF_TYPE_MMC)
54*4882a593Smuzhiyun ? 1 : 0;
55*4882a593Smuzhiyun #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
56*4882a593Smuzhiyun TeecOperation.params[0].value.a = 0;
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun TeecResult = TEEC_OpenSession(&TeecContext,
60*4882a593Smuzhiyun &TeecSession,
61*4882a593Smuzhiyun TeecUuid,
62*4882a593Smuzhiyun TEEC_LOGIN_PUBLIC,
63*4882a593Smuzhiyun NULL,
64*4882a593Smuzhiyun &TeecOperation,
65*4882a593Smuzhiyun &ErrorOrigin);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun TEEC_SharedMemory SharedMem0 = {0};
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun SharedMem0.size = filename_size;
70*4882a593Smuzhiyun SharedMem0.flags = 0;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun memcpy(SharedMem0.buffer, filename, SharedMem0.size);
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun TEEC_SharedMemory SharedMem1 = {0};
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun SharedMem1.size = size;
79*4882a593Smuzhiyun SharedMem1.flags = 0;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
84*4882a593Smuzhiyun TeecOperation.params[0].tmpref.size = SharedMem0.size;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
87*4882a593Smuzhiyun TeecOperation.params[1].tmpref.size = SharedMem1.size;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
90*4882a593Smuzhiyun TEEC_MEMREF_TEMP_INOUT,
91*4882a593Smuzhiyun TEEC_NONE,
92*4882a593Smuzhiyun TEEC_NONE);
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun TeecResult = TEEC_InvokeCommand(&TeecSession,
95*4882a593Smuzhiyun 0,
96*4882a593Smuzhiyun &TeecOperation,
97*4882a593Smuzhiyun &ErrorOrigin);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun if (TeecResult == TEEC_SUCCESS)
100*4882a593Smuzhiyun memcpy(data, SharedMem1.buffer, SharedMem1.size);
101*4882a593Smuzhiyun TEEC_ReleaseSharedMemory(&SharedMem0);
102*4882a593Smuzhiyun TEEC_ReleaseSharedMemory(&SharedMem1);
103*4882a593Smuzhiyun TEEC_CloseSession(&TeecSession);
104*4882a593Smuzhiyun TEEC_FinalizeContext(&TeecContext);
105*4882a593Smuzhiyun debug("read_from_keymaster end\n");
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun return TeecResult;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
write_to_keymaster(uint8_t * filename,uint32_t filename_size,uint8_t * data,uint32_t data_size)110*4882a593Smuzhiyun TEEC_Result write_to_keymaster(uint8_t *filename,
111*4882a593Smuzhiyun uint32_t filename_size,
112*4882a593Smuzhiyun uint8_t *data,
113*4882a593Smuzhiyun uint32_t data_size)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun TEEC_Result TeecResult;
116*4882a593Smuzhiyun TEEC_Context TeecContext;
117*4882a593Smuzhiyun TEEC_Session TeecSession;
118*4882a593Smuzhiyun uint32_t ErrorOrigin;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun TEEC_UUID tempuuid = { 0x1b484ea5,
121*4882a593Smuzhiyun 0x698b,
122*4882a593Smuzhiyun 0x4142,
123*4882a593Smuzhiyun { 0x82, 0xb8, 0x3a,
124*4882a593Smuzhiyun 0xcf, 0x16, 0xe9,
125*4882a593Smuzhiyun 0x9e, 0x2a } };
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun TEEC_UUID *TeecUuid = &tempuuid;
128*4882a593Smuzhiyun TEEC_Operation TeecOperation = {0};
129*4882a593Smuzhiyun struct blk_desc *dev_desc;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun dev_desc = rockchip_get_bootdev();
132*4882a593Smuzhiyun if (!dev_desc) {
133*4882a593Smuzhiyun printf("%s: dev_desc is NULL!\n", __func__);
134*4882a593Smuzhiyun return -TEEC_ERROR_GENERIC;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun debug("write_to_keymaster\n");
138*4882a593Smuzhiyun OpteeClientApiLibInitialize();
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
143*4882a593Smuzhiyun TEEC_NONE,
144*4882a593Smuzhiyun TEEC_NONE,
145*4882a593Smuzhiyun TEEC_NONE);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun /*0 nand or emmc "security" partition , 1 rpmb*/
148*4882a593Smuzhiyun TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC)
149*4882a593Smuzhiyun ? 1 : 0;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION
152*4882a593Smuzhiyun TeecOperation.params[0].value.a = 0;
153*4882a593Smuzhiyun #endif
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun TeecResult = TEEC_OpenSession(&TeecContext,
156*4882a593Smuzhiyun &TeecSession,
157*4882a593Smuzhiyun TeecUuid,
158*4882a593Smuzhiyun TEEC_LOGIN_PUBLIC,
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun NULL, &TeecOperation, &ErrorOrigin);
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun TEEC_SharedMemory SharedMem0 = {0};
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun SharedMem0.size = filename_size;
165*4882a593Smuzhiyun SharedMem0.flags = 0;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun memcpy(SharedMem0.buffer, filename, SharedMem0.size);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun TEEC_SharedMemory SharedMem1 = {0};
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun SharedMem1.size = data_size;
174*4882a593Smuzhiyun SharedMem1.flags = 0;
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun memcpy(SharedMem1.buffer, data, SharedMem1.size);
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
181*4882a593Smuzhiyun TeecOperation.params[0].tmpref.size = SharedMem0.size;
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
184*4882a593Smuzhiyun TeecOperation.params[1].tmpref.size = SharedMem1.size;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
187*4882a593Smuzhiyun TEEC_MEMREF_TEMP_INOUT,
188*4882a593Smuzhiyun TEEC_NONE,
189*4882a593Smuzhiyun TEEC_NONE);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun TeecResult = TEEC_InvokeCommand(&TeecSession,
192*4882a593Smuzhiyun 1,
193*4882a593Smuzhiyun &TeecOperation,
194*4882a593Smuzhiyun &ErrorOrigin);
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun TEEC_ReleaseSharedMemory(&SharedMem0);
197*4882a593Smuzhiyun TEEC_ReleaseSharedMemory(&SharedMem1);
198*4882a593Smuzhiyun TEEC_CloseSession(&TeecSession);
199*4882a593Smuzhiyun TEEC_FinalizeContext(&TeecContext);
200*4882a593Smuzhiyun debug("write_to_keymaster end\n");
201*4882a593Smuzhiyun debug("TeecResult %x\n", TeecResult);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun return TeecResult;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
trusty_write_oem_unlock(uint8_t unlock)206*4882a593Smuzhiyun TEEC_Result trusty_write_oem_unlock(uint8_t unlock)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun char *file = "oem.unlock";
209*4882a593Smuzhiyun TEEC_Result ret;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun ret = write_to_keymaster((uint8_t *)file,
212*4882a593Smuzhiyun strlen(file),
213*4882a593Smuzhiyun (uint8_t *)&unlock,
214*4882a593Smuzhiyun 1);
215*4882a593Smuzhiyun return ret;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
trusty_read_oem_unlock(uint8_t * unlock)218*4882a593Smuzhiyun TEEC_Result trusty_read_oem_unlock(uint8_t *unlock)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun char *file = "oem.unlock";
221*4882a593Smuzhiyun TEEC_Result ret;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun ret = read_from_keymaster((uint8_t *)file,
224*4882a593Smuzhiyun strlen(file),
225*4882a593Smuzhiyun unlock,
226*4882a593Smuzhiyun 1);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun if (ret == TEE_ERROR_ITEM_NOT_FOUND) {
229*4882a593Smuzhiyun debug("init oem unlock status 0");
230*4882a593Smuzhiyun ret = trusty_write_oem_unlock(0);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun return ret;
234*4882a593Smuzhiyun }
235