Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
rsa.c
00001 /* 00002 * The RSA public-key cryptosystem 00003 * 00004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 00005 * SPDX-License-Identifier: Apache-2.0 00006 * 00007 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00008 * not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00015 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * See the License for the specific language governing permissions and 00017 * limitations under the License. 00018 * 00019 * This file is part of mbed TLS (https://tls.mbed.org) 00020 */ 00021 00022 /* 00023 * The following sources were referenced in the design of this implementation 00024 * of the RSA algorithm: 00025 * 00026 * [1] A method for obtaining digital signatures and public-key cryptosystems 00027 * R Rivest, A Shamir, and L Adleman 00028 * http://people.csail.mit.edu/rivest/pubs.html#RSA78 00029 * 00030 * [2] Handbook of Applied Cryptography - 1997, Chapter 8 00031 * Menezes, van Oorschot and Vanstone 00032 * 00033 * [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks 00034 * Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and 00035 * Stefan Mangard 00036 * https://arxiv.org/abs/1702.08719v2 00037 * 00038 */ 00039 00040 #if !defined(MBEDTLS_CONFIG_FILE) 00041 #include "mbedtls/config.h" 00042 #else 00043 #include MBEDTLS_CONFIG_FILE 00044 #endif 00045 00046 #if defined(MBEDTLS_RSA_C) 00047 00048 #include "mbedtls/rsa.h" 00049 #include "mbedtls/rsa_internal.h" 00050 #include "mbedtls/oid.h" 00051 00052 #include <string.h> 00053 00054 #if defined(MBEDTLS_PKCS1_V21) 00055 #include "mbedtls/md.h" 00056 #endif 00057 00058 #if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) 00059 #include <stdlib.h> 00060 #endif 00061 00062 #if defined(MBEDTLS_PLATFORM_C) 00063 #include "mbedtls/platform.h" 00064 #else 00065 #include <stdio.h> 00066 #define mbedtls_printf printf 00067 #define mbedtls_calloc calloc 00068 #define mbedtls_free free 00069 #endif 00070 00071 #if !defined(MBEDTLS_RSA_ALT) 00072 00073 /* Implementation that should never be optimized out by the compiler */ 00074 static void mbedtls_zeroize( void *v, size_t n ) { 00075 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0; 00076 } 00077 00078 /* constant-time buffer comparison */ 00079 static inline int mbedtls_safer_memcmp( const void *a, const void *b, size_t n ) 00080 { 00081 size_t i; 00082 const unsigned char *A = (const unsigned char *) a; 00083 const unsigned char *B = (const unsigned char *) b; 00084 unsigned char diff = 0; 00085 00086 for( i = 0; i < n; i++ ) 00087 diff |= A[i] ^ B[i]; 00088 00089 return( diff ); 00090 } 00091 00092 int mbedtls_rsa_import( mbedtls_rsa_context *ctx, 00093 const mbedtls_mpi *N, 00094 const mbedtls_mpi *P, const mbedtls_mpi *Q, 00095 const mbedtls_mpi *D, const mbedtls_mpi *E ) 00096 { 00097 int ret; 00098 00099 if( ( N != NULL && ( ret = mbedtls_mpi_copy( &ctx->N , N ) ) != 0 ) || 00100 ( P != NULL && ( ret = mbedtls_mpi_copy( &ctx->P , P ) ) != 0 ) || 00101 ( Q != NULL && ( ret = mbedtls_mpi_copy( &ctx->Q , Q ) ) != 0 ) || 00102 ( D != NULL && ( ret = mbedtls_mpi_copy( &ctx->D , D ) ) != 0 ) || 00103 ( E != NULL && ( ret = mbedtls_mpi_copy( &ctx->E , E ) ) != 0 ) ) 00104 { 00105 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00106 } 00107 00108 if( N != NULL ) 00109 ctx->len = mbedtls_mpi_size( &ctx->N ); 00110 00111 return( 0 ); 00112 } 00113 00114 int mbedtls_rsa_import_raw( mbedtls_rsa_context *ctx, 00115 unsigned char const *N, size_t N_len, 00116 unsigned char const *P, size_t P_len, 00117 unsigned char const *Q, size_t Q_len, 00118 unsigned char const *D, size_t D_len, 00119 unsigned char const *E, size_t E_len ) 00120 { 00121 int ret = 0; 00122 00123 if( N != NULL ) 00124 { 00125 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->N , N, N_len ) ); 00126 ctx->len = mbedtls_mpi_size( &ctx->N ); 00127 } 00128 00129 if( P != NULL ) 00130 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->P , P, P_len ) ); 00131 00132 if( Q != NULL ) 00133 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->Q , Q, Q_len ) ); 00134 00135 if( D != NULL ) 00136 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->D , D, D_len ) ); 00137 00138 if( E != NULL ) 00139 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->E , E, E_len ) ); 00140 00141 cleanup: 00142 00143 if( ret != 0 ) 00144 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00145 00146 return( 0 ); 00147 } 00148 00149 /* 00150 * Checks whether the context fields are set in such a way 00151 * that the RSA primitives will be able to execute without error. 00152 * It does *not* make guarantees for consistency of the parameters. 00153 */ 00154 static int rsa_check_context( mbedtls_rsa_context const *ctx, int is_priv, 00155 int blinding_needed ) 00156 { 00157 #if !defined(MBEDTLS_RSA_NO_CRT) 00158 /* blinding_needed is only used for NO_CRT to decide whether 00159 * P,Q need to be present or not. */ 00160 ((void) blinding_needed); 00161 #endif 00162 00163 if( ctx->len != mbedtls_mpi_size( &ctx->N ) || 00164 ctx->len > MBEDTLS_MPI_MAX_SIZE ) 00165 { 00166 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00167 } 00168 00169 /* 00170 * 1. Modular exponentiation needs positive, odd moduli. 00171 */ 00172 00173 /* Modular exponentiation wrt. N is always used for 00174 * RSA public key operations. */ 00175 if( mbedtls_mpi_cmp_int( &ctx->N , 0 ) <= 0 || 00176 mbedtls_mpi_get_bit( &ctx->N , 0 ) == 0 ) 00177 { 00178 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00179 } 00180 00181 #if !defined(MBEDTLS_RSA_NO_CRT) 00182 /* Modular exponentiation for P and Q is only 00183 * used for private key operations and if CRT 00184 * is used. */ 00185 if( is_priv && 00186 ( mbedtls_mpi_cmp_int( &ctx->P , 0 ) <= 0 || 00187 mbedtls_mpi_get_bit( &ctx->P , 0 ) == 0 || 00188 mbedtls_mpi_cmp_int( &ctx->Q , 0 ) <= 0 || 00189 mbedtls_mpi_get_bit( &ctx->Q , 0 ) == 0 ) ) 00190 { 00191 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00192 } 00193 #endif /* !MBEDTLS_RSA_NO_CRT */ 00194 00195 /* 00196 * 2. Exponents must be positive 00197 */ 00198 00199 /* Always need E for public key operations */ 00200 if( mbedtls_mpi_cmp_int( &ctx->E , 0 ) <= 0 ) 00201 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00202 00203 #if defined(MBEDTLS_RSA_NO_CRT) 00204 /* For private key operations, use D or DP & DQ 00205 * as (unblinded) exponents. */ 00206 if( is_priv && mbedtls_mpi_cmp_int( &ctx->D , 0 ) <= 0 ) 00207 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00208 #else 00209 if( is_priv && 00210 ( mbedtls_mpi_cmp_int( &ctx->DP , 0 ) <= 0 || 00211 mbedtls_mpi_cmp_int( &ctx->DQ , 0 ) <= 0 ) ) 00212 { 00213 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00214 } 00215 #endif /* MBEDTLS_RSA_NO_CRT */ 00216 00217 /* Blinding shouldn't make exponents negative either, 00218 * so check that P, Q >= 1 if that hasn't yet been 00219 * done as part of 1. */ 00220 #if defined(MBEDTLS_RSA_NO_CRT) 00221 if( is_priv && blinding_needed && 00222 ( mbedtls_mpi_cmp_int( &ctx->P , 0 ) <= 0 || 00223 mbedtls_mpi_cmp_int( &ctx->Q , 0 ) <= 0 ) ) 00224 { 00225 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00226 } 00227 #endif 00228 00229 /* It wouldn't lead to an error if it wasn't satisfied, 00230 * but check for QP >= 1 nonetheless. */ 00231 #if !defined(MBEDTLS_RSA_NO_CRT) 00232 if( is_priv && 00233 mbedtls_mpi_cmp_int( &ctx->QP , 0 ) <= 0 ) 00234 { 00235 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00236 } 00237 #endif 00238 00239 return( 0 ); 00240 } 00241 00242 int mbedtls_rsa_complete( mbedtls_rsa_context *ctx ) 00243 { 00244 int ret = 0; 00245 00246 const int have_N = ( mbedtls_mpi_cmp_int( &ctx->N , 0 ) != 0 ); 00247 const int have_P = ( mbedtls_mpi_cmp_int( &ctx->P , 0 ) != 0 ); 00248 const int have_Q = ( mbedtls_mpi_cmp_int( &ctx->Q , 0 ) != 0 ); 00249 const int have_D = ( mbedtls_mpi_cmp_int( &ctx->D , 0 ) != 0 ); 00250 const int have_E = ( mbedtls_mpi_cmp_int( &ctx->E , 0 ) != 0 ); 00251 00252 /* 00253 * Check whether provided parameters are enough 00254 * to deduce all others. The following incomplete 00255 * parameter sets for private keys are supported: 00256 * 00257 * (1) P, Q missing. 00258 * (2) D and potentially N missing. 00259 * 00260 */ 00261 00262 const int n_missing = have_P && have_Q && have_D && have_E; 00263 const int pq_missing = have_N && !have_P && !have_Q && have_D && have_E; 00264 const int d_missing = have_P && have_Q && !have_D && have_E; 00265 const int is_pub = have_N && !have_P && !have_Q && !have_D && have_E; 00266 00267 /* These three alternatives are mutually exclusive */ 00268 const int is_priv = n_missing || pq_missing || d_missing; 00269 00270 if( !is_priv && !is_pub ) 00271 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00272 00273 /* 00274 * Step 1: Deduce N if P, Q are provided. 00275 */ 00276 00277 if( !have_N && have_P && have_Q ) 00278 { 00279 if( ( ret = mbedtls_mpi_mul_mpi( &ctx->N , &ctx->P , 00280 &ctx->Q ) ) != 0 ) 00281 { 00282 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00283 } 00284 00285 ctx->len = mbedtls_mpi_size( &ctx->N ); 00286 } 00287 00288 /* 00289 * Step 2: Deduce and verify all remaining core parameters. 00290 */ 00291 00292 if( pq_missing ) 00293 { 00294 ret = mbedtls_rsa_deduce_primes( &ctx->N , &ctx->E , &ctx->D , 00295 &ctx->P , &ctx->Q ); 00296 if( ret != 0 ) 00297 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00298 00299 } 00300 else if( d_missing ) 00301 { 00302 if( ( ret = mbedtls_rsa_deduce_private_exponent( &ctx->P , 00303 &ctx->Q , 00304 &ctx->E , 00305 &ctx->D ) ) != 0 ) 00306 { 00307 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00308 } 00309 } 00310 00311 /* 00312 * Step 3: Deduce all additional parameters specific 00313 * to our current RSA implementation. 00314 */ 00315 00316 #if !defined(MBEDTLS_RSA_NO_CRT) 00317 if( is_priv ) 00318 { 00319 ret = mbedtls_rsa_deduce_crt( &ctx->P , &ctx->Q , &ctx->D , 00320 &ctx->DP , &ctx->DQ , &ctx->QP ); 00321 if( ret != 0 ) 00322 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00323 } 00324 #endif /* MBEDTLS_RSA_NO_CRT */ 00325 00326 /* 00327 * Step 3: Basic sanity checks 00328 */ 00329 00330 return( rsa_check_context( ctx, is_priv, 1 ) ); 00331 } 00332 00333 int mbedtls_rsa_export_raw( const mbedtls_rsa_context *ctx, 00334 unsigned char *N, size_t N_len, 00335 unsigned char *P, size_t P_len, 00336 unsigned char *Q, size_t Q_len, 00337 unsigned char *D, size_t D_len, 00338 unsigned char *E, size_t E_len ) 00339 { 00340 int ret = 0; 00341 00342 /* Check if key is private or public */ 00343 const int is_priv = 00344 mbedtls_mpi_cmp_int( &ctx->N , 0 ) != 0 && 00345 mbedtls_mpi_cmp_int( &ctx->P , 0 ) != 0 && 00346 mbedtls_mpi_cmp_int( &ctx->Q , 0 ) != 0 && 00347 mbedtls_mpi_cmp_int( &ctx->D , 0 ) != 0 && 00348 mbedtls_mpi_cmp_int( &ctx->E , 0 ) != 0; 00349 00350 if( !is_priv ) 00351 { 00352 /* If we're trying to export private parameters for a public key, 00353 * something must be wrong. */ 00354 if( P != NULL || Q != NULL || D != NULL ) 00355 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00356 00357 } 00358 00359 if( N != NULL ) 00360 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->N , N, N_len ) ); 00361 00362 if( P != NULL ) 00363 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->P , P, P_len ) ); 00364 00365 if( Q != NULL ) 00366 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->Q , Q, Q_len ) ); 00367 00368 if( D != NULL ) 00369 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->D , D, D_len ) ); 00370 00371 if( E != NULL ) 00372 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->E , E, E_len ) ); 00373 00374 cleanup: 00375 00376 return( ret ); 00377 } 00378 00379 int mbedtls_rsa_export( const mbedtls_rsa_context *ctx, 00380 mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, 00381 mbedtls_mpi *D, mbedtls_mpi *E ) 00382 { 00383 int ret; 00384 00385 /* Check if key is private or public */ 00386 int is_priv = 00387 mbedtls_mpi_cmp_int( &ctx->N , 0 ) != 0 && 00388 mbedtls_mpi_cmp_int( &ctx->P , 0 ) != 0 && 00389 mbedtls_mpi_cmp_int( &ctx->Q , 0 ) != 0 && 00390 mbedtls_mpi_cmp_int( &ctx->D , 0 ) != 0 && 00391 mbedtls_mpi_cmp_int( &ctx->E , 0 ) != 0; 00392 00393 if( !is_priv ) 00394 { 00395 /* If we're trying to export private parameters for a public key, 00396 * something must be wrong. */ 00397 if( P != NULL || Q != NULL || D != NULL ) 00398 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00399 00400 } 00401 00402 /* Export all requested core parameters. */ 00403 00404 if( ( N != NULL && ( ret = mbedtls_mpi_copy( N, &ctx->N ) ) != 0 ) || 00405 ( P != NULL && ( ret = mbedtls_mpi_copy( P, &ctx->P ) ) != 0 ) || 00406 ( Q != NULL && ( ret = mbedtls_mpi_copy( Q, &ctx->Q ) ) != 0 ) || 00407 ( D != NULL && ( ret = mbedtls_mpi_copy( D, &ctx->D ) ) != 0 ) || 00408 ( E != NULL && ( ret = mbedtls_mpi_copy( E, &ctx->E ) ) != 0 ) ) 00409 { 00410 return( ret ); 00411 } 00412 00413 return( 0 ); 00414 } 00415 00416 /* 00417 * Export CRT parameters 00418 * This must also be implemented if CRT is not used, for being able to 00419 * write DER encoded RSA keys. The helper function mbedtls_rsa_deduce_crt 00420 * can be used in this case. 00421 */ 00422 int mbedtls_rsa_export_crt( const mbedtls_rsa_context *ctx, 00423 mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ) 00424 { 00425 int ret; 00426 00427 /* Check if key is private or public */ 00428 int is_priv = 00429 mbedtls_mpi_cmp_int( &ctx->N , 0 ) != 0 && 00430 mbedtls_mpi_cmp_int( &ctx->P , 0 ) != 0 && 00431 mbedtls_mpi_cmp_int( &ctx->Q , 0 ) != 0 && 00432 mbedtls_mpi_cmp_int( &ctx->D , 0 ) != 0 && 00433 mbedtls_mpi_cmp_int( &ctx->E , 0 ) != 0; 00434 00435 if( !is_priv ) 00436 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00437 00438 #if !defined(MBEDTLS_RSA_NO_CRT) 00439 /* Export all requested blinding parameters. */ 00440 if( ( DP != NULL && ( ret = mbedtls_mpi_copy( DP, &ctx->DP ) ) != 0 ) || 00441 ( DQ != NULL && ( ret = mbedtls_mpi_copy( DQ, &ctx->DQ ) ) != 0 ) || 00442 ( QP != NULL && ( ret = mbedtls_mpi_copy( QP, &ctx->QP ) ) != 0 ) ) 00443 { 00444 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00445 } 00446 #else 00447 if( ( ret = mbedtls_rsa_deduce_crt( &ctx->P , &ctx->Q , &ctx->D , 00448 DP, DQ, QP ) ) != 0 ) 00449 { 00450 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); 00451 } 00452 #endif 00453 00454 return( 0 ); 00455 } 00456 00457 /* 00458 * Initialize an RSA context 00459 */ 00460 void mbedtls_rsa_init( mbedtls_rsa_context *ctx, 00461 int padding, 00462 int hash_id ) 00463 { 00464 memset( ctx, 0, sizeof( mbedtls_rsa_context ) ); 00465 00466 mbedtls_rsa_set_padding( ctx, padding, hash_id ); 00467 00468 #if defined(MBEDTLS_THREADING_C) 00469 mbedtls_mutex_init( &ctx->mutex ); 00470 #endif 00471 } 00472 00473 /* 00474 * Set padding for an existing RSA context 00475 */ 00476 void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id ) 00477 { 00478 ctx->padding = padding; 00479 ctx->hash_id = hash_id; 00480 } 00481 00482 /* 00483 * Get length in bytes of RSA modulus 00484 */ 00485 00486 size_t mbedtls_rsa_get_len( const mbedtls_rsa_context *ctx ) 00487 { 00488 return( ctx->len ); 00489 } 00490 00491 00492 #if defined(MBEDTLS_GENPRIME) 00493 00494 /* 00495 * Generate an RSA keypair 00496 */ 00497 int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, 00498 int (*f_rng)(void *, unsigned char *, size_t), 00499 void *p_rng, 00500 unsigned int nbits, int exponent ) 00501 { 00502 int ret; 00503 mbedtls_mpi H, G; 00504 00505 if( f_rng == NULL || nbits < 128 || exponent < 3 ) 00506 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00507 00508 if( nbits % 2 ) 00509 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00510 00511 mbedtls_mpi_init( &H ); 00512 mbedtls_mpi_init( &G ); 00513 00514 /* 00515 * find primes P and Q with Q < P so that: 00516 * GCD( E, (P-1)*(Q-1) ) == 1 00517 */ 00518 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->E , exponent ) ); 00519 00520 do 00521 { 00522 MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->P , nbits >> 1, 0, 00523 f_rng, p_rng ) ); 00524 00525 MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->Q , nbits >> 1, 0, 00526 f_rng, p_rng ) ); 00527 00528 if( mbedtls_mpi_cmp_mpi( &ctx->P , &ctx->Q ) == 0 ) 00529 continue; 00530 00531 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->N , &ctx->P , &ctx->Q ) ); 00532 if( mbedtls_mpi_bitlen( &ctx->N ) != nbits ) 00533 continue; 00534 00535 if( mbedtls_mpi_cmp_mpi( &ctx->P , &ctx->Q ) < 0 ) 00536 mbedtls_mpi_swap( &ctx->P , &ctx->Q ); 00537 00538 /* Temporarily replace P,Q by P-1, Q-1 */ 00539 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->P , &ctx->P , 1 ) ); 00540 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->Q , &ctx->Q , 1 ) ); 00541 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &ctx->P , &ctx->Q ) ); 00542 MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E , &H ) ); 00543 } 00544 while( mbedtls_mpi_cmp_int( &G, 1 ) != 0 ); 00545 00546 /* Restore P,Q */ 00547 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->P , &ctx->P , 1 ) ); 00548 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->Q , &ctx->Q , 1 ) ); 00549 00550 ctx->len = mbedtls_mpi_size( &ctx->N ); 00551 00552 /* 00553 * D = E^-1 mod ((P-1)*(Q-1)) 00554 * DP = D mod (P - 1) 00555 * DQ = D mod (Q - 1) 00556 * QP = Q^-1 mod P 00557 */ 00558 00559 MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->D , &ctx->E , &H ) ); 00560 00561 #if !defined(MBEDTLS_RSA_NO_CRT) 00562 MBEDTLS_MPI_CHK( mbedtls_rsa_deduce_crt( &ctx->P , &ctx->Q , &ctx->D , 00563 &ctx->DP , &ctx->DQ , &ctx->QP ) ); 00564 #endif /* MBEDTLS_RSA_NO_CRT */ 00565 00566 /* Double-check */ 00567 MBEDTLS_MPI_CHK( mbedtls_rsa_check_privkey( ctx ) ); 00568 00569 cleanup: 00570 00571 mbedtls_mpi_free( &H ); 00572 mbedtls_mpi_free( &G ); 00573 00574 if( ret != 0 ) 00575 { 00576 mbedtls_rsa_free( ctx ); 00577 return( MBEDTLS_ERR_RSA_KEY_GEN_FAILED + ret ); 00578 } 00579 00580 return( 0 ); 00581 } 00582 00583 #endif /* MBEDTLS_GENPRIME */ 00584 00585 /* 00586 * Check a public RSA key 00587 */ 00588 int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ) 00589 { 00590 if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) != 0 ) 00591 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00592 00593 if( mbedtls_mpi_bitlen( &ctx->N ) < 128 ) 00594 { 00595 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00596 } 00597 00598 if( mbedtls_mpi_get_bit( &ctx->E , 0 ) == 0 || 00599 mbedtls_mpi_bitlen( &ctx->E ) < 2 || 00600 mbedtls_mpi_cmp_mpi( &ctx->E , &ctx->N ) >= 0 ) 00601 { 00602 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00603 } 00604 00605 return( 0 ); 00606 } 00607 00608 /* 00609 * Check for the consistency of all fields in an RSA private key context 00610 */ 00611 int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ) 00612 { 00613 if( mbedtls_rsa_check_pubkey( ctx ) != 0 || 00614 rsa_check_context( ctx, 1 /* private */, 1 /* blinding */ ) != 0 ) 00615 { 00616 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00617 } 00618 00619 if( mbedtls_rsa_validate_params( &ctx->N , &ctx->P , &ctx->Q , 00620 &ctx->D , &ctx->E , NULL, NULL ) != 0 ) 00621 { 00622 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00623 } 00624 00625 #if !defined(MBEDTLS_RSA_NO_CRT) 00626 else if( mbedtls_rsa_validate_crt( &ctx->P , &ctx->Q , &ctx->D , 00627 &ctx->DP , &ctx->DQ , &ctx->QP ) != 0 ) 00628 { 00629 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00630 } 00631 #endif 00632 00633 return( 0 ); 00634 } 00635 00636 /* 00637 * Check if contexts holding a public and private key match 00638 */ 00639 int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, 00640 const mbedtls_rsa_context *prv ) 00641 { 00642 if( mbedtls_rsa_check_pubkey( pub ) != 0 || 00643 mbedtls_rsa_check_privkey( prv ) != 0 ) 00644 { 00645 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00646 } 00647 00648 if( mbedtls_mpi_cmp_mpi( &pub->N , &prv->N ) != 0 || 00649 mbedtls_mpi_cmp_mpi( &pub->E , &prv->E ) != 0 ) 00650 { 00651 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); 00652 } 00653 00654 return( 0 ); 00655 } 00656 00657 /* 00658 * Do an RSA public key operation 00659 */ 00660 int mbedtls_rsa_public( mbedtls_rsa_context *ctx, 00661 const unsigned char *input, 00662 unsigned char *output ) 00663 { 00664 int ret; 00665 size_t olen; 00666 mbedtls_mpi T; 00667 00668 if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) ) 00669 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00670 00671 mbedtls_mpi_init( &T ); 00672 00673 #if defined(MBEDTLS_THREADING_C) 00674 if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) 00675 return( ret ); 00676 #endif 00677 00678 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); 00679 00680 if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) 00681 { 00682 ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; 00683 goto cleanup; 00684 } 00685 00686 olen = ctx->len ; 00687 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->E , &ctx->N , &ctx->RN ) ); 00688 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); 00689 00690 cleanup: 00691 #if defined(MBEDTLS_THREADING_C) 00692 if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) 00693 return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); 00694 #endif 00695 00696 mbedtls_mpi_free( &T ); 00697 00698 if( ret != 0 ) 00699 return( MBEDTLS_ERR_RSA_PUBLIC_FAILED + ret ); 00700 00701 return( 0 ); 00702 } 00703 00704 /* 00705 * Generate or update blinding values, see section 10 of: 00706 * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, 00707 * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer 00708 * Berlin Heidelberg, 1996. p. 104-113. 00709 */ 00710 static int rsa_prepare_blinding( mbedtls_rsa_context *ctx, 00711 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) 00712 { 00713 int ret, count = 0; 00714 00715 if( ctx->Vf .p != NULL ) 00716 { 00717 /* We already have blinding values, just update them by squaring */ 00718 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi , &ctx->Vi , &ctx->Vi ) ); 00719 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi , &ctx->Vi , &ctx->N ) ); 00720 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf , &ctx->Vf , &ctx->Vf ) ); 00721 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf , &ctx->Vf , &ctx->N ) ); 00722 00723 goto cleanup; 00724 } 00725 00726 /* Unblinding value: Vf = random number, invertible mod N */ 00727 do { 00728 if( count++ > 10 ) 00729 return( MBEDTLS_ERR_RSA_RNG_FAILED ); 00730 00731 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf , ctx->len - 1, f_rng, p_rng ) ); 00732 MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi , &ctx->Vf , &ctx->N ) ); 00733 } while( mbedtls_mpi_cmp_int( &ctx->Vi , 1 ) != 0 ); 00734 00735 /* Blinding value: Vi = Vf^(-e) mod N */ 00736 MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi , &ctx->Vf , &ctx->N ) ); 00737 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi , &ctx->Vi , &ctx->E , &ctx->N , &ctx->RN ) ); 00738 00739 00740 cleanup: 00741 return( ret ); 00742 } 00743 00744 /* 00745 * Exponent blinding supposed to prevent side-channel attacks using multiple 00746 * traces of measurements to recover the RSA key. The more collisions are there, 00747 * the more bits of the key can be recovered. See [3]. 00748 * 00749 * Collecting n collisions with m bit long blinding value requires 2^(m-m/n) 00750 * observations on avarage. 00751 * 00752 * For example with 28 byte blinding to achieve 2 collisions the adversary has 00753 * to make 2^112 observations on avarage. 00754 * 00755 * (With the currently (as of 2017 April) known best algorithms breaking 2048 00756 * bit RSA requires approximately as much time as trying out 2^112 random keys. 00757 * Thus in this sense with 28 byte blinding the security is not reduced by 00758 * side-channel attacks like the one in [3]) 00759 * 00760 * This countermeasure does not help if the key recovery is possible with a 00761 * single trace. 00762 */ 00763 #define RSA_EXPONENT_BLINDING 28 00764 00765 /* 00766 * Do an RSA private key operation 00767 */ 00768 int mbedtls_rsa_private( mbedtls_rsa_context *ctx, 00769 int (*f_rng)(void *, unsigned char *, size_t), 00770 void *p_rng, 00771 const unsigned char *input, 00772 unsigned char *output ) 00773 { 00774 int ret; 00775 size_t olen; 00776 mbedtls_mpi T, T1, T2; 00777 mbedtls_mpi P1, Q1, R; 00778 #if defined(MBEDTLS_RSA_NO_CRT) 00779 mbedtls_mpi D_blind; 00780 mbedtls_mpi *D = &ctx->D ; 00781 #else 00782 mbedtls_mpi DP_blind, DQ_blind; 00783 mbedtls_mpi *DP = &ctx->DP ; 00784 mbedtls_mpi *DQ = &ctx->DQ ; 00785 #endif 00786 00787 if( rsa_check_context( ctx, 1 /* private key checks */, 00788 f_rng != NULL /* blinding y/n */ ) != 0 ) 00789 { 00790 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 00791 } 00792 00793 mbedtls_mpi_init( &T ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); 00794 mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &R ); 00795 00796 if( f_rng != NULL ) 00797 { 00798 #if defined(MBEDTLS_RSA_NO_CRT) 00799 mbedtls_mpi_init( &D_blind ); 00800 #else 00801 mbedtls_mpi_init( &DP_blind ); 00802 mbedtls_mpi_init( &DQ_blind ); 00803 #endif 00804 } 00805 00806 00807 #if defined(MBEDTLS_THREADING_C) 00808 if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) 00809 return( ret ); 00810 #endif 00811 00812 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); 00813 if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) 00814 { 00815 ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; 00816 goto cleanup; 00817 } 00818 00819 if( f_rng != NULL ) 00820 { 00821 /* 00822 * Blinding 00823 * T = T * Vi mod N 00824 */ 00825 MBEDTLS_MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) ); 00826 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vi ) ); 00827 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); 00828 00829 /* 00830 * Exponent blinding 00831 */ 00832 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P , 1 ) ); 00833 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q , 1 ) ); 00834 00835 #if defined(MBEDTLS_RSA_NO_CRT) 00836 /* 00837 * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D 00838 */ 00839 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, 00840 f_rng, p_rng ) ); 00841 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &P1, &Q1 ) ); 00842 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &D_blind, &R ) ); 00843 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &D_blind, &D_blind, &ctx->D ) ); 00844 00845 D = &D_blind; 00846 #else 00847 /* 00848 * DP_blind = ( P - 1 ) * R + DP 00849 */ 00850 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, 00851 f_rng, p_rng ) ); 00852 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DP_blind, &P1, &R ) ); 00853 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DP_blind, &DP_blind, 00854 &ctx->DP ) ); 00855 00856 DP = &DP_blind; 00857 00858 /* 00859 * DQ_blind = ( Q - 1 ) * R + DQ 00860 */ 00861 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, 00862 f_rng, p_rng ) ); 00863 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DQ_blind, &Q1, &R ) ); 00864 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DQ_blind, &DQ_blind, 00865 &ctx->DQ ) ); 00866 00867 DQ = &DQ_blind; 00868 #endif /* MBEDTLS_RSA_NO_CRT */ 00869 } 00870 00871 #if defined(MBEDTLS_RSA_NO_CRT) 00872 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, D, &ctx->N , &ctx->RN ) ); 00873 #else 00874 /* 00875 * Faster decryption using the CRT 00876 * 00877 * T1 = input ^ dP mod P 00878 * T2 = input ^ dQ mod Q 00879 */ 00880 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T1, &T, DP, &ctx->P , &ctx->RP ) ); 00881 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T2, &T, DQ, &ctx->Q , &ctx->RQ ) ); 00882 00883 /* 00884 * T = (T1 - T2) * (Q^-1 mod P) mod P 00885 */ 00886 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T1, &T2 ) ); 00887 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->QP ) ); 00888 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T1, &ctx->P ) ); 00889 00890 /* 00891 * T = T2 + T * Q 00892 */ 00893 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->Q ) ); 00894 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &T2, &T1 ) ); 00895 #endif /* MBEDTLS_RSA_NO_CRT */ 00896 00897 if( f_rng != NULL ) 00898 { 00899 /* 00900 * Unblind 00901 * T = T * Vf mod N 00902 */ 00903 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vf ) ); 00904 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); 00905 } 00906 00907 olen = ctx->len ; 00908 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); 00909 00910 cleanup: 00911 #if defined(MBEDTLS_THREADING_C) 00912 if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) 00913 return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); 00914 #endif 00915 00916 mbedtls_mpi_free( &T ); mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); 00917 mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &R ); 00918 00919 if( f_rng != NULL ) 00920 { 00921 #if defined(MBEDTLS_RSA_NO_CRT) 00922 mbedtls_mpi_free( &D_blind ); 00923 #else 00924 mbedtls_mpi_free( &DP_blind ); 00925 mbedtls_mpi_free( &DQ_blind ); 00926 #endif 00927 } 00928 00929 if( ret != 0 ) 00930 return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret ); 00931 00932 return( 0 ); 00933 } 00934 00935 #if defined(MBEDTLS_PKCS1_V21) 00936 /** 00937 * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer. 00938 * 00939 * \param dst buffer to mask 00940 * \param dlen length of destination buffer 00941 * \param src source of the mask generation 00942 * \param slen length of the source buffer 00943 * \param md_ctx message digest context to use 00944 */ 00945 static int mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, 00946 size_t slen, mbedtls_md_context_t *md_ctx ) 00947 { 00948 unsigned char mask[MBEDTLS_MD_MAX_SIZE]; 00949 unsigned char counter[4]; 00950 unsigned char *p; 00951 unsigned int hlen; 00952 size_t i, use_len; 00953 int ret = 0; 00954 00955 memset( mask, 0, MBEDTLS_MD_MAX_SIZE ); 00956 memset( counter, 0, 4 ); 00957 00958 hlen = mbedtls_md_get_size( md_ctx->md_info ); 00959 00960 /* Generate and apply dbMask */ 00961 p = dst; 00962 00963 while( dlen > 0 ) 00964 { 00965 use_len = hlen; 00966 if( dlen < hlen ) 00967 use_len = dlen; 00968 00969 if( ( ret = mbedtls_md_starts( md_ctx ) ) != 0 ) 00970 goto exit; 00971 if( ( ret = mbedtls_md_update( md_ctx, src, slen ) ) != 0 ) 00972 goto exit; 00973 if( ( ret = mbedtls_md_update( md_ctx, counter, 4 ) ) != 0 ) 00974 goto exit; 00975 if( ( ret = mbedtls_md_finish( md_ctx, mask ) ) != 0 ) 00976 goto exit; 00977 00978 for( i = 0; i < use_len; ++i ) 00979 *p++ ^= mask[i]; 00980 00981 counter[3]++; 00982 00983 dlen -= use_len; 00984 } 00985 00986 exit: 00987 mbedtls_zeroize( mask, sizeof( mask ) ); 00988 00989 return( ret ); 00990 } 00991 #endif /* MBEDTLS_PKCS1_V21 */ 00992 00993 #if defined(MBEDTLS_PKCS1_V21) 00994 /* 00995 * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function 00996 */ 00997 int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, 00998 int (*f_rng)(void *, unsigned char *, size_t), 00999 void *p_rng, 01000 int mode, 01001 const unsigned char *label, size_t label_len, 01002 size_t ilen, 01003 const unsigned char *input, 01004 unsigned char *output ) 01005 { 01006 size_t olen; 01007 int ret; 01008 unsigned char *p = output; 01009 unsigned int hlen; 01010 const mbedtls_md_info_t *md_info; 01011 mbedtls_md_context_t md_ctx; 01012 01013 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) 01014 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01015 01016 if( f_rng == NULL ) 01017 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01018 01019 md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); 01020 if( md_info == NULL ) 01021 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01022 01023 olen = ctx->len ; 01024 hlen = mbedtls_md_get_size( md_info ); 01025 01026 /* first comparison checks for overflow */ 01027 if( ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2 ) 01028 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01029 01030 memset( output, 0, olen ); 01031 01032 *p++ = 0; 01033 01034 /* Generate a random octet string seed */ 01035 if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 ) 01036 return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); 01037 01038 p += hlen; 01039 01040 /* Construct DB */ 01041 if( ( ret = mbedtls_md( md_info, label, label_len, p ) ) != 0 ) 01042 return( ret ); 01043 p += hlen; 01044 p += olen - 2 * hlen - 2 - ilen; 01045 *p++ = 1; 01046 memcpy( p, input, ilen ); 01047 01048 mbedtls_md_init( &md_ctx ); 01049 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) 01050 goto exit; 01051 01052 /* maskedDB: Apply dbMask to DB */ 01053 if( ( ret = mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen, 01054 &md_ctx ) ) != 0 ) 01055 goto exit; 01056 01057 /* maskedSeed: Apply seedMask to seed */ 01058 if( ( ret = mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1, 01059 &md_ctx ) ) != 0 ) 01060 goto exit; 01061 01062 exit: 01063 mbedtls_md_free( &md_ctx ); 01064 01065 if( ret != 0 ) 01066 return( ret ); 01067 01068 return( ( mode == MBEDTLS_RSA_PUBLIC ) 01069 ? mbedtls_rsa_public( ctx, output, output ) 01070 : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); 01071 } 01072 #endif /* MBEDTLS_PKCS1_V21 */ 01073 01074 #if defined(MBEDTLS_PKCS1_V15) 01075 /* 01076 * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function 01077 */ 01078 int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, 01079 int (*f_rng)(void *, unsigned char *, size_t), 01080 void *p_rng, 01081 int mode, size_t ilen, 01082 const unsigned char *input, 01083 unsigned char *output ) 01084 { 01085 size_t nb_pad, olen; 01086 int ret; 01087 unsigned char *p = output; 01088 01089 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) 01090 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01091 01092 // We don't check p_rng because it won't be dereferenced here 01093 if( f_rng == NULL || input == NULL || output == NULL ) 01094 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01095 01096 olen = ctx->len ; 01097 01098 /* first comparison checks for overflow */ 01099 if( ilen + 11 < ilen || olen < ilen + 11 ) 01100 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01101 01102 nb_pad = olen - 3 - ilen; 01103 01104 *p++ = 0; 01105 if( mode == MBEDTLS_RSA_PUBLIC ) 01106 { 01107 *p++ = MBEDTLS_RSA_CRYPT; 01108 01109 while( nb_pad-- > 0 ) 01110 { 01111 int rng_dl = 100; 01112 01113 do { 01114 ret = f_rng( p_rng, p, 1 ); 01115 } while( *p == 0 && --rng_dl && ret == 0 ); 01116 01117 /* Check if RNG failed to generate data */ 01118 if( rng_dl == 0 || ret != 0 ) 01119 return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); 01120 01121 p++; 01122 } 01123 } 01124 else 01125 { 01126 *p++ = MBEDTLS_RSA_SIGN; 01127 01128 while( nb_pad-- > 0 ) 01129 *p++ = 0xFF; 01130 } 01131 01132 *p++ = 0; 01133 memcpy( p, input, ilen ); 01134 01135 return( ( mode == MBEDTLS_RSA_PUBLIC ) 01136 ? mbedtls_rsa_public( ctx, output, output ) 01137 : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); 01138 } 01139 #endif /* MBEDTLS_PKCS1_V15 */ 01140 01141 /* 01142 * Add the message padding, then do an RSA operation 01143 */ 01144 int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, 01145 int (*f_rng)(void *, unsigned char *, size_t), 01146 void *p_rng, 01147 int mode, size_t ilen, 01148 const unsigned char *input, 01149 unsigned char *output ) 01150 { 01151 switch( ctx->padding ) 01152 { 01153 #if defined(MBEDTLS_PKCS1_V15) 01154 case MBEDTLS_RSA_PKCS_V15: 01155 return mbedtls_rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen, 01156 input, output ); 01157 #endif 01158 01159 #if defined(MBEDTLS_PKCS1_V21) 01160 case MBEDTLS_RSA_PKCS_V21: 01161 return mbedtls_rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0, 01162 ilen, input, output ); 01163 #endif 01164 01165 default: 01166 return( MBEDTLS_ERR_RSA_INVALID_PADDING ); 01167 } 01168 } 01169 01170 #if defined(MBEDTLS_PKCS1_V21) 01171 /* 01172 * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function 01173 */ 01174 int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, 01175 int (*f_rng)(void *, unsigned char *, size_t), 01176 void *p_rng, 01177 int mode, 01178 const unsigned char *label, size_t label_len, 01179 size_t *olen, 01180 const unsigned char *input, 01181 unsigned char *output, 01182 size_t output_max_len ) 01183 { 01184 int ret; 01185 size_t ilen, i, pad_len; 01186 unsigned char *p, bad, pad_done; 01187 unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; 01188 unsigned char lhash[MBEDTLS_MD_MAX_SIZE]; 01189 unsigned int hlen; 01190 const mbedtls_md_info_t *md_info; 01191 mbedtls_md_context_t md_ctx; 01192 01193 /* 01194 * Parameters sanity checks 01195 */ 01196 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) 01197 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01198 01199 ilen = ctx->len ; 01200 01201 if( ilen < 16 || ilen > sizeof( buf ) ) 01202 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01203 01204 md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); 01205 if( md_info == NULL ) 01206 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01207 01208 hlen = mbedtls_md_get_size( md_info ); 01209 01210 // checking for integer underflow 01211 if( 2 * hlen + 2 > ilen ) 01212 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01213 01214 /* 01215 * RSA operation 01216 */ 01217 ret = ( mode == MBEDTLS_RSA_PUBLIC ) 01218 ? mbedtls_rsa_public( ctx, input, buf ) 01219 : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); 01220 01221 if( ret != 0 ) 01222 goto cleanup; 01223 01224 /* 01225 * Unmask data and generate lHash 01226 */ 01227 mbedtls_md_init( &md_ctx ); 01228 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) 01229 { 01230 mbedtls_md_free( &md_ctx ); 01231 goto cleanup; 01232 } 01233 01234 /* seed: Apply seedMask to maskedSeed */ 01235 if( ( ret = mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1, 01236 &md_ctx ) ) != 0 || 01237 /* DB: Apply dbMask to maskedDB */ 01238 ( ret = mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen, 01239 &md_ctx ) ) != 0 ) 01240 { 01241 mbedtls_md_free( &md_ctx ); 01242 goto cleanup; 01243 } 01244 01245 mbedtls_md_free( &md_ctx ); 01246 01247 /* Generate lHash */ 01248 if( ( ret = mbedtls_md( md_info, label, label_len, lhash ) ) != 0 ) 01249 goto cleanup; 01250 01251 /* 01252 * Check contents, in "constant-time" 01253 */ 01254 p = buf; 01255 bad = 0; 01256 01257 bad |= *p++; /* First byte must be 0 */ 01258 01259 p += hlen; /* Skip seed */ 01260 01261 /* Check lHash */ 01262 for( i = 0; i < hlen; i++ ) 01263 bad |= lhash[i] ^ *p++; 01264 01265 /* Get zero-padding len, but always read till end of buffer 01266 * (minus one, for the 01 byte) */ 01267 pad_len = 0; 01268 pad_done = 0; 01269 for( i = 0; i < ilen - 2 * hlen - 2; i++ ) 01270 { 01271 pad_done |= p[i]; 01272 pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; 01273 } 01274 01275 p += pad_len; 01276 bad |= *p++ ^ 0x01; 01277 01278 /* 01279 * The only information "leaked" is whether the padding was correct or not 01280 * (eg, no data is copied if it was not correct). This meets the 01281 * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between 01282 * the different error conditions. 01283 */ 01284 if( bad != 0 ) 01285 { 01286 ret = MBEDTLS_ERR_RSA_INVALID_PADDING; 01287 goto cleanup; 01288 } 01289 01290 if( ilen - ( p - buf ) > output_max_len ) 01291 { 01292 ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; 01293 goto cleanup; 01294 } 01295 01296 *olen = ilen - (p - buf); 01297 memcpy( output, p, *olen ); 01298 ret = 0; 01299 01300 cleanup: 01301 mbedtls_zeroize( buf, sizeof( buf ) ); 01302 mbedtls_zeroize( lhash, sizeof( lhash ) ); 01303 01304 return( ret ); 01305 } 01306 #endif /* MBEDTLS_PKCS1_V21 */ 01307 01308 #if defined(MBEDTLS_PKCS1_V15) 01309 /* 01310 * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function 01311 */ 01312 int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, 01313 int (*f_rng)(void *, unsigned char *, size_t), 01314 void *p_rng, 01315 int mode, size_t *olen, 01316 const unsigned char *input, 01317 unsigned char *output, 01318 size_t output_max_len) 01319 { 01320 int ret; 01321 size_t ilen, pad_count = 0, i; 01322 unsigned char *p, bad, pad_done = 0; 01323 unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; 01324 01325 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) 01326 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01327 01328 ilen = ctx->len ; 01329 01330 if( ilen < 16 || ilen > sizeof( buf ) ) 01331 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01332 01333 ret = ( mode == MBEDTLS_RSA_PUBLIC ) 01334 ? mbedtls_rsa_public( ctx, input, buf ) 01335 : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); 01336 01337 if( ret != 0 ) 01338 goto cleanup; 01339 01340 p = buf; 01341 bad = 0; 01342 01343 /* 01344 * Check and get padding len in "constant-time" 01345 */ 01346 bad |= *p++; /* First byte must be 0 */ 01347 01348 /* This test does not depend on secret data */ 01349 if( mode == MBEDTLS_RSA_PRIVATE ) 01350 { 01351 bad |= *p++ ^ MBEDTLS_RSA_CRYPT; 01352 01353 /* Get padding len, but always read till end of buffer 01354 * (minus one, for the 00 byte) */ 01355 for( i = 0; i < ilen - 3; i++ ) 01356 { 01357 pad_done |= ((p[i] | (unsigned char)-p[i]) >> 7) ^ 1; 01358 pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; 01359 } 01360 01361 p += pad_count; 01362 bad |= *p++; /* Must be zero */ 01363 } 01364 else 01365 { 01366 bad |= *p++ ^ MBEDTLS_RSA_SIGN; 01367 01368 /* Get padding len, but always read till end of buffer 01369 * (minus one, for the 00 byte) */ 01370 for( i = 0; i < ilen - 3; i++ ) 01371 { 01372 pad_done |= ( p[i] != 0xFF ); 01373 pad_count += ( pad_done == 0 ); 01374 } 01375 01376 p += pad_count; 01377 bad |= *p++; /* Must be zero */ 01378 } 01379 01380 bad |= ( pad_count < 8 ); 01381 01382 if( bad ) 01383 { 01384 ret = MBEDTLS_ERR_RSA_INVALID_PADDING; 01385 goto cleanup; 01386 } 01387 01388 if( ilen - ( p - buf ) > output_max_len ) 01389 { 01390 ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; 01391 goto cleanup; 01392 } 01393 01394 *olen = ilen - (p - buf); 01395 memcpy( output, p, *olen ); 01396 ret = 0; 01397 01398 cleanup: 01399 mbedtls_zeroize( buf, sizeof( buf ) ); 01400 01401 return( ret ); 01402 } 01403 #endif /* MBEDTLS_PKCS1_V15 */ 01404 01405 /* 01406 * Do an RSA operation, then remove the message padding 01407 */ 01408 int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, 01409 int (*f_rng)(void *, unsigned char *, size_t), 01410 void *p_rng, 01411 int mode, size_t *olen, 01412 const unsigned char *input, 01413 unsigned char *output, 01414 size_t output_max_len) 01415 { 01416 switch( ctx->padding ) 01417 { 01418 #if defined(MBEDTLS_PKCS1_V15) 01419 case MBEDTLS_RSA_PKCS_V15: 01420 return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen, 01421 input, output, output_max_len ); 01422 #endif 01423 01424 #if defined(MBEDTLS_PKCS1_V21) 01425 case MBEDTLS_RSA_PKCS_V21: 01426 return mbedtls_rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0, 01427 olen, input, output, 01428 output_max_len ); 01429 #endif 01430 01431 default: 01432 return( MBEDTLS_ERR_RSA_INVALID_PADDING ); 01433 } 01434 } 01435 01436 #if defined(MBEDTLS_PKCS1_V21) 01437 /* 01438 * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function 01439 */ 01440 int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, 01441 int (*f_rng)(void *, unsigned char *, size_t), 01442 void *p_rng, 01443 int mode, 01444 mbedtls_md_type_t md_alg, 01445 unsigned int hashlen, 01446 const unsigned char *hash, 01447 unsigned char *sig ) 01448 { 01449 size_t olen; 01450 unsigned char *p = sig; 01451 unsigned char salt[MBEDTLS_MD_MAX_SIZE]; 01452 unsigned int slen, hlen, offset = 0; 01453 int ret; 01454 size_t msb; 01455 const mbedtls_md_info_t *md_info; 01456 mbedtls_md_context_t md_ctx; 01457 01458 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) 01459 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01460 01461 if( f_rng == NULL ) 01462 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01463 01464 olen = ctx->len ; 01465 01466 if( md_alg != MBEDTLS_MD_NONE ) 01467 { 01468 /* Gather length of hash to sign */ 01469 md_info = mbedtls_md_info_from_type( md_alg ); 01470 if( md_info == NULL ) 01471 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01472 01473 hashlen = mbedtls_md_get_size( md_info ); 01474 } 01475 01476 md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); 01477 if( md_info == NULL ) 01478 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01479 01480 hlen = mbedtls_md_get_size( md_info ); 01481 slen = hlen; 01482 01483 if( olen < hlen + slen + 2 ) 01484 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01485 01486 memset( sig, 0, olen ); 01487 01488 /* Generate salt of length slen */ 01489 if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 ) 01490 return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); 01491 01492 /* Note: EMSA-PSS encoding is over the length of N - 1 bits */ 01493 msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; 01494 p += olen - hlen * 2 - 2; 01495 *p++ = 0x01; 01496 memcpy( p, salt, slen ); 01497 p += slen; 01498 01499 mbedtls_md_init( &md_ctx ); 01500 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) 01501 goto exit; 01502 01503 /* Generate H = Hash( M' ) */ 01504 if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 ) 01505 goto exit; 01506 if( ( ret = mbedtls_md_update( &md_ctx, p, 8 ) ) != 0 ) 01507 goto exit; 01508 if( ( ret = mbedtls_md_update( &md_ctx, hash, hashlen ) ) != 0 ) 01509 goto exit; 01510 if( ( ret = mbedtls_md_update( &md_ctx, salt, slen ) ) != 0 ) 01511 goto exit; 01512 if( ( ret = mbedtls_md_finish( &md_ctx, p ) ) != 0 ) 01513 goto exit; 01514 01515 /* Compensate for boundary condition when applying mask */ 01516 if( msb % 8 == 0 ) 01517 offset = 1; 01518 01519 /* maskedDB: Apply dbMask to DB */ 01520 if( ( ret = mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, 01521 &md_ctx ) ) != 0 ) 01522 goto exit; 01523 01524 msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; 01525 sig[0] &= 0xFF >> ( olen * 8 - msb ); 01526 01527 p += hlen; 01528 *p++ = 0xBC; 01529 01530 mbedtls_zeroize( salt, sizeof( salt ) ); 01531 01532 exit: 01533 mbedtls_md_free( &md_ctx ); 01534 01535 if( ret != 0 ) 01536 return( ret ); 01537 01538 return( ( mode == MBEDTLS_RSA_PUBLIC ) 01539 ? mbedtls_rsa_public( ctx, sig, sig ) 01540 : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) ); 01541 } 01542 #endif /* MBEDTLS_PKCS1_V21 */ 01543 01544 #if defined(MBEDTLS_PKCS1_V15) 01545 /* 01546 * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function 01547 */ 01548 01549 /* Construct a PKCS v1.5 encoding of a hashed message 01550 * 01551 * This is used both for signature generation and verification. 01552 * 01553 * Parameters: 01554 * - md_alg: Identifies the hash algorithm used to generate the given hash; 01555 * MBEDTLS_MD_NONE if raw data is signed. 01556 * - hashlen: Length of hash in case hashlen is MBEDTLS_MD_NONE. 01557 * - hash: Buffer containing the hashed message or the raw data. 01558 * - dst_len: Length of the encoded message. 01559 * - dst: Buffer to hold the encoded message. 01560 * 01561 * Assumptions: 01562 * - hash has size hashlen if md_alg == MBEDTLS_MD_NONE. 01563 * - hash has size corresponding to md_alg if md_alg != MBEDTLS_MD_NONE. 01564 * - dst points to a buffer of size at least dst_len. 01565 * 01566 */ 01567 static int rsa_rsassa_pkcs1_v15_encode( mbedtls_md_type_t md_alg, 01568 unsigned int hashlen, 01569 const unsigned char *hash, 01570 size_t dst_len, 01571 unsigned char *dst ) 01572 { 01573 size_t oid_size = 0; 01574 size_t nb_pad = dst_len; 01575 unsigned char *p = dst; 01576 const char *oid = NULL; 01577 01578 /* Are we signing hashed or raw data? */ 01579 if( md_alg != MBEDTLS_MD_NONE ) 01580 { 01581 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); 01582 if( md_info == NULL ) 01583 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01584 01585 if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 ) 01586 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01587 01588 hashlen = mbedtls_md_get_size( md_info ); 01589 01590 /* Double-check that 8 + hashlen + oid_size can be used as a 01591 * 1-byte ASN.1 length encoding and that there's no overflow. */ 01592 if( 8 + hashlen + oid_size >= 0x80 || 01593 10 + hashlen < hashlen || 01594 10 + hashlen + oid_size < 10 + hashlen ) 01595 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01596 01597 /* 01598 * Static bounds check: 01599 * - Need 10 bytes for five tag-length pairs. 01600 * (Insist on 1-byte length encodings to protect against variants of 01601 * Bleichenbacher's forgery attack against lax PKCS#1v1.5 verification) 01602 * - Need hashlen bytes for hash 01603 * - Need oid_size bytes for hash alg OID. 01604 */ 01605 if( nb_pad < 10 + hashlen + oid_size ) 01606 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01607 nb_pad -= 10 + hashlen + oid_size; 01608 } 01609 else 01610 { 01611 if( nb_pad < hashlen ) 01612 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01613 01614 nb_pad -= hashlen; 01615 } 01616 01617 /* Need space for signature header and padding delimiter (3 bytes), 01618 * and 8 bytes for the minimal padding */ 01619 if( nb_pad < 3 + 8 ) 01620 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01621 nb_pad -= 3; 01622 01623 /* Now nb_pad is the amount of memory to be filled 01624 * with padding, and at least 8 bytes long. */ 01625 01626 /* Write signature header and padding */ 01627 *p++ = 0; 01628 *p++ = MBEDTLS_RSA_SIGN; 01629 memset( p, 0xFF, nb_pad ); 01630 p += nb_pad; 01631 *p++ = 0; 01632 01633 /* Are we signing raw data? */ 01634 if( md_alg == MBEDTLS_MD_NONE ) 01635 { 01636 memcpy( p, hash, hashlen ); 01637 return( 0 ); 01638 } 01639 01640 /* Signing hashed data, add corresponding ASN.1 structure 01641 * 01642 * DigestInfo ::= SEQUENCE { 01643 * digestAlgorithm DigestAlgorithmIdentifier, 01644 * digest Digest } 01645 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier 01646 * Digest ::= OCTET STRING 01647 * 01648 * Schematic: 01649 * TAG-SEQ + LEN [ TAG-SEQ + LEN [ TAG-OID + LEN [ OID ] 01650 * TAG-NULL + LEN [ NULL ] ] 01651 * TAG-OCTET + LEN [ HASH ] ] 01652 */ 01653 *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; 01654 *p++ = (unsigned char)( 0x08 + oid_size + hashlen ); 01655 *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; 01656 *p++ = (unsigned char)( 0x04 + oid_size ); 01657 *p++ = MBEDTLS_ASN1_OID; 01658 *p++ = (unsigned char) oid_size; 01659 memcpy( p, oid, oid_size ); 01660 p += oid_size; 01661 *p++ = MBEDTLS_ASN1_NULL; 01662 *p++ = 0x00; 01663 *p++ = MBEDTLS_ASN1_OCTET_STRING; 01664 *p++ = (unsigned char) hashlen; 01665 memcpy( p, hash, hashlen ); 01666 p += hashlen; 01667 01668 /* Just a sanity-check, should be automatic 01669 * after the initial bounds check. */ 01670 if( p != dst + dst_len ) 01671 { 01672 mbedtls_zeroize( dst, dst_len ); 01673 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01674 } 01675 01676 return( 0 ); 01677 } 01678 01679 /* 01680 * Do an RSA operation to sign the message digest 01681 */ 01682 int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, 01683 int (*f_rng)(void *, unsigned char *, size_t), 01684 void *p_rng, 01685 int mode, 01686 mbedtls_md_type_t md_alg, 01687 unsigned int hashlen, 01688 const unsigned char *hash, 01689 unsigned char *sig ) 01690 { 01691 int ret; 01692 unsigned char *sig_try = NULL, *verif = NULL; 01693 01694 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) 01695 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01696 01697 /* 01698 * Prepare PKCS1-v1.5 encoding (padding and hash identifier) 01699 */ 01700 01701 if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, 01702 ctx->len , sig ) ) != 0 ) 01703 return( ret ); 01704 01705 /* 01706 * Call respective RSA primitive 01707 */ 01708 01709 if( mode == MBEDTLS_RSA_PUBLIC ) 01710 { 01711 /* Skip verification on a public key operation */ 01712 return( mbedtls_rsa_public( ctx, sig, sig ) ); 01713 } 01714 01715 /* Private key operation 01716 * 01717 * In order to prevent Lenstra's attack, make the signature in a 01718 * temporary buffer and check it before returning it. 01719 */ 01720 01721 sig_try = mbedtls_calloc( 1, ctx->len ); 01722 if( sig_try == NULL ) 01723 return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); 01724 01725 verif = mbedtls_calloc( 1, ctx->len ); 01726 if( verif == NULL ) 01727 { 01728 mbedtls_free( sig_try ); 01729 return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); 01730 } 01731 01732 MBEDTLS_MPI_CHK( mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig_try ) ); 01733 MBEDTLS_MPI_CHK( mbedtls_rsa_public( ctx, sig_try, verif ) ); 01734 01735 if( mbedtls_safer_memcmp( verif, sig, ctx->len ) != 0 ) 01736 { 01737 ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED; 01738 goto cleanup; 01739 } 01740 01741 memcpy( sig, sig_try, ctx->len ); 01742 01743 cleanup: 01744 mbedtls_free( sig_try ); 01745 mbedtls_free( verif ); 01746 01747 return( ret ); 01748 } 01749 #endif /* MBEDTLS_PKCS1_V15 */ 01750 01751 /* 01752 * Do an RSA operation to sign the message digest 01753 */ 01754 int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, 01755 int (*f_rng)(void *, unsigned char *, size_t), 01756 void *p_rng, 01757 int mode, 01758 mbedtls_md_type_t md_alg, 01759 unsigned int hashlen, 01760 const unsigned char *hash, 01761 unsigned char *sig ) 01762 { 01763 switch( ctx->padding ) 01764 { 01765 #if defined(MBEDTLS_PKCS1_V15) 01766 case MBEDTLS_RSA_PKCS_V15: 01767 return mbedtls_rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg, 01768 hashlen, hash, sig ); 01769 #endif 01770 01771 #if defined(MBEDTLS_PKCS1_V21) 01772 case MBEDTLS_RSA_PKCS_V21: 01773 return mbedtls_rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg, 01774 hashlen, hash, sig ); 01775 #endif 01776 01777 default: 01778 return( MBEDTLS_ERR_RSA_INVALID_PADDING ); 01779 } 01780 } 01781 01782 #if defined(MBEDTLS_PKCS1_V21) 01783 /* 01784 * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function 01785 */ 01786 int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, 01787 int (*f_rng)(void *, unsigned char *, size_t), 01788 void *p_rng, 01789 int mode, 01790 mbedtls_md_type_t md_alg, 01791 unsigned int hashlen, 01792 const unsigned char *hash, 01793 mbedtls_md_type_t mgf1_hash_id, 01794 int expected_salt_len, 01795 const unsigned char *sig ) 01796 { 01797 int ret; 01798 size_t siglen; 01799 unsigned char *p; 01800 unsigned char *hash_start; 01801 unsigned char result[MBEDTLS_MD_MAX_SIZE]; 01802 unsigned char zeros[8]; 01803 unsigned int hlen; 01804 size_t observed_salt_len, msb; 01805 const mbedtls_md_info_t *md_info; 01806 mbedtls_md_context_t md_ctx; 01807 unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; 01808 01809 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) 01810 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01811 01812 siglen = ctx->len ; 01813 01814 if( siglen < 16 || siglen > sizeof( buf ) ) 01815 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01816 01817 ret = ( mode == MBEDTLS_RSA_PUBLIC ) 01818 ? mbedtls_rsa_public( ctx, sig, buf ) 01819 : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf ); 01820 01821 if( ret != 0 ) 01822 return( ret ); 01823 01824 p = buf; 01825 01826 if( buf[siglen - 1] != 0xBC ) 01827 return( MBEDTLS_ERR_RSA_INVALID_PADDING ); 01828 01829 if( md_alg != MBEDTLS_MD_NONE ) 01830 { 01831 /* Gather length of hash to sign */ 01832 md_info = mbedtls_md_info_from_type( md_alg ); 01833 if( md_info == NULL ) 01834 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01835 01836 hashlen = mbedtls_md_get_size( md_info ); 01837 } 01838 01839 md_info = mbedtls_md_info_from_type( mgf1_hash_id ); 01840 if( md_info == NULL ) 01841 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01842 01843 hlen = mbedtls_md_get_size( md_info ); 01844 01845 memset( zeros, 0, 8 ); 01846 01847 /* 01848 * Note: EMSA-PSS verification is over the length of N - 1 bits 01849 */ 01850 msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; 01851 01852 if( buf[0] >> ( 8 - siglen * 8 + msb ) ) 01853 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01854 01855 /* Compensate for boundary condition when applying mask */ 01856 if( msb % 8 == 0 ) 01857 { 01858 p++; 01859 siglen -= 1; 01860 } 01861 01862 if( siglen < hlen + 2 ) 01863 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01864 hash_start = p + siglen - hlen - 1; 01865 01866 mbedtls_md_init( &md_ctx ); 01867 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) 01868 goto exit; 01869 01870 ret = mgf_mask( p, siglen - hlen - 1, hash_start, hlen, &md_ctx ); 01871 if( ret != 0 ) 01872 goto exit; 01873 01874 buf[0] &= 0xFF >> ( siglen * 8 - msb ); 01875 01876 while( p < hash_start - 1 && *p == 0 ) 01877 p++; 01878 01879 if( *p++ != 0x01 ) 01880 { 01881 ret = MBEDTLS_ERR_RSA_INVALID_PADDING; 01882 goto exit; 01883 } 01884 01885 observed_salt_len = hash_start - p; 01886 01887 if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY && 01888 observed_salt_len != (size_t) expected_salt_len ) 01889 { 01890 ret = MBEDTLS_ERR_RSA_INVALID_PADDING; 01891 goto exit; 01892 } 01893 01894 /* 01895 * Generate H = Hash( M' ) 01896 */ 01897 ret = mbedtls_md_starts( &md_ctx ); 01898 if ( ret != 0 ) 01899 goto exit; 01900 ret = mbedtls_md_update( &md_ctx, zeros, 8 ); 01901 if ( ret != 0 ) 01902 goto exit; 01903 ret = mbedtls_md_update( &md_ctx, hash, hashlen ); 01904 if ( ret != 0 ) 01905 goto exit; 01906 ret = mbedtls_md_update( &md_ctx, p, observed_salt_len ); 01907 if ( ret != 0 ) 01908 goto exit; 01909 ret = mbedtls_md_finish( &md_ctx, result ); 01910 if ( ret != 0 ) 01911 goto exit; 01912 01913 if( memcmp( hash_start, result, hlen ) != 0 ) 01914 { 01915 ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; 01916 goto exit; 01917 } 01918 01919 exit: 01920 mbedtls_md_free( &md_ctx ); 01921 01922 return( ret ); 01923 } 01924 01925 /* 01926 * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function 01927 */ 01928 int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, 01929 int (*f_rng)(void *, unsigned char *, size_t), 01930 void *p_rng, 01931 int mode, 01932 mbedtls_md_type_t md_alg, 01933 unsigned int hashlen, 01934 const unsigned char *hash, 01935 const unsigned char *sig ) 01936 { 01937 mbedtls_md_type_t mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE ) 01938 ? (mbedtls_md_type_t) ctx->hash_id 01939 : md_alg; 01940 01941 return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode, 01942 md_alg, hashlen, hash, 01943 mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY, 01944 sig ) ); 01945 01946 } 01947 #endif /* MBEDTLS_PKCS1_V21 */ 01948 01949 #if defined(MBEDTLS_PKCS1_V15) 01950 /* 01951 * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function 01952 */ 01953 int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, 01954 int (*f_rng)(void *, unsigned char *, size_t), 01955 void *p_rng, 01956 int mode, 01957 mbedtls_md_type_t md_alg, 01958 unsigned int hashlen, 01959 const unsigned char *hash, 01960 const unsigned char *sig ) 01961 { 01962 int ret = 0; 01963 const size_t sig_len = ctx->len ; 01964 unsigned char *encoded = NULL, *encoded_expected = NULL; 01965 01966 if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) 01967 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); 01968 01969 /* 01970 * Prepare expected PKCS1 v1.5 encoding of hash. 01971 */ 01972 01973 if( ( encoded = mbedtls_calloc( 1, sig_len ) ) == NULL || 01974 ( encoded_expected = mbedtls_calloc( 1, sig_len ) ) == NULL ) 01975 { 01976 ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; 01977 goto cleanup; 01978 } 01979 01980 if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, sig_len, 01981 encoded_expected ) ) != 0 ) 01982 goto cleanup; 01983 01984 /* 01985 * Apply RSA primitive to get what should be PKCS1 encoded hash. 01986 */ 01987 01988 ret = ( mode == MBEDTLS_RSA_PUBLIC ) 01989 ? mbedtls_rsa_public( ctx, sig, encoded ) 01990 : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, encoded ); 01991 if( ret != 0 ) 01992 goto cleanup; 01993 01994 /* 01995 * Compare 01996 */ 01997 01998 if( ( ret = mbedtls_safer_memcmp( encoded, encoded_expected, 01999 sig_len ) ) != 0 ) 02000 { 02001 ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; 02002 goto cleanup; 02003 } 02004 02005 cleanup: 02006 02007 if( encoded != NULL ) 02008 { 02009 mbedtls_zeroize( encoded, sig_len ); 02010 mbedtls_free( encoded ); 02011 } 02012 02013 if( encoded_expected != NULL ) 02014 { 02015 mbedtls_zeroize( encoded_expected, sig_len ); 02016 mbedtls_free( encoded_expected ); 02017 } 02018 02019 return( ret ); 02020 } 02021 #endif /* MBEDTLS_PKCS1_V15 */ 02022 02023 /* 02024 * Do an RSA operation and check the message digest 02025 */ 02026 int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, 02027 int (*f_rng)(void *, unsigned char *, size_t), 02028 void *p_rng, 02029 int mode, 02030 mbedtls_md_type_t md_alg, 02031 unsigned int hashlen, 02032 const unsigned char *hash, 02033 const unsigned char *sig ) 02034 { 02035 switch( ctx->padding ) 02036 { 02037 #if defined(MBEDTLS_PKCS1_V15) 02038 case MBEDTLS_RSA_PKCS_V15: 02039 return mbedtls_rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg, 02040 hashlen, hash, sig ); 02041 #endif 02042 02043 #if defined(MBEDTLS_PKCS1_V21) 02044 case MBEDTLS_RSA_PKCS_V21: 02045 return mbedtls_rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg, 02046 hashlen, hash, sig ); 02047 #endif 02048 02049 default: 02050 return( MBEDTLS_ERR_RSA_INVALID_PADDING ); 02051 } 02052 } 02053 02054 /* 02055 * Copy the components of an RSA key 02056 */ 02057 int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ) 02058 { 02059 int ret; 02060 02061 dst->ver = src->ver ; 02062 dst->len = src->len ; 02063 02064 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N , &src->N ) ); 02065 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->E , &src->E ) ); 02066 02067 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->D , &src->D ) ); 02068 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->P , &src->P ) ); 02069 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Q , &src->Q ) ); 02070 02071 #if !defined(MBEDTLS_RSA_NO_CRT) 02072 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DP , &src->DP ) ); 02073 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DQ , &src->DQ ) ); 02074 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->QP , &src->QP ) ); 02075 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RP , &src->RP ) ); 02076 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RQ , &src->RQ ) ); 02077 #endif 02078 02079 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RN , &src->RN ) ); 02080 02081 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vi , &src->Vi ) ); 02082 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vf , &src->Vf ) ); 02083 02084 dst->padding = src->padding ; 02085 dst->hash_id = src->hash_id ; 02086 02087 cleanup: 02088 if( ret != 0 ) 02089 mbedtls_rsa_free( dst ); 02090 02091 return( ret ); 02092 } 02093 02094 /* 02095 * Free the components of an RSA key 02096 */ 02097 void mbedtls_rsa_free( mbedtls_rsa_context *ctx ) 02098 { 02099 mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->Vf ); 02100 mbedtls_mpi_free( &ctx->RN ); mbedtls_mpi_free( &ctx->D ); 02101 mbedtls_mpi_free( &ctx->Q ); mbedtls_mpi_free( &ctx->P ); 02102 mbedtls_mpi_free( &ctx->E ); mbedtls_mpi_free( &ctx->N ); 02103 02104 #if !defined(MBEDTLS_RSA_NO_CRT) 02105 mbedtls_mpi_free( &ctx->RQ ); mbedtls_mpi_free( &ctx->RP ); 02106 mbedtls_mpi_free( &ctx->QP ); mbedtls_mpi_free( &ctx->DQ ); 02107 mbedtls_mpi_free( &ctx->DP ); 02108 #endif /* MBEDTLS_RSA_NO_CRT */ 02109 02110 #if defined(MBEDTLS_THREADING_C) 02111 mbedtls_mutex_free( &ctx->mutex ); 02112 #endif 02113 } 02114 02115 #endif /* !MBEDTLS_RSA_ALT */ 02116 02117 #if defined(MBEDTLS_SELF_TEST) 02118 02119 #include "mbedtls/sha1.h" 02120 02121 /* 02122 * Example RSA-1024 keypair, for test purposes 02123 */ 02124 #define KEY_LEN 128 02125 02126 #define RSA_N "9292758453063D803DD603D5E777D788" \ 02127 "8ED1D5BF35786190FA2F23EBC0848AEA" \ 02128 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ 02129 "7130B9CED7ACDF54CFC7555AC14EEBAB" \ 02130 "93A89813FBF3C4F8066D2D800F7C38A8" \ 02131 "1AE31942917403FF4946B0A83D3D3E05" \ 02132 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ 02133 "5E94BB77B07507233A0BC7BAC8F90F79" 02134 02135 #define RSA_E "10001" 02136 02137 #define RSA_D "24BF6185468786FDD303083D25E64EFC" \ 02138 "66CA472BC44D253102F8B4A9D3BFA750" \ 02139 "91386C0077937FE33FA3252D28855837" \ 02140 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ 02141 "DF79C5CE07EE72C7F123142198164234" \ 02142 "CABB724CF78B8173B9F880FC86322407" \ 02143 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ 02144 "071513A1E85B5DFA031F21ECAE91A34D" 02145 02146 #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ 02147 "2C01CAD19EA484A87EA4377637E75500" \ 02148 "FCB2005C5C7DD6EC4AC023CDA285D796" \ 02149 "C3D9E75E1EFC42488BB4F1D13AC30A57" 02150 02151 #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ 02152 "E211C2B9E5DB1ED0BF61D0D9899620F4" \ 02153 "910E4168387E3C30AA1E00C339A79508" \ 02154 "8452DD96A9A5EA5D9DCA68DA636032AF" 02155 02156 #define PT_LEN 24 02157 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ 02158 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" 02159 02160 #if defined(MBEDTLS_PKCS1_V15) 02161 static int myrand( void *rng_state, unsigned char *output, size_t len ) 02162 { 02163 #if !defined(__OpenBSD__) 02164 size_t i; 02165 02166 if( rng_state != NULL ) 02167 rng_state = NULL; 02168 02169 for( i = 0; i < len; ++i ) 02170 output[i] = rand(); 02171 #else 02172 if( rng_state != NULL ) 02173 rng_state = NULL; 02174 02175 arc4random_buf( output, len ); 02176 #endif /* !OpenBSD */ 02177 02178 return( 0 ); 02179 } 02180 #endif /* MBEDTLS_PKCS1_V15 */ 02181 02182 /* 02183 * Checkup routine 02184 */ 02185 int mbedtls_rsa_self_test( int verbose ) 02186 { 02187 int ret = 0; 02188 #if defined(MBEDTLS_PKCS1_V15) 02189 size_t len; 02190 mbedtls_rsa_context rsa; 02191 unsigned char rsa_plaintext[PT_LEN]; 02192 unsigned char rsa_decrypted[PT_LEN]; 02193 unsigned char rsa_ciphertext[KEY_LEN]; 02194 #if defined(MBEDTLS_SHA1_C) 02195 unsigned char sha1sum[20]; 02196 #endif 02197 02198 mbedtls_mpi K; 02199 02200 mbedtls_mpi_init( &K ); 02201 mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 ); 02202 02203 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_N ) ); 02204 MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, &K, NULL, NULL, NULL, NULL ) ); 02205 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_P ) ); 02206 MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, &K, NULL, NULL, NULL ) ); 02207 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_Q ) ); 02208 MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, &K, NULL, NULL ) ); 02209 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_D ) ); 02210 MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, &K, NULL ) ); 02211 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_E ) ); 02212 MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, NULL, &K ) ); 02213 02214 MBEDTLS_MPI_CHK( mbedtls_rsa_complete( &rsa ) ); 02215 02216 if( verbose != 0 ) 02217 mbedtls_printf( " RSA key validation: " ); 02218 02219 if( mbedtls_rsa_check_pubkey( &rsa ) != 0 || 02220 mbedtls_rsa_check_privkey( &rsa ) != 0 ) 02221 { 02222 if( verbose != 0 ) 02223 mbedtls_printf( "failed\n" ); 02224 02225 return( 1 ); 02226 } 02227 02228 if( verbose != 0 ) 02229 mbedtls_printf( "passed\n PKCS#1 encryption : " ); 02230 02231 memcpy( rsa_plaintext, RSA_PT, PT_LEN ); 02232 02233 if( mbedtls_rsa_pkcs1_encrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, 02234 PT_LEN, rsa_plaintext, 02235 rsa_ciphertext ) != 0 ) 02236 { 02237 if( verbose != 0 ) 02238 mbedtls_printf( "failed\n" ); 02239 02240 return( 1 ); 02241 } 02242 02243 if( verbose != 0 ) 02244 mbedtls_printf( "passed\n PKCS#1 decryption : " ); 02245 02246 if( mbedtls_rsa_pkcs1_decrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, 02247 &len, rsa_ciphertext, rsa_decrypted, 02248 sizeof(rsa_decrypted) ) != 0 ) 02249 { 02250 if( verbose != 0 ) 02251 mbedtls_printf( "failed\n" ); 02252 02253 return( 1 ); 02254 } 02255 02256 if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) 02257 { 02258 if( verbose != 0 ) 02259 mbedtls_printf( "failed\n" ); 02260 02261 return( 1 ); 02262 } 02263 02264 if( verbose != 0 ) 02265 mbedtls_printf( "passed\n" ); 02266 02267 #if defined(MBEDTLS_SHA1_C) 02268 if( verbose != 0 ) 02269 mbedtls_printf( " PKCS#1 data sign : " ); 02270 02271 if( mbedtls_sha1_ret( rsa_plaintext, PT_LEN, sha1sum ) != 0 ) 02272 { 02273 if( verbose != 0 ) 02274 mbedtls_printf( "failed\n" ); 02275 02276 return( 1 ); 02277 } 02278 02279 if( mbedtls_rsa_pkcs1_sign( &rsa, myrand, NULL, 02280 MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0, 02281 sha1sum, rsa_ciphertext ) != 0 ) 02282 { 02283 if( verbose != 0 ) 02284 mbedtls_printf( "failed\n" ); 02285 02286 return( 1 ); 02287 } 02288 02289 if( verbose != 0 ) 02290 mbedtls_printf( "passed\n PKCS#1 sig. verify: " ); 02291 02292 if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, 02293 MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0, 02294 sha1sum, rsa_ciphertext ) != 0 ) 02295 { 02296 if( verbose != 0 ) 02297 mbedtls_printf( "failed\n" ); 02298 02299 return( 1 ); 02300 } 02301 02302 if( verbose != 0 ) 02303 mbedtls_printf( "passed\n" ); 02304 #endif /* MBEDTLS_SHA1_C */ 02305 02306 if( verbose != 0 ) 02307 mbedtls_printf( "\n" ); 02308 02309 cleanup: 02310 mbedtls_mpi_free( &K ); 02311 mbedtls_rsa_free( &rsa ); 02312 #else /* MBEDTLS_PKCS1_V15 */ 02313 ((void) verbose); 02314 #endif /* MBEDTLS_PKCS1_V15 */ 02315 return( ret ); 02316 } 02317 02318 #endif /* MBEDTLS_SELF_TEST */ 02319 02320 #endif /* MBEDTLS_RSA_C */
Generated on Tue Jul 12 2022 14:24:33 by
