bn_nist.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:22k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* crypto/bn/bn_nist.c */
  2. /*
  3.  * Written by Nils Larsch for the OpenSSL project
  4.  */
  5. /* ====================================================================
  6.  * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  *
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer. 
  14.  *
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  *
  20.  * 3. All advertising materials mentioning features or use of this
  21.  *    software must display the following acknowledgment:
  22.  *    "This product includes software developed by the OpenSSL Project
  23.  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  24.  *
  25.  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  26.  *    endorse or promote products derived from this software without
  27.  *    prior written permission. For written permission, please contact
  28.  *    openssl-core@openssl.org.
  29.  *
  30.  * 5. Products derived from this software may not be called "OpenSSL"
  31.  *    nor may "OpenSSL" appear in their names without prior written
  32.  *    permission of the OpenSSL Project.
  33.  *
  34.  * 6. Redistributions of any form whatsoever must retain the following
  35.  *    acknowledgment:
  36.  *    "This product includes software developed by the OpenSSL Project
  37.  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  38.  *
  39.  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  40.  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  43.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  45.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  46.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  48.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  49.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  50.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  51.  * ====================================================================
  52.  *
  53.  * This product includes cryptographic software written by Eric Young
  54.  * (eay@cryptsoft.com).  This product includes software written by Tim
  55.  * Hudson (tjh@cryptsoft.com).
  56.  *
  57.  */
  58. #include "bn_lcl.h"
  59. #include "cryptlib.h"
  60. #define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2
  61. #define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2
  62. #define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2
  63. #define BN_NIST_384_TOP (384+BN_BITS2-1)/BN_BITS2
  64. #define BN_NIST_521_TOP (521+BN_BITS2-1)/BN_BITS2
  65. #if BN_BITS2 == 64
  66. static const BN_ULONG _nist_p_192[] =
  67. {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFEULL,
  68. 0xFFFFFFFFFFFFFFFFULL};
  69. static const BN_ULONG _nist_p_224[] =
  70. {0x0000000000000001ULL,0xFFFFFFFF00000000ULL,
  71. 0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL};
  72. static const BN_ULONG _nist_p_256[] =
  73. {0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL,
  74. 0x0000000000000000ULL,0xFFFFFFFF00000001ULL};
  75. static const BN_ULONG _nist_p_384[] =
  76. {0x00000000FFFFFFFFULL,0xFFFFFFFF00000000ULL,
  77. 0xFFFFFFFFFFFFFFFEULL,0xFFFFFFFFFFFFFFFFULL,
  78. 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL};
  79. static const BN_ULONG _nist_p_521[] =
  80. {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,
  81. 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,
  82. 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,
  83. 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,
  84. 0x00000000000001FFULL};
  85. #elif BN_BITS2 == 32
  86. static const BN_ULONG _nist_p_192[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFE,
  87. 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
  88. static const BN_ULONG _nist_p_224[] = {0x00000001,0x00000000,0x00000000,
  89. 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
  90. static const BN_ULONG _nist_p_256[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  91. 0x00000000,0x00000000,0x00000000,0x00000001,0xFFFFFFFF};
  92. static const BN_ULONG _nist_p_384[] = {0xFFFFFFFF,0x00000000,0x00000000,
  93. 0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  94. 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
  95. static const BN_ULONG _nist_p_521[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  96. 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  97. 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  98. 0xFFFFFFFF,0x000001FF};
  99. #elif BN_BITS2 == 16
  100. static const BN_ULONG _nist_p_192[] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFE,
  101. 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF};
  102. static const BN_ULONG _nist_p_224[] = {0x0001,0x0000,0x0000,0x0000,0x0000,
  103. 0x0000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF};
  104. static const BN_ULONG _nist_p_256[] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  105. 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0000,0xFFFF,
  106. 0xFFFF};
  107. static const BN_ULONG _nist_p_384[] = {0xFFFF,0xFFFF,0x0000,0x0000,0x0000,
  108. 0x0000,0xFFFF,0xFFFF,0xFFFE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  109. 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF};
  110. static const BN_ULONG _nist_p_521[] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  111. 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  112. 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  113. 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x01FF};
  114. #elif BN_BITS2 == 8
  115. static const BN_ULONG _nist_p_192[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  116. 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  117. 0xFF,0xFF};
  118. static const BN_ULONG _nist_p_224[] = {0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  119. 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  120. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  121. static const BN_ULONG _nist_p_256[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  122. 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  123. 0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF};
  124. static const BN_ULONG _nist_p_384[] = {0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
  125. 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
  126. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  127. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  128. static const BN_ULONG _nist_p_521[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  129. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  130. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  131. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  132. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  133. 0xFF,0x01};
  134. #endif
  135. const BIGNUM *BN_get0_nist_prime_192(void)
  136. {
  137. static BIGNUM const_nist_192 = { (BN_ULONG *)_nist_p_192,
  138. BN_NIST_192_TOP, BN_NIST_192_TOP, 0, BN_FLG_STATIC_DATA };
  139. return &const_nist_192;
  140. }
  141. const BIGNUM *BN_get0_nist_prime_224(void)
  142. {
  143. static BIGNUM const_nist_224 = { (BN_ULONG *)_nist_p_224,
  144. BN_NIST_224_TOP, BN_NIST_224_TOP, 0, BN_FLG_STATIC_DATA };
  145. return &const_nist_224;
  146. }
  147. const BIGNUM *BN_get0_nist_prime_256(void)
  148. {
  149. static BIGNUM const_nist_256 = { (BN_ULONG *)_nist_p_256,
  150. BN_NIST_256_TOP, BN_NIST_256_TOP, 0, BN_FLG_STATIC_DATA };
  151. return &const_nist_256;
  152. }
  153. const BIGNUM *BN_get0_nist_prime_384(void)
  154. {
  155. static BIGNUM const_nist_384 = { (BN_ULONG *)_nist_p_384,
  156. BN_NIST_384_TOP, BN_NIST_384_TOP, 0, BN_FLG_STATIC_DATA };
  157. return &const_nist_384;
  158. }
  159. const BIGNUM *BN_get0_nist_prime_521(void)
  160. {
  161. static BIGNUM const_nist_521 = { (BN_ULONG *)_nist_p_521,
  162. BN_NIST_521_TOP, BN_NIST_521_TOP, 0, BN_FLG_STATIC_DATA };
  163. return &const_nist_521;
  164. }
  165. /* some misc internal functions */
  166. #if BN_BITS2 != 64
  167. static BN_ULONG _256_data[BN_NIST_256_TOP*6];
  168. static int _is_set_256_data = 0;
  169. static void _init_256_data(void);
  170. static BN_ULONG _384_data[BN_NIST_384_TOP*8];
  171. static int _is_set_384_data = 0;
  172. static void _init_384_data(void);
  173. #endif
  174. #define BN_NIST_ADD_ONE(a) while (!(++(*(a)))) ++(a);
  175. static void nist_cp_bn_0(BN_ULONG *buf, BN_ULONG *a, int top, int max)
  176.         {
  177. int i;
  178.         BN_ULONG *_tmp1 = (buf), *_tmp2 = (a);
  179.         for (i = (top); i != 0; i--)
  180.                 *_tmp1++ = *_tmp2++;
  181.         for (i = (max) - (top); i != 0; i--)
  182.                 *_tmp1++ = (BN_ULONG) 0;
  183.         }
  184. static void nist_cp_bn(BN_ULONG *buf, BN_ULONG *a, int top)
  185.         { 
  186. int i;
  187.         BN_ULONG *_tmp1 = (buf), *_tmp2 = (a);
  188.         for (i = (top); i != 0; i--)
  189.                 *_tmp1++ = *_tmp2++;
  190.         }
  191. #if BN_BITS2 == 64
  192. #define bn_cp_64(to, n, from, m) (to)[n] = (from)[m];
  193. #define bn_64_set_0(to, n) (to)[n] = (BN_ULONG)0;
  194. /* TBD */
  195. #define bn_cp_32(to, n, from, m) (to)[n] = (from)[m];
  196. #define bn_32_set_0(to, n) (to)[n] = (BN_ULONG)0;
  197. #else
  198. #define bn_cp_64(to, n, from, m) 
  199. bn_cp_32(to, (n)*2, from, (m)*2); 
  200. bn_cp_32(to, (n)*2+1, from, (m)*2+1); 
  201. }
  202. #define bn_64_set_0(to, n) 
  203. bn_32_set_0(to, (n)*2); 
  204. bn_32_set_0(to, (n)*2+1); 
  205. }
  206. #if BN_BITS2 == 32
  207. #define bn_cp_32(to, n, from, m) (to)[n] = (from)[m];
  208. #define bn_32_set_0(to, n) (to)[n] = (BN_ULONG)0;
  209. #elif BN_BITS2 == 16
  210. #define bn_cp_32(to, n, from, m) 
  211. (to)[(n)*2]   = (from)[(m)*2];  
  212. (to)[(n)*2+1] = (from)[(m)*2+1];
  213. }
  214. #define bn_32_set_0(to, n) { (to)[(n)*2] = 0; (to)[(n)*2+1] = 0; }
  215. #elif BN_BITS2 == 8
  216. #define bn_cp_32(to, n, from, m) 
  217. (to)[(n)*4]   = (from)[(m)*4];  
  218. (to)[(n)*4+1] = (from)[(m)*4+1];
  219. (to)[(n)*4+2] = (from)[(m)*4+2];
  220. (to)[(n)*4+3] = (from)[(m)*4+3];
  221. }
  222. #define bn_32_set_0(to, n) 
  223. { (to)[(n)*4]   = (BN_ULONG)0; (to)[(n)*4+1] = (BN_ULONG)0; 
  224.   (to)[(n)*4+2] = (BN_ULONG)0; (to)[(n)*4+3] = (BN_ULONG)0; }
  225. #endif
  226. #endif /* BN_BITS2 != 64 */
  227. #define nist_set_192(to, from, a1, a2, a3) 
  228. if (a3 != 0) bn_cp_64(to, 0, from, (a3) - 3) else bn_64_set_0(to, 0)
  229. bn_cp_64(to, 1, from, (a2) - 3) 
  230. if (a1 != 0) bn_cp_64(to, 2, from, (a1) - 3) else bn_64_set_0(to, 2)
  231. }
  232. int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
  233. BN_CTX *ctx)
  234. {
  235. int      top = a->top, i;
  236. BN_ULONG carry = 0;
  237. register BN_ULONG *r_d, *a_d = a->d;
  238. BN_ULONG t_d[BN_NIST_192_TOP],
  239.          buf[BN_NIST_192_TOP];
  240. i = BN_ucmp(field, a);
  241. if (i == 0)
  242. {
  243. BN_zero(r);
  244. return 1;
  245. }
  246. else if (i > 0)
  247. return (r == a) ? 1 : (BN_copy(r ,a) != NULL);
  248. if (top == BN_NIST_192_TOP)
  249. return BN_usub(r, a, field);
  250. if (r != a)
  251. {
  252. if (!bn_wexpand(r, BN_NIST_192_TOP))
  253. return 0;
  254. r_d = r->d;
  255. nist_cp_bn(r_d, a_d, BN_NIST_192_TOP);
  256. }
  257. else
  258. r_d = a_d;
  259. nist_cp_bn_0(buf, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP, BN_NIST_192_TOP);
  260. #if defined(OPENSSL_SYS_VMS) && defined(__DECC)
  261. # pragma message save
  262. # pragma message disable BADSUBSCRIPT
  263. #endif
  264. nist_set_192(t_d, buf, 0, 3, 3);
  265. if (bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP))
  266. ++carry;
  267. nist_set_192(t_d, buf, 4, 4, 0);
  268. if (bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP))
  269. ++carry;
  270. #if defined(OPENSSL_SYS_VMS) && defined(__DECC)
  271. # pragma message restore
  272. #endif
  273. nist_set_192(t_d, buf, 5, 5, 5)
  274. if (bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP))
  275. ++carry;
  276. while (carry)
  277. {
  278. if (bn_sub_words(r_d, r_d, _nist_p_192, BN_NIST_192_TOP))
  279. --carry; 
  280. }
  281. r->top = BN_NIST_192_TOP;
  282. bn_correct_top(r);
  283. if (BN_ucmp(r, field) >= 0)
  284. {
  285. bn_sub_words(r_d, r_d, _nist_p_192, BN_NIST_192_TOP);
  286. bn_correct_top(r);
  287. }
  288. bn_check_top(r);
  289. return 1;
  290. }
  291. #define nist_set_224(to, from, a1, a2, a3, a4, a5, a6, a7) 
  292. if (a7 != 0) bn_cp_32(to, 0, from, (a7) - 7) else bn_32_set_0(to, 0)
  293. if (a6 != 0) bn_cp_32(to, 1, from, (a6) - 7) else bn_32_set_0(to, 1)
  294. if (a5 != 0) bn_cp_32(to, 2, from, (a5) - 7) else bn_32_set_0(to, 2)
  295. if (a4 != 0) bn_cp_32(to, 3, from, (a4) - 7) else bn_32_set_0(to, 3)
  296. if (a3 != 0) bn_cp_32(to, 4, from, (a3) - 7) else bn_32_set_0(to, 4)
  297. if (a2 != 0) bn_cp_32(to, 5, from, (a2) - 7) else bn_32_set_0(to, 5)
  298. if (a1 != 0) bn_cp_32(to, 6, from, (a1) - 7) else bn_32_set_0(to, 6)
  299. }
  300. int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
  301. BN_CTX *ctx)
  302. {
  303. #if BN_BITS2 != 64
  304. int top = a->top, i;
  305. int carry = 0;
  306. BN_ULONG *r_d, *a_d = a->d;
  307. BN_ULONG t_d[BN_NIST_224_TOP],
  308.          buf[BN_NIST_224_TOP];
  309. i = BN_ucmp(field, a);
  310. if (i == 0)
  311. {
  312. BN_zero(r);
  313. return 1;
  314. }
  315. else if (i > 0)
  316. return (r == a)? 1 : (BN_copy(r ,a) != NULL);
  317. if (top == BN_NIST_224_TOP)
  318. return BN_usub(r, a, field);
  319. if (r != a)
  320. {
  321. if (!bn_wexpand(r, BN_NIST_224_TOP))
  322. return 0;
  323. r_d = r->d;
  324. nist_cp_bn(r_d, a_d, BN_NIST_224_TOP);
  325. }
  326. else
  327. r_d = a_d;
  328. nist_cp_bn_0(buf, a_d + BN_NIST_224_TOP, top - BN_NIST_224_TOP, BN_NIST_224_TOP);
  329. nist_set_224(t_d, buf, 10, 9, 8, 7, 0, 0, 0);
  330. if (bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP))
  331. ++carry;
  332. nist_set_224(t_d, buf, 0, 13, 12, 11, 0, 0, 0);
  333. if (bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP))
  334. ++carry;
  335. nist_set_224(t_d, buf, 13, 12, 11, 10, 9, 8, 7);
  336. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP))
  337. --carry;
  338. nist_set_224(t_d, buf, 0, 0, 0, 0, 13, 12, 11);
  339. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP))
  340. --carry;
  341. if (carry > 0)
  342. while (carry)
  343. {
  344. if (bn_sub_words(r_d,r_d,_nist_p_224,BN_NIST_224_TOP))
  345. --carry;
  346. }
  347. else if (carry < 0)
  348. while (carry)
  349. {
  350. if (bn_add_words(r_d,r_d,_nist_p_224,BN_NIST_224_TOP))
  351. ++carry;
  352. }
  353. r->top = BN_NIST_224_TOP;
  354. bn_correct_top(r);
  355. if (BN_ucmp(r, field) >= 0)
  356. {
  357. bn_sub_words(r_d, r_d, _nist_p_224, BN_NIST_224_TOP);
  358. bn_correct_top(r);
  359. }
  360. bn_check_top(r);
  361. return 1;
  362. #else
  363. return 0;
  364. #endif
  365. }
  366. #if BN_BITS2 != 64
  367. static void _init_256_data(void)
  368. {
  369. int i;
  370. BN_ULONG *tmp1 = _256_data;
  371. const BN_ULONG *tmp2 = tmp1;
  372. memcpy(tmp1, _nist_p_256, BN_NIST_256_TOP * sizeof(BN_ULONG));
  373. tmp1 += BN_NIST_256_TOP;
  374. for (i=0; i<5; i++)
  375. {
  376. bn_add_words(tmp1, _nist_p_256, tmp2, BN_NIST_256_TOP);
  377. tmp2  = tmp1;
  378. tmp1 += BN_NIST_256_TOP;
  379. }
  380. _is_set_256_data = 1;
  381. }
  382. #endif
  383. #define nist_set_256(to, from, a1, a2, a3, a4, a5, a6, a7, a8) 
  384. if (a8 != 0) bn_cp_32(to, 0, from, (a8) - 8) else bn_32_set_0(to, 0)
  385. if (a7 != 0) bn_cp_32(to, 1, from, (a7) - 8) else bn_32_set_0(to, 1)
  386. if (a6 != 0) bn_cp_32(to, 2, from, (a6) - 8) else bn_32_set_0(to, 2)
  387. if (a5 != 0) bn_cp_32(to, 3, from, (a5) - 8) else bn_32_set_0(to, 3)
  388. if (a4 != 0) bn_cp_32(to, 4, from, (a4) - 8) else bn_32_set_0(to, 4)
  389. if (a3 != 0) bn_cp_32(to, 5, from, (a3) - 8) else bn_32_set_0(to, 5)
  390. if (a2 != 0) bn_cp_32(to, 6, from, (a2) - 8) else bn_32_set_0(to, 6)
  391. if (a1 != 0) bn_cp_32(to, 7, from, (a1) - 8) else bn_32_set_0(to, 7)
  392. }
  393. int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
  394. BN_CTX *ctx)
  395. {
  396. #if BN_BITS2 != 64
  397. int i, top = a->top;
  398. int carry = 0;
  399. register BN_ULONG *a_d = a->d, *r_d;
  400. BN_ULONG t_d[BN_NIST_256_TOP],
  401.          t_d2[BN_NIST_256_TOP],
  402.          buf[BN_NIST_256_TOP];
  403. if (!_is_set_256_data)
  404. {
  405. CRYPTO_w_lock(CRYPTO_LOCK_BN);
  406. if (!_is_set_256_data)
  407. _init_256_data();
  408. CRYPTO_w_unlock(CRYPTO_LOCK_BN);
  409. }
  410. i = BN_ucmp(field, a);
  411. if (i == 0)
  412. {
  413. BN_zero(r);
  414. return 1;
  415. }
  416. else if (i > 0)
  417. return (r == a)? 1 : (BN_copy(r ,a) != NULL);
  418. if (top == BN_NIST_256_TOP)
  419. return BN_usub(r, a, field);
  420. if (r != a)
  421. {
  422. if (!bn_wexpand(r, BN_NIST_256_TOP))
  423. return 0;
  424. r_d = r->d;
  425. nist_cp_bn(r_d, a_d, BN_NIST_256_TOP);
  426. }
  427. else
  428. r_d = a_d;
  429. nist_cp_bn_0(buf, a_d + BN_NIST_256_TOP, top - BN_NIST_256_TOP, BN_NIST_256_TOP);
  430. /*S1*/
  431. nist_set_256(t_d, buf, 15, 14, 13, 12, 11, 0, 0, 0);
  432. /*S2*/
  433. nist_set_256(t_d2,buf, 0, 15, 14, 13, 12, 0, 0, 0);
  434. if (bn_add_words(t_d, t_d, t_d2, BN_NIST_256_TOP))
  435. carry = 2;
  436. /* left shift */
  437. {
  438. register BN_ULONG *ap,t,c;
  439. ap = t_d;
  440. c=0;
  441. for (i = BN_NIST_256_TOP; i != 0; --i)
  442. {
  443. t= *ap;
  444. *(ap++)=((t<<1)|c)&BN_MASK2;
  445. c=(t & BN_TBIT)?1:0;
  446. }
  447. if (c)
  448. ++carry;
  449. }
  450. if (bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  451. ++carry;
  452. /*S3*/
  453. nist_set_256(t_d, buf, 15, 14, 0, 0, 0, 10, 9, 8);
  454. if (bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  455. ++carry;
  456. /*S4*/
  457. nist_set_256(t_d, buf, 8, 13, 15, 14, 13, 11, 10, 9);
  458. if (bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  459. ++carry;
  460. /*D1*/
  461. nist_set_256(t_d, buf, 10, 8, 0, 0, 0, 13, 12, 11);
  462. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  463. --carry;
  464. /*D2*/
  465. nist_set_256(t_d, buf, 11, 9, 0, 0, 15, 14, 13, 12);
  466. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  467. --carry;
  468. /*D3*/
  469. nist_set_256(t_d, buf, 12, 0, 10, 9, 8, 15, 14, 13);
  470. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  471. --carry;
  472. /*D4*/
  473. nist_set_256(t_d, buf, 13, 0, 11, 10, 9, 0, 15, 14);
  474. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP))
  475. --carry;
  476. if (carry)
  477. {
  478. if (carry > 0)
  479. bn_sub_words(r_d, r_d, _256_data + BN_NIST_256_TOP *
  480. --carry, BN_NIST_256_TOP);
  481. else
  482. {
  483. carry = -carry;
  484. bn_add_words(r_d, r_d, _256_data + BN_NIST_256_TOP *
  485. --carry, BN_NIST_256_TOP);
  486. }
  487. }
  488. r->top = BN_NIST_256_TOP;
  489. bn_correct_top(r);
  490. if (BN_ucmp(r, field) >= 0)
  491. {
  492. bn_sub_words(r_d, r_d, _nist_p_256, BN_NIST_256_TOP);
  493. bn_correct_top(r);
  494. }
  495. bn_check_top(r);
  496. return 1;
  497. #else
  498. return 0;
  499. #endif
  500. }
  501. #if BN_BITS2 != 64
  502. static void _init_384_data(void)
  503. {
  504. int i;
  505. BN_ULONG *tmp1 = _384_data;
  506. const BN_ULONG *tmp2 = tmp1;
  507. memcpy(tmp1, _nist_p_384, BN_NIST_384_TOP * sizeof(BN_ULONG));
  508. tmp1 += BN_NIST_384_TOP;
  509. for (i=0; i<7; i++)
  510. {
  511. bn_add_words(tmp1, _nist_p_384, tmp2, BN_NIST_384_TOP);
  512. tmp2  = tmp1;
  513. tmp1 += BN_NIST_384_TOP;
  514. }
  515. _is_set_384_data = 1;
  516. }
  517. #endif
  518. #define nist_set_384(to,from,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) 
  519. if (a12 != 0) bn_cp_32(to, 0, from,  (a12) - 12) else bn_32_set_0(to, 0)
  520. if (a11 != 0) bn_cp_32(to, 1, from,  (a11) - 12) else bn_32_set_0(to, 1)
  521. if (a10 != 0) bn_cp_32(to, 2, from,  (a10) - 12) else bn_32_set_0(to, 2)
  522. if (a9 != 0)  bn_cp_32(to, 3, from,  (a9) - 12)  else bn_32_set_0(to, 3)
  523. if (a8 != 0)  bn_cp_32(to, 4, from,  (a8) - 12)  else bn_32_set_0(to, 4)
  524. if (a7 != 0)  bn_cp_32(to, 5, from,  (a7) - 12)  else bn_32_set_0(to, 5)
  525. if (a6 != 0)  bn_cp_32(to, 6, from,  (a6) - 12)  else bn_32_set_0(to, 6)
  526. if (a5 != 0)  bn_cp_32(to, 7, from,  (a5) - 12)  else bn_32_set_0(to, 7)
  527. if (a4 != 0)  bn_cp_32(to, 8, from,  (a4) - 12)  else bn_32_set_0(to, 8)
  528. if (a3 != 0)  bn_cp_32(to, 9, from,  (a3) - 12)  else bn_32_set_0(to, 9)
  529. if (a2 != 0)  bn_cp_32(to, 10, from, (a2) - 12)  else bn_32_set_0(to, 10)
  530. if (a1 != 0)  bn_cp_32(to, 11, from, (a1) - 12)  else bn_32_set_0(to, 11)
  531. }
  532. int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
  533. BN_CTX *ctx)
  534. {
  535. #if BN_BITS2 != 64
  536. int i, top = a->top;
  537. int carry = 0;
  538. register BN_ULONG *r_d, *a_d = a->d;
  539. BN_ULONG t_d[BN_NIST_384_TOP],
  540.          buf[BN_NIST_384_TOP];
  541. if (!_is_set_384_data)
  542. {
  543. CRYPTO_w_lock(CRYPTO_LOCK_BN);
  544. if (!_is_set_384_data)
  545. _init_384_data();
  546. CRYPTO_w_unlock(CRYPTO_LOCK_BN);
  547. }
  548. i = BN_ucmp(field, a);
  549. if (i == 0)
  550. {
  551. BN_zero(r);
  552. return 1;
  553. }
  554. else if (i > 0)
  555. return (r == a)? 1 : (BN_copy(r ,a) != NULL);
  556. if (top == BN_NIST_384_TOP)
  557. return BN_usub(r, a, field);
  558. if (r != a)
  559. {
  560. if (!bn_wexpand(r, BN_NIST_384_TOP))
  561. return 0;
  562. r_d = r->d;
  563. nist_cp_bn(r_d, a_d, BN_NIST_384_TOP);
  564. }
  565. else
  566. r_d = a_d;
  567. nist_cp_bn_0(buf, a_d + BN_NIST_384_TOP, top - BN_NIST_384_TOP, BN_NIST_384_TOP);
  568. /*S1*/
  569. nist_set_256(t_d, buf, 0, 0, 0, 0, 0, 23-4, 22-4, 21-4);
  570. /* left shift */
  571. {
  572. register BN_ULONG *ap,t,c;
  573. ap = t_d;
  574. c=0;
  575. for (i = BN_NIST_256_TOP; i != 0; --i)
  576. {
  577. t= *ap;
  578. *(ap++)=((t<<1)|c)&BN_MASK2;
  579. c=(t & BN_TBIT)?1:0;
  580. }
  581. }
  582. if (bn_add_words(r_d+(128/BN_BITS2), r_d+(128/BN_BITS2), 
  583. t_d, BN_NIST_256_TOP))
  584. ++carry;
  585. /*S2 */
  586. if (bn_add_words(r_d, r_d, buf, BN_NIST_384_TOP))
  587. ++carry;
  588. /*S3*/
  589. nist_set_384(t_d,buf,20,19,18,17,16,15,14,13,12,23,22,21);
  590. if (bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  591. ++carry;
  592. /*S4*/
  593. nist_set_384(t_d,buf,19,18,17,16,15,14,13,12,20,0,23,0);
  594. if (bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  595. ++carry;
  596. /*S5*/
  597. nist_set_256(t_d, buf, 0, 0, 0, 0, 23-4, 22-4, 21-4, 20-4);
  598. if (bn_add_words(r_d+(128/BN_BITS2), r_d+(128/BN_BITS2), 
  599. t_d, BN_NIST_256_TOP))
  600. ++carry;
  601. /*S6*/
  602. nist_set_384(t_d,buf,0,0,0,0,0,0,23,22,21,0,0,20);
  603. if (bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  604. ++carry;
  605. /*D1*/
  606. nist_set_384(t_d,buf,22,21,20,19,18,17,16,15,14,13,12,23);
  607. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  608. --carry;
  609. /*D2*/
  610. nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,22,21,20,0);
  611. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  612. --carry;
  613. /*D3*/
  614. nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,23,0,0,0);
  615. if (bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP))
  616. --carry;
  617. if (carry)
  618. {
  619. if (carry > 0)
  620. bn_sub_words(r_d, r_d, _384_data + BN_NIST_384_TOP *
  621. --carry, BN_NIST_384_TOP);
  622. else
  623. {
  624. carry = -carry;
  625. bn_add_words(r_d, r_d, _384_data + BN_NIST_384_TOP *
  626. --carry, BN_NIST_384_TOP);
  627. }
  628. }
  629. r->top = BN_NIST_384_TOP;
  630. bn_correct_top(r);
  631. if (BN_ucmp(r, field) >= 0)
  632. {
  633. bn_sub_words(r_d, r_d, _nist_p_384, BN_NIST_384_TOP);
  634. bn_correct_top(r);
  635. }
  636. bn_check_top(r);
  637. return 1;
  638. #else
  639. return 0;
  640. #endif
  641. }
  642. int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
  643. BN_CTX *ctx)
  644. {
  645. #if BN_BITS2 == 64
  646. #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1FF
  647. #elif BN_BITS2 == 32
  648. #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1FF
  649. #elif BN_BITS2 == 16
  650. #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1FF
  651. #elif BN_BITS2 == 8
  652. #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1
  653. #endif
  654. int top, ret = 0;
  655. BN_ULONG *r_d;
  656. BIGNUM *tmp;
  657. /* check whether a reduction is necessary */
  658. top = a->top;
  659. if (top < BN_NIST_521_TOP  || ( top == BN_NIST_521_TOP &&
  660.            (!(a->d[BN_NIST_521_TOP-1] & ~(BN_NIST_521_TOP_MASK)))))
  661. return (r == a)? 1 : (BN_copy(r ,a) != NULL);
  662. BN_CTX_start(ctx);
  663. tmp = BN_CTX_get(ctx);
  664. if (!tmp)
  665. goto err;
  666. if (!bn_wexpand(tmp, BN_NIST_521_TOP))
  667. goto err;
  668. nist_cp_bn(tmp->d, a->d, BN_NIST_521_TOP);
  669. tmp->top = BN_NIST_521_TOP;
  670.         tmp->d[BN_NIST_521_TOP-1]  &= BN_NIST_521_TOP_MASK;
  671. bn_correct_top(tmp);
  672. if (!BN_rshift(r, a, 521))
  673. goto err;
  674. if (!BN_uadd(r, tmp, r))
  675. goto err;
  676. top = r->top;
  677. r_d = r->d;
  678. if (top == BN_NIST_521_TOP  && 
  679.            (r_d[BN_NIST_521_TOP-1] & ~(BN_NIST_521_TOP_MASK)))
  680. {
  681. BN_NIST_ADD_ONE(r_d)
  682. r_d[BN_NIST_521_TOP-1] &= BN_NIST_521_TOP_MASK; 
  683. }
  684. bn_correct_top(r);
  685. ret = 1;
  686. err:
  687. BN_CTX_end(ctx);
  688. bn_check_top(r);
  689. return ret;
  690. }