pcpeccpdpca.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. /*
  2. * Copyright (C) 2016 Intel Corporation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in
  12. * the documentation and/or other materials provided with the
  13. * distribution.
  14. * * Neither the name of Intel Corporation nor the names of its
  15. * contributors may be used to endorse or promote products derived
  16. * from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. *
  30. */
  31. #include "owndefs.h"
  32. #include "owncp.h"
  33. #include "pcpeccp.h"
  34. #include "pcpeccppoint.h"
  35. #include "pcpbnresource.h"
  36. #include "pcpeccpmethod.h"
  37. #include "pcpeccpmethodcom.h"
  38. #include "pcppma.h"
  39. /*F*
  40. // Name: ippsECCPSet
  41. //
  42. // Purpose: Set EC Domain Parameters.
  43. //
  44. // Returns: Reason:
  45. // ippStsNullPtrErr NULL == pPrime
  46. // NULL == pA
  47. // NULL == pB
  48. // NULL == pGX
  49. // NULL == pGY
  50. // NULL == pOrder
  51. // NULL == pECC
  52. //
  53. // ippStsContextMatchErr illegal pPrime->idCtx
  54. // illegal pA->idCtx
  55. // illegal pB->idCtx
  56. // illegal pGX->idCtx
  57. // illegal pGY->idCtx
  58. // illegal pOrder->idCtx
  59. // illegal pECC->idCtx
  60. //
  61. // ippStsRangeErr not enough room for:
  62. // pPrime
  63. // pA, pB,
  64. // pGX,pGY
  65. // pOrder
  66. //
  67. // ippStsRangeErr 0>= cofactor
  68. //
  69. // ippStsNoErr no errors
  70. //
  71. // Parameters:
  72. // pPrime pointer to the prime (specify FG(p))
  73. // pA pointer to the A coefficient of EC equation
  74. // pB pointer to the B coefficient of EC equation
  75. // pGX,pGY pointer to the Base Point (x and y coordinates) of EC
  76. // pOrder pointer to the Base Point order
  77. // cofactor cofactor value
  78. // pECC pointer to the ECC context
  79. //
  80. *F*/
  81. static
  82. void ECCPSetDP(IppECCType flag,
  83. int primeSize, const Ipp32u* pPrime,
  84. int aSize, const Ipp32u* pA,
  85. int bSize, const Ipp32u* pB,
  86. int gxSize, const Ipp32u* pGx,
  87. int gySize, const Ipp32u* pGy,
  88. int orderSize, const Ipp32u* pOrder,
  89. Ipp32u cofactor,
  90. IppsECCPState* pECC)
  91. {
  92. ECP_TYPE(pECC) = flag;
  93. /* reset size (bits) of field element */
  94. ECP_GFEBITS(pECC) = cpMSBit_BNU32(pPrime, primeSize) +1;
  95. /* reset size (bits) of Base Point order */
  96. ECP_ORDBITS(pECC) = cpMSBit_BNU32(pOrder, orderSize) +1;
  97. /* set up prime */
  98. ippsSet_BN(ippBigNumPOS, primeSize, pPrime, ECP_PRIME(pECC));
  99. /* set up A */
  100. ippsSet_BN(ippBigNumPOS, aSize, pA, ECP_A(pECC));
  101. /* test A */
  102. BN_Word(ECP_B(pECC), 3);
  103. PMA_add(ECP_B(pECC), ECP_A(pECC), ECP_B(pECC), ECP_PRIME(pECC));
  104. ECP_AMI3(pECC) = IsZero_BN(ECP_B(pECC));
  105. /* set up B */
  106. ippsSet_BN(ippBigNumPOS, bSize, pB, ECP_B(pECC));
  107. /* set up affine coordinates of Base Point and order */
  108. ippsSet_BN(ippBigNumPOS, gxSize, pGx, ECP_GX(pECC));
  109. ippsSet_BN(ippBigNumPOS, gySize, pGy, ECP_GY(pECC));
  110. ippsSet_BN(ippBigNumPOS, orderSize, pOrder, ECP_ORDER(pECC));
  111. /* set up cofactor */
  112. //ippsSet_BN(ippBigNumPOS, 1, &((Ipp32u)cofactor), ECP_COFACTOR(pECC));
  113. ippsSet_BN(ippBigNumPOS, 1, &cofactor, ECP_COFACTOR(pECC));
  114. /* montgomery engine (prime) */
  115. if( ippStsNoErr == ippsMontSet((Ipp32u*)BN_NUMBER(ECP_PRIME(pECC)), BN_SIZE32(ECP_PRIME(pECC)), ECP_PMONT(pECC)) ) {
  116. /* modulo reduction and montgomery form of A and B */
  117. PMA_mod(ECP_AENC(pECC), ECP_A(pECC), ECP_PRIME(pECC));
  118. PMA_enc(ECP_AENC(pECC), ECP_AENC(pECC), ECP_PMONT(pECC));
  119. PMA_mod(ECP_BENC(pECC), ECP_B(pECC), ECP_PRIME(pECC));
  120. PMA_enc(ECP_BENC(pECC), ECP_BENC(pECC), ECP_PMONT(pECC));
  121. /* projective coordinates and montgomery form of of Base Point */
  122. if( ( IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity1(ECP_GX(pECC), ECP_GY(pECC))) ||
  123. (!IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity0(ECP_GX(pECC), ECP_GY(pECC))) )
  124. ECCP_SetPointToInfinity(ECP_GENC(pECC));
  125. else {
  126. ECP_METHOD(pECC)->SetPointProjective(ECP_GX(pECC), ECP_GY(pECC), BN_ONE_REF(), ECP_GENC(pECC), pECC);
  127. }
  128. }
  129. /* montgomery engine (order) */
  130. if( ippStsNoErr == ippsMontSet((Ipp32u*)BN_NUMBER(ECP_ORDER(pECC)), BN_SIZE32(ECP_ORDER(pECC)), ECP_RMONT(pECC)) )
  131. PMA_enc(ECP_COFACTOR(pECC), ECP_COFACTOR(pECC), ECP_RMONT(pECC));
  132. /* set zero private keys */
  133. BN_Word(ECP_PRIVATE(pECC), 0);
  134. BN_Word(ECP_PRIVATE_E(pECC), 0);
  135. /* set infinity public keys */
  136. ECCP_SetPointToInfinity(ECP_PUBLIC(pECC));
  137. ECCP_SetPointToInfinity(ECP_PUBLIC_E(pECC));
  138. }
  139. IPPFUN(IppStatus, ippsECCPSet, (const IppsBigNumState* pPrime,
  140. const IppsBigNumState* pA, const IppsBigNumState* pB,
  141. const IppsBigNumState* pGX,const IppsBigNumState* pGY,const IppsBigNumState* pOrder,
  142. int cofactor,
  143. IppsECCPState* pECC))
  144. {
  145. /* test pECC */
  146. IPP_BAD_PTR1_RET(pECC);
  147. /* use aligned EC context */
  148. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  149. /* test ID */
  150. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  151. /* test pPrime */
  152. IPP_BAD_PTR1_RET(pPrime);
  153. pPrime = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrime, ALIGN_VAL) );
  154. IPP_BADARG_RET(!BN_VALID_ID(pPrime), ippStsContextMatchErr);
  155. IPP_BADARG_RET((cpBN_bitsize(pPrime)>ECP_GFEBITS(pECC)), ippStsRangeErr);
  156. /* test pA and pB */
  157. IPP_BAD_PTR2_RET(pA,pB);
  158. pA = (IppsBigNumState*)( IPP_ALIGNED_PTR(pA, ALIGN_VAL) );
  159. pB = (IppsBigNumState*)( IPP_ALIGNED_PTR(pB, ALIGN_VAL) );
  160. IPP_BADARG_RET(!BN_VALID_ID(pA), ippStsContextMatchErr);
  161. IPP_BADARG_RET(!BN_VALID_ID(pB), ippStsContextMatchErr);
  162. IPP_BADARG_RET((cpBN_bitsize(pA)>ECP_GFEBITS(pECC)), ippStsRangeErr);
  163. IPP_BADARG_RET((cpBN_bitsize(pB)>ECP_GFEBITS(pECC)), ippStsRangeErr);
  164. /* test pG and pGorder pointers */
  165. IPP_BAD_PTR3_RET(pGX,pGY, pOrder);
  166. pGX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGX, ALIGN_VAL) );
  167. pGY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pGY, ALIGN_VAL) );
  168. pOrder = (IppsBigNumState*)( IPP_ALIGNED_PTR(pOrder, ALIGN_VAL) );
  169. IPP_BADARG_RET(!BN_VALID_ID(pGX), ippStsContextMatchErr);
  170. IPP_BADARG_RET(!BN_VALID_ID(pGY), ippStsContextMatchErr);
  171. IPP_BADARG_RET(!BN_VALID_ID(pOrder), ippStsContextMatchErr);
  172. IPP_BADARG_RET((cpBN_bitsize(pGX)>ECP_GFEBITS(pECC)), ippStsRangeErr);
  173. IPP_BADARG_RET((cpBN_bitsize(pGY)>ECP_GFEBITS(pECC)), ippStsRangeErr);
  174. IPP_BADARG_RET((cpBN_bitsize(pOrder)>ECP_ORDBITS(pECC)), ippStsRangeErr);
  175. /* test cofactor */
  176. IPP_BADARG_RET(!(0<cofactor), ippStsRangeErr);
  177. /* set general methods */
  178. *(ECP_METHOD(pECC)) = *(ECCPcom_Methods());
  179. /* set domain parameters */
  180. ECCPSetDP(IppECCArbitrary,
  181. BN_SIZE32(pPrime), (Ipp32u*)BN_NUMBER(pPrime),
  182. BN_SIZE32(pA), (Ipp32u*)BN_NUMBER(pA),
  183. BN_SIZE32(pB), (Ipp32u*)BN_NUMBER(pB),
  184. BN_SIZE32(pGX), (Ipp32u*)BN_NUMBER(pGX),
  185. BN_SIZE32(pGY), (Ipp32u*)BN_NUMBER(pGY),
  186. BN_SIZE32(pOrder), (Ipp32u*)BN_NUMBER(pOrder),
  187. cofactor,
  188. pECC);
  189. return ippStsNoErr;
  190. }
  191. /*F*
  192. // Name: ippsECCPSetStd
  193. //
  194. // Purpose: Set Standard ECC Domain Parameter.
  195. //
  196. // Returns: Reason:
  197. // ippStsNullPtrErr NULL == pECC
  198. //
  199. // ippStsContextMatchErr illegal pECC->idCtx
  200. //
  201. // ippStsECCInvalidFlagErr invalid flag
  202. //
  203. // ippStsNoErr no errors
  204. //
  205. // Parameters:
  206. // flag specify standard ECC parameter(s) to be setup
  207. // pECC pointer to the ECC context
  208. //
  209. *F*/
  210. IPPFUN(IppStatus, ippsECCPSetStd, (IppECCType flag, IppsECCPState* pECC))
  211. {
  212. /* test pECC */
  213. IPP_BAD_PTR1_RET(pECC);
  214. /* use aligned EC context */
  215. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  216. /* test ID */
  217. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  218. *(ECP_METHOD(pECC)) = *(ECCPcom_Methods());
  219. switch(flag) {
  220. case IppECCPStd112r1:
  221. ECCPSetDP(IppECCPStd112r1,
  222. BITS2WORD32_SIZE(112), secp112r1_p,
  223. BITS2WORD32_SIZE(112), secp112r1_a,
  224. BITS2WORD32_SIZE(112), secp112r1_b,
  225. BITS2WORD32_SIZE(112), secp112r1_gx,
  226. BITS2WORD32_SIZE(112), secp112r1_gy,
  227. BITS2WORD32_SIZE(112), secp112r1_r,
  228. secp112r1_h, pECC);
  229. break;
  230. case IppECCPStd112r2:
  231. ECCPSetDP(IppECCPStd112r2,
  232. BITS2WORD32_SIZE(112), secp112r2_p,
  233. BITS2WORD32_SIZE(112), secp112r2_a,
  234. BITS2WORD32_SIZE(112), secp112r2_b,
  235. BITS2WORD32_SIZE(112), secp112r2_gx,
  236. BITS2WORD32_SIZE(112), secp112r2_gy,
  237. BITS2WORD32_SIZE(112), secp112r2_r,
  238. secp112r2_h, pECC);
  239. break;
  240. case IppECCPStd128r1:
  241. ECCPSetDP(IppECCPStd128r1,
  242. BITS2WORD32_SIZE(128), secp128r1_p,
  243. BITS2WORD32_SIZE(128), secp128r1_a,
  244. BITS2WORD32_SIZE(128), secp128r1_b,
  245. BITS2WORD32_SIZE(128), secp128r1_gx,
  246. BITS2WORD32_SIZE(128), secp128r1_gy,
  247. BITS2WORD32_SIZE(128), secp128r1_r,
  248. secp128r1_h, pECC);
  249. break;
  250. case IppECCPStd128r2:
  251. ECCPSetDP(IppECCPStd128r2,
  252. BITS2WORD32_SIZE(128), secp128r2_p,
  253. BITS2WORD32_SIZE(128), secp128r2_a,
  254. BITS2WORD32_SIZE(128), secp128r2_b,
  255. BITS2WORD32_SIZE(128), secp128r2_gx,
  256. BITS2WORD32_SIZE(128), secp128r2_gy,
  257. BITS2WORD32_SIZE(128), secp128r2_r,
  258. secp128r2_h, pECC);
  259. break;
  260. case IppECCPStd160r1:
  261. ECCPSetDP(IppECCPStd160r1,
  262. BITS2WORD32_SIZE(160), secp160r1_p,
  263. BITS2WORD32_SIZE(160), secp160r1_a,
  264. BITS2WORD32_SIZE(160), secp160r1_b,
  265. BITS2WORD32_SIZE(160), secp160r1_gx,
  266. BITS2WORD32_SIZE(160), secp160r1_gy,
  267. BITS2WORD32_SIZE(161), secp160r1_r,
  268. secp160r1_h, pECC);
  269. break;
  270. case IppECCPStd160r2:
  271. ECCPSetDP(IppECCPStd160r2,
  272. BITS2WORD32_SIZE(160), secp160r2_p,
  273. BITS2WORD32_SIZE(160), secp160r2_a,
  274. BITS2WORD32_SIZE(160), secp160r2_b,
  275. BITS2WORD32_SIZE(160), secp160r2_gx,
  276. BITS2WORD32_SIZE(160), secp160r2_gy,
  277. BITS2WORD32_SIZE(161), secp160r2_r,
  278. secp160r2_h, pECC);
  279. break;
  280. case IppECCPStd192r1:
  281. ECCPSetDP(IppECCPStd192r1,
  282. BITS2WORD32_SIZE(192), secp192r1_p,
  283. BITS2WORD32_SIZE(192), secp192r1_a,
  284. BITS2WORD32_SIZE(192), secp192r1_b,
  285. BITS2WORD32_SIZE(192), secp192r1_gx,
  286. BITS2WORD32_SIZE(192), secp192r1_gy,
  287. BITS2WORD32_SIZE(192), secp192r1_r,
  288. secp192r1_h, pECC);
  289. break;
  290. case IppECCPStd224r1:
  291. ECCPSetDP(IppECCPStd224r1,
  292. BITS2WORD32_SIZE(224), secp224r1_p,
  293. BITS2WORD32_SIZE(224), secp224r1_a,
  294. BITS2WORD32_SIZE(224), secp224r1_b,
  295. BITS2WORD32_SIZE(224), secp224r1_gx,
  296. BITS2WORD32_SIZE(224), secp224r1_gy,
  297. BITS2WORD32_SIZE(224), secp224r1_r,
  298. secp224r1_h, pECC);
  299. break;
  300. case IppECCPStd256r1:
  301. ECCPSetDP(IppECCPStd256r1,
  302. BITS2WORD32_SIZE(256), secp256r1_p,
  303. BITS2WORD32_SIZE(256), secp256r1_a,
  304. BITS2WORD32_SIZE(256), secp256r1_b,
  305. BITS2WORD32_SIZE(256), secp256r1_gx,
  306. BITS2WORD32_SIZE(256), secp256r1_gy,
  307. BITS2WORD32_SIZE(256), secp256r1_r,
  308. secp256r1_h, pECC);
  309. break;
  310. case IppECCPStd384r1:
  311. ECCPSetDP(IppECCPStd384r1,
  312. BITS2WORD32_SIZE(384), secp384r1_p,
  313. BITS2WORD32_SIZE(384), secp384r1_a,
  314. BITS2WORD32_SIZE(384), secp384r1_b,
  315. BITS2WORD32_SIZE(384), secp384r1_gx,
  316. BITS2WORD32_SIZE(384), secp384r1_gy,
  317. BITS2WORD32_SIZE(384), secp384r1_r,
  318. secp384r1_h, pECC);
  319. break;
  320. case IppECCPStd521r1:
  321. ECCPSetDP(IppECCPStd521r1,
  322. BITS2WORD32_SIZE(521), secp521r1_p,
  323. BITS2WORD32_SIZE(521), secp521r1_a,
  324. BITS2WORD32_SIZE(521), secp521r1_b,
  325. BITS2WORD32_SIZE(521), secp521r1_gx,
  326. BITS2WORD32_SIZE(521), secp521r1_gy,
  327. BITS2WORD32_SIZE(521), secp521r1_r,
  328. secp521r1_h, pECC);
  329. break;
  330. default:
  331. return ippStsECCInvalidFlagErr;
  332. }
  333. return ippStsNoErr;
  334. }