1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
4 * All rights reserved.
5 */
6 #include <stdint.h>
7
8 #include <ta_rpc.h>
9 #include <tee_api.h>
10 #include <trace.h>
11 #include <ta_crypt.h>
12 #include <ta_sims_test.h>
13
14 static TEE_UUID cryp_uuid = TA_CRYPT_UUID;
15
rpc_call_cryp(bool sec_mem,uint32_t nParamTypes,TEE_Param pParams[4],uint32_t cmd)16 static TEE_Result rpc_call_cryp(bool sec_mem, uint32_t nParamTypes,
17 TEE_Param pParams[4], uint32_t cmd)
18 {
19 TEE_TASessionHandle cryp_session = TEE_HANDLE_NULL;
20 TEE_Result res = TEE_ERROR_GENERIC;
21 uint32_t origin = 0;
22 TEE_Param params[4] = { };
23 size_t n = 0;
24 uint32_t types =
25 TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,
26 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
27
28 res = TEE_OpenTASession(&cryp_uuid, TEE_TIMEOUT_INFINITE, types,
29 params, &cryp_session, &origin);
30
31 if (res != TEE_SUCCESS) {
32 EMSG("rpc_sha256 - TEE_OpenTASession returned 0x%x\n",
33 (unsigned int)res);
34 return res;
35 }
36
37 types = nParamTypes;
38 if (sec_mem) {
39 TEE_MemFill(params, 0, sizeof(params));
40 for (n = 0; n < 4; n++) {
41 switch (TEE_PARAM_TYPE_GET(types, n)) {
42 case TEE_PARAM_TYPE_VALUE_INPUT:
43 case TEE_PARAM_TYPE_VALUE_INOUT:
44 params[n].value = pParams[n].value;
45 break;
46
47 case TEE_PARAM_TYPE_MEMREF_INPUT:
48 case TEE_PARAM_TYPE_MEMREF_OUTPUT:
49 case TEE_PARAM_TYPE_MEMREF_INOUT:
50 params[n].memref.buffer =
51 TEE_Malloc(pParams[n].memref.size, 0);
52 if (!params[n].memref.buffer)
53 TEE_Panic(0);
54 params[n].memref.size = pParams[n].memref.size;
55 if (TEE_PARAM_TYPE_GET(types, n) !=
56 TEE_PARAM_TYPE_MEMREF_OUTPUT)
57 TEE_MemMove(params[n].memref.buffer,
58 pParams[n].memref.buffer,
59 pParams[n].memref.size);
60 break;
61 default:
62 break;
63 }
64 }
65 } else {
66 TEE_MemMove(params, pParams, sizeof(params));
67 }
68
69 res = TEE_InvokeTACommand(cryp_session, TEE_TIMEOUT_INFINITE, cmd,
70 types, params, &origin);
71 if (res != TEE_SUCCESS) {
72 EMSG("rpc_call_cryp - TEE_InvokeTACommand returned 0x%x\n",
73 (unsigned int)res);
74 }
75
76 TEE_CloseTASession(cryp_session);
77
78 if (sec_mem) {
79 for (n = 0; n < 4; n++) {
80 switch (TEE_PARAM_TYPE_GET(types, n)) {
81 case TEE_PARAM_TYPE_VALUE_INOUT:
82 case TEE_PARAM_TYPE_VALUE_OUTPUT:
83 pParams[n].value = params[n].value;
84 break;
85
86 case TEE_PARAM_TYPE_MEMREF_INPUT:
87 case TEE_PARAM_TYPE_MEMREF_OUTPUT:
88 case TEE_PARAM_TYPE_MEMREF_INOUT:
89 if (TEE_PARAM_TYPE_GET(types, n) !=
90 TEE_PARAM_TYPE_MEMREF_INPUT)
91 TEE_MemMove(pParams[n].memref.buffer,
92 params[n].memref.buffer,
93 params[n].memref.size);
94 pParams[n].memref.size = params[n].memref.size;
95 TEE_Free(params[n].memref.buffer);
96 break;
97 default:
98 break;
99 }
100 }
101
102 }
103
104 return res;
105 }
106
rpc_sha224(bool sec_mem,uint32_t nParamTypes,TEE_Param pParams[4])107 TEE_Result rpc_sha224(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
108 {
109 return rpc_call_cryp(sec_mem, nParamTypes, pParams,
110 TA_CRYPT_CMD_SHA224);
111 }
112
rpc_sha256(bool sec_mem,uint32_t nParamTypes,TEE_Param pParams[4])113 TEE_Result rpc_sha256(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
114 {
115 return rpc_call_cryp(sec_mem, nParamTypes, pParams,
116 TA_CRYPT_CMD_SHA256);
117 }
118
rpc_aes256ecb_encrypt(bool sec_mem,uint32_t nParamTypes,TEE_Param pParams[4])119 TEE_Result rpc_aes256ecb_encrypt(bool sec_mem, uint32_t nParamTypes,
120 TEE_Param pParams[4])
121 {
122 return rpc_call_cryp(sec_mem, nParamTypes, pParams,
123 TA_CRYPT_CMD_AES256ECB_ENC);
124 }
125
rpc_aes256ecb_decrypt(bool sec_mem,uint32_t nParamTypes,TEE_Param pParams[4])126 TEE_Result rpc_aes256ecb_decrypt(bool sec_mem, uint32_t nParamTypes,
127 TEE_Param pParams[4])
128 {
129 return rpc_call_cryp(sec_mem, nParamTypes, pParams,
130 TA_CRYPT_CMD_AES256ECB_DEC);
131 }
132
rpc_open(void * session_context,uint32_t param_types,TEE_Param params[4])133 TEE_Result rpc_open(void *session_context, uint32_t param_types,
134 TEE_Param params[4])
135 {
136 TEE_TASessionHandle session = TEE_HANDLE_NULL;
137 uint32_t orig = 0;
138 TEE_Result res = TEE_ERROR_GENERIC;
139 TEE_UUID uuid = TA_SIMS_TEST_UUID;
140 uint32_t types =
141 TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
142 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
143 TEE_Param par[4] = { };
144
145 (void)session_context;
146 (void)param_types;
147
148 res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, 0, NULL, &session,
149 &orig);
150
151 if (res != TEE_SUCCESS)
152 return res;
153
154 TEE_MemFill(params, 0, sizeof(TEE_Param) * 4);
155 res =
156 TEE_InvokeTACommand(session, TEE_TIMEOUT_INFINITE,
157 TA_SIMS_CMD_GET_COUNTER, types, par, &orig);
158
159 if (res != TEE_SUCCESS)
160 goto exit;
161
162 exit:
163 TEE_CloseTASession(session);
164
165 return res;
166 }
167