xref: /OK3568_Linux_fs/u-boot/common/keymaster.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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