• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *    http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef TEE_ARITH_API_H
17 #define TEE_ARITH_API_H
18 
19 /**
20  * @addtogroup TeeTrusted
21  * @{
22  *
23  * @brief TEE(Trusted Excution Environment) API.
24  * Provides security capability APIs such as trusted storage, encryption and decryption,
25  * and trusted time for trusted application development.
26  *
27  * @since 12
28  */
29 
30 /**
31  * @file tee_arith_api.h
32  *
33  * @brief Provides APIs for operating big integers.
34  *
35  * @library NA
36  * @kit TEEKit
37  * @syscap SystemCapability.Tee.TeeClient
38  * @since 12
39  * @version 1.0
40  */
41 
42 #include <tee_defines.h>
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 typedef uint32_t TEE_BigInt;
49 typedef uint32_t TEE_BigIntFMM;
50 typedef uint32_t TEE_BigIntFMMContext;
51 
52 /**
53  * @brief Obtains the size of the array of uint32_t values required to represent a <b>BigInt</b>.
54  *
55  * @param n Indicates the <b>TEE_BigInt</b> type.
56  *
57  * @return Returns the <b>BigInt</b> size obtained.
58  *
59  * @since 12
60  * @version 1.0
61  */
62 #define TEE_BigIntSizeInU32(n) ((((n) + 31) / 32) + 2)
63 
64 /**
65  * @brief Obtains the size of the array of uint32_t values.
66  *
67  * @param modulusSizeInBits Indicates the modulus size, in bits.
68  *
69  * @return Returns the number of bytes required to store a <b>TEE_BigIntFMM</b>,
70  * given a modulus of length <b>modSizeInBits</b>.
71  *
72  * @since 12
73  * @version 1.0
74  */
75 size_t TEE_BigIntFMMSizeInU32(size_t modulusSizeInBits);
76 
77 /**
78  * @brief Obtains the size of an array of uint32_t values required to represent a fast modular context.
79  *
80  * @param modulusSizeInBits Indicates the modulus size, in bits.
81  *
82  * @return Returns the number of bytes required to store a <b>TEE_BigIntFMMContext</b>,
83  * given a modulus of length <b>modSizeInBits</b>.
84  *
85  * @since 12
86  * @version 1.0
87  */
88 size_t TEE_BigIntFMMContextSizeInU32(size_t modulusSizeInBits);
89 
90 /**
91  * @brief Initializes a <b>TEE_BigInt</b>.
92  *
93  * @param bigInt Indicates the pointer to the <b>TEE_BigInt</b> to initialize.
94  * @param len Indicates the size of the memory pointed to by <b>TEE_BigInt</b>, in uint32_t.
95  *
96  * @since 12
97  * @version 1.0
98  */
99 void TEE_BigIntInit(TEE_BigInt *bigInt, size_t len);
100 
101 /**
102  * @brief Calculates the necessary prerequisites for fast modular multiplication and stores them in a context.
103  *
104  * @param context Indicates the pointer to the <b>TEE_BigIntFMMContext</b> to initialize.
105  * @param len Indicates the size of the memory pointed to by <b>context</b>, in uint32_t.
106  * @param modulus Indicates the pointer to the modulus.
107  *
108  * @since 12
109  * @version 1.0
110  */
111 void TEE_BigIntInitFMMContext(TEE_BigIntFMMContext *context, size_t len, const TEE_BigInt *modulus);
112 
113 /**
114  * @brief Calculates the necessary prerequisites for fast modular multiplication and stores them in a context.
115  *
116  * @param context Indicates the pointer to the <b>TEE_BigIntFMMContext</b> to initialize.
117  * @param len Indicates the size of the memory pointed to by <b>context</b>, in uint32_t.
118  * @param modulus Indicates the pointer to the modulus.
119  *
120  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
121  *         Returns other values if the operation fails.
122  *
123  * @since 12
124  * @version 1.0
125  */
126 TEE_Result TEE_BigIntInitFMMContext1(TEE_BigIntFMMContext *context, size_t len, const TEE_BigInt *modulus);
127 
128 /**
129  * @brief Initializes a <b>TEE_BigIntFMM</b> and sets its represented value to zero.
130  *
131  * @param bigIntFMM Indicates the pointer to the <b>TEE_BigIntFMM</b> to initialize.
132  * @param len Indicates the size of the memory pointed to by <b>bigIntFMM</b>, in uint32_t.
133  *
134  * @since 12
135  * @version 1.0
136  */
137 void TEE_BigIntInitFMM(TEE_BigIntFMM *bigIntFMM, size_t len);
138 
139 /**
140  * @brief Converts an octet string buffer into the <b>TEE_BigInt</b> format.
141  *
142  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result.
143  * @param buffer Indicates the pointer to the buffer that holds the octet string representation of the integer.
144  * @param bufferLen Indicates the buffer length, in bytes.
145  * @param sign Indicates the sign of <b>dest</b>, which is set to the sign of <b>sign</b>.
146  *
147  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
148  *         Returns <b>TEE_ERROR_OVERFLOW</b> if the memory allocated for <b>dest</b> is too small.
149  *
150  * @since 12
151  * @version 1.0
152  */
153 TEE_Result TEE_BigIntConvertFromOctetString(TEE_BigInt *dest, const uint8_t *buffer, size_t bufferLen, int32_t sign);
154 
155 /**
156  * @brief Converts the absolute value of an integer in <b>TEE_BigInt</b> format into an octet string.
157  *
158  * @param buffer Indicates the pointer to the output buffer that holds the converted octet string representation
159  * of the integer.
160  * @param bufferLen Indicates the pointer to the buffer length, in bytes.
161  * @param bigInt Indicates the pointer to the integer to convert.
162  *
163  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
164  *         Returns <b>TEE_ERROR_SHORT_BUFFER</b> if the output buffer is too small to hold the octet string.
165  *
166  * @since 12
167  * @version 1.0
168  */
169 TEE_Result TEE_BigIntConvertToOctetString(void *buffer, size_t *bufferLen, const TEE_BigInt *bigInt);
170 
171 /**
172  * @brief Sets <b>dest</b> to the value <b>shortVal</b>.
173  *
174  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result.
175  * @param shortVal Indicates the value to set.
176  *
177  * @since 12
178  * @version 1.0
179  */
180 void TEE_BigIntConvertFromS32(TEE_BigInt *dest, int32_t shortVal);
181 
182 /**
183  * @brief Sets <b>dest</b> to the value of <b>src</b>, including the sign of <b>src</b>.
184  *
185  * @param dest Indicates the pointer to the <b> int32_t</b> that holds the result.
186  * @param src Indicates the pointer to the value to set.
187  *
188  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
189  *         Returns <b>TEE_ERROR_OVERFLOW</b> if <b>src</b> does not fit within an <b> int32_t</b>.
190  *
191  * @since 12
192  * @version 1.0
193  */
194 TEE_Result TEE_BigIntConvertToS32(int32_t *dest, const TEE_BigInt *src);
195 
196 /**
197  * @brief Checks whether op1 > op2, op1 == op2, or op1 < op2.
198  *
199  * @param op1 Indicates the pointer to the first operand.
200  * @param op2 Indicates the pointer to the second operand.
201  *
202  * @return Returns <b>0</b> if op1 == op2.
203  *         Returns a positive number if op1 > op2.
204  *
205  * @since 12
206  * @version 1.0
207  */
208 int32_t TEE_BigIntCmp(const TEE_BigInt *op1, const TEE_BigInt *op2);
209 
210 /**
211  * @brief Checks whether op > shortVal, op == shortVal, or op < shortVal.
212  *
213  * @param op Indicates the pointer to the first operand.
214  * @param shortVal Indicates the pointer to the second operand.
215  *
216  * @return Returns <b>0</b> if op1 == shortVal.
217  *         Returns a positive number if op1 > shortVal.
218  *
219  * @since 12
220  * @version 1.0
221  */
222 int32_t TEE_BigIntCmpS32(const TEE_BigInt *op, int32_t shortVal);
223 
224 /**
225  * @brief Computes |dest| = |op| >> bits.
226  *
227  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the shifted result.
228  * @param op Indicates the pointer to the operand to be shifted.
229  * @param bits Indicates the number of bits to shift.
230  *
231  * @since 12
232  * @version 1.0
233  */
234 void TEE_BigIntShiftRight(TEE_BigInt *dest, const TEE_BigInt *op, size_t bits);
235 
236 /**
237  * @brief Obtains the <b>bitIndex</b> bit of the natural binary representation of |src|.
238  *
239  * @param src Indicates the pointer to the integer.
240  * @param bitIndex Indicates the offset of the bit to read, starting from offset <b>0</b> of the least significant bit.
241  *
242  * @return Returns the Boolean value of <b>bitIndexth</b> in |src|. The value <b>true</b> represents a <b>1</b>,
243  * and <b>false</b> represents a <b>0</b>.
244  *
245  * @since 12
246  * @version 1.0
247  */
248 bool TEE_BigIntGetBit(const TEE_BigInt *src, uint32_t bitIndex);
249 
250 /**
251  * @brief Obtains the number of bits in the natural binary representation of |src|,
252  * that is, the magnitude of <b>src</b>.
253  *
254  * @param src Indicates the pointer to the integer.
255  *
256  * @return Returns <b>0</b> if <b>src</b> is <b>0</b>.
257  *         Returns the number of bits in the natural binary representation of <b>src</b>.
258  *
259  * @since 12
260  * @version 1.0
261  */
262 uint32_t TEE_BigIntGetBitCount(const TEE_BigInt *src);
263 
264 #if defined(API_LEVEL) && (API_LEVEL >= API_LEVEL1_2)
265 /**
266  * @brief Sets the first bit of <b>bitIndex</b> in the natural binary representation of <b>op</b> to
267  * <b>1</b> or <b>0</b>.
268  *
269  * @param op Indicates the pointer to the integer.
270  * @param bitIndex Indicates the offset of the bit to set, starting from offset <b>0</b> of the least significant bit.
271  * @param value Indicates the bit value to set. The value <b>true</b> represents a <b>1</b>, and the value <b>false</b>
272  * represents a <b>0</b>.
273  *
274  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
275  *         Returns <b>TEE_ERROR_OVERFLOW bitIndexth</b> if the <b>bitIndexth</b> bit is larger than the allocated bit
276  * length of <b>op</b>.
277  *
278  * @since 12
279  * @version 1.0
280  */
281 TEE_Result TEE_BigIntSetBit(TEE_BigInt *op, uint32_t bitIndex, bool value);
282 
283 /**
284  * @brief Assigns the value of <b>src</b> to <b>dest</b>.
285  *
286  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> to be assigned.
287  * @param src Indicates the pointer to the source operand.
288  *
289  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
290  *         Returns <b>TEE_ERROR_OVERFLOW</b> if the <b>dest</b> operand cannot hold the value of <b>src</b>.
291  *
292  * @since 12
293  * @version 1.0
294  */
295 TEE_Result TEE_BigIntAssign(TEE_BigInt *dest, const TEE_BigInt *src);
296 
297 /**
298  * @brief Assigns the value of <b>src</b> to <b>dest</b>.
299  *
300  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> to be assigned.
301  * @param src Indicates the pointer to the source operand.
302  *
303  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
304  *         Returns <b>TEE_ERROR_OVERFLOW</b> if the <b>dest</b> operand cannot hold the value of <b>src</b>.
305  *
306  * @since 12
307  * @version 1.0
308  */
309 TEE_Result TEE_BigIntAbs(TEE_BigInt *dest, const TEE_BigInt *src);
310 #endif /* API_LEVEL */
311 
312 /**
313  * @brief Computes dest = op1 + op2.
314  *
315  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the sum of <b>op1</b> and <b>op2</b>.
316  * @param op1 Indicates the pointer to the first operand.
317  * @param op2 Indicates the pointer to the second operand.
318  *
319  * @since 12
320  * @version 1.0
321  */
322 void TEE_BigIntAdd(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2);
323 
324 /**
325  * @brief Computes dest = op1 – op2.
326  *
327  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the difference between <b>op1</b>
328  * and <b>op2</b>.
329  * @param op1 Indicates the pointer to the first operand.
330  * @param op2 Indicates the pointer to the second operand.
331  *
332  * @since 12
333  * @version 1.0
334  */
335 void TEE_BigIntSub(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2);
336 
337 /**
338  * @brief Negates an operand: dest = –op.
339  *
340  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result –op.
341  * @param op Indicates the pointer to the operand to be negated.
342  *
343  * @since 12
344  * @version 1.0
345  */
346 void TEE_BigIntNeg(TEE_BigInt *dest, const TEE_BigInt *op);
347 
348 /**
349  * @brief Computes dest = op1 * op2.
350  *
351  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the product of <b>op1</b> and <b>op2</b>.
352  * @param op1 Indicates the pointer to the first operand.
353  * @param op2 Indicates the pointer to the second operand.
354  *
355  * @since 12
356  * @version 1.0
357  */
358 void TEE_BigIntMul(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2);
359 
360 /**
361  * @brief Computes dest = op * op.
362  *
363  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op * op.
364  * @param op Indicates the pointer to the operand to be squared.
365  *
366  * @since 12
367  * @version 1.0
368  */
369 void TEE_BigIntSquare(TEE_BigInt *dest, const TEE_BigInt *op);
370 
371 /**
372  * @brief Computes <b>dest_r</b> and <b>dest_q</b> to make op1 = dest_q* op2 + dest_r.
373  *
374  * @param dest_q Indicates the pointer to the <b>TEE_BigInt</b> that holds the quotient.
375  * @param dest_r Indicates the pointer to the <b>TEE_BigInt</b> that holds the remainder.
376  * @param op1 Indicates the pointer to the first operand, which is the dividend.
377  * @param op2 Indicates the pointer to the second operand, which is the divisor.
378  *
379  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
380  *         Returns <b>TEE_ERROR_BAD_PARAMETERS</b> if at least one parameter is null.
381  *
382  * @since 12
383  * @version 1.0
384  */
385 void TEE_BigIntDiv(TEE_BigInt *dest_q, TEE_BigInt *dest_r, const TEE_BigInt *op1, const TEE_BigInt *op2);
386 
387 /**
388  * @brief Computes dest = op (mod n) to make 0 <= dest < n.
389  *
390  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op (mod n).
391  * @param op Indicates the pointer to the operand to be reduced mod n.
392  * @param n [IN] Indicates the pointer to the modulus, which must be greater than 1.
393  *
394  * @since 12
395  * @version 1.0
396  */
397 void TEE_BigIntMod(TEE_BigInt *dest, const TEE_BigInt *op, const TEE_BigInt *n);
398 
399 /**
400  * @brief Computes dest = (op1 + op2) (mod n).
401  *
402  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op (op1 + op2)(mod n).
403  * @param op1 Indicates the pointer to the first operand.
404  * @param op2 Indicates the pointer to the second operand.
405  * @param n Indicates the pointer to the modulus, which must be greater than 1.
406  *
407  * @since 12
408  * @version 1.0
409  */
410 void TEE_BigIntAddMod(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2, const TEE_BigInt *n);
411 
412 /**
413  * @brief Computes dest = (op1 – op2) (mod n).
414  *
415  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op (op1 – op2)(mod n).
416  * @param op1 Indicates the pointer to the first operand.
417  * @param op2 Indicates the pointer to the second operand.
418  * @param n Indicates the pointer to the modulus, which must be greater than 1.
419  *
420  * @since 12
421  * @version 1.0
422  */
423 void TEE_BigIntSubMod(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2, const TEE_BigInt *n);
424 
425 /**
426  * @brief Computes dest = (op1* op2)(mod n).
427  *
428  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op (op1 * op2)(mod n).
429  * @param op1 Indicates the pointer to the first operand.
430  * @param op2 Indicates the pointer to the second operand.
431  * @param n Indicates the pointer to the modulus, which must be greater than 1.
432  *
433  * @since 12
434  * @version 1.0
435  */
436 void TEE_BigIntMulMod(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2, const TEE_BigInt *n);
437 
438 /**
439  * @brief Computes dest = (op * op) (mod n).
440  *
441  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result op (op * op)(mod n).
442  * @param op Indicates the pointer to the operand.
443  * @param n [IN] Indicates the pointer to the modulus, which must be greater than 1.
444  *
445  * @since 12
446  * @version 1.0
447  */
448 void TEE_BigIntSquareMod(TEE_BigInt *dest, const TEE_BigInt *op, const TEE_BigInt *n);
449 
450 /**
451  * @brief Computes <b>dest</b> to make dest* op = 1 (mod n).
452  *
453  * @param dest Indicates the pointer to the <b>TEE_BigInt</b> that holds the result (op^–1)(mod n).
454  * @param op Indicates the pointer to the operand.
455  * @param n [IN] Indicates the pointer to the modulus, which must be greater than 1.
456  *
457  * @since 12
458  * @version 1.0
459  */
460 void TEE_BigIntInvMod(TEE_BigInt *dest, const TEE_BigInt *op, const TEE_BigInt *n);
461 
462 /**
463  * @brief Checks whether gcd(op1, op2) == 1.
464  *
465  * @param op1 Indicates the pointer to the first operand.
466  * @param op2 Indicates the pointer to the second operand.
467  *
468  * @return Returns <b>true</b> if gcd(op1, op2) == 1.
469  *         Returns <b>false</b> if gcd(op1, op2) != 1.
470  *
471  * @since 12
472  * @version 1.0
473  */
474 bool TEE_BigIntRelativePrime(const TEE_BigInt *op1, const TEE_BigInt *op2);
475 
476 /**
477  * @brief Computes the greatest common divisor of <b>op1</b> and <b>op2</b>.
478  *
479  * @param gcd Indicates the pointer to the <b>TEE_BigInt</b> that holds the greatest common divisor of <b>op1</b>
480  * and <b>op2</b>.
481  * @param u Indicates the pointer to the <b>TEE_BigInt</b> that holds the first coefficient.
482  * @param v Indicates the pointer to the <b>TEE_BigInt</b> that holds the second coefficient.
483  * @param op1 Indicates the pointer to the first operand.
484  * @param op2 Indicates the pointer to the second operand.
485  *
486  * @since 12
487  * @version 1.0
488  */
489 void TEE_BigIntComputeExtendedGcd(TEE_BigInt *gcd, TEE_BigInt *u, TEE_BigInt *v, const TEE_BigInt *op1,
490                                   const TEE_BigInt *op2);
491 /**
492  * @brief Performs a probabilistic primality test on <b>op</b>.
493  *
494  * @param op Indicates the pointer to the candidate number that is tested for primality.
495  * @param confidenceLevel Indicates the expected confidence level for a non-conclusive test.
496  *
497  * @return Returns <b>0</b> if <b>op</b> is a composite number.
498  *         Returns <b>1</b> if <b>op</b> is a prime number.
499  *         Returns <b>–1</b> if the test is non-conclusive but the probability that <b>op</b> is composite is
500  * less than 2^(-confidenceLevel).
501  *
502  * @since 12
503  * @version 1.0
504  */
505 int32_t TEE_BigIntIsProbablePrime(const TEE_BigInt *op, uint32_t confidenceLevel);
506 
507 /**
508  * @brief Converts <b>src</b> into a representation suitable for doing fast modular multiplication.
509  *
510  * @param dest Indicates the pointer to an initialized <b>TEE_BigIntFMM</b> memory area.
511  * @param src Indicates the pointer to the <b>TEE_BigInt</b> to convert.
512  * @param n Indicates the pointer to the modulus.
513  * @param context Indicates the pointer to the context that is previously initialized using
514  * {@link TEE_BigIntInitFMMContext1}.
515  *
516  * @since 12
517  * @version 1.0
518  */
519 void TEE_BigIntConvertToFMM(TEE_BigIntFMM *dest, const TEE_BigInt *src, const TEE_BigInt *n,
520                             const TEE_BigIntFMMContext *context);
521 
522 /**
523  * @brief Converts <b>src</b> in the fast modular multiplication representation back to a
524  * <b>TEE_BigInt</b> representation.
525  *
526  * @param dest Indicates the pointer to an initialized <b>TEE_BigIntFMM</b> memory area to store the converted result.
527  * @param src Indicates the pointer to a <b>TEE_BigIntFMM</b> holding the value in the fast modular multiplication
528  * representation.
529  * @param n Indicates the pointer to the modulus.
530  * @param context Indicates the pointer to the context that is previously initialized using
531  * {@link TEE_BigIntInitFMMContext1}.
532  *
533  * @since 12
534  * @version 1.0
535  */
536 void TEE_BigIntConvertFromFMM(TEE_BigInt *dest, const TEE_BigIntFMM *src, const TEE_BigInt *n,
537                               const TEE_BigIntFMMContext *context);
538 
539 /**
540  * @brief Computes dest = op1* op2 in the fast modular multiplication representation.
541  *
542  * @param dest Indicates the pointer to the <b>TEE_BigIntFMM</b> that holds the result op1* op2.
543  * @param op1 Indicates the pointer to the first operand.
544  * @param op2 Indicates the pointer to the second operand.
545  * @param n Indicates the pointer to the modulus.
546  * @param context Indicates the pointer to the context that is previously initialized using
547  * {@link TEE_BigIntInitFMMContext1}.
548  *
549  * @since 12
550  * @version 1.0
551  */
552 void TEE_BigIntComputeFMM(TEE_BigIntFMM *dest, const TEE_BigIntFMM *op1, const TEE_BigIntFMM *op2, const TEE_BigInt *n,
553                           const TEE_BigIntFMMContext *context);
554 
555 /**
556  * @brief Computes dest = (op1 ^ op2)(mod n).
557  *
558  * @param des Indicates the pointer to the <b>TEE_BigInt</b> that holds the result (op1 ^ op2)(mod n).
559  * @param op1 Indicates the pointer to the first operand.
560  * @param op2 Indicates the pointer to the second operand.
561  * @param n Indicates the pointer to the modulus.
562  * @param context Indicates the pointer to the context that is previously initialized using
563  * {@link TEE_BigIntInitFMMContext1} or initialized to null.
564  *
565  * @return Returns <b>TEE_SUCCESS</b> if the operation is successful.
566  *         Returns <b>TEE_ERROR_NOT_SUPPORTED</b> if the value of <b>n</b> is not supported.
567  *
568  * @since 12
569  * @version 1.0
570  */
571 TEE_Result TEE_BigIntExpMod(TEE_BigInt *des, TEE_BigInt *op1, const TEE_BigInt *op2, const TEE_BigInt *n,
572                             TEE_BigIntFMMContext *context);
573 
574 #ifdef __cplusplus
575 }
576 #endif
577 /** @} */
578 #endif
579