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