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