xref: /OK3568_Linux_fs/external/security/rk_tee_user/v2/ta/rk_public_api/rk_derive_key_api.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2023 Rockchip Electronics Co. Ltd.
4  */
5 #include <pta_system.h>
6 #include <tee_internal_api.h>
7 #include "rk_derive_key_api.h"
8 
rk_derive_ta_unique_key(uint8_t * extra,uint16_t extra_size,uint8_t * key,uint16_t key_size)9 TEE_Result rk_derive_ta_unique_key(uint8_t *extra, uint16_t extra_size,
10 				    uint8_t *key, uint16_t key_size)
11 {
12 	TEE_UUID sta_uuid = PTA_SYSTEM_UUID;
13 	TEE_TASessionHandle sta_session = TEE_HANDLE_NULL;
14 	uint32_t origin;
15 	TEE_Result res;
16 	TEE_Param taParams[4];
17 	uint32_t nParamTypes;
18 
19 	if (!extra || extra_size == 0 || !key || (key_size != 16 && key_size != 32))
20 		return TEE_ERROR_BAD_PARAMETERS;
21 
22 	nParamTypes = TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE,
23 			TEE_PARAM_TYPE_NONE,
24 			TEE_PARAM_TYPE_NONE,
25 			TEE_PARAM_TYPE_NONE);
26 
27 	res = TEE_OpenTASession(&sta_uuid, 0, nParamTypes, taParams, &sta_session, &origin);
28 	if (res != TEE_SUCCESS)
29 		return res;
30 
31 	nParamTypes = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
32 			TEE_PARAM_TYPE_MEMREF_OUTPUT,
33 			TEE_PARAM_TYPE_NONE,
34 			TEE_PARAM_TYPE_NONE);
35 
36 	taParams[0].memref.buffer = extra;
37 	taParams[0].memref.size = extra_size;
38 	taParams[1].memref.buffer = key;
39 	taParams[1].memref.size = key_size;
40 
41 	res = TEE_InvokeTACommand(sta_session, 0, PTA_SYSTEM_DERIVE_TA_UNIQUE_KEY,
42 				  nParamTypes, taParams, &origin);
43 	if (res != TEE_SUCCESS)
44 		EMSG("Failure when calling PTA_SYSTEM_DERIVE_TA_UNIQUE_KEY");
45 
46 	TEE_CloseTASession(sta_session);
47 
48 	return res;
49 }
50