blob: fa6a3f30848248ec1362f731792c33d084216807 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * The RSA public-key cryptosystem
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman.
24 *
25 * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf
26 * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf
Janos Follath5d392572017-03-22 13:38:28 +000027 * [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks
28 * Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and
29 * Stefan Mangard
30 * https://arxiv.org/abs/1702.08719v2
31 *
Paul Bakker5121ce52009-01-03 21:22:43 +000032 */
33
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020034#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker40e46942009-01-03 21:51:57 +000035#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020036#else
37#include POLARSSL_CONFIG_FILE
38#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000039
Paul Bakker40e46942009-01-03 21:51:57 +000040#if defined(POLARSSL_RSA_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000041
Paul Bakker40e46942009-01-03 21:51:57 +000042#include "polarssl/rsa.h"
Paul Bakkerc70b9822013-04-07 22:00:46 +020043#include "polarssl/oid.h"
Paul Bakkerbb51f0c2012-08-23 07:46:58 +000044
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <string.h>
46
Paul Bakkerbb51f0c2012-08-23 07:46:58 +000047#if defined(POLARSSL_PKCS1_V21)
Paul Bakker9dcc3222011-03-08 14:16:06 +000048#include "polarssl/md.h"
Paul Bakkerbb51f0c2012-08-23 07:46:58 +000049#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000050
Rich Evans00ab4702015-02-06 13:43:58 +000051#if defined(POLARSSL_PKCS1_V15) && !defined(__OpenBSD__)
Paul Bakker5121ce52009-01-03 21:22:43 +000052#include <stdlib.h>
Rich Evans00ab4702015-02-06 13:43:58 +000053#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Paul Bakker7dc4c442014-02-01 22:50:26 +010055#if defined(POLARSSL_PLATFORM_C)
56#include "polarssl/platform.h"
57#else
Rich Evans00ab4702015-02-06 13:43:58 +000058#include <stdio.h>
Paul Bakker7dc4c442014-02-01 22:50:26 +010059#define polarssl_printf printf
Manuel Pégourié-Gonnarda1cdcd22015-09-03 20:03:15 +020060#define polarssl_malloc malloc
61#define polarssl_free free
Paul Bakker7dc4c442014-02-01 22:50:26 +010062#endif
63
Paul Bakker5121ce52009-01-03 21:22:43 +000064/*
65 * Initialize an RSA context
66 */
67void rsa_init( rsa_context *ctx,
68 int padding,
Paul Bakker21eb2802010-08-16 11:10:02 +000069 int hash_id )
Paul Bakker5121ce52009-01-03 21:22:43 +000070{
71 memset( ctx, 0, sizeof( rsa_context ) );
72
Manuel Pégourié-Gonnard844a4c02014-03-10 21:55:35 +010073 rsa_set_padding( ctx, padding, hash_id );
Paul Bakkerc9965dc2013-09-29 14:58:17 +020074
75#if defined(POLARSSL_THREADING_C)
76 polarssl_mutex_init( &ctx->mutex );
77#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000078}
79
Manuel Pégourié-Gonnard844a4c02014-03-10 21:55:35 +010080/*
81 * Set padding for an existing RSA context
82 */
83void rsa_set_padding( rsa_context *ctx, int padding, int hash_id )
84{
85 ctx->padding = padding;
86 ctx->hash_id = hash_id;
87}
88
Paul Bakker40e46942009-01-03 21:51:57 +000089#if defined(POLARSSL_GENPRIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000090
91/*
92 * Generate an RSA keypair
93 */
Paul Bakker21eb2802010-08-16 11:10:02 +000094int rsa_gen_key( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +000095 int (*f_rng)(void *, unsigned char *, size_t),
96 void *p_rng,
97 unsigned int nbits, int exponent )
Paul Bakker5121ce52009-01-03 21:22:43 +000098{
99 int ret;
100 mpi P1, Q1, H, G;
101
Paul Bakker21eb2802010-08-16 11:10:02 +0000102 if( f_rng == NULL || nbits < 128 || exponent < 3 )
Paul Bakker40e46942009-01-03 21:51:57 +0000103 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000104
Janos Follathbfcd0322016-09-21 13:18:12 +0100105 if( nbits % 2 )
106 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
107
Janos Follathd61fc682016-02-23 14:42:48 +0000108 mpi_init( &P1 ); mpi_init( &Q1 );
109 mpi_init( &H ); mpi_init( &G );
Paul Bakker5121ce52009-01-03 21:22:43 +0000110
111 /*
112 * find primes P and Q with Q < P so that:
113 * GCD( E, (P-1)*(Q-1) ) == 1
114 */
115 MPI_CHK( mpi_lset( &ctx->E, exponent ) );
116
117 do
118 {
Janos Follathd61fc682016-02-23 14:42:48 +0000119 MPI_CHK( mpi_gen_prime( &ctx->P, nbits >> 1, 0,
Paul Bakker21eb2802010-08-16 11:10:02 +0000120 f_rng, p_rng ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000121
Janos Follathbfcd0322016-09-21 13:18:12 +0100122 MPI_CHK( mpi_gen_prime( &ctx->Q, nbits >> 1, 0,
Paul Bakker21eb2802010-08-16 11:10:02 +0000123 f_rng, p_rng ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000124
125 if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )
126 continue;
127
128 MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );
129 if( mpi_msb( &ctx->N ) != nbits )
130 continue;
131
Janos Follathbfcd0322016-09-21 13:18:12 +0100132 if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )
133 mpi_swap( &ctx->P, &ctx->Q );
134
Paul Bakker5121ce52009-01-03 21:22:43 +0000135 MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
136 MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
137 MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
138 MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
139 }
140 while( mpi_cmp_int( &G, 1 ) != 0 );
141
142 /*
143 * D = E^-1 mod ((P-1)*(Q-1))
144 * DP = D mod (P - 1)
145 * DQ = D mod (Q - 1)
146 * QP = Q^-1 mod P
147 */
148 MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) );
149 MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );
150 MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );
151 MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );
152
153 ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3;
154
155cleanup:
156
Paul Bakker6c591fa2011-05-05 11:49:20 +0000157 mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
Paul Bakker5121ce52009-01-03 21:22:43 +0000158
159 if( ret != 0 )
160 {
161 rsa_free( ctx );
Paul Bakker9d781402011-05-09 16:17:09 +0000162 return( POLARSSL_ERR_RSA_KEY_GEN_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000163 }
164
Paul Bakker48377d92013-08-30 12:06:24 +0200165 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000166}
167
Paul Bakker9af723c2014-05-01 13:03:14 +0200168#endif /* POLARSSL_GENPRIME */
Paul Bakker5121ce52009-01-03 21:22:43 +0000169
170/*
171 * Check a public RSA key
172 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000173int rsa_check_pubkey( const rsa_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000174{
Paul Bakker37940d9f2009-07-10 22:38:58 +0000175 if( !ctx->N.p || !ctx->E.p )
176 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
177
Paul Bakker48377d92013-08-30 12:06:24 +0200178 if( ( ctx->N.p[0] & 1 ) == 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000179 ( ctx->E.p[0] & 1 ) == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +0000180 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000181
182 if( mpi_msb( &ctx->N ) < 128 ||
Paul Bakkerfe3256e2011-11-25 12:11:43 +0000183 mpi_msb( &ctx->N ) > POLARSSL_MPI_MAX_BITS )
Paul Bakker40e46942009-01-03 21:51:57 +0000184 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000185
186 if( mpi_msb( &ctx->E ) < 2 ||
Paul Bakker24f37cc2014-04-30 13:33:35 +0200187 mpi_cmp_mpi( &ctx->E, &ctx->N ) >= 0 )
Paul Bakker40e46942009-01-03 21:51:57 +0000188 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000189
190 return( 0 );
191}
192
193/*
194 * Check a private RSA key
195 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000196int rsa_check_privkey( const rsa_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000197{
198 int ret;
Paul Bakker321df6f2012-09-27 13:21:34 +0000199 mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2, DP, DQ, QP;
Paul Bakker5121ce52009-01-03 21:22:43 +0000200
201 if( ( ret = rsa_check_pubkey( ctx ) ) != 0 )
202 return( ret );
203
Paul Bakker37940d9f2009-07-10 22:38:58 +0000204 if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )
205 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
206
Paul Bakker6c591fa2011-05-05 11:49:20 +0000207 mpi_init( &PQ ); mpi_init( &DE ); mpi_init( &P1 ); mpi_init( &Q1 );
208 mpi_init( &H ); mpi_init( &I ); mpi_init( &G ); mpi_init( &G2 );
Paul Bakker321df6f2012-09-27 13:21:34 +0000209 mpi_init( &L1 ); mpi_init( &L2 ); mpi_init( &DP ); mpi_init( &DQ );
210 mpi_init( &QP );
Paul Bakker5121ce52009-01-03 21:22:43 +0000211
212 MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
213 MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
214 MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
215 MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
216 MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000217 MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
218
Paul Bakkerb572adf2010-07-18 08:29:32 +0000219 MPI_CHK( mpi_gcd( &G2, &P1, &Q1 ) );
Paul Bakker48377d92013-08-30 12:06:24 +0200220 MPI_CHK( mpi_div_mpi( &L1, &L2, &H, &G2 ) );
Paul Bakkerb572adf2010-07-18 08:29:32 +0000221 MPI_CHK( mpi_mod_mpi( &I, &DE, &L1 ) );
222
Paul Bakker321df6f2012-09-27 13:21:34 +0000223 MPI_CHK( mpi_mod_mpi( &DP, &ctx->D, &P1 ) );
224 MPI_CHK( mpi_mod_mpi( &DQ, &ctx->D, &Q1 ) );
225 MPI_CHK( mpi_inv_mod( &QP, &ctx->Q, &ctx->P ) );
Paul Bakkerb572adf2010-07-18 08:29:32 +0000226 /*
227 * Check for a valid PKCS1v2 private key
228 */
Paul Bakker6c591fa2011-05-05 11:49:20 +0000229 if( mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||
Paul Bakker321df6f2012-09-27 13:21:34 +0000230 mpi_cmp_mpi( &DP, &ctx->DP ) != 0 ||
231 mpi_cmp_mpi( &DQ, &ctx->DQ ) != 0 ||
232 mpi_cmp_mpi( &QP, &ctx->QP ) != 0 ||
Paul Bakker6c591fa2011-05-05 11:49:20 +0000233 mpi_cmp_int( &L2, 0 ) != 0 ||
234 mpi_cmp_int( &I, 1 ) != 0 ||
235 mpi_cmp_int( &G, 1 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000236 {
Paul Bakker6c591fa2011-05-05 11:49:20 +0000237 ret = POLARSSL_ERR_RSA_KEY_CHECK_FAILED;
Paul Bakker5121ce52009-01-03 21:22:43 +0000238 }
Paul Bakker48377d92013-08-30 12:06:24 +0200239
Paul Bakker5121ce52009-01-03 21:22:43 +0000240cleanup:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000241 mpi_free( &PQ ); mpi_free( &DE ); mpi_free( &P1 ); mpi_free( &Q1 );
242 mpi_free( &H ); mpi_free( &I ); mpi_free( &G ); mpi_free( &G2 );
Paul Bakker321df6f2012-09-27 13:21:34 +0000243 mpi_free( &L1 ); mpi_free( &L2 ); mpi_free( &DP ); mpi_free( &DQ );
244 mpi_free( &QP );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000245
Paul Bakker9d781402011-05-09 16:17:09 +0000246 if( ret == POLARSSL_ERR_RSA_KEY_CHECK_FAILED )
247 return( ret );
248
Paul Bakker6c591fa2011-05-05 11:49:20 +0000249 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000250 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED + ret );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000251
252 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000253}
254
255/*
Manuel Pégourié-Gonnard2f8d1f92014-11-06 14:02:51 +0100256 * Check if contexts holding a public and private key match
257 */
258int rsa_check_pub_priv( const rsa_context *pub, const rsa_context *prv )
259{
260 if( rsa_check_pubkey( pub ) != 0 ||
261 rsa_check_privkey( prv ) != 0 )
262 {
263 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
264 }
265
266 if( mpi_cmp_mpi( &pub->N, &prv->N ) != 0 ||
267 mpi_cmp_mpi( &pub->E, &prv->E ) != 0 )
268 {
269 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
270 }
271
272 return( 0 );
273}
274
275/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000276 * Do an RSA public key operation
277 */
278int rsa_public( rsa_context *ctx,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000279 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000280 unsigned char *output )
281{
Paul Bakker23986e52011-04-24 08:57:21 +0000282 int ret;
283 size_t olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000284 mpi T;
285
Paul Bakker6c591fa2011-05-05 11:49:20 +0000286 mpi_init( &T );
Paul Bakker5121ce52009-01-03 21:22:43 +0000287
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200288#if defined(POLARSSL_THREADING_C)
289 if( ( ret = polarssl_mutex_lock( &ctx->mutex ) ) != 0 )
290 return( ret );
291#endif
292
Paul Bakker5121ce52009-01-03 21:22:43 +0000293 MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
294
295 if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
296 {
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200297 ret = POLARSSL_ERR_MPI_BAD_INPUT_DATA;
298 goto cleanup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000299 }
300
301 olen = ctx->len;
302 MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );
303 MPI_CHK( mpi_write_binary( &T, output, olen ) );
304
305cleanup:
Manuel Pégourié-Gonnard88fca3e2015-03-27 15:06:07 +0100306#if defined(POLARSSL_THREADING_C)
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200307 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
308 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
Manuel Pégourié-Gonnard88fca3e2015-03-27 15:06:07 +0100309#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000310
Paul Bakker6c591fa2011-05-05 11:49:20 +0000311 mpi_free( &T );
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
313 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000314 return( POLARSSL_ERR_RSA_PUBLIC_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000315
316 return( 0 );
317}
318
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200319/*
Manuel Pégourié-Gonnard8a109f12013-09-10 13:37:26 +0200320 * Generate or update blinding values, see section 10 of:
321 * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA,
322 * DSS, and other systems. In : Advances in Cryptology—CRYPTO’96. Springer
323 * Berlin Heidelberg, 1996. p. 104-113.
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200324 */
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200325static int rsa_prepare_blinding( rsa_context *ctx,
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200326 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
327{
Manuel Pégourié-Gonnard4d89c7e2013-10-04 15:18:38 +0200328 int ret, count = 0;
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200329
Manuel Pégourié-Gonnard8a109f12013-09-10 13:37:26 +0200330 if( ctx->Vf.p != NULL )
331 {
332 /* We already have blinding values, just update them by squaring */
333 MPI_CHK( mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) );
Manuel Pégourié-Gonnard735b8fc2013-09-13 12:57:23 +0200334 MPI_CHK( mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) );
Manuel Pégourié-Gonnard8a109f12013-09-10 13:37:26 +0200335 MPI_CHK( mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) );
Manuel Pégourié-Gonnard735b8fc2013-09-13 12:57:23 +0200336 MPI_CHK( mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->N ) );
Manuel Pégourié-Gonnard8a109f12013-09-10 13:37:26 +0200337
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200338 goto cleanup;
Manuel Pégourié-Gonnard8a109f12013-09-10 13:37:26 +0200339 }
340
Manuel Pégourié-Gonnard4d89c7e2013-10-04 15:18:38 +0200341 /* Unblinding value: Vf = random number, invertible mod N */
342 do {
343 if( count++ > 10 )
344 return( POLARSSL_ERR_RSA_RNG_FAILED );
345
346 MPI_CHK( mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) );
347 MPI_CHK( mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) );
348 } while( mpi_cmp_int( &ctx->Vi, 1 ) != 0 );
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200349
350 /* Blinding value: Vi = Vf^(-e) mod N */
351 MPI_CHK( mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) );
352 MPI_CHK( mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) );
353
354cleanup:
355 return( ret );
356}
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358/*
Janos Follath5d392572017-03-22 13:38:28 +0000359 * Exponent blinding supposed to prevent side-channel attacks using multiple
360 * traces of measurements to recover the RSA key. The more collisions are there,
361 * the more bits of the key can be recovered. See [3].
362 *
363 * Collecting n collisions with m bit long blinding value requires 2^(m-m/n)
364 * observations on avarage.
365 *
366 * For example with 28 byte blinding to achieve 2 collisions the adversary has
367 * to make 2^112 observations on avarage.
368 *
369 * (With the currently (as of 2017 April) known best algorithms breaking 2048
370 * bit RSA requires approximately as much time as trying out 2^112 random keys.
371 * Thus in this sense with 28 byte blinding the security is not reduced by
372 * side-channel attacks like the one in [3])
373 *
374 * This countermeasure does not help if the key recovery is possible with a
375 * single trace.
376 */
377#define RSA_EXPONENT_BLINDING 28
378
379/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000380 * Do an RSA private key operation
381 */
382int rsa_private( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +0200383 int (*f_rng)(void *, unsigned char *, size_t),
384 void *p_rng,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000385 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 unsigned char *output )
387{
Paul Bakker23986e52011-04-24 08:57:21 +0000388 int ret;
389 size_t olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000390 mpi T, T1, T2;
Janos Follathbb1e6882017-03-22 15:13:15 +0000391 mpi P1, Q1, R;
Janos Follath5d392572017-03-22 13:38:28 +0000392#if defined(POLARSSL_RSA_NO_CRT)
Janos Follathbb1e6882017-03-22 15:13:15 +0000393 mpi D_blind;
Janos Follath5d392572017-03-22 13:38:28 +0000394 mpi *D = &ctx->D;
Janos Follathbb1e6882017-03-22 15:13:15 +0000395#else
396 mpi DP_blind, DQ_blind;
397 mpi *DP = &ctx->DP;
398 mpi *DQ = &ctx->DQ;
Janos Follath5d392572017-03-22 13:38:28 +0000399#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000400
Paul Bakker6c591fa2011-05-05 11:49:20 +0000401 mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000402
Janos Follath5d392572017-03-22 13:38:28 +0000403 mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 );
Janos Follathbb1e6882017-03-22 15:13:15 +0000404 mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &R );
405
406
407 if( f_rng != NULL )
408 {
Janos Follath5d392572017-03-22 13:38:28 +0000409#if defined(POLARSSL_RSA_NO_CRT)
Janos Follathbb1e6882017-03-22 15:13:15 +0000410 mpi_init( &D_blind );
411#else
412 mpi_init( &DP_blind );
413 mpi_init( &DQ_blind );
Janos Follath5d392572017-03-22 13:38:28 +0000414#endif
Janos Follathbb1e6882017-03-22 15:13:15 +0000415 }
Janos Follath5d392572017-03-22 13:38:28 +0000416
417
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200418#if defined(POLARSSL_THREADING_C)
Janos Follath5d392572017-03-22 13:38:28 +0000419 if( ( ret = mutex_lock( &ctx->mutex ) ) != 0 )
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200420 return( ret );
421#endif
422
Paul Bakker5121ce52009-01-03 21:22:43 +0000423 MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000424 if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
425 {
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200426 ret = POLARSSL_ERR_MPI_BAD_INPUT_DATA;
427 goto cleanup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000428 }
429
Paul Bakkerf451bac2013-08-30 15:37:02 +0200430 if( f_rng != NULL )
431 {
432 /*
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200433 * Blinding
434 * T = T * Vi mod N
Paul Bakkerf451bac2013-08-30 15:37:02 +0200435 */
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200436 MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) );
437 MPI_CHK( mpi_mul_mpi( &T, &T, &ctx->Vi ) );
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200438 MPI_CHK( mpi_mod_mpi( &T, &T, &ctx->N ) );
Janos Follath5d392572017-03-22 13:38:28 +0000439
Janos Follath5d392572017-03-22 13:38:28 +0000440 /*
441 * Exponent blinding
442 */
443 MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
444 MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
445
Janos Follathbb1e6882017-03-22 15:13:15 +0000446#if defined(POLARSSL_RSA_NO_CRT)
Janos Follath5d392572017-03-22 13:38:28 +0000447 /*
448 * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D
449 */
450 MPI_CHK( mpi_fill_random( &R, RSA_EXPONENT_BLINDING,
451 f_rng, p_rng ) );
452 MPI_CHK( mpi_mul_mpi( &D_blind, &P1, &Q1 ) );
453 MPI_CHK( mpi_mul_mpi( &D_blind, &D_blind, &R ) );
454 MPI_CHK( mpi_add_mpi( &D_blind, &D_blind, &ctx->D ) );
455
456 D = &D_blind;
Janos Follathbb1e6882017-03-22 15:13:15 +0000457#else
458 /*
459 * DP_blind = ( P - 1 ) * R + DP
460 */
461 MPI_CHK( mpi_fill_random( &R, RSA_EXPONENT_BLINDING,
462 f_rng, p_rng ) );
463 MPI_CHK( mpi_mul_mpi( &DP_blind, &P1, &R ) );
464 MPI_CHK( mpi_add_mpi( &DP_blind, &DP_blind,
465 &ctx->DP ) );
466
467 DP = &DP_blind;
468
469 /*
470 * DQ_blind = ( Q - 1 ) * R + DQ
471 */
472 MPI_CHK( mpi_fill_random( &R, RSA_EXPONENT_BLINDING,
473 f_rng, p_rng ) );
474 MPI_CHK( mpi_mul_mpi( &DQ_blind, &Q1, &R ) );
475 MPI_CHK( mpi_add_mpi( &DQ_blind, &DQ_blind,
476 &ctx->DQ ) );
477
478 DQ = &DQ_blind;
Janos Follath5d392572017-03-22 13:38:28 +0000479#endif /* POLARSSL_RSA_NO_CRT */
Paul Bakkerf451bac2013-08-30 15:37:02 +0200480 }
Paul Bakkeraab30c12013-08-30 11:00:25 +0200481
Manuel Pégourié-Gonnarde10e06d2014-11-06 18:15:12 +0100482#if defined(POLARSSL_RSA_NO_CRT)
Janos Follath5d392572017-03-22 13:38:28 +0000483 MPI_CHK( mpi_exp_mod( &T, &T, D, &ctx->N, &ctx->RN ) );
Manuel Pégourié-Gonnarde10e06d2014-11-06 18:15:12 +0100484#else
Paul Bakkeraab30c12013-08-30 11:00:25 +0200485 /*
Janos Follath5d392572017-03-22 13:38:28 +0000486 * Faster decryption using the CRT
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 *
488 * T1 = input ^ dP mod P
489 * T2 = input ^ dQ mod Q
490 */
Janos Follathbb1e6882017-03-22 15:13:15 +0000491 MPI_CHK( mpi_exp_mod( &T1, &T, DP, &ctx->P, &ctx->RP ) );
492 MPI_CHK( mpi_exp_mod( &T2, &T, DQ, &ctx->Q, &ctx->RQ ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000493
494 /*
495 * T = (T1 - T2) * (Q^-1 mod P) mod P
496 */
497 MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) );
498 MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) );
499 MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) );
500
501 /*
Paul Bakkerf451bac2013-08-30 15:37:02 +0200502 * T = T2 + T * Q
Paul Bakker5121ce52009-01-03 21:22:43 +0000503 */
504 MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) );
Paul Bakkerf451bac2013-08-30 15:37:02 +0200505 MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) );
Manuel Pégourié-Gonnarde10e06d2014-11-06 18:15:12 +0100506#endif /* POLARSSL_RSA_NO_CRT */
Paul Bakkeraab30c12013-08-30 11:00:25 +0200507
Paul Bakkerf451bac2013-08-30 15:37:02 +0200508 if( f_rng != NULL )
509 {
510 /*
511 * Unblind
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +0200512 * T = T * Vf mod N
Paul Bakkerf451bac2013-08-30 15:37:02 +0200513 */
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200514 MPI_CHK( mpi_mul_mpi( &T, &T, &ctx->Vf ) );
Paul Bakkerf451bac2013-08-30 15:37:02 +0200515 MPI_CHK( mpi_mod_mpi( &T, &T, &ctx->N ) );
516 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000517
518 olen = ctx->len;
519 MPI_CHK( mpi_write_binary( &T, output, olen ) );
520
521cleanup:
Manuel Pégourié-Gonnarde10e06d2014-11-06 18:15:12 +0100522#if defined(POLARSSL_THREADING_C)
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200523 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
524 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
Manuel Pégourié-Gonnardae102992013-10-04 17:07:12 +0200525#endif
Manuel Pégourié-Gonnard5efed092015-08-31 10:03:16 +0200526
Manuel Pégourié-Gonnard88fca3e2015-03-27 15:06:07 +0100527 mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 );
Janos Follathbb1e6882017-03-22 15:13:15 +0000528 mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &R );
529
530 if( f_rng != NULL )
531 {
Janos Follath5d392572017-03-22 13:38:28 +0000532#if defined(POLARSSL_RSA_NO_CRT)
Janos Follathbb1e6882017-03-22 15:13:15 +0000533 mpi_free( &D_blind );
534#else
535 mpi_free( &DP_blind );
536 mpi_free( &DQ_blind );
Janos Follath5d392572017-03-22 13:38:28 +0000537#endif
Janos Follathbb1e6882017-03-22 15:13:15 +0000538 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000539
540 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000541 return( POLARSSL_ERR_RSA_PRIVATE_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
543 return( 0 );
544}
545
Paul Bakker9dcc3222011-03-08 14:16:06 +0000546#if defined(POLARSSL_PKCS1_V21)
547/**
548 * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer.
549 *
Paul Bakkerb125ed82011-11-10 13:33:51 +0000550 * \param dst buffer to mask
551 * \param dlen length of destination buffer
552 * \param src source of the mask generation
553 * \param slen length of the source buffer
554 * \param md_ctx message digest context to use
Paul Bakker9dcc3222011-03-08 14:16:06 +0000555 */
Paul Bakker48377d92013-08-30 12:06:24 +0200556static void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src,
557 size_t slen, md_context_t *md_ctx )
Paul Bakker9dcc3222011-03-08 14:16:06 +0000558{
559 unsigned char mask[POLARSSL_MD_MAX_SIZE];
560 unsigned char counter[4];
561 unsigned char *p;
Paul Bakker23986e52011-04-24 08:57:21 +0000562 unsigned int hlen;
563 size_t i, use_len;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000564
565 memset( mask, 0, POLARSSL_MD_MAX_SIZE );
566 memset( counter, 0, 4 );
567
568 hlen = md_ctx->md_info->size;
569
570 // Generate and apply dbMask
571 //
572 p = dst;
573
574 while( dlen > 0 )
575 {
576 use_len = hlen;
577 if( dlen < hlen )
578 use_len = dlen;
579
580 md_starts( md_ctx );
581 md_update( md_ctx, src, slen );
582 md_update( md_ctx, counter, 4 );
583 md_finish( md_ctx, mask );
584
585 for( i = 0; i < use_len; ++i )
586 *p++ ^= mask[i];
587
588 counter[3]++;
589
590 dlen -= use_len;
591 }
592}
Paul Bakker9af723c2014-05-01 13:03:14 +0200593#endif /* POLARSSL_PKCS1_V21 */
Paul Bakker9dcc3222011-03-08 14:16:06 +0000594
Paul Bakkerb3869132013-02-28 17:21:01 +0100595#if defined(POLARSSL_PKCS1_V21)
596/*
597 * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function
598 */
599int rsa_rsaes_oaep_encrypt( rsa_context *ctx,
600 int (*f_rng)(void *, unsigned char *, size_t),
601 void *p_rng,
Paul Bakkera43231c2013-02-28 17:33:49 +0100602 int mode,
603 const unsigned char *label, size_t label_len,
604 size_t ilen,
Paul Bakkerb3869132013-02-28 17:21:01 +0100605 const unsigned char *input,
606 unsigned char *output )
607{
608 size_t olen;
609 int ret;
610 unsigned char *p = output;
611 unsigned int hlen;
612 const md_info_t *md_info;
613 md_context_t md_ctx;
614
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +0200615 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V21 )
616 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
617
618 if( f_rng == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +0100619 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
620
Manuel Pégourié-Gonnarda2733712015-02-10 17:32:14 +0100621 md_info = md_info_from_type( (md_type_t) ctx->hash_id );
Paul Bakkerb3869132013-02-28 17:21:01 +0100622 if( md_info == NULL )
623 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
624
625 olen = ctx->len;
626 hlen = md_get_size( md_info );
627
Janos Follath742783f2016-02-08 14:52:29 +0000628 // first comparison checks for overflow
629 if( ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2 )
Paul Bakkerb3869132013-02-28 17:21:01 +0100630 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
631
632 memset( output, 0, olen );
633
634 *p++ = 0;
635
636 // Generate a random octet string seed
637 //
638 if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 )
639 return( POLARSSL_ERR_RSA_RNG_FAILED + ret );
640
641 p += hlen;
642
643 // Construct DB
644 //
Paul Bakkera43231c2013-02-28 17:33:49 +0100645 md( md_info, label, label_len, p );
Paul Bakkerb3869132013-02-28 17:21:01 +0100646 p += hlen;
647 p += olen - 2 * hlen - 2 - ilen;
648 *p++ = 1;
649 memcpy( p, input, ilen );
650
Paul Bakker84bbeb52014-07-01 14:53:22 +0200651 md_init( &md_ctx );
Brian J Murray4556d202016-06-23 12:57:03 -0700652 if( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 )
653 {
654 md_free( &md_ctx );
655 return( ret );
656 }
Paul Bakkerb3869132013-02-28 17:21:01 +0100657
658 // maskedDB: Apply dbMask to DB
659 //
660 mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,
661 &md_ctx );
662
663 // maskedSeed: Apply seedMask to seed
664 //
665 mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,
666 &md_ctx );
667
Paul Bakker84bbeb52014-07-01 14:53:22 +0200668 md_free( &md_ctx );
Paul Bakkerb3869132013-02-28 17:21:01 +0100669
670 return( ( mode == RSA_PUBLIC )
671 ? rsa_public( ctx, output, output )
Paul Bakker548957d2013-08-30 10:30:02 +0200672 : rsa_private( ctx, f_rng, p_rng, output, output ) );
Paul Bakkerb3869132013-02-28 17:21:01 +0100673}
674#endif /* POLARSSL_PKCS1_V21 */
675
Paul Bakker48377d92013-08-30 12:06:24 +0200676#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +0100677/*
678 * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function
679 */
680int rsa_rsaes_pkcs1_v15_encrypt( rsa_context *ctx,
681 int (*f_rng)(void *, unsigned char *, size_t),
682 void *p_rng,
683 int mode, size_t ilen,
684 const unsigned char *input,
685 unsigned char *output )
686{
687 size_t nb_pad, olen;
688 int ret;
689 unsigned char *p = output;
690
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +0200691 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V15 )
692 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
693
Janos Follath7ddc2cd2016-03-18 11:45:44 +0000694 // We don't check p_rng because it won't be dereferenced here
695 if( f_rng == NULL || input == NULL || output == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +0100696 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
697
698 olen = ctx->len;
699
Janos Follath742783f2016-02-08 14:52:29 +0000700 // first comparison checks for overflow
701 if( ilen + 11 < ilen || olen < ilen + 11 )
Paul Bakkerb3869132013-02-28 17:21:01 +0100702 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
703
704 nb_pad = olen - 3 - ilen;
705
706 *p++ = 0;
707 if( mode == RSA_PUBLIC )
708 {
709 *p++ = RSA_CRYPT;
710
711 while( nb_pad-- > 0 )
712 {
713 int rng_dl = 100;
714
715 do {
716 ret = f_rng( p_rng, p, 1 );
717 } while( *p == 0 && --rng_dl && ret == 0 );
718
719 // Check if RNG failed to generate data
720 //
Paul Bakker66d5d072014-06-17 16:39:18 +0200721 if( rng_dl == 0 || ret != 0 )
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200722 return( POLARSSL_ERR_RSA_RNG_FAILED + ret );
Paul Bakkerb3869132013-02-28 17:21:01 +0100723
724 p++;
725 }
726 }
727 else
728 {
729 *p++ = RSA_SIGN;
730
731 while( nb_pad-- > 0 )
732 *p++ = 0xFF;
733 }
734
735 *p++ = 0;
736 memcpy( p, input, ilen );
737
738 return( ( mode == RSA_PUBLIC )
739 ? rsa_public( ctx, output, output )
Paul Bakker548957d2013-08-30 10:30:02 +0200740 : rsa_private( ctx, f_rng, p_rng, output, output ) );
Paul Bakkerb3869132013-02-28 17:21:01 +0100741}
Paul Bakker48377d92013-08-30 12:06:24 +0200742#endif /* POLARSSL_PKCS1_V15 */
Paul Bakkerb3869132013-02-28 17:21:01 +0100743
Paul Bakker5121ce52009-01-03 21:22:43 +0000744/*
745 * Add the message padding, then do an RSA operation
746 */
747int rsa_pkcs1_encrypt( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +0000748 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker21eb2802010-08-16 11:10:02 +0000749 void *p_rng,
Paul Bakker23986e52011-04-24 08:57:21 +0000750 int mode, size_t ilen,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000751 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000752 unsigned char *output )
753{
Paul Bakker5121ce52009-01-03 21:22:43 +0000754 switch( ctx->padding )
755 {
Paul Bakker48377d92013-08-30 12:06:24 +0200756#if defined(POLARSSL_PKCS1_V15)
Paul Bakker5121ce52009-01-03 21:22:43 +0000757 case RSA_PKCS_V15:
Paul Bakkerb3869132013-02-28 17:21:01 +0100758 return rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen,
759 input, output );
Paul Bakker48377d92013-08-30 12:06:24 +0200760#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000761
Paul Bakker9dcc3222011-03-08 14:16:06 +0000762#if defined(POLARSSL_PKCS1_V21)
763 case RSA_PKCS_V21:
Paul Bakkerb3869132013-02-28 17:21:01 +0100764 return rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0,
765 ilen, input, output );
Paul Bakker9dcc3222011-03-08 14:16:06 +0000766#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000767
768 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000769 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000770 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000771}
772
Paul Bakkerb3869132013-02-28 17:21:01 +0100773#if defined(POLARSSL_PKCS1_V21)
Paul Bakker5121ce52009-01-03 21:22:43 +0000774/*
Paul Bakkerb3869132013-02-28 17:21:01 +0100775 * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function
Paul Bakker5121ce52009-01-03 21:22:43 +0000776 */
Paul Bakkerb3869132013-02-28 17:21:01 +0100777int rsa_rsaes_oaep_decrypt( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +0200778 int (*f_rng)(void *, unsigned char *, size_t),
779 void *p_rng,
780 int mode,
Paul Bakkera43231c2013-02-28 17:33:49 +0100781 const unsigned char *label, size_t label_len,
782 size_t *olen,
Paul Bakkerb3869132013-02-28 17:21:01 +0100783 const unsigned char *input,
784 unsigned char *output,
785 size_t output_max_len )
Paul Bakker5121ce52009-01-03 21:22:43 +0000786{
Paul Bakker23986e52011-04-24 08:57:21 +0000787 int ret;
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100788 size_t ilen, i, pad_len;
789 unsigned char *p, bad, pad_done;
Paul Bakker0be82f22012-10-03 20:36:33 +0000790 unsigned char buf[POLARSSL_MPI_MAX_SIZE];
Paul Bakker9dcc3222011-03-08 14:16:06 +0000791 unsigned char lhash[POLARSSL_MD_MAX_SIZE];
Paul Bakker23986e52011-04-24 08:57:21 +0000792 unsigned int hlen;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000793 const md_info_t *md_info;
794 md_context_t md_ctx;
Paul Bakkerb3869132013-02-28 17:21:01 +0100795
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100796 /*
797 * Parameters sanity checks
798 */
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +0200799 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V21 )
Paul Bakkerb3869132013-02-28 17:21:01 +0100800 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000801
802 ilen = ctx->len;
803
Paul Bakker27fdf462011-06-09 13:55:13 +0000804 if( ilen < 16 || ilen > sizeof( buf ) )
Paul Bakker40e46942009-01-03 21:51:57 +0000805 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000806
Manuel Pégourié-Gonnarda2733712015-02-10 17:32:14 +0100807 md_info = md_info_from_type( (md_type_t) ctx->hash_id );
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100808 if( md_info == NULL )
809 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
810
Simon Butcherd3253b02016-03-17 00:57:18 +0000811 hlen = md_get_size( md_info );
Janos Follath092f2c42016-02-11 11:08:18 +0000812
813 // checking for integer underflow
814 if( 2 * hlen + 2 > ilen )
Simon Butcherd3253b02016-03-17 00:57:18 +0000815 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Janos Follath092f2c42016-02-11 11:08:18 +0000816
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100817 /*
818 * RSA operation
819 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000820 ret = ( mode == RSA_PUBLIC )
821 ? rsa_public( ctx, input, buf )
Paul Bakker548957d2013-08-30 10:30:02 +0200822 : rsa_private( ctx, f_rng, p_rng, input, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
824 if( ret != 0 )
825 return( ret );
826
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100827 /*
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100828 * Unmask data and generate lHash
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100829 */
830 hlen = md_get_size( md_info );
831
Janos Follath3bed13d2016-02-09 14:51:35 +0000832 // checking for integer underflow
833 if( 2 * hlen + 2 > ilen )
834 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
835
Simon Butcherd3253b02016-03-17 00:57:18 +0000836 md_init( &md_ctx );
Brian J Murray4556d202016-06-23 12:57:03 -0700837 if( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 )
838 {
839 md_free( &md_ctx );
840 return( ret );
841 }
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100842
843 /* Generate lHash */
844 md( md_info, label, label_len, lhash );
845
846 /* seed: Apply seedMask to maskedSeed */
847 mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,
848 &md_ctx );
849
850 /* DB: Apply dbMask to maskedDB */
851 mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,
852 &md_ctx );
853
Paul Bakker84bbeb52014-07-01 14:53:22 +0200854 md_free( &md_ctx );
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100855
856 /*
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100857 * Check contents, in "constant-time"
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100858 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000859 p = buf;
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100860 bad = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000861
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100862 bad |= *p++; /* First byte must be 0 */
Paul Bakkerb3869132013-02-28 17:21:01 +0100863
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100864 p += hlen; /* Skip seed */
Paul Bakkerb3869132013-02-28 17:21:01 +0100865
Manuel Pégourié-Gonnarda5cfc352013-11-28 15:57:52 +0100866 /* Check lHash */
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100867 for( i = 0; i < hlen; i++ )
868 bad |= lhash[i] ^ *p++;
Paul Bakkerb3869132013-02-28 17:21:01 +0100869
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100870 /* Get zero-padding len, but always read till end of buffer
871 * (minus one, for the 01 byte) */
872 pad_len = 0;
873 pad_done = 0;
874 for( i = 0; i < ilen - 2 * hlen - 2; i++ )
875 {
876 pad_done |= p[i];
Pascal Junodb99183d2015-03-11 16:49:45 +0100877 pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100878 }
Paul Bakkerb3869132013-02-28 17:21:01 +0100879
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100880 p += pad_len;
881 bad |= *p++ ^ 0x01;
Paul Bakkerb3869132013-02-28 17:21:01 +0100882
Manuel Pégourié-Gonnardab44d7e2013-11-29 12:49:44 +0100883 /*
884 * The only information "leaked" is whether the padding was correct or not
885 * (eg, no data is copied if it was not correct). This meets the
886 * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between
887 * the different error conditions.
888 */
889 if( bad != 0 )
Paul Bakkerb3869132013-02-28 17:21:01 +0100890 return( POLARSSL_ERR_RSA_INVALID_PADDING );
891
Paul Bakker66d5d072014-06-17 16:39:18 +0200892 if( ilen - ( p - buf ) > output_max_len )
Paul Bakkerb3869132013-02-28 17:21:01 +0100893 return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE );
894
895 *olen = ilen - (p - buf);
896 memcpy( output, p, *olen );
897
898 return( 0 );
899}
900#endif /* POLARSSL_PKCS1_V21 */
901
Paul Bakker48377d92013-08-30 12:06:24 +0200902#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +0100903/*
904 * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function
905 */
906int rsa_rsaes_pkcs1_v15_decrypt( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +0200907 int (*f_rng)(void *, unsigned char *, size_t),
908 void *p_rng,
Paul Bakkerb3869132013-02-28 17:21:01 +0100909 int mode, size_t *olen,
910 const unsigned char *input,
911 unsigned char *output,
912 size_t output_max_len)
913{
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100914 int ret;
915 size_t ilen, pad_count = 0, i;
916 unsigned char *p, bad, pad_done = 0;
Paul Bakkerb3869132013-02-28 17:21:01 +0100917 unsigned char buf[POLARSSL_MPI_MAX_SIZE];
918
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +0200919 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V15 )
Paul Bakkerb3869132013-02-28 17:21:01 +0100920 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
921
922 ilen = ctx->len;
923
924 if( ilen < 16 || ilen > sizeof( buf ) )
925 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
926
927 ret = ( mode == RSA_PUBLIC )
928 ? rsa_public( ctx, input, buf )
Paul Bakker548957d2013-08-30 10:30:02 +0200929 : rsa_private( ctx, f_rng, p_rng, input, buf );
Paul Bakkerb3869132013-02-28 17:21:01 +0100930
931 if( ret != 0 )
932 return( ret );
933
934 p = buf;
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100935 bad = 0;
Paul Bakkerb3869132013-02-28 17:21:01 +0100936
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100937 /*
938 * Check and get padding len in "constant-time"
939 */
940 bad |= *p++; /* First byte must be 0 */
Paul Bakkerb3869132013-02-28 17:21:01 +0100941
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100942 /* This test does not depend on secret data */
943 if( mode == RSA_PRIVATE )
Paul Bakker5121ce52009-01-03 21:22:43 +0000944 {
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100945 bad |= *p++ ^ RSA_CRYPT;
Paul Bakker5121ce52009-01-03 21:22:43 +0000946
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100947 /* Get padding len, but always read till end of buffer
948 * (minus one, for the 00 byte) */
949 for( i = 0; i < ilen - 3; i++ )
950 {
Pascal Junodb99183d2015-03-11 16:49:45 +0100951 pad_done |= ((p[i] | (unsigned char)-p[i]) >> 7) ^ 1;
952 pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100953 }
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000954
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100955 p += pad_count;
956 bad |= *p++; /* Must be zero */
Paul Bakkerb3869132013-02-28 17:21:01 +0100957 }
958 else
959 {
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100960 bad |= *p++ ^ RSA_SIGN;
Paul Bakkerb3869132013-02-28 17:21:01 +0100961
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100962 /* Get padding len, but always read till end of buffer
963 * (minus one, for the 00 byte) */
964 for( i = 0; i < ilen - 3; i++ )
965 {
Manuel Pégourié-Gonnardfbf09152014-02-03 11:58:55 +0100966 pad_done |= ( p[i] != 0xFF );
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100967 pad_count += ( pad_done == 0 );
968 }
Paul Bakkerb3869132013-02-28 17:21:01 +0100969
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100970 p += pad_count;
971 bad |= *p++; /* Must be zero */
Paul Bakker5121ce52009-01-03 21:22:43 +0000972 }
973
Janos Follathf18263d2016-02-12 13:30:09 +0000974 bad |= ( pad_count < 8 );
Janos Follathf570f7f2016-02-08 13:59:25 +0000975
Manuel Pégourié-Gonnard27290da2013-11-30 13:36:53 +0100976 if( bad )
Paul Bakker8804f692013-02-28 18:06:26 +0100977 return( POLARSSL_ERR_RSA_INVALID_PADDING );
978
Paul Bakker66d5d072014-06-17 16:39:18 +0200979 if( ilen - ( p - buf ) > output_max_len )
Paul Bakker23986e52011-04-24 08:57:21 +0000980 return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE );
Paul Bakker060c5682009-01-12 21:48:39 +0000981
Paul Bakker27fdf462011-06-09 13:55:13 +0000982 *olen = ilen - (p - buf);
Paul Bakker5121ce52009-01-03 21:22:43 +0000983 memcpy( output, p, *olen );
984
985 return( 0 );
986}
Paul Bakker48377d92013-08-30 12:06:24 +0200987#endif /* POLARSSL_PKCS1_V15 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000988
989/*
Paul Bakkerb3869132013-02-28 17:21:01 +0100990 * Do an RSA operation, then remove the message padding
991 */
992int rsa_pkcs1_decrypt( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +0200993 int (*f_rng)(void *, unsigned char *, size_t),
994 void *p_rng,
Paul Bakkerb3869132013-02-28 17:21:01 +0100995 int mode, size_t *olen,
996 const unsigned char *input,
997 unsigned char *output,
998 size_t output_max_len)
999{
1000 switch( ctx->padding )
1001 {
Paul Bakker48377d92013-08-30 12:06:24 +02001002#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +01001003 case RSA_PKCS_V15:
Paul Bakker548957d2013-08-30 10:30:02 +02001004 return rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen,
1005 input, output, output_max_len );
Paul Bakker48377d92013-08-30 12:06:24 +02001006#endif
Paul Bakkerb3869132013-02-28 17:21:01 +01001007
1008#if defined(POLARSSL_PKCS1_V21)
1009 case RSA_PKCS_V21:
Paul Bakker548957d2013-08-30 10:30:02 +02001010 return rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0,
1011 olen, input, output,
1012 output_max_len );
Paul Bakkerb3869132013-02-28 17:21:01 +01001013#endif
1014
1015 default:
1016 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1017 }
1018}
1019
1020#if defined(POLARSSL_PKCS1_V21)
1021/*
1022 * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function
1023 */
1024int rsa_rsassa_pss_sign( rsa_context *ctx,
1025 int (*f_rng)(void *, unsigned char *, size_t),
1026 void *p_rng,
1027 int mode,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001028 md_type_t md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001029 unsigned int hashlen,
1030 const unsigned char *hash,
1031 unsigned char *sig )
1032{
1033 size_t olen;
1034 unsigned char *p = sig;
1035 unsigned char salt[POLARSSL_MD_MAX_SIZE];
1036 unsigned int slen, hlen, offset = 0;
1037 int ret;
1038 size_t msb;
1039 const md_info_t *md_info;
1040 md_context_t md_ctx;
1041
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +02001042 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V21 )
1043 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1044
1045 if( f_rng == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +01001046 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1047
1048 olen = ctx->len;
1049
Paul Bakkerc70b9822013-04-07 22:00:46 +02001050 if( md_alg != POLARSSL_MD_NONE )
Paul Bakkerb3869132013-02-28 17:21:01 +01001051 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001052 // Gather length of hash to sign
1053 //
1054 md_info = md_info_from_type( md_alg );
1055 if( md_info == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +01001056 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001057
1058 hashlen = md_get_size( md_info );
Paul Bakkerb3869132013-02-28 17:21:01 +01001059 }
1060
Manuel Pégourié-Gonnarda2733712015-02-10 17:32:14 +01001061 md_info = md_info_from_type( (md_type_t) ctx->hash_id );
Paul Bakkerb3869132013-02-28 17:21:01 +01001062 if( md_info == NULL )
1063 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1064
1065 hlen = md_get_size( md_info );
1066 slen = hlen;
1067
1068 if( olen < hlen + slen + 2 )
1069 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1070
1071 memset( sig, 0, olen );
1072
Paul Bakkerb3869132013-02-28 17:21:01 +01001073 // Generate salt of length slen
1074 //
1075 if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )
1076 return( POLARSSL_ERR_RSA_RNG_FAILED + ret );
1077
1078 // Note: EMSA-PSS encoding is over the length of N - 1 bits
1079 //
1080 msb = mpi_msb( &ctx->N ) - 1;
1081 p += olen - hlen * 2 - 2;
1082 *p++ = 0x01;
1083 memcpy( p, salt, slen );
1084 p += slen;
1085
Paul Bakker84bbeb52014-07-01 14:53:22 +02001086 md_init( &md_ctx );
Brian J Murray4556d202016-06-23 12:57:03 -07001087 if( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 )
1088 {
1089 md_free( &md_ctx );
1090 return( ret );
1091 }
Paul Bakkerb3869132013-02-28 17:21:01 +01001092
1093 // Generate H = Hash( M' )
1094 //
1095 md_starts( &md_ctx );
1096 md_update( &md_ctx, p, 8 );
1097 md_update( &md_ctx, hash, hashlen );
1098 md_update( &md_ctx, salt, slen );
1099 md_finish( &md_ctx, p );
1100
1101 // Compensate for boundary condition when applying mask
1102 //
1103 if( msb % 8 == 0 )
1104 offset = 1;
1105
1106 // maskedDB: Apply dbMask to DB
1107 //
1108 mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );
1109
Paul Bakker84bbeb52014-07-01 14:53:22 +02001110 md_free( &md_ctx );
Paul Bakkerb3869132013-02-28 17:21:01 +01001111
1112 msb = mpi_msb( &ctx->N ) - 1;
1113 sig[0] &= 0xFF >> ( olen * 8 - msb );
1114
1115 p += hlen;
1116 *p++ = 0xBC;
1117
1118 return( ( mode == RSA_PUBLIC )
1119 ? rsa_public( ctx, sig, sig )
Paul Bakker548957d2013-08-30 10:30:02 +02001120 : rsa_private( ctx, f_rng, p_rng, sig, sig ) );
Paul Bakkerb3869132013-02-28 17:21:01 +01001121}
1122#endif /* POLARSSL_PKCS1_V21 */
1123
Paul Bakker48377d92013-08-30 12:06:24 +02001124#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +01001125/*
1126 * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function
1127 */
1128/*
1129 * Do an RSA operation to sign the message digest
1130 */
1131int rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +02001132 int (*f_rng)(void *, unsigned char *, size_t),
1133 void *p_rng,
Paul Bakkerb3869132013-02-28 17:21:01 +01001134 int mode,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001135 md_type_t md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001136 unsigned int hashlen,
1137 const unsigned char *hash,
1138 unsigned char *sig )
1139{
Paul Bakkerc70b9822013-04-07 22:00:46 +02001140 size_t nb_pad, olen, oid_size = 0;
Paul Bakkerb3869132013-02-28 17:21:01 +01001141 unsigned char *p = sig;
Paul Bakker21e081b2014-07-24 10:38:01 +02001142 const char *oid = NULL;
Manuel Pégourié-Gonnarda1cdcd22015-09-03 20:03:15 +02001143 unsigned char *sig_try = NULL, *verif = NULL;
1144 size_t i;
1145 unsigned char diff;
1146 volatile unsigned char diff_no_optimize;
1147 int ret;
Paul Bakkerb3869132013-02-28 17:21:01 +01001148
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +02001149 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V15 )
Paul Bakkerb3869132013-02-28 17:21:01 +01001150 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1151
1152 olen = ctx->len;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001153 nb_pad = olen - 3;
Paul Bakkerb3869132013-02-28 17:21:01 +01001154
Paul Bakkerc70b9822013-04-07 22:00:46 +02001155 if( md_alg != POLARSSL_MD_NONE )
Paul Bakkerb3869132013-02-28 17:21:01 +01001156 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001157 const md_info_t *md_info = md_info_from_type( md_alg );
1158 if( md_info == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +01001159 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001160
Paul Bakker1c3853b2013-09-10 11:43:44 +02001161 if( oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 )
Paul Bakkerc70b9822013-04-07 22:00:46 +02001162 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1163
Paul Bakkerc70b9822013-04-07 22:00:46 +02001164 nb_pad -= 10 + oid_size;
1165
1166 hashlen = md_get_size( md_info );
Paul Bakkerb3869132013-02-28 17:21:01 +01001167 }
1168
Paul Bakkerc70b9822013-04-07 22:00:46 +02001169 nb_pad -= hashlen;
1170
Paul Bakkerb3869132013-02-28 17:21:01 +01001171 if( ( nb_pad < 8 ) || ( nb_pad > olen ) )
1172 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1173
1174 *p++ = 0;
1175 *p++ = RSA_SIGN;
1176 memset( p, 0xFF, nb_pad );
1177 p += nb_pad;
1178 *p++ = 0;
1179
Paul Bakkerc70b9822013-04-07 22:00:46 +02001180 if( md_alg == POLARSSL_MD_NONE )
Paul Bakkerb3869132013-02-28 17:21:01 +01001181 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001182 memcpy( p, hash, hashlen );
1183 }
1184 else
1185 {
1186 /*
1187 * DigestInfo ::= SEQUENCE {
1188 * digestAlgorithm DigestAlgorithmIdentifier,
1189 * digest Digest }
1190 *
1191 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
1192 *
1193 * Digest ::= OCTET STRING
1194 */
1195 *p++ = ASN1_SEQUENCE | ASN1_CONSTRUCTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001196 *p++ = (unsigned char) ( 0x08 + oid_size + hashlen );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001197 *p++ = ASN1_SEQUENCE | ASN1_CONSTRUCTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001198 *p++ = (unsigned char) ( 0x04 + oid_size );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001199 *p++ = ASN1_OID;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001200 *p++ = oid_size & 0xFF;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001201 memcpy( p, oid, oid_size );
1202 p += oid_size;
1203 *p++ = ASN1_NULL;
1204 *p++ = 0x00;
1205 *p++ = ASN1_OCTET_STRING;
1206 *p++ = hashlen;
1207 memcpy( p, hash, hashlen );
Paul Bakkerb3869132013-02-28 17:21:01 +01001208 }
1209
Manuel Pégourié-Gonnarda1cdcd22015-09-03 20:03:15 +02001210 if( mode == RSA_PUBLIC )
1211 return( rsa_public( ctx, sig, sig ) );
1212
1213 /*
1214 * In order to prevent Lenstra's attack, make the signature in a
1215 * temporary buffer and check it before returning it.
1216 */
1217 sig_try = polarssl_malloc( ctx->len );
Simon Butcher7d3f3a82016-01-02 00:03:39 +00001218 if( sig_try == NULL )
Manuel Pégourié-Gonnarda1cdcd22015-09-03 20:03:15 +02001219 return( POLARSSL_ERR_MPI_MALLOC_FAILED );
1220
Simon Butcher7d3f3a82016-01-02 00:03:39 +00001221 verif = polarssl_malloc( ctx->len );
1222 if( verif == NULL )
1223 {
1224 polarssl_free( sig_try );
1225 return( POLARSSL_ERR_MPI_MALLOC_FAILED );
1226 }
1227
Manuel Pégourié-Gonnarda1cdcd22015-09-03 20:03:15 +02001228 MPI_CHK( rsa_private( ctx, f_rng, p_rng, sig, sig_try ) );
1229 MPI_CHK( rsa_public( ctx, sig_try, verif ) );
1230
1231 /* Compare in constant time just in case */
1232 for( diff = 0, i = 0; i < ctx->len; i++ )
1233 diff |= verif[i] ^ sig[i];
1234 diff_no_optimize = diff;
1235
1236 if( diff_no_optimize != 0 )
1237 {
1238 ret = POLARSSL_ERR_RSA_PRIVATE_FAILED;
1239 goto cleanup;
1240 }
1241
1242 memcpy( sig, sig_try, ctx->len );
1243
1244cleanup:
1245 polarssl_free( sig_try );
1246 polarssl_free( verif );
1247
1248 return( ret );
Paul Bakkerb3869132013-02-28 17:21:01 +01001249}
Paul Bakker48377d92013-08-30 12:06:24 +02001250#endif /* POLARSSL_PKCS1_V15 */
Paul Bakkerb3869132013-02-28 17:21:01 +01001251
1252/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001253 * Do an RSA operation to sign the message digest
1254 */
1255int rsa_pkcs1_sign( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +00001256 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker9dcc3222011-03-08 14:16:06 +00001257 void *p_rng,
Paul Bakker5121ce52009-01-03 21:22:43 +00001258 int mode,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001259 md_type_t md_alg,
Paul Bakker23986e52011-04-24 08:57:21 +00001260 unsigned int hashlen,
Paul Bakkerff60ee62010-03-16 21:09:09 +00001261 const unsigned char *hash,
Paul Bakker5121ce52009-01-03 21:22:43 +00001262 unsigned char *sig )
1263{
Paul Bakker5121ce52009-01-03 21:22:43 +00001264 switch( ctx->padding )
1265 {
Paul Bakker48377d92013-08-30 12:06:24 +02001266#if defined(POLARSSL_PKCS1_V15)
Paul Bakker5121ce52009-01-03 21:22:43 +00001267 case RSA_PKCS_V15:
Paul Bakker548957d2013-08-30 10:30:02 +02001268 return rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001269 hashlen, hash, sig );
Paul Bakker48377d92013-08-30 12:06:24 +02001270#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001271
Paul Bakker9dcc3222011-03-08 14:16:06 +00001272#if defined(POLARSSL_PKCS1_V21)
1273 case RSA_PKCS_V21:
Paul Bakkerc70b9822013-04-07 22:00:46 +02001274 return rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001275 hashlen, hash, sig );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001276#endif
1277
Paul Bakker5121ce52009-01-03 21:22:43 +00001278 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001279 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +00001280 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001281}
1282
Paul Bakkerb3869132013-02-28 17:21:01 +01001283#if defined(POLARSSL_PKCS1_V21)
Paul Bakker5121ce52009-01-03 21:22:43 +00001284/*
Paul Bakkerb3869132013-02-28 17:21:01 +01001285 * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function
Paul Bakker5121ce52009-01-03 21:22:43 +00001286 */
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001287int rsa_rsassa_pss_verify_ext( rsa_context *ctx,
1288 int (*f_rng)(void *, unsigned char *, size_t),
1289 void *p_rng,
1290 int mode,
1291 md_type_t md_alg,
1292 unsigned int hashlen,
1293 const unsigned char *hash,
1294 md_type_t mgf1_hash_id,
1295 int expected_salt_len,
1296 const unsigned char *sig )
Paul Bakker5121ce52009-01-03 21:22:43 +00001297{
Paul Bakker23986e52011-04-24 08:57:21 +00001298 int ret;
Paul Bakkerb3869132013-02-28 17:21:01 +01001299 size_t siglen;
1300 unsigned char *p;
Paul Bakker0be82f22012-10-03 20:36:33 +00001301 unsigned char buf[POLARSSL_MPI_MAX_SIZE];
Paul Bakker1fe7d9b2011-11-15 15:26:03 +00001302 unsigned char result[POLARSSL_MD_MAX_SIZE];
Paul Bakker9dcc3222011-03-08 14:16:06 +00001303 unsigned char zeros[8];
Paul Bakker23986e52011-04-24 08:57:21 +00001304 unsigned int hlen;
1305 size_t slen, msb;
Paul Bakker9dcc3222011-03-08 14:16:06 +00001306 const md_info_t *md_info;
1307 md_context_t md_ctx;
Paul Bakkerb3869132013-02-28 17:21:01 +01001308
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +02001309 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V21 )
Paul Bakkerb3869132013-02-28 17:21:01 +01001310 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1311
Paul Bakker5121ce52009-01-03 21:22:43 +00001312 siglen = ctx->len;
1313
Paul Bakker27fdf462011-06-09 13:55:13 +00001314 if( siglen < 16 || siglen > sizeof( buf ) )
Paul Bakker40e46942009-01-03 21:51:57 +00001315 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001316
1317 ret = ( mode == RSA_PUBLIC )
1318 ? rsa_public( ctx, sig, buf )
Paul Bakker548957d2013-08-30 10:30:02 +02001319 : rsa_private( ctx, f_rng, p_rng, sig, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001320
1321 if( ret != 0 )
1322 return( ret );
1323
1324 p = buf;
1325
Paul Bakkerb3869132013-02-28 17:21:01 +01001326 if( buf[siglen - 1] != 0xBC )
1327 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1328
Paul Bakkerc70b9822013-04-07 22:00:46 +02001329 if( md_alg != POLARSSL_MD_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001330 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001331 // Gather length of hash to sign
1332 //
1333 md_info = md_info_from_type( md_alg );
1334 if( md_info == NULL )
Paul Bakkerb3869132013-02-28 17:21:01 +01001335 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001336
1337 hashlen = md_get_size( md_info );
Paul Bakkerb3869132013-02-28 17:21:01 +01001338 }
Paul Bakker9dcc3222011-03-08 14:16:06 +00001339
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001340 md_info = md_info_from_type( mgf1_hash_id );
Paul Bakkerb3869132013-02-28 17:21:01 +01001341 if( md_info == NULL )
1342 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001343
Paul Bakkerb3869132013-02-28 17:21:01 +01001344 hlen = md_get_size( md_info );
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001345 slen = siglen - hlen - 1; /* Currently length of salt + padding */
Paul Bakker9dcc3222011-03-08 14:16:06 +00001346
Paul Bakkerb3869132013-02-28 17:21:01 +01001347 memset( zeros, 0, 8 );
Paul Bakker53019ae2011-03-25 13:58:48 +00001348
Paul Bakkerb3869132013-02-28 17:21:01 +01001349 // Note: EMSA-PSS verification is over the length of N - 1 bits
1350 //
1351 msb = mpi_msb( &ctx->N ) - 1;
Paul Bakker9dcc3222011-03-08 14:16:06 +00001352
Paul Bakkerb3869132013-02-28 17:21:01 +01001353 // Compensate for boundary condition when applying mask
1354 //
1355 if( msb % 8 == 0 )
1356 {
1357 p++;
1358 siglen -= 1;
1359 }
1360 if( buf[0] >> ( 8 - siglen * 8 + msb ) )
1361 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001362
Paul Bakker84bbeb52014-07-01 14:53:22 +02001363 md_init( &md_ctx );
Brian J Murray4556d202016-06-23 12:57:03 -07001364 if( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 )
1365 {
1366 md_free( &md_ctx );
1367 return( ret );
1368 }
Paul Bakker9dcc3222011-03-08 14:16:06 +00001369
Paul Bakkerb3869132013-02-28 17:21:01 +01001370 mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );
Paul Bakker02303e82013-01-03 11:08:31 +01001371
Paul Bakkerb3869132013-02-28 17:21:01 +01001372 buf[0] &= 0xFF >> ( siglen * 8 - msb );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001373
Paul Bakker4de44aa2013-12-31 11:43:01 +01001374 while( p < buf + siglen && *p == 0 )
Paul Bakkerb3869132013-02-28 17:21:01 +01001375 p++;
Paul Bakker9dcc3222011-03-08 14:16:06 +00001376
Paul Bakkerb3869132013-02-28 17:21:01 +01001377 if( p == buf + siglen ||
1378 *p++ != 0x01 )
1379 {
Paul Bakker84bbeb52014-07-01 14:53:22 +02001380 md_free( &md_ctx );
Paul Bakkerb3869132013-02-28 17:21:01 +01001381 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1382 }
Paul Bakker9dcc3222011-03-08 14:16:06 +00001383
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001384 /* Actual salt len */
Paul Bakkerb3869132013-02-28 17:21:01 +01001385 slen -= p - buf;
Paul Bakker9dcc3222011-03-08 14:16:06 +00001386
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001387 if( expected_salt_len != RSA_SALT_LEN_ANY &&
1388 slen != (size_t) expected_salt_len )
1389 {
Paul Bakker84bbeb52014-07-01 14:53:22 +02001390 md_free( &md_ctx );
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001391 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1392 }
1393
Paul Bakkerb3869132013-02-28 17:21:01 +01001394 // Generate H = Hash( M' )
1395 //
1396 md_starts( &md_ctx );
1397 md_update( &md_ctx, zeros, 8 );
1398 md_update( &md_ctx, hash, hashlen );
1399 md_update( &md_ctx, p, slen );
1400 md_finish( &md_ctx, result );
Paul Bakker53019ae2011-03-25 13:58:48 +00001401
Paul Bakker84bbeb52014-07-01 14:53:22 +02001402 md_free( &md_ctx );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001403
Paul Bakkerb3869132013-02-28 17:21:01 +01001404 if( memcmp( p + slen, result, hlen ) == 0 )
1405 return( 0 );
1406 else
1407 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1408}
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001409
1410/*
1411 * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function
1412 */
1413int rsa_rsassa_pss_verify( rsa_context *ctx,
1414 int (*f_rng)(void *, unsigned char *, size_t),
1415 void *p_rng,
1416 int mode,
1417 md_type_t md_alg,
1418 unsigned int hashlen,
1419 const unsigned char *hash,
1420 const unsigned char *sig )
1421{
1422 md_type_t mgf1_hash_id = ( ctx->hash_id != POLARSSL_MD_NONE )
Manuel Pégourié-Gonnard0eaa8be2014-06-05 18:07:20 +02001423 ? (md_type_t) ctx->hash_id
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +02001424 : md_alg;
1425
1426 return( rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode,
1427 md_alg, hashlen, hash,
1428 mgf1_hash_id, RSA_SALT_LEN_ANY,
1429 sig ) );
1430
1431}
Paul Bakkerb3869132013-02-28 17:21:01 +01001432#endif /* POLARSSL_PKCS1_V21 */
Paul Bakker40628ba2013-01-03 10:50:31 +01001433
Paul Bakker48377d92013-08-30 12:06:24 +02001434#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +01001435/*
1436 * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function
1437 */
1438int rsa_rsassa_pkcs1_v15_verify( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +02001439 int (*f_rng)(void *, unsigned char *, size_t),
1440 void *p_rng,
Paul Bakkerb3869132013-02-28 17:21:01 +01001441 int mode,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001442 md_type_t md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001443 unsigned int hashlen,
1444 const unsigned char *hash,
Manuel Pégourié-Gonnardcc0a9d02013-08-12 11:34:35 +02001445 const unsigned char *sig )
Paul Bakkerb3869132013-02-28 17:21:01 +01001446{
1447 int ret;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001448 size_t len, siglen, asn1_len;
1449 unsigned char *p, *end;
Paul Bakkerb3869132013-02-28 17:21:01 +01001450 unsigned char buf[POLARSSL_MPI_MAX_SIZE];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001451 md_type_t msg_md_alg;
1452 const md_info_t *md_info;
1453 asn1_buf oid;
Paul Bakkerb3869132013-02-28 17:21:01 +01001454
Manuel Pégourié-Gonnarde6d1d822014-06-02 16:47:02 +02001455 if( mode == RSA_PRIVATE && ctx->padding != RSA_PKCS_V15 )
Paul Bakkerb3869132013-02-28 17:21:01 +01001456 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1457
1458 siglen = ctx->len;
1459
1460 if( siglen < 16 || siglen > sizeof( buf ) )
1461 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1462
1463 ret = ( mode == RSA_PUBLIC )
1464 ? rsa_public( ctx, sig, buf )
Paul Bakker548957d2013-08-30 10:30:02 +02001465 : rsa_private( ctx, f_rng, p_rng, sig, buf );
Paul Bakkerb3869132013-02-28 17:21:01 +01001466
1467 if( ret != 0 )
1468 return( ret );
1469
1470 p = buf;
1471
1472 if( *p++ != 0 || *p++ != RSA_SIGN )
1473 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1474
1475 while( *p != 0 )
1476 {
1477 if( p >= buf + siglen - 1 || *p != 0xFF )
1478 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1479 p++;
1480 }
1481 p++;
1482
1483 len = siglen - ( p - buf );
1484
Paul Bakkerc70b9822013-04-07 22:00:46 +02001485 if( len == hashlen && md_alg == POLARSSL_MD_NONE )
Paul Bakkerb3869132013-02-28 17:21:01 +01001486 {
1487 if( memcmp( p, hash, hashlen ) == 0 )
1488 return( 0 );
1489 else
1490 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001491 }
1492
Paul Bakkerc70b9822013-04-07 22:00:46 +02001493 md_info = md_info_from_type( md_alg );
1494 if( md_info == NULL )
1495 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1496 hashlen = md_get_size( md_info );
1497
1498 end = p + len;
1499
1500 // Parse the ASN.1 structure inside the PKCS#1 v1.5 structure
1501 //
1502 if( ( ret = asn1_get_tag( &p, end, &asn1_len,
1503 ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
1504 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1505
1506 if( asn1_len + 2 != len )
1507 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1508
1509 if( ( ret = asn1_get_tag( &p, end, &asn1_len,
1510 ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
1511 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1512
1513 if( asn1_len + 6 + hashlen != len )
1514 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1515
1516 if( ( ret = asn1_get_tag( &p, end, &oid.len, ASN1_OID ) ) != 0 )
1517 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1518
1519 oid.p = p;
1520 p += oid.len;
1521
1522 if( oid_get_md_alg( &oid, &msg_md_alg ) != 0 )
1523 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1524
1525 if( md_alg != msg_md_alg )
1526 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1527
1528 /*
1529 * assume the algorithm parameters must be NULL
1530 */
1531 if( ( ret = asn1_get_tag( &p, end, &asn1_len, ASN1_NULL ) ) != 0 )
1532 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1533
1534 if( ( ret = asn1_get_tag( &p, end, &asn1_len, ASN1_OCTET_STRING ) ) != 0 )
1535 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1536
1537 if( asn1_len != hashlen )
1538 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1539
1540 if( memcmp( p, hash, hashlen ) != 0 )
1541 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1542
1543 p += hashlen;
1544
1545 if( p != end )
1546 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
1547
1548 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001549}
Paul Bakker48377d92013-08-30 12:06:24 +02001550#endif /* POLARSSL_PKCS1_V15 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001551
1552/*
Paul Bakkerb3869132013-02-28 17:21:01 +01001553 * Do an RSA operation and check the message digest
1554 */
1555int rsa_pkcs1_verify( rsa_context *ctx,
Paul Bakker548957d2013-08-30 10:30:02 +02001556 int (*f_rng)(void *, unsigned char *, size_t),
1557 void *p_rng,
Paul Bakkerb3869132013-02-28 17:21:01 +01001558 int mode,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001559 md_type_t md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001560 unsigned int hashlen,
1561 const unsigned char *hash,
Manuel Pégourié-Gonnardcc0a9d02013-08-12 11:34:35 +02001562 const unsigned char *sig )
Paul Bakkerb3869132013-02-28 17:21:01 +01001563{
1564 switch( ctx->padding )
1565 {
Paul Bakker48377d92013-08-30 12:06:24 +02001566#if defined(POLARSSL_PKCS1_V15)
Paul Bakkerb3869132013-02-28 17:21:01 +01001567 case RSA_PKCS_V15:
Paul Bakker548957d2013-08-30 10:30:02 +02001568 return rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001569 hashlen, hash, sig );
Paul Bakker48377d92013-08-30 12:06:24 +02001570#endif
Paul Bakkerb3869132013-02-28 17:21:01 +01001571
1572#if defined(POLARSSL_PKCS1_V21)
1573 case RSA_PKCS_V21:
Paul Bakker548957d2013-08-30 10:30:02 +02001574 return rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg,
Paul Bakkerb3869132013-02-28 17:21:01 +01001575 hashlen, hash, sig );
1576#endif
1577
1578 default:
1579 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1580 }
1581}
1582
1583/*
Manuel Pégourié-Gonnard3053f5b2013-08-14 13:39:57 +02001584 * Copy the components of an RSA key
1585 */
1586int rsa_copy( rsa_context *dst, const rsa_context *src )
1587{
1588 int ret;
1589
1590 dst->ver = src->ver;
1591 dst->len = src->len;
1592
1593 MPI_CHK( mpi_copy( &dst->N, &src->N ) );
1594 MPI_CHK( mpi_copy( &dst->E, &src->E ) );
1595
1596 MPI_CHK( mpi_copy( &dst->D, &src->D ) );
1597 MPI_CHK( mpi_copy( &dst->P, &src->P ) );
1598 MPI_CHK( mpi_copy( &dst->Q, &src->Q ) );
1599 MPI_CHK( mpi_copy( &dst->DP, &src->DP ) );
1600 MPI_CHK( mpi_copy( &dst->DQ, &src->DQ ) );
1601 MPI_CHK( mpi_copy( &dst->QP, &src->QP ) );
1602
1603 MPI_CHK( mpi_copy( &dst->RN, &src->RN ) );
1604 MPI_CHK( mpi_copy( &dst->RP, &src->RP ) );
1605 MPI_CHK( mpi_copy( &dst->RQ, &src->RQ ) );
1606
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +02001607 MPI_CHK( mpi_copy( &dst->Vi, &src->Vi ) );
1608 MPI_CHK( mpi_copy( &dst->Vf, &src->Vf ) );
1609
Manuel Pégourié-Gonnard3053f5b2013-08-14 13:39:57 +02001610 dst->padding = src->padding;
Manuel Pégourié-Gonnardfdddac92014-03-25 15:58:35 +01001611 dst->hash_id = src->hash_id;
Manuel Pégourié-Gonnard3053f5b2013-08-14 13:39:57 +02001612
1613cleanup:
1614 if( ret != 0 )
1615 rsa_free( dst );
1616
1617 return( ret );
1618}
1619
1620/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001621 * Free the components of an RSA key
1622 */
1623void rsa_free( rsa_context *ctx )
1624{
Manuel Pégourié-Gonnardea53a552013-09-10 13:29:30 +02001625 mpi_free( &ctx->Vi ); mpi_free( &ctx->Vf );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001626 mpi_free( &ctx->RQ ); mpi_free( &ctx->RP ); mpi_free( &ctx->RN );
1627 mpi_free( &ctx->QP ); mpi_free( &ctx->DQ ); mpi_free( &ctx->DP );
1628 mpi_free( &ctx->Q ); mpi_free( &ctx->P ); mpi_free( &ctx->D );
1629 mpi_free( &ctx->E ); mpi_free( &ctx->N );
Paul Bakkerc9965dc2013-09-29 14:58:17 +02001630
1631#if defined(POLARSSL_THREADING_C)
1632 polarssl_mutex_free( &ctx->mutex );
1633#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001634}
1635
Paul Bakker40e46942009-01-03 21:51:57 +00001636#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001637
Paul Bakker40e46942009-01-03 21:51:57 +00001638#include "polarssl/sha1.h"
Paul Bakker5121ce52009-01-03 21:22:43 +00001639
1640/*
1641 * Example RSA-1024 keypair, for test purposes
1642 */
1643#define KEY_LEN 128
1644
1645#define RSA_N "9292758453063D803DD603D5E777D788" \
1646 "8ED1D5BF35786190FA2F23EBC0848AEA" \
1647 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
1648 "7130B9CED7ACDF54CFC7555AC14EEBAB" \
1649 "93A89813FBF3C4F8066D2D800F7C38A8" \
1650 "1AE31942917403FF4946B0A83D3D3E05" \
1651 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
1652 "5E94BB77B07507233A0BC7BAC8F90F79"
1653
1654#define RSA_E "10001"
1655
1656#define RSA_D "24BF6185468786FDD303083D25E64EFC" \
1657 "66CA472BC44D253102F8B4A9D3BFA750" \
1658 "91386C0077937FE33FA3252D28855837" \
1659 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
1660 "DF79C5CE07EE72C7F123142198164234" \
1661 "CABB724CF78B8173B9F880FC86322407" \
1662 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
1663 "071513A1E85B5DFA031F21ECAE91A34D"
1664
1665#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
1666 "2C01CAD19EA484A87EA4377637E75500" \
1667 "FCB2005C5C7DD6EC4AC023CDA285D796" \
1668 "C3D9E75E1EFC42488BB4F1D13AC30A57"
1669
1670#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
1671 "E211C2B9E5DB1ED0BF61D0D9899620F4" \
1672 "910E4168387E3C30AA1E00C339A79508" \
1673 "8452DD96A9A5EA5D9DCA68DA636032AF"
1674
1675#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
1676 "3C94D22288ACD763FD8E5600ED4A702D" \
1677 "F84198A5F06C2E72236AE490C93F07F8" \
1678 "3CC559CD27BC2D1CA488811730BB5725"
1679
1680#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
1681 "D8AAEA56749EA28623272E4F7D0592AF" \
1682 "7C1F1313CAC9471B5C523BFE592F517B" \
1683 "407A1BD76C164B93DA2D32A383E58357"
1684
1685#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
1686 "F38D18D2B2F0E2DD275AA977E2BF4411" \
1687 "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
1688 "A74206CEC169D74BF5A8C50D6F48EA08"
1689
1690#define PT_LEN 24
1691#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
1692 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
1693
Paul Bakkerfef3c5a2013-12-11 13:36:30 +01001694#if defined(POLARSSL_PKCS1_V15)
Paul Bakkera3d195c2011-11-27 21:07:34 +00001695static int myrand( void *rng_state, unsigned char *output, size_t len )
Paul Bakker545570e2010-07-18 09:00:25 +00001696{
Paul Bakkerf96f7b62014-04-30 16:02:38 +02001697#if !defined(__OpenBSD__)
Paul Bakkera3d195c2011-11-27 21:07:34 +00001698 size_t i;
1699
Paul Bakker545570e2010-07-18 09:00:25 +00001700 if( rng_state != NULL )
1701 rng_state = NULL;
1702
Paul Bakkera3d195c2011-11-27 21:07:34 +00001703 for( i = 0; i < len; ++i )
1704 output[i] = rand();
Paul Bakkerf96f7b62014-04-30 16:02:38 +02001705#else
1706 if( rng_state != NULL )
1707 rng_state = NULL;
1708
1709 arc4random_buf( output, len );
1710#endif /* !OpenBSD */
Paul Bakker48377d92013-08-30 12:06:24 +02001711
Paul Bakkera3d195c2011-11-27 21:07:34 +00001712 return( 0 );
Paul Bakker545570e2010-07-18 09:00:25 +00001713}
Paul Bakker9af723c2014-05-01 13:03:14 +02001714#endif /* POLARSSL_PKCS1_V15 */
Paul Bakker545570e2010-07-18 09:00:25 +00001715
Paul Bakker5121ce52009-01-03 21:22:43 +00001716/*
1717 * Checkup routine
1718 */
1719int rsa_self_test( int verbose )
1720{
Paul Bakker3d8fb632014-04-17 12:42:41 +02001721 int ret = 0;
Paul Bakkerfef3c5a2013-12-11 13:36:30 +01001722#if defined(POLARSSL_PKCS1_V15)
Paul Bakker23986e52011-04-24 08:57:21 +00001723 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001724 rsa_context rsa;
Paul Bakker5121ce52009-01-03 21:22:43 +00001725 unsigned char rsa_plaintext[PT_LEN];
1726 unsigned char rsa_decrypted[PT_LEN];
1727 unsigned char rsa_ciphertext[KEY_LEN];
Paul Bakker5690efc2011-05-26 13:16:06 +00001728#if defined(POLARSSL_SHA1_C)
1729 unsigned char sha1sum[20];
1730#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001731
Paul Bakker21eb2802010-08-16 11:10:02 +00001732 rsa_init( &rsa, RSA_PKCS_V15, 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001733
1734 rsa.len = KEY_LEN;
Paul Bakker3d8fb632014-04-17 12:42:41 +02001735 MPI_CHK( mpi_read_string( &rsa.N , 16, RSA_N ) );
1736 MPI_CHK( mpi_read_string( &rsa.E , 16, RSA_E ) );
1737 MPI_CHK( mpi_read_string( &rsa.D , 16, RSA_D ) );
1738 MPI_CHK( mpi_read_string( &rsa.P , 16, RSA_P ) );
1739 MPI_CHK( mpi_read_string( &rsa.Q , 16, RSA_Q ) );
1740 MPI_CHK( mpi_read_string( &rsa.DP, 16, RSA_DP ) );
1741 MPI_CHK( mpi_read_string( &rsa.DQ, 16, RSA_DQ ) );
1742 MPI_CHK( mpi_read_string( &rsa.QP, 16, RSA_QP ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001743
1744 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001745 polarssl_printf( " RSA key validation: " );
Paul Bakker5121ce52009-01-03 21:22:43 +00001746
1747 if( rsa_check_pubkey( &rsa ) != 0 ||
1748 rsa_check_privkey( &rsa ) != 0 )
1749 {
1750 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001751 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001752
1753 return( 1 );
1754 }
1755
1756 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001757 polarssl_printf( "passed\n PKCS#1 encryption : " );
Paul Bakker5121ce52009-01-03 21:22:43 +00001758
1759 memcpy( rsa_plaintext, RSA_PT, PT_LEN );
1760
Paul Bakker548957d2013-08-30 10:30:02 +02001761 if( rsa_pkcs1_encrypt( &rsa, myrand, NULL, RSA_PUBLIC, PT_LEN,
Paul Bakker5121ce52009-01-03 21:22:43 +00001762 rsa_plaintext, rsa_ciphertext ) != 0 )
1763 {
1764 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001765 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001766
1767 return( 1 );
1768 }
1769
1770 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001771 polarssl_printf( "passed\n PKCS#1 decryption : " );
Paul Bakker5121ce52009-01-03 21:22:43 +00001772
Paul Bakker548957d2013-08-30 10:30:02 +02001773 if( rsa_pkcs1_decrypt( &rsa, myrand, NULL, RSA_PRIVATE, &len,
Paul Bakker060c5682009-01-12 21:48:39 +00001774 rsa_ciphertext, rsa_decrypted,
Paul Bakker23986e52011-04-24 08:57:21 +00001775 sizeof(rsa_decrypted) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001776 {
1777 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001778 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001779
1780 return( 1 );
1781 }
1782
1783 if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
1784 {
1785 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001786 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001787
1788 return( 1 );
1789 }
1790
Paul Bakker5690efc2011-05-26 13:16:06 +00001791#if defined(POLARSSL_SHA1_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001793 polarssl_printf( "passed\n PKCS#1 data sign : " );
Paul Bakker5121ce52009-01-03 21:22:43 +00001794
1795 sha1( rsa_plaintext, PT_LEN, sha1sum );
1796
Paul Bakkeraab30c12013-08-30 11:00:25 +02001797 if( rsa_pkcs1_sign( &rsa, myrand, NULL, RSA_PRIVATE, POLARSSL_MD_SHA1, 0,
Paul Bakker5121ce52009-01-03 21:22:43 +00001798 sha1sum, rsa_ciphertext ) != 0 )
1799 {
1800 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001801 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001802
1803 return( 1 );
1804 }
1805
1806 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001807 polarssl_printf( "passed\n PKCS#1 sig. verify: " );
Paul Bakker5121ce52009-01-03 21:22:43 +00001808
Paul Bakker548957d2013-08-30 10:30:02 +02001809 if( rsa_pkcs1_verify( &rsa, NULL, NULL, RSA_PUBLIC, POLARSSL_MD_SHA1, 0,
Paul Bakker5121ce52009-01-03 21:22:43 +00001810 sha1sum, rsa_ciphertext ) != 0 )
1811 {
1812 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001813 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001814
1815 return( 1 );
1816 }
1817
1818 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001819 polarssl_printf( "passed\n\n" );
Paul Bakker5690efc2011-05-26 13:16:06 +00001820#endif /* POLARSSL_SHA1_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001821
Paul Bakker3d8fb632014-04-17 12:42:41 +02001822cleanup:
Paul Bakker5121ce52009-01-03 21:22:43 +00001823 rsa_free( &rsa );
Paul Bakker48377d92013-08-30 12:06:24 +02001824#else /* POLARSSL_PKCS1_V15 */
Paul Bakker3e41fe82013-09-15 17:42:50 +02001825 ((void) verbose);
Paul Bakker48377d92013-08-30 12:06:24 +02001826#endif /* POLARSSL_PKCS1_V15 */
Paul Bakker3d8fb632014-04-17 12:42:41 +02001827 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001828}
1829
Paul Bakker9af723c2014-05-01 13:03:14 +02001830#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00001831
Paul Bakker9af723c2014-05-01 13:03:14 +02001832#endif /* POLARSSL_RSA_C */