LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/bn - bn_blind.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 64 110 58.2 %
Date: 2015-10-10 Functions: 7 13 53.8 %

          Line data    Source code
       1             : /* crypto/bn/bn_blind.c */
       2             : /* ====================================================================
       3             :  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
       4             :  *
       5             :  * Redistribution and use in source and binary forms, with or without
       6             :  * modification, are permitted provided that the following conditions
       7             :  * are met:
       8             :  *
       9             :  * 1. Redistributions of source code must retain the above copyright
      10             :  *    notice, this list of conditions and the following disclaimer.
      11             :  *
      12             :  * 2. Redistributions in binary form must reproduce the above copyright
      13             :  *    notice, this list of conditions and the following disclaimer in
      14             :  *    the documentation and/or other materials provided with the
      15             :  *    distribution.
      16             :  *
      17             :  * 3. All advertising materials mentioning features or use of this
      18             :  *    software must display the following acknowledgment:
      19             :  *    "This product includes software developed by the OpenSSL Project
      20             :  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
      21             :  *
      22             :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      23             :  *    endorse or promote products derived from this software without
      24             :  *    prior written permission. For written permission, please contact
      25             :  *    openssl-core@openssl.org.
      26             :  *
      27             :  * 5. Products derived from this software may not be called "OpenSSL"
      28             :  *    nor may "OpenSSL" appear in their names without prior written
      29             :  *    permission of the OpenSSL Project.
      30             :  *
      31             :  * 6. Redistributions of any form whatsoever must retain the following
      32             :  *    acknowledgment:
      33             :  *    "This product includes software developed by the OpenSSL Project
      34             :  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
      35             :  *
      36             :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      37             :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      38             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      39             :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      40             :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      41             :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      42             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      43             :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      44             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      45             :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      46             :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      47             :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      48             :  * ====================================================================
      49             :  *
      50             :  * This product includes cryptographic software written by Eric Young
      51             :  * (eay@cryptsoft.com).  This product includes software written by Tim
      52             :  * Hudson (tjh@cryptsoft.com).
      53             :  *
      54             :  */
      55             : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
      56             :  * All rights reserved.
      57             :  *
      58             :  * This package is an SSL implementation written
      59             :  * by Eric Young (eay@cryptsoft.com).
      60             :  * The implementation was written so as to conform with Netscapes SSL.
      61             :  *
      62             :  * This library is free for commercial and non-commercial use as long as
      63             :  * the following conditions are aheared to.  The following conditions
      64             :  * apply to all code found in this distribution, be it the RC4, RSA,
      65             :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      66             :  * included with this distribution is covered by the same copyright terms
      67             :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      68             :  *
      69             :  * Copyright remains Eric Young's, and as such any Copyright notices in
      70             :  * the code are not to be removed.
      71             :  * If this package is used in a product, Eric Young should be given attribution
      72             :  * as the author of the parts of the library used.
      73             :  * This can be in the form of a textual message at program startup or
      74             :  * in documentation (online or textual) provided with the package.
      75             :  *
      76             :  * Redistribution and use in source and binary forms, with or without
      77             :  * modification, are permitted provided that the following conditions
      78             :  * are met:
      79             :  * 1. Redistributions of source code must retain the copyright
      80             :  *    notice, this list of conditions and the following disclaimer.
      81             :  * 2. Redistributions in binary form must reproduce the above copyright
      82             :  *    notice, this list of conditions and the following disclaimer in the
      83             :  *    documentation and/or other materials provided with the distribution.
      84             :  * 3. All advertising materials mentioning features or use of this software
      85             :  *    must display the following acknowledgement:
      86             :  *    "This product includes cryptographic software written by
      87             :  *     Eric Young (eay@cryptsoft.com)"
      88             :  *    The word 'cryptographic' can be left out if the rouines from the library
      89             :  *    being used are not cryptographic related :-).
      90             :  * 4. If you include any Windows specific code (or a derivative thereof) from
      91             :  *    the apps directory (application code) you must include an acknowledgement:
      92             :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      93             :  *
      94             :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      95             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      96             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      97             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      98             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      99             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     100             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     101             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     102             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     103             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     104             :  * SUCH DAMAGE.
     105             :  *
     106             :  * The licence and distribution terms for any publically available version or
     107             :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     108             :  * copied and put under another distribution licence
     109             :  * [including the GNU Public Licence.]
     110             :  */
     111             : 
     112             : #include <stdio.h>
     113             : #include "cryptlib.h"
     114             : #include "bn_lcl.h"
     115             : 
     116             : #define BN_BLINDING_COUNTER     32
     117             : 
     118             : struct bn_blinding_st {
     119             :     BIGNUM *A;
     120             :     BIGNUM *Ai;
     121             :     BIGNUM *e;
     122             :     BIGNUM *mod;                /* just a reference */
     123             : #ifndef OPENSSL_NO_DEPRECATED
     124             :     unsigned long thread_id;    /* added in OpenSSL 0.9.6j and 0.9.7b; used
     125             :                                  * only by crypto/rsa/rsa_eay.c, rsa_lib.c */
     126             : #endif
     127             :     CRYPTO_THREADID tid;
     128             :     int counter;
     129             :     unsigned long flags;
     130             :     BN_MONT_CTX *m_ctx;
     131             :     int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
     132             :                        const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
     133             : };
     134             : 
     135         345 : BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod)
     136             : {
     137             :     BN_BLINDING *ret = NULL;
     138             : 
     139             :     bn_check_top(mod);
     140             : 
     141         345 :     if ((ret = (BN_BLINDING *)OPENSSL_malloc(sizeof(BN_BLINDING))) == NULL) {
     142           0 :         BNerr(BN_F_BN_BLINDING_NEW, ERR_R_MALLOC_FAILURE);
     143           0 :         return (NULL);
     144             :     }
     145             :     memset(ret, 0, sizeof(BN_BLINDING));
     146         345 :     if (A != NULL) {
     147           0 :         if ((ret->A = BN_dup(A)) == NULL)
     148             :             goto err;
     149             :     }
     150         345 :     if (Ai != NULL) {
     151           0 :         if ((ret->Ai = BN_dup(Ai)) == NULL)
     152             :             goto err;
     153             :     }
     154             : 
     155             :     /* save a copy of mod in the BN_BLINDING structure */
     156         345 :     if ((ret->mod = BN_dup(mod)) == NULL)
     157             :         goto err;
     158         345 :     if (BN_get_flags(mod, BN_FLG_CONSTTIME) != 0)
     159         345 :         BN_set_flags(ret->mod, BN_FLG_CONSTTIME);
     160             : 
     161             :     /*
     162             :      * Set the counter to the special value -1 to indicate that this is
     163             :      * never-used fresh blinding that does not need updating before first
     164             :      * use.
     165             :      */
     166         345 :     ret->counter = -1;
     167         345 :     CRYPTO_THREADID_current(&ret->tid);
     168         345 :     return (ret);
     169             :  err:
     170           0 :     if (ret != NULL)
     171           0 :         BN_BLINDING_free(ret);
     172             :     return (NULL);
     173             : }
     174             : 
     175         345 : void BN_BLINDING_free(BN_BLINDING *r)
     176             : {
     177         345 :     if (r == NULL)
     178         345 :         return;
     179             : 
     180         345 :     if (r->A != NULL)
     181         345 :         BN_free(r->A);
     182         345 :     if (r->Ai != NULL)
     183         345 :         BN_free(r->Ai);
     184         345 :     if (r->e != NULL)
     185         345 :         BN_free(r->e);
     186         345 :     if (r->mod != NULL)
     187         345 :         BN_free(r->mod);
     188         345 :     OPENSSL_free(r);
     189             : }
     190             : 
     191          36 : int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx)
     192             : {
     193             :     int ret = 0;
     194             : 
     195          36 :     if ((b->A == NULL) || (b->Ai == NULL)) {
     196           0 :         BNerr(BN_F_BN_BLINDING_UPDATE, BN_R_NOT_INITIALIZED);
     197           0 :         goto err;
     198             :     }
     199             : 
     200          36 :     if (b->counter == -1)
     201           0 :         b->counter = 0;
     202             : 
     203          36 :     if (++b->counter == BN_BLINDING_COUNTER && b->e != NULL &&
     204           0 :         !(b->flags & BN_BLINDING_NO_RECREATE)) {
     205             :         /* re-create blinding parameters */
     206           0 :         if (!BN_BLINDING_create_param(b, NULL, NULL, ctx, NULL, NULL))
     207             :             goto err;
     208          36 :     } else if (!(b->flags & BN_BLINDING_NO_UPDATE)) {
     209          36 :         if (!BN_mod_mul(b->A, b->A, b->A, b->mod, ctx))
     210             :             goto err;
     211          36 :         if (!BN_mod_mul(b->Ai, b->Ai, b->Ai, b->mod, ctx))
     212             :             goto err;
     213             :     }
     214             : 
     215             :     ret = 1;
     216             :  err:
     217          36 :     if (b->counter == BN_BLINDING_COUNTER)
     218           0 :         b->counter = 0;
     219          36 :     return (ret);
     220             : }
     221             : 
     222           0 : int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx)
     223             : {
     224           0 :     return BN_BLINDING_convert_ex(n, NULL, b, ctx);
     225             : }
     226             : 
     227         381 : int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *ctx)
     228             : {
     229             :     int ret = 1;
     230             : 
     231             :     bn_check_top(n);
     232             : 
     233         381 :     if ((b->A == NULL) || (b->Ai == NULL)) {
     234           0 :         BNerr(BN_F_BN_BLINDING_CONVERT_EX, BN_R_NOT_INITIALIZED);
     235           0 :         return (0);
     236             :     }
     237             : 
     238         381 :     if (b->counter == -1)
     239             :         /* Fresh blinding, doesn't need updating. */
     240         345 :         b->counter = 0;
     241          36 :     else if (!BN_BLINDING_update(b, ctx))
     242             :         return (0);
     243             : 
     244         381 :     if (r != NULL) {
     245           0 :         if (!BN_copy(r, b->Ai))
     246             :             ret = 0;
     247             :     }
     248             : 
     249         381 :     if (!BN_mod_mul(n, n, b->A, b->mod, ctx))
     250             :         ret = 0;
     251             : 
     252         381 :     return ret;
     253             : }
     254             : 
     255           0 : int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx)
     256             : {
     257           0 :     return BN_BLINDING_invert_ex(n, NULL, b, ctx);
     258             : }
     259             : 
     260         381 : int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b,
     261             :                           BN_CTX *ctx)
     262             : {
     263             :     int ret;
     264             : 
     265             :     bn_check_top(n);
     266             : 
     267         381 :     if (r != NULL)
     268           0 :         ret = BN_mod_mul(n, n, r, b->mod, ctx);
     269             :     else {
     270         381 :         if (b->Ai == NULL) {
     271           0 :             BNerr(BN_F_BN_BLINDING_INVERT_EX, BN_R_NOT_INITIALIZED);
     272           0 :             return (0);
     273             :         }
     274         381 :         ret = BN_mod_mul(n, n, b->Ai, b->mod, ctx);
     275             :     }
     276             : 
     277             :     bn_check_top(n);
     278         381 :     return (ret);
     279             : }
     280             : 
     281             : #ifndef OPENSSL_NO_DEPRECATED
     282           0 : unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *b)
     283             : {
     284           0 :     return b->thread_id;
     285             : }
     286             : 
     287           0 : void BN_BLINDING_set_thread_id(BN_BLINDING *b, unsigned long n)
     288             : {
     289           0 :     b->thread_id = n;
     290           0 : }
     291             : #endif
     292             : 
     293         726 : CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *b)
     294             : {
     295         726 :     return &b->tid;
     296             : }
     297             : 
     298           0 : unsigned long BN_BLINDING_get_flags(const BN_BLINDING *b)
     299             : {
     300           0 :     return b->flags;
     301             : }
     302             : 
     303           0 : void BN_BLINDING_set_flags(BN_BLINDING *b, unsigned long flags)
     304             : {
     305           0 :     b->flags = flags;
     306           0 : }
     307             : 
     308         345 : BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b,
     309             :                                       const BIGNUM *e, BIGNUM *m, BN_CTX *ctx,
     310             :                                       int (*bn_mod_exp) (BIGNUM *r,
     311             :                                                          const BIGNUM *a,
     312             :                                                          const BIGNUM *p,
     313             :                                                          const BIGNUM *m,
     314             :                                                          BN_CTX *ctx,
     315             :                                                          BN_MONT_CTX *m_ctx),
     316             :                                       BN_MONT_CTX *m_ctx)
     317             : {
     318             :     int retry_counter = 32;
     319             :     BN_BLINDING *ret = NULL;
     320             : 
     321         345 :     if (b == NULL)
     322         345 :         ret = BN_BLINDING_new(NULL, NULL, m);
     323             :     else
     324             :         ret = b;
     325             : 
     326         345 :     if (ret == NULL)
     327             :         goto err;
     328             : 
     329         345 :     if (ret->A == NULL && (ret->A = BN_new()) == NULL)
     330             :         goto err;
     331         345 :     if (ret->Ai == NULL && (ret->Ai = BN_new()) == NULL)
     332             :         goto err;
     333             : 
     334         345 :     if (e != NULL) {
     335         345 :         if (ret->e != NULL)
     336           0 :             BN_free(ret->e);
     337         345 :         ret->e = BN_dup(e);
     338             :     }
     339         345 :     if (ret->e == NULL)
     340             :         goto err;
     341             : 
     342         345 :     if (bn_mod_exp != NULL)
     343         345 :         ret->bn_mod_exp = bn_mod_exp;
     344         345 :     if (m_ctx != NULL)
     345           0 :         ret->m_ctx = m_ctx;
     346             : 
     347             :     do {
     348         345 :         if (!BN_rand_range(ret->A, ret->mod))
     349             :             goto err;
     350         345 :         if (BN_mod_inverse(ret->Ai, ret->A, ret->mod, ctx) == NULL) {
     351             :             /*
     352             :              * this should almost never happen for good RSA keys
     353             :              */
     354           0 :             unsigned long error = ERR_peek_last_error();
     355           0 :             if (ERR_GET_REASON(error) == BN_R_NO_INVERSE) {
     356           0 :                 if (retry_counter-- == 0) {
     357           0 :                     BNerr(BN_F_BN_BLINDING_CREATE_PARAM,
     358             :                           BN_R_TOO_MANY_ITERATIONS);
     359           0 :                     goto err;
     360             :                 }
     361           0 :                 ERR_clear_error();
     362             :             } else
     363             :                 goto err;
     364             :         } else
     365             :             break;
     366           0 :     } while (1);
     367             : 
     368         345 :     if (ret->bn_mod_exp != NULL && ret->m_ctx != NULL) {
     369           0 :         if (!ret->bn_mod_exp
     370           0 :             (ret->A, ret->A, ret->e, ret->mod, ctx, ret->m_ctx))
     371             :             goto err;
     372             :     } else {
     373         345 :         if (!BN_mod_exp(ret->A, ret->A, ret->e, ret->mod, ctx))
     374             :             goto err;
     375             :     }
     376             : 
     377         345 :     return ret;
     378             :  err:
     379           0 :     if (b == NULL && ret != NULL) {
     380           0 :         BN_BLINDING_free(ret);
     381             :         ret = NULL;
     382             :     }
     383             : 
     384           0 :     return ret;
     385             : }

Generated by: LCOV version 1.10