1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2014, STMicroelectronics International N.V.
4  */
5 
6 /* Based on GP TEE Internal API Specification Version 1.1 */
7 #ifndef TEE_API_H
8 #define TEE_API_H
9 
10 #include <stddef.h>
11 #include <compiler.h>
12 #include <tee_api_defines.h>
13 #include <tee_api_types.h>
14 #include <trace.h>
15 
16 /* Property access functions */
17 
18 TEE_Result TEE_GetPropertyAsString(TEE_PropSetHandle propsetOrEnumerator,
19 				   const char *name, char *valueBuffer,
20 				   uint32_t *valueBufferLen);
21 
22 TEE_Result TEE_GetPropertyAsBool(TEE_PropSetHandle propsetOrEnumerator,
23 				 const char *name, bool *value);
24 
25 TEE_Result TEE_GetPropertyAsU32(TEE_PropSetHandle propsetOrEnumerator,
26 				const char *name, uint32_t *value);
27 
28 TEE_Result TEE_GetPropertyAsBinaryBlock(TEE_PropSetHandle propsetOrEnumerator,
29 					const char *name, void *valueBuffer,
30 					uint32_t *valueBufferLen);
31 
32 TEE_Result TEE_GetPropertyAsUUID(TEE_PropSetHandle propsetOrEnumerator,
33 				 const char *name, TEE_UUID *value);
34 
35 TEE_Result TEE_GetPropertyAsIdentity(TEE_PropSetHandle propsetOrEnumerator,
36 				     const char *name, TEE_Identity *value);
37 
38 TEE_Result TEE_AllocatePropertyEnumerator(TEE_PropSetHandle *enumerator);
39 
40 void TEE_FreePropertyEnumerator(TEE_PropSetHandle enumerator);
41 
42 void TEE_StartPropertyEnumerator(TEE_PropSetHandle enumerator,
43 				 TEE_PropSetHandle propSet);
44 
45 void TEE_ResetPropertyEnumerator(TEE_PropSetHandle enumerator);
46 
47 TEE_Result TEE_GetPropertyName(TEE_PropSetHandle enumerator,
48 			       void *nameBuffer, uint32_t *nameBufferLen);
49 
50 TEE_Result TEE_GetNextProperty(TEE_PropSetHandle enumerator);
51 
52 /* System API - Misc */
53 
54 void TEE_Panic(TEE_Result panicCode);
55 
56 /* System API - Internal Client API */
57 
58 TEE_Result TEE_OpenTASession(const TEE_UUID *destination,
59 				uint32_t cancellationRequestTimeout,
60 				uint32_t paramTypes,
61 				TEE_Param params[TEE_NUM_PARAMS],
62 				TEE_TASessionHandle *session,
63 				uint32_t *returnOrigin);
64 
65 void TEE_CloseTASession(TEE_TASessionHandle session);
66 
67 TEE_Result TEE_InvokeTACommand(TEE_TASessionHandle session,
68 				uint32_t cancellationRequestTimeout,
69 				uint32_t commandID, uint32_t paramTypes,
70 				TEE_Param params[TEE_NUM_PARAMS],
71 				uint32_t *returnOrigin);
72 
73 /* System API - Cancellations */
74 
75 bool TEE_GetCancellationFlag(void);
76 
77 bool TEE_UnmaskCancellation(void);
78 
79 bool TEE_MaskCancellation(void);
80 
81 /* System API - Memory Management */
82 
83 TEE_Result TEE_CheckMemoryAccessRights(uint32_t accessFlags, void *buffer,
84 				       uint32_t size);
85 
86 void TEE_SetInstanceData(const void *instanceData);
87 
88 const void *TEE_GetInstanceData(void);
89 
90 void *TEE_Malloc(uint32_t size, uint32_t hint);
91 
92 void *TEE_Realloc(void *buffer, uint32_t newSize);
93 
94 void TEE_Free(void *buffer);
95 
96 void *TEE_MemMove(void *dest, const void *src, uint32_t size);
97 
98 /*
99  * Note: TEE_MemCompare() has a constant-time implementation (execution time
100  * does not depend on buffer content but only on buffer size). It is the main
101  * difference with memcmp().
102  */
103 int32_t TEE_MemCompare(const void *buffer1, const void *buffer2, uint32_t size);
104 
105 void *TEE_MemFill(void *buff, uint32_t x, uint32_t size);
106 
107 /* Data and Key Storage API  - Generic Object Functions */
108 
109 void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo);
110 TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo);
111 
112 void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage);
113 TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage);
114 
115 TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
116 					uint32_t attributeID, void *buffer,
117 					uint32_t *size);
118 
119 TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,
120 				       uint32_t attributeID, uint32_t *a,
121 				       uint32_t *b);
122 
123 void TEE_CloseObject(TEE_ObjectHandle object);
124 
125 /* Data and Key Storage API  - Transient Object Functions */
126 
127 TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
128 				       uint32_t maxKeySize,
129 				       TEE_ObjectHandle *object);
130 
131 void TEE_FreeTransientObject(TEE_ObjectHandle object);
132 
133 void TEE_ResetTransientObject(TEE_ObjectHandle object);
134 
135 TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
136 				       const TEE_Attribute *attrs,
137 				       uint32_t attrCount);
138 
139 void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
140 			  const void *buffer, uint32_t length);
141 
142 void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
143 			    uint32_t a, uint32_t b);
144 
145 void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
146 			      TEE_ObjectHandle srcObject);
147 
148 TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
149 			      TEE_ObjectHandle srcObject);
150 
151 TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
152 			   const TEE_Attribute *params, uint32_t paramCount);
153 
154 /* Data and Key Storage API  - Persistent Object Functions */
155 
156 TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID,
157 				    uint32_t objectIDLen, uint32_t flags,
158 				    TEE_ObjectHandle *object);
159 
160 TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID,
161 				      uint32_t objectIDLen, uint32_t flags,
162 				      TEE_ObjectHandle attributes,
163 				      const void *initialData,
164 				      uint32_t initialDataLen,
165 				      TEE_ObjectHandle *object);
166 
167 void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object);
168 
169 TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object);
170 
171 TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
172 				      const void *newObjectID,
173 				      uint32_t newObjectIDLen);
174 
175 TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
176 						  objectEnumerator);
177 
178 void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator);
179 
180 void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator);
181 
182 TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
183 					       objectEnumerator,
184 					       uint32_t storageID);
185 
186 TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
187 				       TEE_ObjectInfo *objectInfo,
188 				       void *objectID, uint32_t *objectIDLen);
189 
190 /* Data and Key Storage API  - Data Stream Access Functions */
191 
192 TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
193 			      uint32_t size, uint32_t *count);
194 
195 TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer,
196 			       uint32_t size);
197 
198 TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size);
199 
200 TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
201 			      TEE_Whence whence);
202 
203 /* Cryptographic Operations API - Generic Operation Functions */
204 
205 TEE_Result TEE_AllocateOperation(TEE_OperationHandle *operation,
206 				 uint32_t algorithm, uint32_t mode,
207 				 uint32_t maxKeySize);
208 
209 void TEE_FreeOperation(TEE_OperationHandle operation);
210 
211 void TEE_GetOperationInfo(TEE_OperationHandle operation,
212 			  TEE_OperationInfo *operationInfo);
213 
214 TEE_Result TEE_GetOperationInfoMultiple(TEE_OperationHandle operation,
215 			  TEE_OperationInfoMultiple *operationInfoMultiple,
216 			  uint32_t *operationSize);
217 
218 void TEE_ResetOperation(TEE_OperationHandle operation);
219 
220 TEE_Result TEE_SetOperationKey(TEE_OperationHandle operation,
221 			       TEE_ObjectHandle key);
222 
223 TEE_Result TEE_SetOperationKey2(TEE_OperationHandle operation,
224 				TEE_ObjectHandle key1, TEE_ObjectHandle key2);
225 
226 void TEE_CopyOperation(TEE_OperationHandle dstOperation,
227 		       TEE_OperationHandle srcOperation);
228 
229 TEE_Result TEE_IsAlgorithmSupported(uint32_t algId, uint32_t element);
230 
231 /* Cryptographic Operations API - Message Digest Functions */
232 
233 void TEE_DigestUpdate(TEE_OperationHandle operation,
234 		      const void *chunk, uint32_t chunkSize);
235 
236 TEE_Result TEE_DigestDoFinal(TEE_OperationHandle operation, const void *chunk,
237 			     uint32_t chunkLen, void *hash, uint32_t *hashLen);
238 
239 /* Cryptographic Operations API - Symmetric Cipher Functions */
240 
241 void TEE_CipherInit(TEE_OperationHandle operation, const void *IV,
242 		    uint32_t IVLen);
243 
244 TEE_Result TEE_CipherUpdate(TEE_OperationHandle operation, const void *srcData,
245 			    uint32_t srcLen, void *destData, uint32_t *destLen);
246 
247 TEE_Result TEE_CipherDoFinal(TEE_OperationHandle operation,
248 			     const void *srcData, uint32_t srcLen,
249 			     void *destData, uint32_t *destLen);
250 
251 /* Cryptographic Operations API - MAC Functions */
252 
253 void TEE_MACInit(TEE_OperationHandle operation, const void *IV,
254 		 uint32_t IVLen);
255 
256 void TEE_MACUpdate(TEE_OperationHandle operation, const void *chunk,
257 		   uint32_t chunkSize);
258 
259 TEE_Result TEE_MACComputeFinal(TEE_OperationHandle operation,
260 			       const void *message, uint32_t messageLen,
261 			       void *mac, uint32_t *macLen);
262 
263 TEE_Result TEE_MACCompareFinal(TEE_OperationHandle operation,
264 			       const void *message, uint32_t messageLen,
265 			       const void *mac, uint32_t macLen);
266 
267 /* Cryptographic Operations API - Authenticated Encryption Functions */
268 
269 TEE_Result TEE_AEInit(TEE_OperationHandle operation, const void *nonce,
270 		      uint32_t nonceLen, uint32_t tagLen, uint32_t AADLen,
271 		      uint32_t payloadLen);
272 
273 void TEE_AEUpdateAAD(TEE_OperationHandle operation, const void *AADdata,
274 		     uint32_t AADdataLen);
275 
276 TEE_Result TEE_AEUpdate(TEE_OperationHandle operation, const void *srcData,
277 			uint32_t srcLen, void *destData, uint32_t *destLen);
278 
279 TEE_Result TEE_AEEncryptFinal(TEE_OperationHandle operation,
280 			      const void *srcData, uint32_t srcLen,
281 			      void *destData, uint32_t *destLen, void *tag,
282 			      uint32_t *tagLen);
283 
284 TEE_Result TEE_AEDecryptFinal(TEE_OperationHandle operation,
285 			      const void *srcData, uint32_t srcLen,
286 			      void *destData, uint32_t *destLen, void *tag,
287 			      uint32_t tagLen);
288 
289 /* Cryptographic Operations API - Asymmetric Functions */
290 
291 TEE_Result TEE_AsymmetricEncrypt(TEE_OperationHandle operation,
292 				 const TEE_Attribute *params,
293 				 uint32_t paramCount, const void *srcData,
294 				 uint32_t srcLen, void *destData,
295 				 uint32_t *destLen);
296 
297 TEE_Result TEE_AsymmetricDecrypt(TEE_OperationHandle operation,
298 				 const TEE_Attribute *params,
299 				 uint32_t paramCount, const void *srcData,
300 				 uint32_t srcLen, void *destData,
301 				 uint32_t *destLen);
302 
303 TEE_Result TEE_AsymmetricSignDigest(TEE_OperationHandle operation,
304 				    const TEE_Attribute *params,
305 				    uint32_t paramCount, const void *digest,
306 				    uint32_t digestLen, void *signature,
307 				    uint32_t *signatureLen);
308 
309 TEE_Result TEE_AsymmetricVerifyDigest(TEE_OperationHandle operation,
310 				      const TEE_Attribute *params,
311 				      uint32_t paramCount, const void *digest,
312 				      uint32_t digestLen, const void *signature,
313 				      uint32_t signatureLen);
314 
315 /* Cryptographic Operations API - Key Derivation Functions */
316 
317 void TEE_DeriveKey(TEE_OperationHandle operation,
318 		   const TEE_Attribute *params, uint32_t paramCount,
319 		   TEE_ObjectHandle derivedKey);
320 
321 /* Cryptographic Operations API - Random Number Generation Functions */
322 
323 void TEE_GenerateRandom(void *randomBuffer, uint32_t randomBufferLen);
324 
325 /* Date & Time API */
326 
327 void TEE_GetSystemTime(TEE_Time *time);
328 
329 TEE_Result TEE_Wait(uint32_t timeout);
330 
331 TEE_Result TEE_GetTAPersistentTime(TEE_Time *time);
332 
333 TEE_Result TEE_SetTAPersistentTime(const TEE_Time *time);
334 
335 void TEE_GetREETime(TEE_Time *time);
336 
337 /* TEE Arithmetical API - Memory allocation and size of objects */
338 
339 uint32_t TEE_BigIntFMMSizeInU32(uint32_t modulusSizeInBits);
340 
341 uint32_t TEE_BigIntFMMContextSizeInU32(uint32_t modulusSizeInBits);
342 
343 /* TEE Arithmetical API - Initialization functions */
344 
345 void TEE_BigIntInit(TEE_BigInt *bigInt, uint32_t len);
346 
347 void TEE_BigIntInitFMMContext(TEE_BigIntFMMContext *context, uint32_t len,
348 			      const TEE_BigInt *modulus);
349 
350 void TEE_BigIntInitFMM(TEE_BigIntFMM *bigIntFMM, uint32_t len);
351 
352 /* TEE Arithmetical API - Converter functions */
353 
354 TEE_Result TEE_BigIntConvertFromOctetString(TEE_BigInt *dest,
355 					    const uint8_t *buffer,
356 					    uint32_t bufferLen,
357 					    int32_t sign);
358 
359 TEE_Result TEE_BigIntConvertToOctetString(uint8_t *buffer, uint32_t *bufferLen,
360 					  const TEE_BigInt *bigInt);
361 
362 void TEE_BigIntConvertFromS32(TEE_BigInt *dest, int32_t shortVal);
363 
364 TEE_Result TEE_BigIntConvertToS32(int32_t *dest, const TEE_BigInt *src);
365 
366 /* TEE Arithmetical API - Logical operations */
367 
368 int32_t TEE_BigIntCmp(const TEE_BigInt *op1, const TEE_BigInt *op2);
369 
370 int32_t TEE_BigIntCmpS32(const TEE_BigInt *op, int32_t shortVal);
371 
372 void TEE_BigIntShiftRight(TEE_BigInt *dest, const TEE_BigInt *op,
373 			  size_t bits);
374 
375 bool TEE_BigIntGetBit(const TEE_BigInt *src, uint32_t bitIndex);
376 
377 uint32_t TEE_BigIntGetBitCount(const TEE_BigInt *src);
378 
379 void TEE_BigIntAdd(TEE_BigInt *dest, const TEE_BigInt *op1,
380 		   const TEE_BigInt *op2);
381 
382 void TEE_BigIntSub(TEE_BigInt *dest, const TEE_BigInt *op1,
383 		   const TEE_BigInt *op2);
384 
385 void TEE_BigIntNeg(TEE_BigInt *dest, const TEE_BigInt *op);
386 
387 void TEE_BigIntMul(TEE_BigInt *dest, const TEE_BigInt *op1,
388 		   const TEE_BigInt *op2);
389 
390 void TEE_BigIntSquare(TEE_BigInt *dest, const TEE_BigInt *op);
391 
392 void TEE_BigIntDiv(TEE_BigInt *dest_q, TEE_BigInt *dest_r,
393 		   const TEE_BigInt *op1, const TEE_BigInt *op2);
394 
395 /* TEE Arithmetical API - Modular arithmetic operations */
396 
397 void TEE_BigIntMod(TEE_BigInt *dest, const TEE_BigInt *op,
398 		   const TEE_BigInt *n);
399 
400 void TEE_BigIntAddMod(TEE_BigInt *dest, const TEE_BigInt *op1,
401 		      const TEE_BigInt *op2, const TEE_BigInt *n);
402 
403 void TEE_BigIntSubMod(TEE_BigInt *dest, const TEE_BigInt *op1,
404 		      const TEE_BigInt *op2, const TEE_BigInt *n);
405 
406 void TEE_BigIntMulMod(TEE_BigInt *dest, const  TEE_BigInt *op1,
407 		      const TEE_BigInt *op2, const TEE_BigInt *n);
408 
409 void TEE_BigIntSquareMod(TEE_BigInt *dest, const TEE_BigInt *op,
410 			 const TEE_BigInt *n);
411 
412 void TEE_BigIntInvMod(TEE_BigInt *dest, const TEE_BigInt *op,
413 		      const TEE_BigInt *n);
414 
415 /* TEE Arithmetical API - Other arithmetic operations */
416 
417 bool TEE_BigIntRelativePrime(const TEE_BigInt *op1, const TEE_BigInt *op2);
418 
419 void TEE_BigIntComputeExtendedGcd(TEE_BigInt *gcd, TEE_BigInt *u,
420 				  TEE_BigInt *v, const TEE_BigInt *op1,
421 				  const TEE_BigInt *op2);
422 
423 int32_t TEE_BigIntIsProbablePrime(const TEE_BigInt *op,
424 				  uint32_t confidenceLevel);
425 
426 /* TEE Arithmetical API - Fast modular multiplication operations */
427 
428 void TEE_BigIntConvertToFMM(TEE_BigIntFMM *dest, const TEE_BigInt *src,
429 			    const TEE_BigInt *n,
430 			    const TEE_BigIntFMMContext *context);
431 
432 void TEE_BigIntConvertFromFMM(TEE_BigInt *dest, const TEE_BigIntFMM *src,
433 			      const TEE_BigInt *n,
434 			      const TEE_BigIntFMMContext *context);
435 
436 void TEE_BigIntFMMConvertToBigInt(TEE_BigInt *dest, const TEE_BigIntFMM *src,
437 				  const TEE_BigInt *n,
438 				  const TEE_BigIntFMMContext *context);
439 
440 void TEE_BigIntComputeFMM(TEE_BigIntFMM *dest, const TEE_BigIntFMM *op1,
441 			  const TEE_BigIntFMM *op2, const TEE_BigInt *n,
442 			  const TEE_BigIntFMMContext *context);
443 
444 #endif /* TEE_API_H */
445