pcpeccppointopca.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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 "pcpeccppoint.h"
  34. #include "pcpeccpmethod.h"
  35. #include "pcpeccpmethodcom.h"
  36. /*F*
  37. // Name: ippsECCPSetPoint
  38. //
  39. // Purpose: Converts regular affine coordinates EC point (pX,pY)
  40. // into internal presentation - montgomery projective.
  41. //
  42. // Returns: Reason:
  43. // ippStsNullPtrErr NULL == pECC
  44. // NULL == pPoint
  45. // NULL == pX
  46. // NULL == pY
  47. //
  48. // ippStsContextMatchErr illegal pECC->idCtx
  49. // illegal pX->idCtx
  50. // illegal pY->idCtx
  51. // illegal pPoint->idCtx
  52. //
  53. // ippStsOutOfECErr point out-of EC
  54. //
  55. // ippStsNoErr no errors
  56. //
  57. // Parameters:
  58. // pX pointer to the regular affine coordinate X
  59. // pY pointer to the regular affine coordinate Y
  60. // pPoint pointer to the EC Point context
  61. // pECC pointer to the ECCP context
  62. //
  63. // Note:
  64. // if B==0 and (x,y)=(0,y) then point at Infinity will be set up
  65. // if B!=0 and (x,y)=(0,0) then point at Infinity will be set up
  66. // else point with requested coordinates (x,y) wil be set up
  67. // There are no check validation inside!
  68. //
  69. *F*/
  70. IPPFUN(IppStatus, ippsECCPSetPoint,(const IppsBigNumState* pX,
  71. const IppsBigNumState* pY,
  72. IppsECCPPointState* pPoint,
  73. IppsECCPState* pECC))
  74. {
  75. /* test pECC */
  76. IPP_BAD_PTR1_RET(pECC);
  77. /* use aligned EC context */
  78. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  79. /* test ID */
  80. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  81. /* test pX and pY */
  82. IPP_BAD_PTR2_RET(pX,pY);
  83. pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
  84. pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
  85. IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
  86. IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
  87. /* test pPoint */
  88. IPP_BAD_PTR1_RET(pPoint);
  89. pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
  90. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
  91. /* set affine coordinates at Infinity */
  92. if( ( IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity1(pX,pY)) ||
  93. (!IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity0(pX,pY)) )
  94. ECCP_SetPointToInfinity(pPoint);
  95. /* set point */
  96. else {
  97. ECP_METHOD(pECC)->SetPointProjective(pX, pY, BN_ONE_REF(), pPoint, pECC);
  98. }
  99. return ippStsNoErr;
  100. }
  101. /*F*
  102. // Name: ippsECCPSetPointAtInfinity
  103. //
  104. // Purpose: Set point at Infinity
  105. //
  106. // Returns: Reason:
  107. // ippStsNullPtrErr NULL == pECC
  108. // NULL == pPoint
  109. //
  110. // ippStsContextMatchErr illegal pECC->idCtx
  111. // illegal pPoint->idCtx
  112. //
  113. // ippStsNoErr no errors
  114. //
  115. // Parameters:
  116. // pPoint pointer to the EC Point context
  117. // pECC pointer to the ECCP context
  118. //
  119. *F*/
  120. IPPFUN(IppStatus, ippsECCPSetPointAtInfinity,(IppsECCPPointState* pPoint,
  121. IppsECCPState* pECC))
  122. {
  123. /* test pECC */
  124. IPP_BAD_PTR1_RET(pECC);
  125. /* use aligned EC context */
  126. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  127. /* test ID */
  128. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  129. /* test pPoint */
  130. IPP_BAD_PTR1_RET(pPoint);
  131. pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
  132. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
  133. ECCP_SetPointToInfinity(pPoint);
  134. return ippStsNoErr;
  135. }
  136. /*F*
  137. // Name: ippsECCPGetPoint
  138. //
  139. // Purpose: Converts internal presentation EC point - montgomery projective
  140. // into regular affine coordinates EC point (pX,pY)
  141. //
  142. // Returns: Reason:
  143. // ippStsNullPtrErr NULL == pECC
  144. // NULL == pPoint
  145. //
  146. // ippStsContextMatchErr illegal pECC->idCtx
  147. // illegal pPoint->idCtx
  148. // NULL != pX, illegal pX->idCtx
  149. // NULL != pY, illegal pY->idCtx
  150. //
  151. // ippStsNoErr no errors
  152. //
  153. // Parameters:
  154. // pX pointer to the regular affine coordinate X
  155. // pY pointer to the regular affine coordinate Y
  156. // pLength pointer to the length of coordinates
  157. // pPoint pointer to the EC Point context
  158. // pECC pointer to the ECCP context
  159. //
  160. *F*/
  161. IPPFUN(IppStatus, ippsECCPGetPoint,(IppsBigNumState* pX,
  162. IppsBigNumState* pY,
  163. const IppsECCPPointState* pPoint,
  164. IppsECCPState* pECC))
  165. {
  166. /* test pECC */
  167. IPP_BAD_PTR1_RET(pECC);
  168. /* use aligned EC context */
  169. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  170. /* test ID */
  171. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  172. /* test source point */
  173. IPP_BAD_PTR1_RET(pPoint);
  174. pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
  175. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
  176. /* test pX and pY */
  177. if(pX) {
  178. pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
  179. IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
  180. }
  181. if(pY) {
  182. pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
  183. IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
  184. }
  185. if( ECCP_IsPointAtInfinity(pPoint) ) {
  186. if( IsZero_BN(ECP_BENC(pECC)) )
  187. ECCP_SetPointToAffineInfinity1(pX, pY);
  188. else
  189. ECCP_SetPointToAffineInfinity0(pX, pY);
  190. }
  191. else
  192. ECP_METHOD(pECC)->GetPointAffine(pX, pY, pPoint, pECC, ECP_BNCTX(pECC));
  193. return ippStsNoErr;
  194. }
  195. /*F*
  196. // Name: ippsECCPCheckPoint
  197. //
  198. // Purpose: Check EC point:
  199. // - is point lie on EC
  200. // - is point at infinity
  201. //
  202. // Returns: Reason:
  203. // ippStsNullPtrErr NULL == pECC
  204. // NULL == pP
  205. // NULL == pResult
  206. //
  207. // ippStsContextMatchErr illegal pECC->idCtx
  208. // illegal pP->idCtx
  209. //
  210. // ippStsNoErr no errors
  211. //
  212. // Parameters:
  213. // pPoint pointer to the EC Point context
  214. // pECC pointer to the ECCP context
  215. // pResult pointer to the result:
  216. // ippECValid
  217. // ippECPointIsNotValid
  218. // ippECPointIsAtInfinite
  219. //
  220. *F*/
  221. IPPFUN(IppStatus, ippsECCPCheckPoint,(const IppsECCPPointState* pP,
  222. IppECResult* pResult,
  223. IppsECCPState* pECC))
  224. {
  225. /* test pECC */
  226. IPP_BAD_PTR1_RET(pECC);
  227. /* use aligned EC context */
  228. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  229. /* test ID */
  230. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  231. /* test point */
  232. IPP_BAD_PTR1_RET(pP);
  233. pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
  234. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
  235. /* test pResult */
  236. IPP_BAD_PTR1_RET(pResult);
  237. if( ECCP_IsPointAtInfinity(pP) )
  238. *pResult = ippECPointIsAtInfinite;
  239. else if( ECP_METHOD(pECC)->IsPointOnCurve(pP, pECC, ECP_BNCTX(pECC)) )
  240. *pResult = ippECValid;
  241. else
  242. *pResult = ippECPointIsNotValid;
  243. return ippStsNoErr;
  244. }
  245. /*F*
  246. // Name: ippsECCPComparePoint
  247. //
  248. // Purpose: Compare two EC points
  249. //
  250. // Returns: Reason:
  251. // ippStsNullPtrErr NULL == pECC
  252. // NULL == pP
  253. // NULL == pQ
  254. // NULL == pResult
  255. //
  256. // ippStsContextMatchErr illegal pECC->idCtx
  257. // illegal pP->idCtx
  258. // illegal pQ->idCtx
  259. //
  260. // ippStsNoErr no errors
  261. //
  262. // Parameters:
  263. // pP pointer to the EC Point context
  264. // pQ pointer to the EC Point context
  265. // pECC pointer to the ECCP context
  266. // pResult pointer to the result:
  267. // ippECPointIsEqual
  268. // ippECPointIsNotEqual
  269. //
  270. *F*/
  271. IPPFUN(IppStatus, ippsECCPComparePoint,(const IppsECCPPointState* pP,
  272. const IppsECCPPointState* pQ,
  273. IppECResult* pResult,
  274. IppsECCPState* pECC))
  275. {
  276. /* test pECC */
  277. IPP_BAD_PTR1_RET(pECC);
  278. /* use aligned EC context */
  279. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  280. /* test ID */
  281. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  282. /* test points */
  283. IPP_BAD_PTR2_RET(pP,pQ);
  284. pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
  285. pQ = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pQ, ALIGN_VAL) );
  286. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
  287. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pQ), ippStsContextMatchErr);
  288. /* test pResult */
  289. IPP_BAD_PTR1_RET(pResult);
  290. *pResult = ECP_METHOD(pECC)->ComparePoint(pP, pQ, pECC, ECP_BNCTX(pECC))? ippECPointIsNotEqual : ippECPointIsEqual;
  291. return ippStsNoErr;
  292. }
  293. /*F*
  294. // Name: ippsECCPNegativePoint
  295. //
  296. // Purpose: Perforn EC point operation: R = -P
  297. //
  298. // Returns: Reason:
  299. // ippStsNullPtrErr NULL == pECC
  300. // NULL == pP
  301. // NULL == pR
  302. //
  303. // ippStsContextMatchErr illegal pECC->idCtx
  304. // illegal pP->idCtx
  305. // illegal pR->idCtx
  306. //
  307. // ippStsNoErr no errors
  308. //
  309. // Parameters:
  310. // pP pointer to the source EC Point context
  311. // pR pointer to the resultant EC Point context
  312. // pECC pointer to the ECCP context
  313. //
  314. *F*/
  315. IPPFUN(IppStatus, ippsECCPNegativePoint, (const IppsECCPPointState* pP,
  316. IppsECCPPointState* pR,
  317. IppsECCPState* pECC))
  318. {
  319. /* test pECC */
  320. IPP_BAD_PTR1_RET(pECC);
  321. /* use aligned EC context */
  322. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  323. /* test ID */
  324. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  325. /* test points */
  326. IPP_BAD_PTR2_RET(pP,pR);
  327. pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
  328. pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
  329. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
  330. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
  331. ECP_METHOD(pECC)->NegPoint(pP, pR, pECC);
  332. return ippStsNoErr;
  333. }
  334. /*F*
  335. // Name: ippsECCPAddPoint
  336. //
  337. // Purpose: Perforn EC point operation: R = P+Q
  338. //
  339. // Returns: Reason:
  340. // ippStsNullPtrErr NULL == pECC
  341. // NULL == pP
  342. // NULL == pQ
  343. // NULL == pR
  344. //
  345. // ippStsContextMatchErr illegal pECC->idCtx
  346. // illegal pP->idCtx
  347. // illegal pQ->idCtx
  348. // illegal pR->idCtx
  349. //
  350. // ippStsNoErr no errors
  351. //
  352. // Parameters:
  353. // pP pointer to the source EC Point context
  354. // pQ pointer to the source EC Point context
  355. // pR pointer to the resultant EC Point context
  356. // pECC pointer to the ECCP context
  357. //
  358. *F*/
  359. IPPFUN(IppStatus, ippsECCPAddPoint,(const IppsECCPPointState* pP,
  360. const IppsECCPPointState* pQ,
  361. IppsECCPPointState* pR,
  362. IppsECCPState* pECC))
  363. {
  364. /* test pECC */
  365. IPP_BAD_PTR1_RET(pECC);
  366. /* use aligned EC context */
  367. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  368. /* test ID */
  369. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  370. /* test points */
  371. IPP_BAD_PTR3_RET(pP,pQ,pR);
  372. pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
  373. pQ = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pQ, ALIGN_VAL) );
  374. pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
  375. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
  376. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pQ), ippStsContextMatchErr);
  377. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
  378. if(pP==pQ)
  379. ECP_METHOD(pECC)->DblPoint(pP, pR, pECC, ECP_BNCTX(pECC));
  380. else
  381. ECP_METHOD(pECC)->AddPoint(pP, pQ, pR, pECC, ECP_BNCTX(pECC));
  382. return ippStsNoErr;
  383. }
  384. /*F*
  385. // Name: ippsECCPMulPointScalar
  386. //
  387. // Purpose: Perforn EC point operation: R = k*P
  388. //
  389. // Returns: Reason:
  390. // ippStsNullPtrErr NULL == pECC
  391. // NULL == pP
  392. // NULL == pK
  393. // NULL == pR
  394. //
  395. // ippStsContextMatchErr illegal pECC->idCtx
  396. // illegal pP->idCtx
  397. // illegal pK->idCtx
  398. // illegal pR->idCtx
  399. //
  400. // ippStsNoErr no errors
  401. //
  402. // Parameters:
  403. // pP pointer to the source EC Point context
  404. // pK pointer to the source BigNum multiplier context
  405. // pR pointer to the resultant EC Point context
  406. // pECC pointer to the ECCP context
  407. //
  408. *F*/
  409. IPPFUN(IppStatus, ippsECCPMulPointScalar,(const IppsECCPPointState* pP,
  410. const IppsBigNumState* pK,
  411. IppsECCPPointState* pR,
  412. IppsECCPState* pECC))
  413. {
  414. /* test pECC */
  415. IPP_BAD_PTR1_RET(pECC);
  416. /* use aligned EC context */
  417. pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) );
  418. /* test ID */
  419. IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr);
  420. /* test points */
  421. IPP_BAD_PTR2_RET(pP,pR);
  422. pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
  423. pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
  424. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
  425. IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
  426. /* test scalar */
  427. IPP_BAD_PTR1_RET(pK);
  428. pK = (IppsBigNumState*)( IPP_ALIGNED_PTR(pK, ALIGN_VAL) );
  429. IPP_BADARG_RET(!BN_VALID_ID(pK), ippStsContextMatchErr);
  430. ECP_METHOD(pECC)->MulPoint(pP, pK, pR, pECC, ECP_BNCTX(pECC));
  431. return ippStsNoErr;
  432. }