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

其他游戏

开发平台:

Visual C++

  1. /* crypto/rsa/rsa_eay.c */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3.  * All rights reserved.
  4.  *
  5.  * This package is an SSL implementation written
  6.  * by Eric Young (eay@cryptsoft.com).
  7.  * The implementation was written so as to conform with Netscapes SSL.
  8.  * 
  9.  * This library is free for commercial and non-commercial use as long as
  10.  * the following conditions are aheared to.  The following conditions
  11.  * apply to all code found in this distribution, be it the RC4, RSA,
  12.  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13.  * included with this distribution is covered by the same copyright terms
  14.  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15.  * 
  16.  * Copyright remains Eric Young's, and as such any Copyright notices in
  17.  * the code are not to be removed.
  18.  * If this package is used in a product, Eric Young should be given attribution
  19.  * as the author of the parts of the library used.
  20.  * This can be in the form of a textual message at program startup or
  21.  * in documentation (online or textual) provided with the package.
  22.  * 
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  26.  * 1. Redistributions of source code must retain the copyright
  27.  *    notice, this list of conditions and the following disclaimer.
  28.  * 2. Redistributions in binary form must reproduce the above copyright
  29.  *    notice, this list of conditions and the following disclaimer in the
  30.  *    documentation and/or other materials provided with the distribution.
  31.  * 3. All advertising materials mentioning features or use of this software
  32.  *    must display the following acknowledgement:
  33.  *    "This product includes cryptographic software written by
  34.  *     Eric Young (eay@cryptsoft.com)"
  35.  *    The word 'cryptographic' can be left out if the rouines from the library
  36.  *    being used are not cryptographic related :-).
  37.  * 4. If you include any Windows specific code (or a derivative thereof) from 
  38.  *    the apps directory (application code) you must include an acknowledgement:
  39.  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51.  * SUCH DAMAGE.
  52.  * 
  53.  * The licence and distribution terms for any publically available version or
  54.  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55.  * copied and put under another distribution licence
  56.  * [including the GNU Public Licence.]
  57.  */
  58. /* ====================================================================
  59.  * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
  60.  *
  61.  * Redistribution and use in source and binary forms, with or without
  62.  * modification, are permitted provided that the following conditions
  63.  * are met:
  64.  *
  65.  * 1. Redistributions of source code must retain the above copyright
  66.  *    notice, this list of conditions and the following disclaimer. 
  67.  *
  68.  * 2. Redistributions in binary form must reproduce the above copyright
  69.  *    notice, this list of conditions and the following disclaimer in
  70.  *    the documentation and/or other materials provided with the
  71.  *    distribution.
  72.  *
  73.  * 3. All advertising materials mentioning features or use of this
  74.  *    software must display the following acknowledgment:
  75.  *    "This product includes software developed by the OpenSSL Project
  76.  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  77.  *
  78.  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  79.  *    endorse or promote products derived from this software without
  80.  *    prior written permission. For written permission, please contact
  81.  *    openssl-core@openssl.org.
  82.  *
  83.  * 5. Products derived from this software may not be called "OpenSSL"
  84.  *    nor may "OpenSSL" appear in their names without prior written
  85.  *    permission of the OpenSSL Project.
  86.  *
  87.  * 6. Redistributions of any form whatsoever must retain the following
  88.  *    acknowledgment:
  89.  *    "This product includes software developed by the OpenSSL Project
  90.  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  91.  *
  92.  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  93.  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  94.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  95.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  96.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  97.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  98.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  99.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  100.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  101.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  102.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  103.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  104.  * ====================================================================
  105.  *
  106.  * This product includes cryptographic software written by Eric Young
  107.  * (eay@cryptsoft.com).  This product includes software written by Tim
  108.  * Hudson (tjh@cryptsoft.com).
  109.  *
  110.  */
  111. #include <stdio.h>
  112. #include "cryptlib.h"
  113. #include <openssl/bn.h>
  114. #include <openssl/rsa.h>
  115. #include <openssl/rand.h>
  116. #ifndef RSA_NULL
  117. static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
  118. unsigned char *to, RSA *rsa,int padding);
  119. static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
  120. unsigned char *to, RSA *rsa,int padding);
  121. static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
  122. unsigned char *to, RSA *rsa,int padding);
  123. static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
  124. unsigned char *to, RSA *rsa,int padding);
  125. static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx);
  126. static int RSA_eay_init(RSA *rsa);
  127. static int RSA_eay_finish(RSA *rsa);
  128. static RSA_METHOD rsa_pkcs1_eay_meth={
  129. "Eric Young's PKCS#1 RSA",
  130. RSA_eay_public_encrypt,
  131. RSA_eay_public_decrypt, /* signature verification */
  132. RSA_eay_private_encrypt, /* signing */
  133. RSA_eay_private_decrypt,
  134. RSA_eay_mod_exp,
  135. BN_mod_exp_mont, /* XXX probably we should not use Montgomery if  e == 3 */
  136. RSA_eay_init,
  137. RSA_eay_finish,
  138. 0, /* flags */
  139. NULL,
  140. 0, /* rsa_sign */
  141. 0, /* rsa_verify */
  142. NULL /* rsa_keygen */
  143. };
  144. const RSA_METHOD *RSA_PKCS1_SSLeay(void)
  145. {
  146. return(&rsa_pkcs1_eay_meth);
  147. }
  148. /* Usage example;
  149.  *    MONT_HELPER(rsa, bn_ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
  150.  */
  151. #define MONT_HELPER(rsa, ctx, m, pre_cond, err_instr) 
  152. if((pre_cond) && ((rsa)->_method_mod_##m == NULL) && 
  153. !BN_MONT_CTX_set_locked(&((rsa)->_method_mod_##m), 
  154. CRYPTO_LOCK_RSA, 
  155. (rsa)->m, (ctx))) 
  156. err_instr
  157. static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
  158.      unsigned char *to, RSA *rsa, int padding)
  159. {
  160. BIGNUM *f,*ret;
  161. int i,j,k,num=0,r= -1;
  162. unsigned char *buf=NULL;
  163. BN_CTX *ctx=NULL;
  164. if ((ctx=BN_CTX_new()) == NULL) goto err;
  165. BN_CTX_start(ctx);
  166. f = BN_CTX_get(ctx);
  167. ret = BN_CTX_get(ctx);
  168. num=BN_num_bytes(rsa->n);
  169. buf = OPENSSL_malloc(num);
  170. if (!f || !ret || !buf)
  171. {
  172. RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,ERR_R_MALLOC_FAILURE);
  173. goto err;
  174. }
  175. switch (padding)
  176. {
  177. case RSA_PKCS1_PADDING:
  178. i=RSA_padding_add_PKCS1_type_2(buf,num,from,flen);
  179. break;
  180. #ifndef OPENSSL_NO_SHA
  181. case RSA_PKCS1_OAEP_PADDING:
  182.         i=RSA_padding_add_PKCS1_OAEP(buf,num,from,flen,NULL,0);
  183. break;
  184. #endif
  185. case RSA_SSLV23_PADDING:
  186. i=RSA_padding_add_SSLv23(buf,num,from,flen);
  187. break;
  188. case RSA_NO_PADDING:
  189. i=RSA_padding_add_none(buf,num,from,flen);
  190. break;
  191. default:
  192. RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
  193. goto err;
  194. }
  195. if (i <= 0) goto err;
  196. if (BN_bin2bn(buf,num,f) == NULL) goto err;
  197. if (BN_ucmp(f, rsa->n) >= 0)
  198. {
  199. /* usually the padding functions would catch this */
  200. RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
  201. goto err;
  202. }
  203. MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
  204. if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
  205. rsa->_method_mod_n)) goto err;
  206. /* put in leading 0 bytes if the number is less than the
  207.  * length of the modulus */
  208. j=BN_num_bytes(ret);
  209. i=BN_bn2bin(ret,&(to[num-j]));
  210. for (k=0; k<(num-i); k++)
  211. to[k]=0;
  212. r=num;
  213. err:
  214. if (ctx != NULL)
  215. {
  216. BN_CTX_end(ctx);
  217. BN_CTX_free(ctx);
  218. }
  219. if (buf != NULL) 
  220. {
  221. OPENSSL_cleanse(buf,num);
  222. OPENSSL_free(buf);
  223. }
  224. return(r);
  225. }
  226. static BN_BLINDING *rsa_get_blinding(RSA *rsa, BIGNUM **r, int *local, BN_CTX *ctx)
  227. {
  228. BN_BLINDING *ret;
  229. if (rsa->blinding == NULL)
  230. {
  231. if (rsa->blinding == NULL)
  232. {
  233. CRYPTO_w_lock(CRYPTO_LOCK_RSA);
  234. if (rsa->blinding == NULL)
  235. rsa->blinding = RSA_setup_blinding(rsa, ctx);
  236. CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
  237. }
  238. }
  239. ret = rsa->blinding;
  240. if (ret == NULL)
  241. return NULL;
  242. if (BN_BLINDING_get_thread_id(ret) != CRYPTO_thread_id())
  243. {
  244. *local = 0;
  245. if (rsa->mt_blinding == NULL)
  246. {
  247. CRYPTO_w_lock(CRYPTO_LOCK_RSA);
  248. if (rsa->mt_blinding == NULL)
  249. rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
  250. CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
  251. }
  252. ret = rsa->mt_blinding;
  253. }
  254. else
  255. *local = 1;
  256. return ret;
  257. }
  258. static int rsa_blinding_convert(BN_BLINDING *b, int local, BIGNUM *f,
  259. BIGNUM *r, BN_CTX *ctx)
  260. {
  261. if (local)
  262. return BN_BLINDING_convert_ex(f, NULL, b, ctx);
  263. else
  264. {
  265. int ret;
  266. CRYPTO_r_lock(CRYPTO_LOCK_RSA_BLINDING);
  267. ret = BN_BLINDING_convert_ex(f, r, b, ctx);
  268. CRYPTO_r_unlock(CRYPTO_LOCK_RSA_BLINDING);
  269. return ret;
  270. }
  271. }
  272. static int rsa_blinding_invert(BN_BLINDING *b, int local, BIGNUM *f,
  273. BIGNUM *r, BN_CTX *ctx)
  274. {
  275. if (local)
  276. return BN_BLINDING_invert_ex(f, NULL, b, ctx);
  277. else
  278. {
  279. int ret;
  280. CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
  281. ret = BN_BLINDING_invert_ex(f, r, b, ctx);
  282. CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
  283. return ret;
  284. }
  285. }
  286. /* signing */
  287. static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
  288.      unsigned char *to, RSA *rsa, int padding)
  289. {
  290. BIGNUM *f, *ret, *br, *res;
  291. int i,j,k,num=0,r= -1;
  292. unsigned char *buf=NULL;
  293. BN_CTX *ctx=NULL;
  294. int local_blinding = 0;
  295. BN_BLINDING *blinding = NULL;
  296. if ((ctx=BN_CTX_new()) == NULL) goto err;
  297. BN_CTX_start(ctx);
  298. f   = BN_CTX_get(ctx);
  299. br  = BN_CTX_get(ctx);
  300. ret = BN_CTX_get(ctx);
  301. num = BN_num_bytes(rsa->n);
  302. buf = OPENSSL_malloc(num);
  303. if(!f || !ret || !buf)
  304. {
  305. RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE);
  306. goto err;
  307. }
  308. switch (padding)
  309. {
  310. case RSA_PKCS1_PADDING:
  311. i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen);
  312. break;
  313. case RSA_X931_PADDING:
  314. i=RSA_padding_add_X931(buf,num,from,flen);
  315. break;
  316. case RSA_NO_PADDING:
  317. i=RSA_padding_add_none(buf,num,from,flen);
  318. break;
  319. case RSA_SSLV23_PADDING:
  320. default:
  321. RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
  322. goto err;
  323. }
  324. if (i <= 0) goto err;
  325. if (BN_bin2bn(buf,num,f) == NULL) goto err;
  326. if (BN_ucmp(f, rsa->n) >= 0)
  327. {
  328. /* usually the padding functions would catch this */
  329. RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
  330. goto err;
  331. }
  332. if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
  333. {
  334. blinding = rsa_get_blinding(rsa, &br, &local_blinding, ctx);
  335. if (blinding == NULL)
  336. {
  337. RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
  338. goto err;
  339. }
  340. }
  341. if (blinding != NULL)
  342. if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
  343. goto err;
  344. if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
  345. ((rsa->p != NULL) &&
  346. (rsa->q != NULL) &&
  347. (rsa->dmp1 != NULL) &&
  348. (rsa->dmq1 != NULL) &&
  349. (rsa->iqmp != NULL)) )
  350. if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
  351. }
  352. else
  353. {
  354. BIGNUM local_d;
  355. BIGNUM *d = NULL;
  356. if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
  357. {
  358. BN_init(&local_d);
  359. d = &local_d;
  360. BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
  361. }
  362. else
  363. d = rsa->d;
  364. MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
  365. if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
  366. rsa->_method_mod_n)) goto err;
  367. }
  368. if (blinding)
  369. if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
  370. goto err;
  371. if (padding == RSA_X931_PADDING)
  372. {
  373. BN_sub(f, rsa->n, ret);
  374. if (BN_cmp(ret, f))
  375. res = f;
  376. else
  377. res = ret;
  378. }
  379. else
  380. res = ret;
  381. /* put in leading 0 bytes if the number is less than the
  382.  * length of the modulus */
  383. j=BN_num_bytes(res);
  384. i=BN_bn2bin(res,&(to[num-j]));
  385. for (k=0; k<(num-i); k++)
  386. to[k]=0;
  387. r=num;
  388. err:
  389. if (ctx != NULL)
  390. {
  391. BN_CTX_end(ctx);
  392. BN_CTX_free(ctx);
  393. }
  394. if (buf != NULL)
  395. {
  396. OPENSSL_cleanse(buf,num);
  397. OPENSSL_free(buf);
  398. }
  399. return(r);
  400. }
  401. static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
  402.      unsigned char *to, RSA *rsa, int padding)
  403. {
  404. BIGNUM *f, *ret, *br;
  405. int j,num=0,r= -1;
  406. unsigned char *p;
  407. unsigned char *buf=NULL;
  408. BN_CTX *ctx=NULL;
  409. int local_blinding = 0;
  410. BN_BLINDING *blinding = NULL;
  411. if((ctx = BN_CTX_new()) == NULL) goto err;
  412. BN_CTX_start(ctx);
  413. f   = BN_CTX_get(ctx);
  414. br  = BN_CTX_get(ctx);
  415. ret = BN_CTX_get(ctx);
  416. num = BN_num_bytes(rsa->n);
  417. buf = OPENSSL_malloc(num);
  418. if(!f || !ret || !buf)
  419. {
  420. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE);
  421. goto err;
  422. }
  423. /* This check was for equality but PGP does evil things
  424.  * and chops off the top '0' bytes */
  425. if (flen > num)
  426. {
  427. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
  428. goto err;
  429. }
  430. /* make data into a big number */
  431. if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
  432. if (BN_ucmp(f, rsa->n) >= 0)
  433. {
  434. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
  435. goto err;
  436. }
  437. if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
  438. {
  439. blinding = rsa_get_blinding(rsa, &br, &local_blinding, ctx);
  440. if (blinding == NULL)
  441. {
  442. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
  443. goto err;
  444. }
  445. }
  446. if (blinding != NULL)
  447. if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
  448. goto err;
  449. /* do the decrypt */
  450. if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
  451. ((rsa->p != NULL) &&
  452. (rsa->q != NULL) &&
  453. (rsa->dmp1 != NULL) &&
  454. (rsa->dmq1 != NULL) &&
  455. (rsa->iqmp != NULL)) )
  456. {
  457. if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
  458. }
  459. else
  460. {
  461. BIGNUM local_d;
  462. BIGNUM *d = NULL;
  463. if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
  464. {
  465. d = &local_d;
  466. BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
  467. }
  468. else
  469. d = rsa->d;
  470. MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
  471. if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
  472. rsa->_method_mod_n))
  473.   goto err;
  474. }
  475. if (blinding)
  476. if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
  477. goto err;
  478. p=buf;
  479. j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */
  480. switch (padding)
  481. {
  482. case RSA_PKCS1_PADDING:
  483. r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
  484. break;
  485. #ifndef OPENSSL_NO_SHA
  486.         case RSA_PKCS1_OAEP_PADDING:
  487.         r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0);
  488.                 break;
  489. #endif
  490.   case RSA_SSLV23_PADDING:
  491. r=RSA_padding_check_SSLv23(to,num,buf,j,num);
  492. break;
  493. case RSA_NO_PADDING:
  494. r=RSA_padding_check_none(to,num,buf,j,num);
  495. break;
  496. default:
  497. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
  498. goto err;
  499. }
  500. if (r < 0)
  501. RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
  502. err:
  503. if (ctx != NULL)
  504. {
  505. BN_CTX_end(ctx);
  506. BN_CTX_free(ctx);
  507. }
  508. if (buf != NULL)
  509. {
  510. OPENSSL_cleanse(buf,num);
  511. OPENSSL_free(buf);
  512. }
  513. return(r);
  514. }
  515. /* signature verification */
  516. static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
  517.      unsigned char *to, RSA *rsa, int padding)
  518. {
  519. BIGNUM *f,*ret;
  520. int i,num=0,r= -1;
  521. unsigned char *p;
  522. unsigned char *buf=NULL;
  523. BN_CTX *ctx=NULL;
  524. if((ctx = BN_CTX_new()) == NULL) goto err;
  525. BN_CTX_start(ctx);
  526. f = BN_CTX_get(ctx);
  527. ret = BN_CTX_get(ctx);
  528. num=BN_num_bytes(rsa->n);
  529. buf = OPENSSL_malloc(num);
  530. if(!f || !ret || !buf)
  531. {
  532. RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE);
  533. goto err;
  534. }
  535. /* This check was for equality but PGP does evil things
  536.  * and chops off the top '0' bytes */
  537. if (flen > num)
  538. {
  539. RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
  540. goto err;
  541. }
  542. if (BN_bin2bn(from,flen,f) == NULL) goto err;
  543. if (BN_ucmp(f, rsa->n) >= 0)
  544. {
  545. RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
  546. goto err;
  547. }
  548. MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
  549. if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
  550. rsa->_method_mod_n)) goto err;
  551. if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
  552. BN_sub(ret, rsa->n, ret);
  553. p=buf;
  554. i=BN_bn2bin(ret,p);
  555. switch (padding)
  556. {
  557. case RSA_PKCS1_PADDING:
  558. r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
  559. break;
  560. case RSA_X931_PADDING:
  561. r=RSA_padding_check_X931(to,num,buf,i,num);
  562. break;
  563. case RSA_NO_PADDING:
  564. r=RSA_padding_check_none(to,num,buf,i,num);
  565. break;
  566. default:
  567. RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
  568. goto err;
  569. }
  570. if (r < 0)
  571. RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
  572. err:
  573. if (ctx != NULL)
  574. {
  575. BN_CTX_end(ctx);
  576. BN_CTX_free(ctx);
  577. }
  578. if (buf != NULL)
  579. {
  580. OPENSSL_cleanse(buf,num);
  581. OPENSSL_free(buf);
  582. }
  583. return(r);
  584. }
  585. static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
  586. {
  587. BIGNUM *r1,*m1,*vrfy;
  588. BIGNUM local_dmp1, local_dmq1;
  589. BIGNUM *dmp1, *dmq1;
  590. int ret=0;
  591. BN_CTX_start(ctx);
  592. r1 = BN_CTX_get(ctx);
  593. m1 = BN_CTX_get(ctx);
  594. vrfy = BN_CTX_get(ctx);
  595. MONT_HELPER(rsa, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
  596. MONT_HELPER(rsa, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
  597. MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
  598. if (!BN_mod(r1,I,rsa->q,ctx)) goto err;
  599. if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
  600. {
  601. dmq1 = &local_dmq1;
  602. BN_with_flags(dmq1, rsa->dmq1, BN_FLG_EXP_CONSTTIME);
  603. }
  604. else
  605. dmq1 = rsa->dmq1;
  606. if (!rsa->meth->bn_mod_exp(m1,r1,dmq1,rsa->q,ctx,
  607. rsa->_method_mod_q)) goto err;
  608. if (!BN_mod(r1,I,rsa->p,ctx)) goto err;
  609. if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
  610. {
  611. dmp1 = &local_dmp1;
  612. BN_with_flags(dmp1, rsa->dmp1, BN_FLG_EXP_CONSTTIME);
  613. }
  614. else
  615. dmp1 = rsa->dmp1;
  616. if (!rsa->meth->bn_mod_exp(r0,r1,dmp1,rsa->p,ctx,
  617. rsa->_method_mod_p)) goto err;
  618. if (!BN_sub(r0,r0,m1)) goto err;
  619. /* This will help stop the size of r0 increasing, which does
  620.  * affect the multiply if it optimised for a power of 2 size */
  621. if (BN_is_negative(r0))
  622. if (!BN_add(r0,r0,rsa->p)) goto err;
  623. if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err;
  624. if (!BN_mod(r0,r1,rsa->p,ctx)) goto err;
  625. /* If p < q it is occasionally possible for the correction of
  626.          * adding 'p' if r0 is negative above to leave the result still
  627.  * negative. This can break the private key operations: the following
  628.  * second correction should *always* correct this rare occurrence.
  629.  * This will *never* happen with OpenSSL generated keys because
  630.          * they ensure p > q [steve]
  631.          */
  632. if (BN_is_negative(r0))
  633. if (!BN_add(r0,r0,rsa->p)) goto err;
  634. if (!BN_mul(r1,r0,rsa->q,ctx)) goto err;
  635. if (!BN_add(r0,r1,m1)) goto err;
  636. if (rsa->e && rsa->n)
  637. {
  638. if (!rsa->meth->bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err;
  639. /* If 'I' was greater than (or equal to) rsa->n, the operation
  640.  * will be equivalent to using 'I mod n'. However, the result of
  641.  * the verify will *always* be less than 'n' so we don't check
  642.  * for absolute equality, just congruency. */
  643. if (!BN_sub(vrfy, vrfy, I)) goto err;
  644. if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err;
  645. if (BN_is_negative(vrfy))
  646. if (!BN_add(vrfy, vrfy, rsa->n)) goto err;
  647. if (!BN_is_zero(vrfy))
  648. {
  649. /* 'I' and 'vrfy' aren't congruent mod n. Don't leak
  650.  * miscalculated CRT output, just do a raw (slower)
  651.  * mod_exp and return that instead. */
  652. BIGNUM local_d;
  653. BIGNUM *d = NULL;
  654. if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
  655. {
  656. d = &local_d;
  657. BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
  658. }
  659. else
  660. d = rsa->d;
  661. if (!rsa->meth->bn_mod_exp(r0,I,d,rsa->n,ctx,
  662.    rsa->_method_mod_n)) goto err;
  663. }
  664. }
  665. ret=1;
  666. err:
  667. BN_CTX_end(ctx);
  668. return(ret);
  669. }
  670. static int RSA_eay_init(RSA *rsa)
  671. {
  672. rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
  673. return(1);
  674. }
  675. static int RSA_eay_finish(RSA *rsa)
  676. {
  677. if (rsa->_method_mod_n != NULL)
  678. BN_MONT_CTX_free(rsa->_method_mod_n);
  679. if (rsa->_method_mod_p != NULL)
  680. BN_MONT_CTX_free(rsa->_method_mod_p);
  681. if (rsa->_method_mod_q != NULL)
  682. BN_MONT_CTX_free(rsa->_method_mod_q);
  683. return(1);
  684. }
  685. #endif