xref: /optee_os/lib/libutee/include/tee_api.h (revision 12941fdcbaa31bd0c6ab241022a7eba66c801467)
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 int32_t TEE_MemCompare(const void *buffer1, const void *buffer2, uint32_t size);
99 
100 void *TEE_MemFill(void *buff, uint32_t x, uint32_t size);
101 
102 /* Data and Key Storage API  - Generic Object Functions */
103 
104 void TEE_GetObjectInfo(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo);
105 TEE_Result TEE_GetObjectInfo1(TEE_ObjectHandle object, TEE_ObjectInfo *objectInfo);
106 
107 void TEE_RestrictObjectUsage(TEE_ObjectHandle object, uint32_t objectUsage);
108 TEE_Result TEE_RestrictObjectUsage1(TEE_ObjectHandle object, uint32_t objectUsage);
109 
110 TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,
111 					uint32_t attributeID, void *buffer,
112 					uint32_t *size);
113 
114 TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,
115 				       uint32_t attributeID, uint32_t *a,
116 				       uint32_t *b);
117 
118 void TEE_CloseObject(TEE_ObjectHandle object);
119 
120 /* Data and Key Storage API  - Transient Object Functions */
121 
122 TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
123 				       uint32_t maxKeySize,
124 				       TEE_ObjectHandle *object);
125 
126 void TEE_FreeTransientObject(TEE_ObjectHandle object);
127 
128 void TEE_ResetTransientObject(TEE_ObjectHandle object);
129 
130 TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
131 				       const TEE_Attribute *attrs,
132 				       uint32_t attrCount);
133 
134 void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
135 			  const void *buffer, uint32_t length);
136 
137 void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,
138 			    uint32_t a, uint32_t b);
139 
140 void TEE_CopyObjectAttributes(TEE_ObjectHandle destObject,
141 			      TEE_ObjectHandle srcObject);
142 
143 TEE_Result TEE_CopyObjectAttributes1(TEE_ObjectHandle destObject,
144 			      TEE_ObjectHandle srcObject);
145 
146 TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
147 			   const TEE_Attribute *params, uint32_t paramCount);
148 
149 /* Data and Key Storage API  - Persistent Object Functions */
150 
151 TEE_Result TEE_OpenPersistentObject(uint32_t storageID, const void *objectID,
152 				    uint32_t objectIDLen, uint32_t flags,
153 				    TEE_ObjectHandle *object);
154 
155 TEE_Result TEE_CreatePersistentObject(uint32_t storageID, const void *objectID,
156 				      uint32_t objectIDLen, uint32_t flags,
157 				      TEE_ObjectHandle attributes,
158 				      const void *initialData,
159 				      uint32_t initialDataLen,
160 				      TEE_ObjectHandle *object);
161 
162 void TEE_CloseAndDeletePersistentObject(TEE_ObjectHandle object);
163 
164 TEE_Result TEE_CloseAndDeletePersistentObject1(TEE_ObjectHandle object);
165 
166 TEE_Result TEE_RenamePersistentObject(TEE_ObjectHandle object,
167 				      const void *newObjectID,
168 				      uint32_t newObjectIDLen);
169 
170 TEE_Result TEE_AllocatePersistentObjectEnumerator(TEE_ObjectEnumHandle *
171 						  objectEnumerator);
172 
173 void TEE_FreePersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator);
174 
175 void TEE_ResetPersistentObjectEnumerator(TEE_ObjectEnumHandle objectEnumerator);
176 
177 TEE_Result TEE_StartPersistentObjectEnumerator(TEE_ObjectEnumHandle
178 					       objectEnumerator,
179 					       uint32_t storageID);
180 
181 TEE_Result TEE_GetNextPersistentObject(TEE_ObjectEnumHandle objectEnumerator,
182 				       TEE_ObjectInfo *objectInfo,
183 				       void *objectID, uint32_t *objectIDLen);
184 
185 /* Data and Key Storage API  - Data Stream Access Functions */
186 
187 TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer,
188 			      uint32_t size, uint32_t *count);
189 
190 TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, const void *buffer,
191 			       uint32_t size);
192 
193 TEE_Result TEE_TruncateObjectData(TEE_ObjectHandle object, uint32_t size);
194 
195 TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
196 			      TEE_Whence whence);
197 
198 /* Cryptographic Operations API - Generic Operation Functions */
199 
200 TEE_Result TEE_AllocateOperation(TEE_OperationHandle *operation,
201 				 uint32_t algorithm, uint32_t mode,
202 				 uint32_t maxKeySize);
203 
204 void TEE_FreeOperation(TEE_OperationHandle operation);
205 
206 void TEE_GetOperationInfo(TEE_OperationHandle operation,
207 			  TEE_OperationInfo *operationInfo);
208 
209 TEE_Result TEE_GetOperationInfoMultiple(TEE_OperationHandle operation,
210 			  TEE_OperationInfoMultiple *operationInfoMultiple,
211 			  uint32_t *operationSize);
212 
213 void TEE_ResetOperation(TEE_OperationHandle operation);
214 
215 TEE_Result TEE_SetOperationKey(TEE_OperationHandle operation,
216 			       TEE_ObjectHandle key);
217 
218 TEE_Result TEE_SetOperationKey2(TEE_OperationHandle operation,
219 				TEE_ObjectHandle key1, TEE_ObjectHandle key2);
220 
221 void TEE_CopyOperation(TEE_OperationHandle dstOperation,
222 		       TEE_OperationHandle srcOperation);
223 
224 /* Cryptographic Operations API - Message Digest Functions */
225 
226 void TEE_DigestUpdate(TEE_OperationHandle operation,
227 		      const void *chunk, uint32_t chunkSize);
228 
229 TEE_Result TEE_DigestDoFinal(TEE_OperationHandle operation, const void *chunk,
230 			     uint32_t chunkLen, void *hash, uint32_t *hashLen);
231 
232 /* Cryptographic Operations API - Symmetric Cipher Functions */
233 
234 void TEE_CipherInit(TEE_OperationHandle operation, const void *IV,
235 		    uint32_t IVLen);
236 
237 TEE_Result TEE_CipherUpdate(TEE_OperationHandle operation, const void *srcData,
238 			    uint32_t srcLen, void *destData, uint32_t *destLen);
239 
240 TEE_Result TEE_CipherDoFinal(TEE_OperationHandle operation,
241 			     const void *srcData, uint32_t srcLen,
242 			     void *destData, uint32_t *destLen);
243 
244 /* Cryptographic Operations API - MAC Functions */
245 
246 void TEE_MACInit(TEE_OperationHandle operation, const void *IV,
247 		 uint32_t IVLen);
248 
249 void TEE_MACUpdate(TEE_OperationHandle operation, const void *chunk,
250 		   uint32_t chunkSize);
251 
252 TEE_Result TEE_MACComputeFinal(TEE_OperationHandle operation,
253 			       const void *message, uint32_t messageLen,
254 			       void *mac, uint32_t *macLen);
255 
256 TEE_Result TEE_MACCompareFinal(TEE_OperationHandle operation,
257 			       const void *message, uint32_t messageLen,
258 			       const void *mac, uint32_t macLen);
259 
260 /* Cryptographic Operations API - Authenticated Encryption Functions */
261 
262 TEE_Result TEE_AEInit(TEE_OperationHandle operation, const void *nonce,
263 		      uint32_t nonceLen, uint32_t tagLen, uint32_t AADLen,
264 		      uint32_t payloadLen);
265 
266 void TEE_AEUpdateAAD(TEE_OperationHandle operation, const void *AADdata,
267 		     uint32_t AADdataLen);
268 
269 TEE_Result TEE_AEUpdate(TEE_OperationHandle operation, const void *srcData,
270 			uint32_t srcLen, void *destData, uint32_t *destLen);
271 
272 TEE_Result TEE_AEEncryptFinal(TEE_OperationHandle operation,
273 			      const void *srcData, uint32_t srcLen,
274 			      void *destData, uint32_t *destLen, void *tag,
275 			      uint32_t *tagLen);
276 
277 TEE_Result TEE_AEDecryptFinal(TEE_OperationHandle operation,
278 			      const void *srcData, uint32_t srcLen,
279 			      void *destData, uint32_t *destLen, void *tag,
280 			      uint32_t tagLen);
281 
282 /* Cryptographic Operations API - Asymmetric Functions */
283 
284 TEE_Result TEE_AsymmetricEncrypt(TEE_OperationHandle operation,
285 				 const TEE_Attribute *params,
286 				 uint32_t paramCount, const void *srcData,
287 				 uint32_t srcLen, void *destData,
288 				 uint32_t *destLen);
289 
290 TEE_Result TEE_AsymmetricDecrypt(TEE_OperationHandle operation,
291 				 const TEE_Attribute *params,
292 				 uint32_t paramCount, const void *srcData,
293 				 uint32_t srcLen, void *destData,
294 				 uint32_t *destLen);
295 
296 TEE_Result TEE_AsymmetricSignDigest(TEE_OperationHandle operation,
297 				    const TEE_Attribute *params,
298 				    uint32_t paramCount, const void *digest,
299 				    uint32_t digestLen, void *signature,
300 				    uint32_t *signatureLen);
301 
302 TEE_Result TEE_AsymmetricVerifyDigest(TEE_OperationHandle operation,
303 				      const TEE_Attribute *params,
304 				      uint32_t paramCount, const void *digest,
305 				      uint32_t digestLen, const void *signature,
306 				      uint32_t signatureLen);
307 
308 /* Cryptographic Operations API - Key Derivation Functions */
309 
310 void TEE_DeriveKey(TEE_OperationHandle operation,
311 		   const TEE_Attribute *params, uint32_t paramCount,
312 		   TEE_ObjectHandle derivedKey);
313 
314 /* Cryptographic Operations API - Random Number Generation Functions */
315 
316 void TEE_GenerateRandom(void *randomBuffer, uint32_t randomBufferLen);
317 
318 /* Date & Time API */
319 
320 void TEE_GetSystemTime(TEE_Time *time);
321 
322 TEE_Result TEE_Wait(uint32_t timeout);
323 
324 TEE_Result TEE_GetTAPersistentTime(TEE_Time *time);
325 
326 TEE_Result TEE_SetTAPersistentTime(const TEE_Time *time);
327 
328 void TEE_GetREETime(TEE_Time *time);
329 
330 /* TEE Arithmetical API - Memory allocation and size of objects */
331 
332 uint32_t TEE_BigIntFMMSizeInU32(uint32_t modulusSizeInBits);
333 
334 uint32_t TEE_BigIntFMMContextSizeInU32(uint32_t modulusSizeInBits);
335 
336 /* TEE Arithmetical API - Initialization functions */
337 
338 void TEE_BigIntInit(TEE_BigInt *bigInt, uint32_t len);
339 
340 void TEE_BigIntInitFMMContext(TEE_BigIntFMMContext *context, uint32_t len,
341 			      const TEE_BigInt *modulus);
342 
343 void TEE_BigIntInitFMM(TEE_BigIntFMM *bigIntFMM, uint32_t len);
344 
345 /* TEE Arithmetical API - Converter functions */
346 
347 TEE_Result TEE_BigIntConvertFromOctetString(TEE_BigInt *dest,
348 					    const uint8_t *buffer,
349 					    uint32_t bufferLen,
350 					    int32_t sign);
351 
352 TEE_Result TEE_BigIntConvertToOctetString(uint8_t *buffer, uint32_t *bufferLen,
353 					  const TEE_BigInt *bigInt);
354 
355 void TEE_BigIntConvertFromS32(TEE_BigInt *dest, int32_t shortVal);
356 
357 TEE_Result TEE_BigIntConvertToS32(int32_t *dest, const TEE_BigInt *src);
358 
359 /* TEE Arithmetical API - Logical operations */
360 
361 int32_t TEE_BigIntCmp(const TEE_BigInt *op1, const TEE_BigInt *op2);
362 
363 int32_t TEE_BigIntCmpS32(const TEE_BigInt *op, int32_t shortVal);
364 
365 void TEE_BigIntShiftRight(TEE_BigInt *dest, const TEE_BigInt *op,
366 			  size_t bits);
367 
368 bool TEE_BigIntGetBit(const TEE_BigInt *src, uint32_t bitIndex);
369 
370 uint32_t TEE_BigIntGetBitCount(const TEE_BigInt *src);
371 
372 void TEE_BigIntAdd(TEE_BigInt *dest, const TEE_BigInt *op1,
373 		   const TEE_BigInt *op2);
374 
375 void TEE_BigIntSub(TEE_BigInt *dest, const TEE_BigInt *op1,
376 		   const TEE_BigInt *op2);
377 
378 void TEE_BigIntNeg(TEE_BigInt *dest, const TEE_BigInt *op);
379 
380 void TEE_BigIntMul(TEE_BigInt *dest, const TEE_BigInt *op1,
381 		   const TEE_BigInt *op2);
382 
383 void TEE_BigIntSquare(TEE_BigInt *dest, const TEE_BigInt *op);
384 
385 void TEE_BigIntDiv(TEE_BigInt *dest_q, TEE_BigInt *dest_r,
386 		   const TEE_BigInt *op1, const TEE_BigInt *op2);
387 
388 /* TEE Arithmetical API - Modular arithmetic operations */
389 
390 void TEE_BigIntMod(TEE_BigInt *dest, const TEE_BigInt *op,
391 		   const TEE_BigInt *n);
392 
393 void TEE_BigIntAddMod(TEE_BigInt *dest, const TEE_BigInt *op1,
394 		      const TEE_BigInt *op2, const TEE_BigInt *n);
395 
396 void TEE_BigIntSubMod(TEE_BigInt *dest, const TEE_BigInt *op1,
397 		      const TEE_BigInt *op2, const TEE_BigInt *n);
398 
399 void TEE_BigIntMulMod(TEE_BigInt *dest, const  TEE_BigInt *op1,
400 		      const TEE_BigInt *op2, const TEE_BigInt *n);
401 
402 void TEE_BigIntSquareMod(TEE_BigInt *dest, const TEE_BigInt *op,
403 			 const TEE_BigInt *n);
404 
405 void TEE_BigIntInvMod(TEE_BigInt *dest, const TEE_BigInt *op,
406 		      const TEE_BigInt *n);
407 
408 /* TEE Arithmetical API - Other arithmetic operations */
409 
410 bool TEE_BigIntRelativePrime(const TEE_BigInt *op1, const TEE_BigInt *op2);
411 
412 void TEE_BigIntComputeExtendedGcd(TEE_BigInt *gcd, TEE_BigInt *u,
413 				  TEE_BigInt *v, const TEE_BigInt *op1,
414 				  const TEE_BigInt *op2);
415 
416 int32_t TEE_BigIntIsProbablePrime(const TEE_BigInt *op,
417 				  uint32_t confidenceLevel);
418 
419 /* TEE Arithmetical API - Fast modular multiplication operations */
420 
421 void TEE_BigIntConvertToFMM(TEE_BigIntFMM *dest, const TEE_BigInt *src,
422 			    const TEE_BigInt *n,
423 			    const TEE_BigIntFMMContext *context);
424 
425 void TEE_BigIntConvertFromFMM(TEE_BigInt *dest, const TEE_BigIntFMM *src,
426 			      const TEE_BigInt *n,
427 			      const TEE_BigIntFMMContext *context);
428 
429 void TEE_BigIntFMMConvertToBigInt(TEE_BigInt *dest, const TEE_BigIntFMM *src,
430 				  const TEE_BigInt *n,
431 				  const TEE_BigIntFMMContext *context);
432 
433 void TEE_BigIntComputeFMM(TEE_BigIntFMM *dest, const TEE_BigIntFMM *op1,
434 			  const TEE_BigIntFMM *op2, const TEE_BigInt *n,
435 			  const TEE_BigIntFMMContext *context);
436 
437 #endif /* TEE_API_H */
438