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