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