diff options
Diffstat (limited to 'thirdparty/mbedtls/library/rsa.c')
| -rw-r--r-- | thirdparty/mbedtls/library/rsa.c | 72 | 
1 files changed, 61 insertions, 11 deletions
| diff --git a/thirdparty/mbedtls/library/rsa.c b/thirdparty/mbedtls/library/rsa.c index 09fd379fdb..a25c633bc6 100644 --- a/thirdparty/mbedtls/library/rsa.c +++ b/thirdparty/mbedtls/library/rsa.c @@ -1,8 +1,14 @@  /*   *  The RSA public-key cryptosystem   * - *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - *  SPDX-License-Identifier: Apache-2.0 + *  Copyright The Mbed TLS Contributors + *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + *  This file is provided under the Apache License 2.0, or the + *  GNU General Public License v2.0 or later. + * + *  ********** + *  Apache License 2.0:   *   *  Licensed under the Apache License, Version 2.0 (the "License"); you may   *  not use this file except in compliance with the License. @@ -16,7 +22,26 @@   *  See the License for the specific language governing permissions and   *  limitations under the License.   * - *  This file is part of mbed TLS (https://tls.mbed.org) + *  ********** + * + *  ********** + *  GNU General Public License v2.0 or later: + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License along + *  with this program; if not, write to the Free Software Foundation, Inc., + *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + *  **********   */  /* @@ -56,7 +81,7 @@  #include "mbedtls/md.h"  #endif -#if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) +#if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) && !defined(__NetBSD__)  #include <stdlib.h>  #endif @@ -781,6 +806,9 @@ static int rsa_prepare_blinding( mbedtls_rsa_context *ctx,                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )  {      int ret, count = 0; +    mbedtls_mpi R; + +    mbedtls_mpi_init( &R );      if( ctx->Vf.p != NULL )      { @@ -796,18 +824,40 @@ static int rsa_prepare_blinding( mbedtls_rsa_context *ctx,      /* Unblinding value: Vf = random number, invertible mod N */      do {          if( count++ > 10 ) -            return( MBEDTLS_ERR_RSA_RNG_FAILED ); +        { +            ret = MBEDTLS_ERR_RSA_RNG_FAILED; +            goto cleanup; +        }          MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) ); -        MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) ); -    } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 ); -    /* Blinding value: Vi =  Vf^(-e) mod N */ -    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) ); +        /* Compute Vf^-1 as R * (R Vf)^-1 to avoid leaks from inv_mod. */ +        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, ctx->len - 1, f_rng, p_rng ) ); +        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vf, &R ) ); +        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) ); + +        /* At this point, Vi is invertible mod N if and only if both Vf and R +         * are invertible mod N. If one of them isn't, we don't need to know +         * which one, we just loop and choose new values for both of them. +         * (Each iteration succeeds with overwhelming probability.) */ +        ret = mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vi, &ctx->N ); +        if( ret != 0 && ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) +            goto cleanup; + +    } while( ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); + +    /* Finish the computation of Vf^-1 = R * (R Vf)^-1 */ +    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &R ) ); +    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) ); + +    /* Blinding value: Vi = Vf^(-e) mod N +     * (Vi already contains Vf^-1 at this point) */      MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) );  cleanup: +    mbedtls_mpi_free( &R ); +      return( ret );  } @@ -2563,7 +2613,7 @@ void mbedtls_rsa_free( mbedtls_rsa_context *ctx )  #if defined(MBEDTLS_PKCS1_V15)  static int myrand( void *rng_state, unsigned char *output, size_t len )  { -#if !defined(__OpenBSD__) +#if !defined(__OpenBSD__) && !defined(__NetBSD__)      size_t i;      if( rng_state != NULL ) @@ -2576,7 +2626,7 @@ static int myrand( void *rng_state, unsigned char *output, size_t len )          rng_state = NULL;      arc4random_buf( output, len ); -#endif /* !OpenBSD */ +#endif /* !OpenBSD && !NetBSD */      return( 0 );  } |