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