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