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