pcpgfpecstuff.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*############################################################################
  2. # Copyright 2016 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. /*
  17. //
  18. // Purpose:
  19. // Intel(R) Performance Primitives. Cryptography Primitives.
  20. // Internal EC over GF(p^m) basic Definitions & Function Prototypes
  21. //
  22. //
  23. */
  24. #if !defined(_CP_ECGFP_H_)
  25. #define _CP_ECGFP_H_
  26. #include "pcpgfpstuff.h"
  27. #include "pcpgfpxstuff.h"
  28. /*
  29. // EC over GF(p) Point context
  30. */
  31. typedef struct _cpGFpECPoint {
  32. IppCtxId idCtx; /* EC Point identifier */
  33. int flags; /* flags: affine */
  34. int elementSize; /* size of each coordinate */
  35. BNU_CHUNK_T* pData; /* coordinatex X, Y, Z */
  36. } cpGFPECPoint;
  37. /*
  38. // Contetx Access Macros
  39. */
  40. #define ECP_POINT_ID(ctx) ((ctx)->idCtx)
  41. #define ECP_POINT_FLAGS(ctx) ((ctx)->flags)
  42. #define ECP_POINT_FELEN(ctx) ((ctx)->elementSize)
  43. #define ECP_POINT_DATA(ctx) ((ctx)->pData)
  44. #define ECP_POINT_X(ctx) ((ctx)->pData)
  45. #define ECP_POINT_Y(ctx) ((ctx)->pData+(ctx)->elementSize)
  46. #define ECP_POINT_Z(ctx) ((ctx)->pData+(ctx)->elementSize*2)
  47. #define ECP_POINT_TEST_ID(ctx) (ECP_POINT_ID((ctx))==idCtxGFPPoint)
  48. /* point flags */
  49. #define ECP_AFFINE_POINT (1)
  50. #define ECP_FINITE_POINT (2)
  51. #define IS_ECP_AFFINE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&ECP_AFFINE_POINT)
  52. #define SET_ECP_AFFINE_POINT(ctx) (ECP_POINT_FLAGS((ctx))|ECP_AFFINE_POINT)
  53. #define SET_ECP_PROJECTIVE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&~ECP_AFFINE_POINT)
  54. #define IS_ECP_FINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&ECP_FINITE_POINT)
  55. #define SET_ECP_FINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))|ECP_FINITE_POINT)
  56. #define SET_ECP_INFINITE_POINT(ctx) (ECP_POINT_FLAGS((ctx))&~ECP_FINITE_POINT)
  57. /*
  58. // define using projective coordinates
  59. */
  60. #define JACOBIAN (0)
  61. #define HOMOGENEOUS (1)
  62. #define ECP_PROJECTIVE_COORD JACOBIAN
  63. //#define ECP_PROJECTIVE_COORD HOMOGENEOUS
  64. #if (ECP_PROJECTIVE_COORD== JACOBIAN)
  65. #pragma message ("ECP_PROJECTIVE_COORD = JACOBIAN")
  66. #elif (ECP_PROJECTIVE_COORD== HOMOGENEOUS)
  67. #pragma message ("ECP_PROJECTIVE_COORD = HOMOGENEOUS")
  68. #else
  69. #error ECP_PROJECTIVE_COORD should be either JACOBIAN or HOMOGENEOUS type
  70. #endif
  71. #define _EPID20_EC_PARAM_SPECIFIC_
  72. #if defined(_EPID20_EC_PARAM_SPECIFIC_)
  73. #pragma message ("_EPID20_EC_PARAM_SPECIFIC_")
  74. #endif
  75. /* EC over GF(p) context */
  76. typedef struct _cpGFpEC {
  77. IppCtxId idCtx; /* EC identifier */
  78. IppsGFpState* pGF; /* arbitrary GF(p^d)*/
  79. int elementSize; /* size of point's coordinate */
  80. int orderBitSize; /* base_point order bitsize */
  81. // int cofactor; /* cofactor = #E/base_point order */
  82. int epidParams; /* Intel(R) EPID 2.0 specific parameters */
  83. BNU_CHUNK_T* pA; /* EC parameter A */
  84. BNU_CHUNK_T* pB; /* B */
  85. BNU_CHUNK_T* pG; /* base_point */
  86. BNU_CHUNK_T* pR; /* base_point order */
  87. BNU_CHUNK_T* cofactor; /* cofactor = #E/base_point order */
  88. BNU_CHUNK_T* pPool; /* pool of points */
  89. } cpGFPEC;
  90. #define ECGFP_ALIGNMENT ((int)(sizeof(void*)))
  91. /* Local definitions */
  92. #define EC_POOL_SIZE (8) /* num of points into the pool */
  93. #define ECP_ID(pCtx) ((pCtx)->idCtx)
  94. #define ECP_GFP(pCtx) ((pCtx)->pGF)
  95. #define ECP_FELEN(pCtx) ((pCtx)->elementSize)
  96. #define ECP_ORDBITSIZE(pCtx) ((pCtx)->orderBitSize)
  97. #define ECP_COFACTOR(pCtx) ((pCtx)->cofactor)
  98. #define EPID_PARAMS(pCtx) ((pCtx)->epidParams)
  99. #define ECP_A(pCtx) ((pCtx)->pA)
  100. #define ECP_B(pCtx) ((pCtx)->pB)
  101. #define ECP_G(pCtx) ((pCtx)->pG)
  102. #define ECP_R(pCtx) ((pCtx)->pR)
  103. #define ECP_POOL(pCtx) ((pCtx)->pPool)
  104. #define ECP_TEST_ID(pCtx) (ECP_ID((pCtx))==idCtxGFPEC)
  105. /*
  106. // get/release n points from/to the pool
  107. */
  108. __INLINE BNU_CHUNK_T* cpEcGFpGetPool(int n, IppsGFpECState* pEC)
  109. {
  110. BNU_CHUNK_T* pPool = ECP_POOL(pEC);
  111. ECP_POOL(pEC) += n*GFP_FELEN(ECP_GFP(pEC))*3;
  112. return pPool;
  113. }
  114. __INLINE void cpEcGFpReleasePool(int n, IppsGFpECState* pEC)
  115. {
  116. ECP_POOL(pEC) -= n*GFP_FELEN(ECP_GFP(pEC))*3;
  117. }
  118. __INLINE IppsGFpECPoint* cpEcGFpInitPoint(IppsGFpECPoint* pPoint, BNU_CHUNK_T* pData, int flags, const IppsGFpECState* pEC)
  119. {
  120. ECP_POINT_ID(pPoint) = idCtxGFPPoint;
  121. ECP_POINT_FLAGS(pPoint) = flags;
  122. ECP_POINT_FELEN(pPoint) = GFP_FELEN(ECP_GFP(pEC));
  123. ECP_POINT_DATA(pPoint) = pData;
  124. return pPoint;
  125. }
  126. /*
  127. // copy one point into another
  128. */
  129. __INLINE IppsGFpECPoint* cpEcGFpCopyPoint(IppsGFpECPoint* pPointR, const IppsGFpECPoint* pPointA, int elemLen)
  130. {
  131. cpGFpElementCopy(ECP_POINT_DATA(pPointR), ECP_POINT_DATA(pPointA), 3*elemLen);
  132. ECP_POINT_FLAGS(pPointR) = ECP_POINT_FLAGS(pPointA);
  133. return pPointR;
  134. }
  135. /*
  136. // set point (convert into inside representation)
  137. // SetProjectivePoint
  138. // SetProjectivePointAtInfinity
  139. // SetAffinePoint
  140. */
  141. __INLINE IppsGFpECPoint* cpEcGFpSetProjectivePoint(IppsGFpECPoint* pPoint,
  142. const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY, const BNU_CHUNK_T* pZ,
  143. IppsGFpECState* pEC)
  144. {
  145. IppsGFpState* pGF = ECP_GFP(pEC);
  146. int elemLen = GFP_FELEN(pGF);
  147. int pointFlag = 0;
  148. cpGFpxSet(ECP_POINT_X(pPoint), pX, elemLen, pGF, USE_MONT_SPACE_REPRESENTATION);
  149. cpGFpxSet(ECP_POINT_Y(pPoint), pY, elemLen, pGF, USE_MONT_SPACE_REPRESENTATION);
  150. cpGFpxSet(ECP_POINT_Z(pPoint), pZ, elemLen, pGF, USE_MONT_SPACE_REPRESENTATION);
  151. if(!GFP_IS_ZERO(pZ, elemLen)) pointFlag |= ECP_FINITE_POINT;
  152. if(GFP_IS_ONE(pZ, elemLen)) pointFlag |= ECP_AFFINE_POINT;
  153. ECP_POINT_FLAGS(pPoint) = pointFlag;
  154. return pPoint;
  155. }
  156. __INLINE IppsGFpECPoint* cpEcGFpSetProjectivePointAtInfinity(IppsGFpECPoint* pPoint, int elemLen)
  157. {
  158. cpGFpElementPadd(ECP_POINT_X(pPoint), elemLen, 0);
  159. cpGFpElementPadd(ECP_POINT_Y(pPoint), elemLen, 0);
  160. cpGFpElementPadd(ECP_POINT_Z(pPoint), elemLen, 0);
  161. ECP_POINT_FLAGS(pPoint) = 0;
  162. return pPoint;
  163. }
  164. __INLINE IppsGFpECPoint* cpEcGFpSetAffinePoint(IppsGFpECPoint* pPoint,
  165. const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY,
  166. IppsGFpECState* pEC)
  167. {
  168. IppsGFpState* pGF = ECP_GFP(pEC);
  169. IppsGFpState* pBasicGF = cpGFpBasic(pGF);
  170. cpGFpElementCopy(ECP_POINT_X(pPoint), pX, GFP_FELEN(pGF));
  171. cpGFpElementCopy(ECP_POINT_Y(pPoint), pY, GFP_FELEN(pGF));
  172. cpGFpElementCopyPadd(ECP_POINT_Z(pPoint), GFP_FELEN(pGF), MNT_1(GFP_MONT(pBasicGF)), GFP_FELEN(pBasicGF));
  173. ECP_POINT_FLAGS(pPoint) = ECP_AFFINE_POINT | ECP_FINITE_POINT;
  174. return pPoint;
  175. }
  176. /*
  177. // test infinity:
  178. // IsProjectivePointAtInfinity
  179. */
  180. __INLINE int cpEcGFpIsProjectivePointAtInfinity(const IppsGFpECPoint* pPoint, Ipp32u elemLen)
  181. {
  182. return GFP_IS_ZERO( ECP_POINT_Z(pPoint), elemLen );
  183. }
  184. /*
  185. // get point (convert from inside representation)
  186. // GetProjectivePoint
  187. // GetAffinePointAtInfinity0 (B==0)
  188. // GetAffinePointAtInfinity1 (B!=0)
  189. // GetAffinePoint
  190. */
  191. __INLINE void cpEcGFpGetProjectivePoint(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, BNU_CHUNK_T* pZ,
  192. const IppsGFpECPoint* pPoint,
  193. IppsGFpECState* pEC)
  194. {
  195. IppsGFpState* pGF = ECP_GFP(pEC);
  196. cpGFpxGet(pX, GFP_FELEN(pGF), ECP_POINT_X(pPoint), pGF, USE_MONT_SPACE_REPRESENTATION);
  197. cpGFpxGet(pY, GFP_FELEN(pGF), ECP_POINT_Y(pPoint), pGF, USE_MONT_SPACE_REPRESENTATION);
  198. cpGFpxGet(pZ, GFP_FELEN(pGF), ECP_POINT_Z(pPoint), pGF, USE_MONT_SPACE_REPRESENTATION);
  199. }
  200. #if 0
  201. __INLINE void cpEcGFpGetAffinePointAtInfinity0(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, int elemLen)
  202. {
  203. GFP_ZERO(pX, elemLen);
  204. GFP_ONE(pY, elemLen);
  205. }
  206. __INLINE void cpEcGFpGetAffinePointAtInfinity1(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, int elemLen)
  207. {
  208. GFP_ZERO(pX, elemLen);
  209. GFP_ZERO(pY, elemLen);
  210. }
  211. #endif
  212. /* signed encode */
  213. __INLINE void booth_recode(Ipp8u* sign, Ipp8u* digit, Ipp8u in, int w)
  214. {
  215. Ipp8u s = ~((in >> w) - 1);
  216. int d = (1 << (w+1)) - in - 1;
  217. d = (d & s) | (in & ~s);
  218. d = (d >> 1) + (d & 1);
  219. *sign = s & 1;
  220. *digit = (Ipp8u)d;
  221. }
  222. /* mask of the argument:
  223. if x==0 returns 0
  224. if x!=0 returns BNU_CHUNK_T(-1)
  225. */
  226. __INLINE BNU_CHUNK_T cpIsNonZeroMask(BNU_CHUNK_T x)
  227. {
  228. #if(_IPP_ARCH==_IPP_ARCH_EM64T)
  229. x |= x>>32;
  230. #endif
  231. x |= x>>16;
  232. x |= x>>8;
  233. x |= x>>4;
  234. x |= x>>2;
  235. x |= x>>1;
  236. return 0-(x&1);
  237. }
  238. /* dst[] = src[], iif moveFlag!=0 */
  239. __INLINE void cpMaskMove(BNU_CHUNK_T* dst, const BNU_CHUNK_T* src, int len, int moveFlag)
  240. {
  241. BNU_CHUNK_T mask1 = cpIsNonZeroMask(moveFlag);
  242. BNU_CHUNK_T mask2 = ~mask1;
  243. int n;
  244. for(n=0; n<len; n++)
  245. dst[n] = (src[n] & mask1) ^ (dst[n] & mask2);
  246. }
  247. __INLINE void cpScatter32(Ipp32u* pTbl, int scale, int idx, const Ipp32u* pData, int len)
  248. {
  249. int i;
  250. pTbl += idx;
  251. for(i=0; i<len; i++, pTbl+=scale, pData++)
  252. pTbl[0] = pData[0];
  253. }
  254. __INLINE void cpGather32(Ipp32u* pData, int len, const Ipp32u* pTbl, int scale, int idx)
  255. {
  256. Ipp32u mask = (Ipp32u)cpIsNonZeroMask(idx);
  257. int i;
  258. idx = (idx & mask) | (1 & (~mask)); /* set idx=1 if input idx==0 */
  259. pTbl += (idx-1);
  260. for(i=0; i<len; i++, pTbl+=scale, pData++) pData[0] = pTbl[0] & mask;
  261. }
  262. /*
  263. // other point operations
  264. */
  265. int cpEcGFpGetAffinePoint(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, const IppsGFpECPoint* pPoint, IppsGFpECState* pEC);
  266. int cpEcGFpMakePoint(IppsGFpECPoint* pPoint, const BNU_CHUNK_T* pElm, IppsGFpECState* pEC);
  267. int cpEcGFpIsPointEquial(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC);
  268. int cpEcGFpIsPointOnCurve(const IppsGFpECPoint* pP, IppsGFpECState* pEC);
  269. int cpEcGFpIsPointInGroup(const IppsGFpECPoint* pP, IppsGFpECState* pEC);
  270. IppsGFpECPoint* cpEcGFpNegPoint(IppsGFpECPoint* pR, const IppsGFpECPoint* pP, IppsGFpECState* pEC);
  271. IppsGFpECPoint* cpEcGFpDblPoint(IppsGFpECPoint* pR, const IppsGFpECPoint* pP, IppsGFpECState* pEC);
  272. IppsGFpECPoint* cpEcGFpAddPoint(IppsGFpECPoint* pR, const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC);
  273. int cpEcGFpGetOptimalWinSize(int scalarBitsize);
  274. IppsGFpECPoint* cpEcGFpMulPoint(IppsGFpECPoint* pR,
  275. const IppsGFpECPoint* pP, const BNU_CHUNK_T* pN, int nsN,
  276. IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
  277. #endif /* _CP_ECGFP_H_ */