1 /*############################################################################ 2 # Copyright 2017 Intel Corporation 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 ############################################################################*/ 16 /// Definition of math types in tiny Intel(R) EPID. 17 /*! \file */ 18 19 #ifndef EPID_MEMBER_TINY_MATH_MATHTYPES_H_ 20 #define EPID_MEMBER_TINY_MATH_MATHTYPES_H_ 21 22 /// number of 32bit words in a very large integer 23 #define NUM_ECC_DIGITS 8 24 25 #include <stdint.h> 26 27 /// Large integer. 28 /*! 29 VeryLargeInt* is always expected to point to a buffer 30 with NUM_ECC_DIGITS uint32_t sized words. 31 */ 32 typedef struct VeryLargeInt { 33 uint32_t word[NUM_ECC_DIGITS]; ///< Large integer data 34 } VeryLargeInt; 35 36 /// Used for multiplication 37 typedef struct VeryLargeIntProduct { 38 uint32_t word[2 * NUM_ECC_DIGITS]; ///< Large integer data 39 } VeryLargeIntProduct; 40 41 /// Element of Fp. 42 typedef struct FpElem { 43 VeryLargeInt limbs; ///< An integer in [0, p-1] 44 } FpElem; 45 46 /// Element of Fq. 47 typedef struct FqElem { 48 VeryLargeInt limbs; ///< An integer in [0, q-1] 49 } FqElem; 50 51 /// Element of Fq2. 52 typedef struct Fq2Elem { 53 FqElem x0; ///< A coefficent in Fq 54 FqElem x1; ///< A coefficent in Fq 55 } Fq2Elem; 56 57 /// Point in EFq. 58 typedef struct EccPointFq { 59 FqElem x; ///< x coordinate 60 FqElem y; ///< y coordinate 61 } EccPointFq; 62 63 /// Point in EFq2. 64 typedef struct EccPointFq2 { 65 Fq2Elem x; ///< x coordinate 66 Fq2Elem y; ///< y coordinate 67 } EccPointFq2; 68 69 /// Element of Fq6. 70 typedef struct Fq6Elem { 71 Fq2Elem y0; ///< A coefficent in Fq2 72 Fq2Elem y1; ///< A coefficent in Fq2 73 Fq2Elem y2; ///< A coefficent in Fq2 74 } Fq6Elem; 75 76 /// Element of Fq12. 77 typedef struct Fq12Elem { 78 Fq6Elem z0; ///< A coefficent in Fq6 79 Fq6Elem z1; ///< A coefficent in Fq6 80 } Fq12Elem; 81 82 /// Element of EFq in Jacobi format. 83 typedef struct EccPointJacobiFq { 84 FqElem X; ///< x coordinate 85 FqElem Y; ///< y coordinate 86 FqElem Z; ///< z coordinate 87 } EccPointJacobiFq; 88 89 /// Element of EFq2 in Jacobi format. 90 typedef struct EccPointJacobiFq2 { 91 Fq2Elem X; ///< x coordinate 92 Fq2Elem Y; ///< y coordinate 93 Fq2Elem Z; ///< z coordinate 94 } EccPointJacobiFq2; 95 96 /// A scratch buffer for stateful pairing calls. 97 typedef struct PairingState { 98 Fq2Elem g[3][5]; ///< pairing scratch data 99 } PairingState; 100 101 #endif // EPID_MEMBER_TINY_MATH_MATHTYPES_H_ 102