pcpeccp.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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. #if !defined(_PCP_ECCP_H)
  32. #define _PCP_ECCP_H
  33. #include "pcpbnresource.h"
  34. #include "pcppma.h"
  35. #include "pcpeccppoint.h"
  36. #include "pcpeccpsscm.h"
  37. typedef struct eccp_method_st ECCP_METHOD;
  38. /*
  39. // ECC over prime GF(p) Context
  40. */
  41. struct _cpECCP {
  42. IppCtxId idCtx; /* prime EC identifier */
  43. IppsBigNumState* pPrime; /* specify finite field GF(p) */
  44. IppsBigNumState* pA; /* scecify A & B of EC equation: */
  45. IppsBigNumState* pB; /* y^2 = x^3 + A*x + B (mod)p */
  46. IppsBigNumState* pGX; /* Base Point (X coordinate) */
  47. IppsBigNumState* pGY; /* Base Point (Y coordinate) */
  48. IppsBigNumState* pR; /* order (r) of Base Point */
  49. /* fields above mainly for ippsECCPSet()/ippsECCPGet() */
  50. Ipp32u eccStandard;/* generic/standard ecc */
  51. ECCP_METHOD* pMethod;
  52. int gfeBitSize; /* size (bits) of field element */
  53. int ordBitSize; /* size (bits) of BP order */
  54. int a_3; /* ==1 if A==-3 or A==P-3 */
  55. IppsBigNumState* pAenc; /* internal formatted pA value */
  56. IppsBigNumState* pBenc; /* internal formatted pB value */
  57. IppsMontState* pMontP; /* montromery engine (modulo p) */
  58. IppsECCPPointState* pGenc; /* internal formatted Base Point */
  59. IppsBigNumState* pCofactor; /* cofactor = #E/base_point_order*/
  60. IppsMontState* pMontR; /* montromery engine (modulo r) */
  61. IppsBigNumState* pPrivate; /* private key */
  62. IppsECCPPointState* pPublic; /* public key (affine) */
  63. IppsBigNumState* pPrivateE; /* ephemeral private key */
  64. IppsECCPPointState* pPublicE; /* ephemeral public key (affine) */
  65. IppsPrimeState* pPrimary; /* prime engine */
  66. Ipp8u* pSscmBuffer;/* pointer to sscm buffer */
  67. BigNumNode* pBnList; /* list of big numbers */
  68. };
  69. /* some useful constants */
  70. #define BNLISTSIZE (32) /* list size (probably less) */
  71. /*
  72. // Contetx Access Macros
  73. */
  74. #define ECP_ID(ctx) ((ctx)->idCtx)
  75. #define ECP_PRIME(ctx) ((ctx)->pPrime)
  76. #define ECP_A(ctx) ((ctx)->pA)
  77. #define ECP_B(ctx) ((ctx)->pB)
  78. #define ECP_GX(ctx) ((ctx)->pGX)
  79. #define ECP_GY(ctx) ((ctx)->pGY)
  80. #define ECP_ORDER(ctx) ((ctx)->pR)
  81. #define ECP_TYPE(ctx) ((ctx)->eccStandard)
  82. #define ECP_METHOD(ctx) ((ctx)->pMethod)
  83. #define ECP_GFEBITS(ctx) ((ctx)->gfeBitSize)
  84. #define ECP_ORDBITS(ctx) ((ctx)->ordBitSize)
  85. #define ECP_AMI3(ctx) ((ctx)->a_3)
  86. #define ECP_AENC(ctx) ((ctx)->pAenc)
  87. #define ECP_BENC(ctx) ((ctx)->pBenc)
  88. #define ECP_PMONT(ctx) ((ctx)->pMontP)
  89. #define ECP_GENC(ctx) ((ctx)->pGenc)
  90. #define ECP_COFACTOR(ctx) ((ctx)->pCofactor)
  91. #define ECP_RMONT(ctx) ((ctx)->pMontR)
  92. #define ECP_PRIVATE(ctx) ((ctx)->pPrivate)
  93. #define ECP_PUBLIC(ctx) ((ctx)->pPublic)
  94. #define ECP_PRIVATE_E(ctx) ((ctx)->pPrivateE)
  95. #define ECP_PUBLIC_E(ctx) ((ctx)->pPublicE)
  96. #define ECP_PRIMARY(ctx) ((ctx)->pPrimary)
  97. #define ECP_SCCMBUFF(ctx) ((ctx)->pSscmBuffer)
  98. #define ECP_BNCTX(ctx) ((ctx)->pBnList)
  99. #define ECP_VALID_ID(ctx) (ECP_ID((ctx))==idCtxECCP)
  100. /*
  101. // Recommended (Standard) Domain Parameters
  102. */
  103. extern const Ipp32u secp112r1_p[]; // (2^128 -3)/76439
  104. extern const Ipp32u secp112r1_a[];
  105. extern const Ipp32u secp112r1_b[];
  106. extern const Ipp32u secp112r1_gx[];
  107. extern const Ipp32u secp112r1_gy[];
  108. extern const Ipp32u secp112r1_r[];
  109. extern Ipp32u secp112r1_h;
  110. extern const Ipp32u secp112r2_p[]; // (2^128 -3)/76439
  111. extern const Ipp32u secp112r2_a[];
  112. extern const Ipp32u secp112r2_b[];
  113. extern const Ipp32u secp112r2_gx[];
  114. extern const Ipp32u secp112r2_gy[];
  115. extern const Ipp32u secp112r2_r[];
  116. extern Ipp32u secp112r2_h;
  117. extern const Ipp32u secp128r1_p[]; // 2^128 -2^97 -1
  118. extern const Ipp32u secp128r1_a[];
  119. extern const Ipp32u secp128r1_b[];
  120. extern const Ipp32u secp128r1_gx[];
  121. extern const Ipp32u secp128r1_gy[];
  122. extern const Ipp32u secp128r1_r[];
  123. extern Ipp32u secp128r1_h;
  124. extern const Ipp32u* secp128_mx[];
  125. extern const Ipp32u secp128r2_p[]; // 2^128 -2^97 -1
  126. extern const Ipp32u secp128r2_a[];
  127. extern const Ipp32u secp128r2_b[];
  128. extern const Ipp32u secp128r2_gx[];
  129. extern const Ipp32u secp128r2_gy[];
  130. extern const Ipp32u secp128r2_r[];
  131. extern Ipp32u secp128r2_h;
  132. extern const Ipp32u secp160r1_p[]; // 2^160 -2^31 -1
  133. extern const Ipp32u secp160r1_a[];
  134. extern const Ipp32u secp160r1_b[];
  135. extern const Ipp32u secp160r1_gx[];
  136. extern const Ipp32u secp160r1_gy[];
  137. extern const Ipp32u secp160r1_r[];
  138. extern Ipp32u secp160r1_h;
  139. extern const Ipp32u secp160r2_p[]; // 2^160 -2^32 -2^14 -2^12 -2^9 -2^8 -2^7 -2^2 -1
  140. extern const Ipp32u secp160r2_a[];
  141. extern const Ipp32u secp160r2_b[];
  142. extern const Ipp32u secp160r2_gx[];
  143. extern const Ipp32u secp160r2_gy[];
  144. extern const Ipp32u secp160r2_r[];
  145. extern Ipp32u secp160r2_h;
  146. extern const Ipp32u secp192r1_p[]; // 2^192 -2^64 -1
  147. extern const Ipp32u secp192r1_a[];
  148. extern const Ipp32u secp192r1_b[];
  149. extern const Ipp32u secp192r1_gx[];
  150. extern const Ipp32u secp192r1_gy[];
  151. extern const Ipp32u secp192r1_r[];
  152. extern Ipp32u secp192r1_h;
  153. extern const Ipp32u secp224r1_p[]; // 2^224 -2^96 +1
  154. extern const Ipp32u secp224r1_a[];
  155. extern const Ipp32u secp224r1_b[];
  156. extern const Ipp32u secp224r1_gx[];
  157. extern const Ipp32u secp224r1_gy[];
  158. extern const Ipp32u secp224r1_r[];
  159. extern Ipp32u secp224r1_h;
  160. extern const Ipp32u secp256r1_p[]; // 2^256 -2^224 +2^192 +2^96 -1
  161. extern const Ipp32u secp256r1_a[];
  162. extern const Ipp32u secp256r1_b[];
  163. extern const Ipp32u secp256r1_gx[];
  164. extern const Ipp32u secp256r1_gy[];
  165. extern const Ipp32u secp256r1_r[];
  166. extern Ipp32u secp256r1_h;
  167. extern const Ipp32u secp384r1_p[]; // 2^384 -2^128 -2^96 +2^32 -1
  168. extern const Ipp32u secp384r1_a[];
  169. extern const Ipp32u secp384r1_b[];
  170. extern const Ipp32u secp384r1_gx[];
  171. extern const Ipp32u secp384r1_gy[];
  172. extern const Ipp32u secp384r1_r[];
  173. extern Ipp32u secp384r1_h;
  174. extern const Ipp32u secp521r1_p[]; // 2^521 -1
  175. extern const Ipp32u secp521r1_a[];
  176. extern const Ipp32u secp521r1_b[];
  177. extern const Ipp32u secp521r1_gx[];
  178. extern const Ipp32u secp521r1_gy[];
  179. extern const Ipp32u secp521r1_r[];
  180. extern Ipp32u secp521r1_h;
  181. /* half of some std modulus */
  182. extern const Ipp32u h_secp128r1_p[];
  183. extern const Ipp32u h_secp192r1_p[];
  184. extern const Ipp32u h_secp224r1_p[];
  185. extern const Ipp32u h_secp256r1_p[];
  186. extern const Ipp32u h_secp384r1_p[];
  187. extern const Ipp32u h_secp521r1_p[];
  188. #endif /* _PCP_ECCP_H */