pcpngrsakeyprivate.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  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 "pcpbn.h"
  34. #include "pcpngrsa.h"
  35. #include "pcpngrsamontstuff.h"
  36. /*F*
  37. // Name: ippsRSA_GetSizePrivateKeyType1
  38. //
  39. // Purpose: Returns context size (bytes) of RSA private key (type1) context
  40. //
  41. // Returns: Reason:
  42. // ippStsNullPtrErr NULL == pSize
  43. //
  44. // ippStsNotSupportedModeErr MIN_RSA_SIZE > rsaModulusBitSize
  45. // MAX_RSA_SIZE < rsaModulusBitSize
  46. //
  47. // ippStsBadArgErr 0 >= privateExpBitSize
  48. // privateExpBitSize > rsaModulusBitSize
  49. //
  50. // ippStsNoErr no error
  51. //
  52. // Parameters:
  53. // rsaModulusBitSize bitsize of RSA modulus (bitsize of N)
  54. // privateExpBitSize bitsize of private exponent (bitsize of D)
  55. // pSize pointer to the size of RSA key context (bytes)
  56. *F*/
  57. static int cpSizeof_RSA_privateKey1(int rsaModulusBitSize, int privateExpBitSize)
  58. {
  59. int prvExpLen = BITS_BNU_CHUNK(privateExpBitSize);
  60. int modulusLen32 = BITS2WORD32_SIZE(rsaModulusBitSize);
  61. int montNsize;
  62. gsMontGetSize(ippBinaryMethod, modulusLen32, &montNsize);
  63. return sizeof(IppsRSAPrivateKeyState)
  64. + prvExpLen*sizeof(BNU_CHUNK_T)
  65. + sizeof(BNU_CHUNK_T)-1
  66. + montNsize
  67. + (RSA_PRIVATE_KEY_ALIGNMENT-1);
  68. }
  69. IPPFUN(IppStatus, ippsRSA_GetSizePrivateKeyType1,(int rsaModulusBitSize, int privateExpBitSize, int* pKeySize))
  70. {
  71. IPP_BAD_PTR1_RET(pKeySize);
  72. IPP_BADARG_RET((MIN_RSA_SIZE>rsaModulusBitSize) || (rsaModulusBitSize>MAX_RSA_SIZE), ippStsNotSupportedModeErr);
  73. IPP_BADARG_RET(!((0<privateExpBitSize) && (privateExpBitSize<=rsaModulusBitSize)), ippStsBadArgErr);
  74. *pKeySize = cpSizeof_RSA_privateKey1(rsaModulusBitSize, privateExpBitSize);
  75. return ippStsNoErr;
  76. }
  77. /*F*
  78. // Name: ippsRSA_InitPrivateKeyType1
  79. //
  80. // Purpose: Init RSA private key context
  81. //
  82. // Returns: Reason:
  83. // ippStsNullPtrErr NULL == pKey
  84. //
  85. // ippStsNotSupportedModeErr MIN_RSA_SIZE > rsaModulusBitSize
  86. // MAX_RSA_SIZE < rsaModulusBitSize
  87. //
  88. // ippStsBadArgErr 0 >= privateExpBitSize
  89. // privateExpBitSize > rsaModulusBitSize
  90. //
  91. // ippStsMemAllocErr keyCtxSize is not enough for operation
  92. //
  93. // ippStsNoErr no error
  94. //
  95. // Parameters:
  96. // rsaModulusBitSize bitsize of RSA modulus (bitsize of N)
  97. // privateExpBitSize bitsize of private exponent (bitsize of D)
  98. // pKey pointer to the key context
  99. // keyCtxSize size of memmory accosizted with key comtext
  100. *F*/
  101. IPPFUN(IppStatus, ippsRSA_InitPrivateKeyType1,(int rsaModulusBitSize, int privateExpBitSize,
  102. IppsRSAPrivateKeyState* pKey, int keyCtxSize))
  103. {
  104. IPP_BAD_PTR1_RET(pKey);
  105. pKey = (IppsRSAPrivateKeyState*)( IPP_ALIGNED_PTR(pKey, RSA_PRIVATE_KEY_ALIGNMENT) );
  106. IPP_BADARG_RET((MIN_RSA_SIZE>rsaModulusBitSize) || (rsaModulusBitSize>MAX_RSA_SIZE), ippStsNotSupportedModeErr);
  107. IPP_BADARG_RET(!((0<privateExpBitSize) && (privateExpBitSize<=rsaModulusBitSize)), ippStsBadArgErr);
  108. /* test available size of context buffer */
  109. IPP_BADARG_RET(keyCtxSize<cpSizeof_RSA_privateKey1(rsaModulusBitSize,privateExpBitSize), ippStsMemAllocErr);
  110. RSA_PRV_KEY_ID(pKey) = idCtxRSA_PrvKey1;
  111. RSA_PRV_KEY_MAXSIZE_N(pKey) = rsaModulusBitSize;
  112. RSA_PRV_KEY_MAXSIZE_D(pKey) = privateExpBitSize;
  113. RSA_PRV_KEY_BITSIZE_N(pKey) = 0;
  114. RSA_PRV_KEY_BITSIZE_D(pKey) = 0;
  115. RSA_PRV_KEY_BITSIZE_P(pKey) = 0;
  116. RSA_PRV_KEY_BITSIZE_Q(pKey) = 0;
  117. RSA_PRV_KEY_DP(pKey) = NULL;
  118. RSA_PRV_KEY_DQ(pKey) = NULL;
  119. RSA_PRV_KEY_INVQ(pKey) = NULL;
  120. RSA_PRV_KEY_PMONT(pKey) = NULL;
  121. RSA_PRV_KEY_QMONT(pKey) = NULL;
  122. {
  123. Ipp8u* ptr = (Ipp8u*)pKey;
  124. int prvExpLen = BITS_BNU_CHUNK(privateExpBitSize);
  125. int modulusLen32 = BITS2WORD32_SIZE(rsaModulusBitSize);
  126. int montNsize;
  127. gsMontGetSize(ippBinaryMethod, modulusLen32, &montNsize);
  128. /* allocate internal contexts */
  129. ptr += sizeof(IppsRSAPrivateKeyState);
  130. RSA_PRV_KEY_D(pKey) = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR((ptr), (int)sizeof(BNU_CHUNK_T)) );
  131. ptr += prvExpLen*sizeof(BNU_CHUNK_T);
  132. RSA_PRV_KEY_NMONT(pKey) = (IppsMontState*)( IPP_ALIGNED_PTR((ptr), (MONT_ALIGNMENT)) );
  133. ptr += montNsize;
  134. ZEXPAND_BNU(RSA_PRV_KEY_D(pKey), 0, prvExpLen);
  135. gsMontInit(ippBinaryMethod, modulusLen32, RSA_PRV_KEY_NMONT(pKey));
  136. return ippStsNoErr;
  137. }
  138. }
  139. /*F*
  140. // Name: ippsRSA_SetPrivateKeyType1
  141. //
  142. // Purpose: Set up the RSA private key
  143. //
  144. // Returns: Reason:
  145. // ippStsNullPtrErr NULL == pModulus
  146. // NULL == pPrivateExp
  147. // NULL == pKey
  148. //
  149. // ippStsContextMatchErr !BN_VALID_ID(pModulus)
  150. // !BN_VALID_ID(pPrivateExp)
  151. // !RSA_PRV_KEY_VALID_ID()
  152. //
  153. // ippStsOutOfRangeErr 0 >= pModulus
  154. // 0 >= pPrivateExp
  155. //
  156. // ippStsSizeErr bitsize(pModulus) exceeds requested value
  157. // bitsize(pPrivateExp) exceeds requested value
  158. //
  159. // ippStsNoErr no error
  160. //
  161. // Parameters:
  162. // pModulus pointer to modulus (N)
  163. // pPrivateExp pointer to public exponent (D)
  164. // pKey pointer to the key context
  165. *F*/
  166. IPPFUN(IppStatus, ippsRSA_SetPrivateKeyType1,(const IppsBigNumState* pModulus,
  167. const IppsBigNumState* pPrivateExp,
  168. IppsRSAPrivateKeyState* pKey))
  169. {
  170. IPP_BAD_PTR1_RET(pKey);
  171. pKey = (IppsRSAPrivateKeyState*)( IPP_ALIGNED_PTR(pKey, RSA_PRIVATE_KEY_ALIGNMENT) );
  172. IPP_BADARG_RET(!RSA_PRV_KEY1_VALID_ID(pKey), ippStsContextMatchErr);
  173. IPP_BAD_PTR1_RET(pModulus);
  174. pModulus = (IppsBigNumState*)( IPP_ALIGNED_PTR(pModulus, BN_ALIGNMENT) );
  175. IPP_BADARG_RET(!BN_VALID_ID(pModulus), ippStsContextMatchErr);
  176. IPP_BADARG_RET(!(0 < cpBN_tst(pModulus)), ippStsOutOfRangeErr);
  177. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pModulus), BN_SIZE(pModulus)) > RSA_PRV_KEY_MAXSIZE_N(pKey), ippStsSizeErr);
  178. IPP_BAD_PTR1_RET(pPrivateExp);
  179. pPrivateExp = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivateExp, BN_ALIGNMENT) );
  180. IPP_BADARG_RET(!BN_VALID_ID(pPrivateExp), ippStsContextMatchErr);
  181. IPP_BADARG_RET(!(0 < cpBN_tst(pPrivateExp)), ippStsOutOfRangeErr);
  182. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pPrivateExp), BN_SIZE(pPrivateExp)) > RSA_PRV_KEY_MAXSIZE_D(pKey), ippStsSizeErr);
  183. {
  184. /* store D */
  185. ZEXPAND_COPY_BNU(RSA_PRV_KEY_D(pKey), BITS_BNU_CHUNK(RSA_PRV_KEY_MAXSIZE_D(pKey)), BN_NUMBER(pPrivateExp), BN_SIZE(pPrivateExp));
  186. /* setup montgomery engine */
  187. gsMontSet((Ipp32u*)BN_NUMBER(pModulus), BN_SIZE32(pModulus), RSA_PRV_KEY_NMONT(pKey));
  188. RSA_PRV_KEY_BITSIZE_N(pKey) = cpBN_bitsize(pModulus);
  189. RSA_PRV_KEY_BITSIZE_D(pKey) = cpBN_bitsize(pPrivateExp);
  190. return ippStsNoErr;
  191. }
  192. }
  193. /*F*
  194. // Name: ippsRSA_GetSizePrivateKeyType2
  195. //
  196. // Purpose: Returns context size (bytes) of RSA private key (type2) context
  197. //
  198. // Returns: Reason:
  199. // ippStsNullPtrErr NULL == pSize
  200. //
  201. // ippStsNotSupportedModeErr MIN_RSA_SIZE > (factorPbitSize+factorQbitSize)
  202. // MAX_RSA_SIZE < (factorPbitSize+factorQbitSize)
  203. //
  204. // ippStsBadArgErr 0 >= factorPbitSize
  205. // 0 >= factorQbitSize
  206. // factorQbitSize > factorPbitSize
  207. //
  208. // ippStsNoErr no error
  209. //
  210. // Parameters:
  211. // factorPbitSize bitsize of RSA modulus (bitsize of P)
  212. // factorPbitSize bitsize of private exponent (bitsize of Q)
  213. // pSize pointer to the size of RSA key context (bytes)
  214. *F*/
  215. static int cpSizeof_RSA_privateKey2(int factorPbitSize, int factorQbitSize)
  216. {
  217. int factorPlen = BITS_BNU_CHUNK(factorPbitSize);
  218. int factorQlen = BITS_BNU_CHUNK(factorQbitSize);
  219. int factorPlen32 = BITS2WORD32_SIZE(factorPbitSize);
  220. int factorQlen32 = BITS2WORD32_SIZE(factorQbitSize);
  221. int rsaModulusLen32 = BITS2WORD32_SIZE(factorPbitSize+factorQbitSize);
  222. int montPsize;
  223. int montQsize;
  224. int montNsize;
  225. gsMontGetSize(ippBinaryMethod, factorPlen32, &montPsize);
  226. gsMontGetSize(ippBinaryMethod, factorQlen32, &montQsize);
  227. gsMontGetSize(ippBinaryMethod, rsaModulusLen32, &montNsize);
  228. return sizeof(IppsRSAPrivateKeyState)
  229. + factorPlen*sizeof(BNU_CHUNK_T) /* dp slot */
  230. + factorQlen*sizeof(BNU_CHUNK_T) /* dq slot */
  231. + factorPlen*sizeof(BNU_CHUNK_T) /* qinv slot */
  232. + sizeof(BNU_CHUNK_T)-1
  233. + montPsize
  234. + montQsize
  235. + montNsize
  236. + (RSA_PRIVATE_KEY_ALIGNMENT-1);
  237. }
  238. IPPFUN(IppStatus, ippsRSA_GetSizePrivateKeyType2,(int factorPbitSize, int factorQbitSize, int* pKeySize))
  239. {
  240. IPP_BAD_PTR1_RET(pKeySize);
  241. IPP_BADARG_RET((factorPbitSize<=0) || (factorQbitSize<=0), ippStsBadArgErr);
  242. IPP_BADARG_RET((factorPbitSize < factorQbitSize), ippStsBadArgErr);
  243. IPP_BADARG_RET((MIN_RSA_SIZE>(factorPbitSize+factorQbitSize) || (factorPbitSize+factorQbitSize)>MAX_RSA_SIZE), ippStsNotSupportedModeErr);
  244. *pKeySize = cpSizeof_RSA_privateKey2(factorPbitSize, factorQbitSize);
  245. return ippStsNoErr;
  246. }
  247. /*F*
  248. // Name: ippsRSA_InitPrivateKeyType2
  249. //
  250. // Purpose: Init RSA private key context
  251. //
  252. // Returns: Reason:
  253. // ippStsNullPtrErr NULL == pKey
  254. //
  255. // ippStsNotSupportedModeErr MIN_RSA_SIZE > (factorPbitSize+factorQbitSize)
  256. // MAX_RSA_SIZE < (factorPbitSize+factorQbitSize)
  257. //
  258. // ippStsBadArgErr 0 >= factorPbitSize
  259. // 0 >= factorQbitSize
  260. // factorQbitSize > factorPbitSize
  261. //
  262. // ippStsMemAllocErr keyCtxSize is not enough for operation
  263. //
  264. // ippStsNoErr no error
  265. //
  266. // Parameters:
  267. // factorPbitSize bitsize of RSA modulus (bitsize of P)
  268. // factorQbitSize bitsize of private exponent (bitsize of Q)
  269. // pKey pointer to the key context
  270. // keyCtxSize size of memmory accosizted with key comtext
  271. *F*/
  272. IPPFUN(IppStatus, ippsRSA_InitPrivateKeyType2,(int factorPbitSize, int factorQbitSize,
  273. IppsRSAPrivateKeyState* pKey, int keyCtxSize))
  274. {
  275. IPP_BAD_PTR1_RET(pKey);
  276. IPP_BADARG_RET((factorPbitSize<=0) || (factorQbitSize<=0), ippStsBadArgErr);
  277. IPP_BADARG_RET((factorPbitSize < factorQbitSize), ippStsBadArgErr);
  278. IPP_BADARG_RET((MIN_RSA_SIZE>(factorPbitSize+factorQbitSize) || (factorPbitSize+factorQbitSize)>MAX_RSA_SIZE), ippStsNotSupportedModeErr);
  279. /* test available size of context buffer */
  280. IPP_BADARG_RET(keyCtxSize<cpSizeof_RSA_privateKey2(factorPbitSize,factorQbitSize), ippStsMemAllocErr);
  281. RSA_PRV_KEY_ID(pKey) = idCtxRSA_PrvKey2;
  282. RSA_PRV_KEY_MAXSIZE_N(pKey) = 0;
  283. RSA_PRV_KEY_MAXSIZE_D(pKey) = 0;
  284. RSA_PRV_KEY_BITSIZE_N(pKey) = 0;
  285. RSA_PRV_KEY_BITSIZE_D(pKey) = 0;
  286. RSA_PRV_KEY_BITSIZE_P(pKey) = factorPbitSize;
  287. RSA_PRV_KEY_BITSIZE_Q(pKey) = factorQbitSize;
  288. RSA_PRV_KEY_D(pKey) = NULL;
  289. {
  290. Ipp8u* ptr = (Ipp8u*)pKey;
  291. int factorPlen = BITS_BNU_CHUNK(factorPbitSize);
  292. int factorQlen = BITS_BNU_CHUNK(factorQbitSize);
  293. int factorPlen32 = BITS2WORD32_SIZE(factorPbitSize);
  294. int factorQlen32 = BITS2WORD32_SIZE(factorQbitSize);
  295. int rsaModulusLen32 = BITS2WORD32_SIZE(factorPbitSize+factorQbitSize);
  296. int montPsize;
  297. int montQsize;
  298. int montNsize;
  299. gsMontGetSize(ippBinaryMethod, factorPlen32, &montPsize);
  300. gsMontGetSize(ippBinaryMethod, factorQlen32, &montQsize);
  301. gsMontGetSize(ippBinaryMethod, rsaModulusLen32, &montNsize);
  302. /* allocate internal contexts */
  303. ptr += sizeof(IppsRSAPrivateKeyState);
  304. RSA_PRV_KEY_DP(pKey) = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR((ptr), (int)sizeof(BNU_CHUNK_T)) );
  305. ptr += factorPlen*sizeof(BNU_CHUNK_T);
  306. RSA_PRV_KEY_DQ(pKey) = (BNU_CHUNK_T*)(ptr);
  307. ptr += factorQlen*sizeof(BNU_CHUNK_T);
  308. RSA_PRV_KEY_INVQ(pKey) = (BNU_CHUNK_T*)(ptr);
  309. ptr += factorPlen*sizeof(BNU_CHUNK_T);
  310. RSA_PRV_KEY_PMONT(pKey) = (IppsMontState*)( IPP_ALIGNED_PTR((ptr), (MONT_ALIGNMENT)) );
  311. ptr += montPsize;
  312. RSA_PRV_KEY_QMONT(pKey) = (IppsMontState*)( IPP_ALIGNED_PTR((ptr), (MONT_ALIGNMENT)) );
  313. ptr += montQsize;
  314. RSA_PRV_KEY_NMONT(pKey) = (IppsMontState*)( IPP_ALIGNED_PTR((ptr), (MONT_ALIGNMENT)) );
  315. ptr += montNsize;
  316. ZEXPAND_BNU(RSA_PRV_KEY_DP(pKey), 0, factorPlen);
  317. ZEXPAND_BNU(RSA_PRV_KEY_DQ(pKey), 0, factorQlen);
  318. ZEXPAND_BNU(RSA_PRV_KEY_INVQ(pKey), 0, factorPlen);
  319. gsMontInit(ippBinaryMethod, factorPlen32, RSA_PRV_KEY_PMONT(pKey));
  320. gsMontInit(ippBinaryMethod, factorQlen32, RSA_PRV_KEY_QMONT(pKey));
  321. gsMontInit(ippBinaryMethod, rsaModulusLen32, RSA_PRV_KEY_NMONT(pKey));
  322. return ippStsNoErr;
  323. }
  324. }
  325. /*F*
  326. // Name: ippsRSA_SetPrivateKeyType2
  327. //
  328. // Purpose: Set up the RSA private key
  329. //
  330. // Returns: Reason:
  331. // ippStsNullPtrErr NULL == pFactorP, NULL == pFactorQ
  332. // NULL == pCrtExpP, NULL == pCrtExpQ
  333. // NULL == pInverseQ
  334. // NULL == pKey
  335. //
  336. // ippStsContextMatchErr !BN_VALID_ID(pFactorP), !BN_VALID_ID(pFactorQ)
  337. // !BN_VALID_ID(pCrtExpP), !BN_VALID_ID(pCrtExpQ)
  338. // !BN_VALID_ID(pInverseQ)
  339. // !RSA_PRV_KEY_VALID_ID()
  340. //
  341. // ippStsOutOfRangeErr 0 >= pFactorP, 0 >= pFactorQ
  342. // 0 >= pCrtExpP, 0 >= pCrtExpQ
  343. // 0 >= pInverseQ
  344. //
  345. // ippStsSizeErr bitsize(pFactorP) exceeds requested value
  346. // bitsize(pFactorQ) exceeds requested value
  347. // bitsize(pCrtExpP) > bitsize(pFactorP)
  348. // bitsize(pCrtExpQ) > bitsize(pFactorQ)
  349. // bitsize(pInverseQ) > bitsize(pFactorP)
  350. //
  351. // ippStsNoErr no error
  352. //
  353. // Parameters:
  354. // pFactorP, pFactorQ pointer to the RSA modulus (N) prime factors
  355. // pCrtExpP, pCrtExpQ pointer to CTR's exponent
  356. // pInverseQ 1/Q mod P
  357. // pKey pointer to the key context
  358. *F*/
  359. IPPFUN(IppStatus, ippsRSA_SetPrivateKeyType2,(const IppsBigNumState* pFactorP,
  360. const IppsBigNumState* pFactorQ,
  361. const IppsBigNumState* pCrtExpP,
  362. const IppsBigNumState* pCrtExpQ,
  363. const IppsBigNumState* pInverseQ,
  364. IppsRSAPrivateKeyState* pKey))
  365. {
  366. IPP_BAD_PTR1_RET(pKey);
  367. pKey = (IppsRSAPrivateKeyState*)( IPP_ALIGNED_PTR(pKey, RSA_PRIVATE_KEY_ALIGNMENT) );
  368. IPP_BADARG_RET(!RSA_PRV_KEY2_VALID_ID(pKey), ippStsContextMatchErr);
  369. IPP_BAD_PTR1_RET(pFactorP);
  370. pFactorP = (IppsBigNumState*)( IPP_ALIGNED_PTR(pFactorP, BN_ALIGNMENT) );
  371. IPP_BADARG_RET(!BN_VALID_ID(pFactorP), ippStsContextMatchErr);
  372. IPP_BADARG_RET(!(0 < cpBN_tst(pFactorP)), ippStsOutOfRangeErr);
  373. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pFactorP), BN_SIZE(pFactorP)) > RSA_PRV_KEY_BITSIZE_P(pKey), ippStsSizeErr);
  374. IPP_BAD_PTR1_RET(pFactorQ);
  375. pFactorQ = (IppsBigNumState*)( IPP_ALIGNED_PTR(pFactorQ, BN_ALIGNMENT) );
  376. IPP_BADARG_RET(!BN_VALID_ID(pFactorQ), ippStsContextMatchErr);
  377. IPP_BADARG_RET(!(0 < cpBN_tst(pFactorQ)), ippStsOutOfRangeErr);
  378. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pFactorQ), BN_SIZE(pFactorQ)) > RSA_PRV_KEY_BITSIZE_Q(pKey), ippStsSizeErr);
  379. /* let P>Q */
  380. IPP_BADARG_RET(0>=cpBN_cmp(pFactorP,pFactorQ), ippStsBadArgErr);
  381. IPP_BAD_PTR1_RET(pCrtExpP);
  382. pCrtExpP = (IppsBigNumState*)( IPP_ALIGNED_PTR(pCrtExpP, BN_ALIGNMENT) );
  383. IPP_BADARG_RET(!BN_VALID_ID(pCrtExpP), ippStsContextMatchErr);
  384. IPP_BADARG_RET(!(0 < cpBN_tst(pCrtExpP)), ippStsOutOfRangeErr);
  385. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pCrtExpP), BN_SIZE(pCrtExpP)) > RSA_PRV_KEY_BITSIZE_P(pKey), ippStsSizeErr);
  386. IPP_BAD_PTR1_RET(pCrtExpQ);
  387. pCrtExpQ = (IppsBigNumState*)( IPP_ALIGNED_PTR(pCrtExpQ, BN_ALIGNMENT) );
  388. IPP_BADARG_RET(!BN_VALID_ID(pCrtExpQ), ippStsContextMatchErr);
  389. IPP_BADARG_RET(!(0 < cpBN_tst(pCrtExpQ)), ippStsOutOfRangeErr);
  390. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pCrtExpQ), BN_SIZE(pCrtExpQ)) > RSA_PRV_KEY_BITSIZE_Q(pKey), ippStsSizeErr);
  391. IPP_BAD_PTR1_RET(pInverseQ);
  392. pInverseQ = (IppsBigNumState*)( IPP_ALIGNED_PTR(pInverseQ, BN_ALIGNMENT) );
  393. IPP_BADARG_RET(!BN_VALID_ID(pInverseQ), ippStsContextMatchErr);
  394. IPP_BADARG_RET(!(0 < cpBN_tst(pInverseQ)), ippStsOutOfRangeErr);
  395. IPP_BADARG_RET(BITSIZE_BNU(BN_NUMBER(pInverseQ), BN_SIZE(pInverseQ)) > RSA_PRV_KEY_BITSIZE_P(pKey), ippStsSizeErr);
  396. /* set bitsize(N) = 0, so the key contex is not ready */
  397. RSA_PRV_KEY_BITSIZE_N(pKey) = 0;
  398. RSA_PRV_KEY_BITSIZE_D(pKey) = 0;
  399. /* setup montgomery engine P */
  400. gsMontSet((Ipp32u*)BN_NUMBER(pFactorP), BN_SIZE32(pFactorP), RSA_PRV_KEY_PMONT(pKey));
  401. /* setup montgomery engine Q */
  402. gsMontSet((Ipp32u*)BN_NUMBER(pFactorQ), BN_SIZE32(pFactorQ), RSA_PRV_KEY_QMONT(pKey));
  403. /* actual size of key components */
  404. RSA_PRV_KEY_BITSIZE_P(pKey) = cpBN_bitsize(pFactorP);
  405. RSA_PRV_KEY_BITSIZE_Q(pKey) = cpBN_bitsize(pFactorQ);
  406. /* store CTR's exp dp */
  407. ZEXPAND_COPY_BNU(RSA_PRV_KEY_DP(pKey), BITS_BNU_CHUNK(RSA_PRV_KEY_BITSIZE_P(pKey)), BN_NUMBER(pCrtExpP), BN_SIZE(pCrtExpP));
  408. /* store CTR's exp dq */
  409. ZEXPAND_COPY_BNU(RSA_PRV_KEY_DQ(pKey), BITS_BNU_CHUNK(RSA_PRV_KEY_BITSIZE_Q(pKey)), BN_NUMBER(pCrtExpQ), BN_SIZE(pCrtExpQ));
  410. /* store mont encoded CTR's coeff qinv */
  411. {
  412. IppsMontState* pMontP = RSA_PRV_KEY_PMONT(pKey);
  413. BNU_CHUNK_T* pTmpProduct = MNT_MODULUS(RSA_PRV_KEY_NMONT(pKey));
  414. cpMontMul_BNU(RSA_PRV_KEY_INVQ(pKey),
  415. BN_NUMBER(pInverseQ), BN_SIZE(pInverseQ),
  416. MNT_SQUARE_R(pMontP), MNT_SIZE(pMontP),
  417. MNT_MODULUS(pMontP), MNT_SIZE(pMontP), MNT_HELPER(pMontP),
  418. pTmpProduct, NULL);
  419. }
  420. /* setup montgomery engine N = P*Q */
  421. {
  422. BNU_CHUNK_T* pN = MNT_MODULUS(RSA_PRV_KEY_NMONT(pKey));
  423. cpSize nsN = BITS_BNU_CHUNK(RSA_PRV_KEY_BITSIZE_P(pKey) + RSA_PRV_KEY_BITSIZE_Q(pKey));
  424. cpMul_BNU_school(pN,
  425. BN_NUMBER(pFactorP), BN_SIZE(pFactorP),
  426. BN_NUMBER(pFactorQ), BN_SIZE(pFactorQ));
  427. gsMontSet((Ipp32u*)MNT_MODULUS(RSA_PRV_KEY_NMONT(pKey)), BITS2WORD32_SIZE(RSA_PRV_KEY_BITSIZE_P(pKey)+RSA_PRV_KEY_BITSIZE_Q(pKey)), RSA_PRV_KEY_NMONT(pKey));
  428. FIX_BNU(pN, nsN);
  429. RSA_PRV_KEY_BITSIZE_N(pKey) = BITSIZE_BNU(pN, nsN);
  430. }
  431. return ippStsNoErr;
  432. }