LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/rsa - rsa_lib.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 66 138 47.8 %
Date: 2015-10-10 Functions: 4 12 33.3 %

          Line data    Source code
       1             : /* crypto/rsa/rsa_lib.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             : #include <stdio.h>
      60             : #include <openssl/crypto.h>
      61             : #include "cryptlib.h"
      62             : #include <openssl/lhash.h>
      63             : #include <openssl/bn.h>
      64             : #include <openssl/rsa.h>
      65             : #include <openssl/rand.h>
      66             : #ifndef OPENSSL_NO_ENGINE
      67             : # include <openssl/engine.h>
      68             : #endif
      69             : 
      70             : #ifdef OPENSSL_FIPS
      71             : # include <openssl/fips.h>
      72             : #endif
      73             : 
      74             : const char RSA_version[] = "RSA" OPENSSL_VERSION_PTEXT;
      75             : 
      76             : static const RSA_METHOD *default_RSA_meth = NULL;
      77             : 
      78        1592 : RSA *RSA_new(void)
      79             : {
      80        1592 :     RSA *r = RSA_new_method(NULL);
      81             : 
      82        1592 :     return r;
      83             : }
      84             : 
      85           0 : void RSA_set_default_method(const RSA_METHOD *meth)
      86             : {
      87           0 :     default_RSA_meth = meth;
      88           0 : }
      89             : 
      90           0 : const RSA_METHOD *RSA_get_default_method(void)
      91             : {
      92        1592 :     if (default_RSA_meth == NULL) {
      93             : #ifdef OPENSSL_FIPS
      94             :         if (FIPS_mode())
      95             :             return FIPS_rsa_pkcs1_ssleay();
      96             :         else
      97             :             return RSA_PKCS1_SSLeay();
      98             : #else
      99             : # ifdef RSA_NULL
     100             :         default_RSA_meth = RSA_null_method();
     101             : # else
     102         124 :         default_RSA_meth = RSA_PKCS1_SSLeay();
     103             : # endif
     104             : #endif
     105             :     }
     106             : 
     107        1592 :     return default_RSA_meth;
     108             : }
     109             : 
     110           0 : const RSA_METHOD *RSA_get_method(const RSA *rsa)
     111             : {
     112           0 :     return rsa->meth;
     113             : }
     114             : 
     115           0 : int RSA_set_method(RSA *rsa, const RSA_METHOD *meth)
     116             : {
     117             :     /*
     118             :      * NB: The caller is specifically setting a method, so it's not up to us
     119             :      * to deal with which ENGINE it comes from.
     120             :      */
     121             :     const RSA_METHOD *mtmp;
     122           0 :     mtmp = rsa->meth;
     123           0 :     if (mtmp->finish)
     124           0 :         mtmp->finish(rsa);
     125             : #ifndef OPENSSL_NO_ENGINE
     126           0 :     if (rsa->engine) {
     127           0 :         ENGINE_finish(rsa->engine);
     128           0 :         rsa->engine = NULL;
     129             :     }
     130             : #endif
     131           0 :     rsa->meth = meth;
     132           0 :     if (meth->init)
     133           0 :         meth->init(rsa);
     134           0 :     return 1;
     135             : }
     136             : 
     137        1592 : RSA *RSA_new_method(ENGINE *engine)
     138             : {
     139             :     RSA *ret;
     140             : 
     141        1592 :     ret = (RSA *)OPENSSL_malloc(sizeof(RSA));
     142        1592 :     if (ret == NULL) {
     143           0 :         RSAerr(RSA_F_RSA_NEW_METHOD, ERR_R_MALLOC_FAILURE);
     144           0 :         return NULL;
     145             :     }
     146             : 
     147        1592 :     ret->meth = RSA_get_default_method();
     148             : #ifndef OPENSSL_NO_ENGINE
     149        1592 :     if (engine) {
     150           0 :         if (!ENGINE_init(engine)) {
     151           0 :             RSAerr(RSA_F_RSA_NEW_METHOD, ERR_R_ENGINE_LIB);
     152           0 :             OPENSSL_free(ret);
     153           0 :             return NULL;
     154             :         }
     155           0 :         ret->engine = engine;
     156             :     } else
     157        1592 :         ret->engine = ENGINE_get_default_RSA();
     158        1592 :     if (ret->engine) {
     159           0 :         ret->meth = ENGINE_get_RSA(ret->engine);
     160           0 :         if (!ret->meth) {
     161           0 :             RSAerr(RSA_F_RSA_NEW_METHOD, ERR_R_ENGINE_LIB);
     162           0 :             ENGINE_finish(ret->engine);
     163           0 :             OPENSSL_free(ret);
     164           0 :             return NULL;
     165             :         }
     166             :     }
     167             : #endif
     168             : 
     169        1592 :     ret->pad = 0;
     170        1592 :     ret->version = 0;
     171        1592 :     ret->n = NULL;
     172        1592 :     ret->e = NULL;
     173        1592 :     ret->d = NULL;
     174        1592 :     ret->p = NULL;
     175        1592 :     ret->q = NULL;
     176        1592 :     ret->dmp1 = NULL;
     177        1592 :     ret->dmq1 = NULL;
     178        1592 :     ret->iqmp = NULL;
     179        1592 :     ret->references = 1;
     180        1592 :     ret->_method_mod_n = NULL;
     181        1592 :     ret->_method_mod_p = NULL;
     182        1592 :     ret->_method_mod_q = NULL;
     183        1592 :     ret->blinding = NULL;
     184        1592 :     ret->mt_blinding = NULL;
     185        1592 :     ret->bignum_data = NULL;
     186        1592 :     ret->flags = ret->meth->flags & ~RSA_FLAG_NON_FIPS_ALLOW;
     187        1592 :     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data)) {
     188             : #ifndef OPENSSL_NO_ENGINE
     189           0 :         if (ret->engine)
     190           0 :             ENGINE_finish(ret->engine);
     191             : #endif
     192           0 :         OPENSSL_free(ret);
     193           0 :         return (NULL);
     194             :     }
     195             : 
     196        1592 :     if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
     197             : #ifndef OPENSSL_NO_ENGINE
     198           0 :         if (ret->engine)
     199           0 :             ENGINE_finish(ret->engine);
     200             : #endif
     201           0 :         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data);
     202           0 :         OPENSSL_free(ret);
     203             :         ret = NULL;
     204             :     }
     205        1592 :     return (ret);
     206             : }
     207             : 
     208        1617 : void RSA_free(RSA *r)
     209             : {
     210             :     int i;
     211             : 
     212        1617 :     if (r == NULL)
     213             :         return;
     214             : 
     215        1617 :     i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_RSA);
     216             : #ifdef REF_PRINT
     217             :     REF_PRINT("RSA", r);
     218             : #endif
     219        1617 :     if (i > 0)
     220             :         return;
     221             : #ifdef REF_CHECK
     222             :     if (i < 0) {
     223             :         fprintf(stderr, "RSA_free, bad reference count\n");
     224             :         abort();
     225             :     }
     226             : #endif
     227             : 
     228        1592 :     if (r->meth->finish)
     229        1592 :         r->meth->finish(r);
     230             : #ifndef OPENSSL_NO_ENGINE
     231        1592 :     if (r->engine)
     232           0 :         ENGINE_finish(r->engine);
     233             : #endif
     234             : 
     235        1592 :     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, r, &r->ex_data);
     236             : 
     237        1592 :     if (r->n != NULL)
     238        1592 :         BN_clear_free(r->n);
     239        1592 :     if (r->e != NULL)
     240        1592 :         BN_clear_free(r->e);
     241        1592 :     if (r->d != NULL)
     242         450 :         BN_clear_free(r->d);
     243        1592 :     if (r->p != NULL)
     244         450 :         BN_clear_free(r->p);
     245        1592 :     if (r->q != NULL)
     246         450 :         BN_clear_free(r->q);
     247        1592 :     if (r->dmp1 != NULL)
     248         450 :         BN_clear_free(r->dmp1);
     249        1592 :     if (r->dmq1 != NULL)
     250         450 :         BN_clear_free(r->dmq1);
     251        1592 :     if (r->iqmp != NULL)
     252         450 :         BN_clear_free(r->iqmp);
     253        1592 :     if (r->blinding != NULL)
     254         345 :         BN_BLINDING_free(r->blinding);
     255        1592 :     if (r->mt_blinding != NULL)
     256           0 :         BN_BLINDING_free(r->mt_blinding);
     257        1592 :     if (r->bignum_data != NULL)
     258           0 :         OPENSSL_free_locked(r->bignum_data);
     259        1592 :     OPENSSL_free(r);
     260             : }
     261             : 
     262          25 : int RSA_up_ref(RSA *r)
     263             : {
     264          25 :     int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA);
     265             : #ifdef REF_PRINT
     266             :     REF_PRINT("RSA", r);
     267             : #endif
     268             : #ifdef REF_CHECK
     269             :     if (i < 2) {
     270             :         fprintf(stderr, "RSA_up_ref, bad reference count\n");
     271             :         abort();
     272             :     }
     273             : #endif
     274          25 :     return ((i > 1) ? 1 : 0);
     275             : }
     276             : 
     277           0 : int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
     278             :                          CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
     279             : {
     280           0 :     return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, argl, argp,
     281             :                                    new_func, dup_func, free_func);
     282             : }
     283             : 
     284           0 : int RSA_set_ex_data(RSA *r, int idx, void *arg)
     285             : {
     286           0 :     return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
     287             : }
     288             : 
     289           0 : void *RSA_get_ex_data(const RSA *r, int idx)
     290             : {
     291           0 :     return (CRYPTO_get_ex_data(&r->ex_data, idx));
     292             : }
     293             : 
     294           0 : int RSA_memory_lock(RSA *r)
     295             : {
     296             :     int i, j, k, off;
     297             :     char *p;
     298             :     BIGNUM *bn, **t[6], *b;
     299             :     BN_ULONG *ul;
     300             : 
     301           0 :     if (r->d == NULL)
     302             :         return (1);
     303           0 :     t[0] = &r->d;
     304           0 :     t[1] = &r->p;
     305           0 :     t[2] = &r->q;
     306           0 :     t[3] = &r->dmp1;
     307           0 :     t[4] = &r->dmq1;
     308           0 :     t[5] = &r->iqmp;
     309             :     k = sizeof(BIGNUM) * 6;
     310             :     off = k / sizeof(BN_ULONG) + 1;
     311             :     j = 1;
     312           0 :     for (i = 0; i < 6; i++)
     313           0 :         j += (*t[i])->top;
     314           0 :     if ((p = OPENSSL_malloc_locked((off + j) * sizeof(BN_ULONG))) == NULL) {
     315           0 :         RSAerr(RSA_F_RSA_MEMORY_LOCK, ERR_R_MALLOC_FAILURE);
     316           0 :         return (0);
     317             :     }
     318             :     bn = (BIGNUM *)p;
     319           0 :     ul = (BN_ULONG *)&(p[off]);
     320           0 :     for (i = 0; i < 6; i++) {
     321           0 :         b = *(t[i]);
     322           0 :         *(t[i]) = &(bn[i]);
     323             :         memcpy((char *)&(bn[i]), (char *)b, sizeof(BIGNUM));
     324           0 :         bn[i].flags = BN_FLG_STATIC_DATA;
     325           0 :         bn[i].d = ul;
     326           0 :         memcpy((char *)ul, b->d, sizeof(BN_ULONG) * b->top);
     327           0 :         ul += b->top;
     328           0 :         BN_clear_free(b);
     329             :     }
     330             : 
     331             :     /* I should fix this so it can still be done */
     332           0 :     r->flags &= ~(RSA_FLAG_CACHE_PRIVATE | RSA_FLAG_CACHE_PUBLIC);
     333             : 
     334           0 :     r->bignum_data = p;
     335           0 :     return (1);
     336             : }

Generated by: LCOV version 1.10