Home | History | Annotate | Download | only in rsa
      1 /* crypto/rsa/rsa_pmeth.c */
      2 /* Written by Dr Stephen N Henson (steve (at) openssl.org) for the OpenSSL
      3  * project 2006.
      4  */
      5 /* ====================================================================
      6  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  *
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in
     17  *    the documentation and/or other materials provided with the
     18  *    distribution.
     19  *
     20  * 3. All advertising materials mentioning features or use of this
     21  *    software must display the following acknowledgment:
     22  *    "This product includes software developed by the OpenSSL Project
     23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
     24  *
     25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     26  *    endorse or promote products derived from this software without
     27  *    prior written permission. For written permission, please contact
     28  *    licensing (at) OpenSSL.org.
     29  *
     30  * 5. Products derived from this software may not be called "OpenSSL"
     31  *    nor may "OpenSSL" appear in their names without prior written
     32  *    permission of the OpenSSL Project.
     33  *
     34  * 6. Redistributions of any form whatsoever must retain the following
     35  *    acknowledgment:
     36  *    "This product includes software developed by the OpenSSL Project
     37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
     38  *
     39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     50  * OF THE POSSIBILITY OF SUCH DAMAGE.
     51  * ====================================================================
     52  *
     53  * This product includes cryptographic software written by Eric Young
     54  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     55  * Hudson (tjh (at) cryptsoft.com).
     56  *
     57  */
     58 
     59 #include <stdio.h>
     60 #include "cryptlib.h"
     61 #include <openssl/asn1t.h>
     62 #include <openssl/x509.h>
     63 #include <openssl/rsa.h>
     64 #include <openssl/bn.h>
     65 #include <openssl/evp.h>
     66 #include "evp_locl.h"
     67 #include "rsa_locl.h"
     68 
     69 /* RSA pkey context structure */
     70 
     71 typedef struct
     72 	{
     73 	/* Key gen parameters */
     74 	int nbits;
     75 	BIGNUM *pub_exp;
     76 	/* Keygen callback info */
     77 	int gentmp[2];
     78 	/* RSA padding mode */
     79 	int pad_mode;
     80 	/* message digest */
     81 	const EVP_MD *md;
     82 	/* PSS/OAEP salt length */
     83 	int saltlen;
     84 	/* Temp buffer */
     85 	unsigned char *tbuf;
     86 	} RSA_PKEY_CTX;
     87 
     88 static int pkey_rsa_init(EVP_PKEY_CTX *ctx)
     89 	{
     90 	RSA_PKEY_CTX *rctx;
     91 	rctx = OPENSSL_malloc(sizeof(RSA_PKEY_CTX));
     92 	if (!rctx)
     93 		return 0;
     94 	rctx->nbits = 1024;
     95 	rctx->pub_exp = NULL;
     96 	rctx->pad_mode = RSA_PKCS1_PADDING;
     97 	rctx->md = NULL;
     98 	rctx->tbuf = NULL;
     99 
    100 	rctx->saltlen = -2;
    101 
    102 	ctx->data = rctx;
    103 	ctx->keygen_info = rctx->gentmp;
    104 	ctx->keygen_info_count = 2;
    105 
    106 	return 1;
    107 	}
    108 
    109 static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
    110 	{
    111 	RSA_PKEY_CTX *dctx, *sctx;
    112 	if (!pkey_rsa_init(dst))
    113 		return 0;
    114        	sctx = src->data;
    115 	dctx = dst->data;
    116 	dctx->nbits = sctx->nbits;
    117 	if (sctx->pub_exp)
    118 		{
    119 		dctx->pub_exp = BN_dup(sctx->pub_exp);
    120 		if (!dctx->pub_exp)
    121 			return 0;
    122 		}
    123 	dctx->pad_mode = sctx->pad_mode;
    124 	dctx->md = sctx->md;
    125 	return 1;
    126 	}
    127 
    128 static int setup_tbuf(RSA_PKEY_CTX *ctx, EVP_PKEY_CTX *pk)
    129 	{
    130 	if (ctx->tbuf)
    131 		return 1;
    132 	ctx->tbuf = OPENSSL_malloc(EVP_PKEY_size(pk->pkey));
    133 	if (!ctx->tbuf)
    134 		return 0;
    135 	return 1;
    136 	}
    137 
    138 static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx)
    139 	{
    140 	RSA_PKEY_CTX *rctx = ctx->data;
    141 	if (rctx)
    142 		{
    143 		if (rctx->pub_exp)
    144 			BN_free(rctx->pub_exp);
    145 		if (rctx->tbuf)
    146 			OPENSSL_free(rctx->tbuf);
    147 		OPENSSL_free(rctx);
    148 		}
    149 	}
    150 
    151 static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
    152 					const unsigned char *tbs, size_t tbslen)
    153 	{
    154 	int ret;
    155 	RSA_PKEY_CTX *rctx = ctx->data;
    156 	RSA *rsa = ctx->pkey->pkey.rsa;
    157 
    158 	if (rctx->md)
    159 		{
    160 		if (tbslen != (size_t)EVP_MD_size(rctx->md))
    161 			{
    162 			RSAerr(RSA_F_PKEY_RSA_SIGN,
    163 					RSA_R_INVALID_DIGEST_LENGTH);
    164 			return -1;
    165 			}
    166 		if (rctx->pad_mode == RSA_X931_PADDING)
    167 			{
    168 			if (!setup_tbuf(rctx, ctx))
    169 				return -1;
    170 			memcpy(rctx->tbuf, tbs, tbslen);
    171 			rctx->tbuf[tbslen] =
    172 				RSA_X931_hash_id(EVP_MD_type(rctx->md));
    173 			ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf,
    174 						sig, rsa, RSA_X931_PADDING);
    175 			}
    176 		else if (rctx->pad_mode == RSA_PKCS1_PADDING)
    177 			{
    178 			unsigned int sltmp;
    179 			ret = RSA_sign(EVP_MD_type(rctx->md),
    180 						tbs, tbslen, sig, &sltmp, rsa);
    181 			if (ret <= 0)
    182 				return ret;
    183 			ret = sltmp;
    184 			}
    185 		else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
    186 			{
    187 			if (!setup_tbuf(rctx, ctx))
    188 				return -1;
    189 			if (!RSA_padding_add_PKCS1_PSS(rsa, rctx->tbuf, tbs,
    190 						rctx->md, rctx->saltlen))
    191 				return -1;
    192 			ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
    193 						sig, rsa, RSA_NO_PADDING);
    194 			}
    195 		else
    196 			return -1;
    197 		}
    198 	else
    199 		ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
    200 							rctx->pad_mode);
    201 	if (ret < 0)
    202 		return ret;
    203 	*siglen = ret;
    204 	return 1;
    205 	}
    206 
    207 
    208 static int pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx,
    209 					unsigned char *rout, size_t *routlen,
    210 					const unsigned char *sig, size_t siglen)
    211 	{
    212 	int ret;
    213 	RSA_PKEY_CTX *rctx = ctx->data;
    214 
    215 	if (rctx->md)
    216 		{
    217 		if (rctx->pad_mode == RSA_X931_PADDING)
    218 			{
    219 			if (!setup_tbuf(rctx, ctx))
    220 				return -1;
    221 			ret = RSA_public_decrypt(siglen, sig,
    222 						rctx->tbuf, ctx->pkey->pkey.rsa,
    223 						RSA_X931_PADDING);
    224 			if (ret < 1)
    225 				return 0;
    226 			ret--;
    227 			if (rctx->tbuf[ret] !=
    228 				RSA_X931_hash_id(EVP_MD_type(rctx->md)))
    229 				{
    230 				RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
    231 						RSA_R_ALGORITHM_MISMATCH);
    232 				return 0;
    233 				}
    234 			if (ret != EVP_MD_size(rctx->md))
    235 				{
    236 				RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
    237 					RSA_R_INVALID_DIGEST_LENGTH);
    238 				return 0;
    239 				}
    240 			if (rout)
    241 				memcpy(rout, rctx->tbuf, ret);
    242 			}
    243 		else if (rctx->pad_mode == RSA_PKCS1_PADDING)
    244 			{
    245 			size_t sltmp;
    246 			ret = int_rsa_verify(EVP_MD_type(rctx->md),
    247 						NULL, 0, rout, &sltmp,
    248 					sig, siglen, ctx->pkey->pkey.rsa);
    249 			if (ret <= 0)
    250 				return 0;
    251 			ret = sltmp;
    252 			}
    253 		else
    254 			return -1;
    255 		}
    256 	else
    257 		ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
    258 							rctx->pad_mode);
    259 	if (ret < 0)
    260 		return ret;
    261 	*routlen = ret;
    262 	return 1;
    263 	}
    264 
    265 static int pkey_rsa_verify(EVP_PKEY_CTX *ctx,
    266 					const unsigned char *sig, size_t siglen,
    267 					const unsigned char *tbs, size_t tbslen)
    268 	{
    269 	RSA_PKEY_CTX *rctx = ctx->data;
    270 	RSA *rsa = ctx->pkey->pkey.rsa;
    271 	size_t rslen;
    272 	if (rctx->md)
    273 		{
    274 		if (rctx->pad_mode == RSA_PKCS1_PADDING)
    275 			return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen,
    276 					sig, siglen, rsa);
    277 		if (rctx->pad_mode == RSA_X931_PADDING)
    278 			{
    279 			if (pkey_rsa_verifyrecover(ctx, NULL, &rslen,
    280 					sig, siglen) <= 0)
    281 				return 0;
    282 			}
    283 		else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
    284 			{
    285 			int ret;
    286 			if (!setup_tbuf(rctx, ctx))
    287 				return -1;
    288 			ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
    289 							rsa, RSA_NO_PADDING);
    290 			if (ret <= 0)
    291 				return 0;
    292 			ret = RSA_verify_PKCS1_PSS(rsa, tbs, rctx->md,
    293 						rctx->tbuf, rctx->saltlen);
    294 			if (ret <= 0)
    295 				return 0;
    296 			return 1;
    297 			}
    298 		else
    299 			return -1;
    300 		}
    301 	else
    302 		{
    303 		if (!setup_tbuf(rctx, ctx))
    304 			return -1;
    305 		rslen = RSA_public_decrypt(siglen, sig, rctx->tbuf,
    306 						rsa, rctx->pad_mode);
    307 		if (rslen == 0)
    308 			return 0;
    309 		}
    310 
    311 	if ((rslen != tbslen) || memcmp(tbs, rctx->tbuf, rslen))
    312 		return 0;
    313 
    314 	return 1;
    315 
    316 	}
    317 
    318 
    319 static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx,
    320 					unsigned char *out, size_t *outlen,
    321 					const unsigned char *in, size_t inlen)
    322 	{
    323 	int ret;
    324 	RSA_PKEY_CTX *rctx = ctx->data;
    325 	ret = RSA_public_encrypt(inlen, in, out, ctx->pkey->pkey.rsa,
    326 							rctx->pad_mode);
    327 	if (ret < 0)
    328 		return ret;
    329 	*outlen = ret;
    330 	return 1;
    331 	}
    332 
    333 static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
    334 					unsigned char *out, size_t *outlen,
    335 					const unsigned char *in, size_t inlen)
    336 	{
    337 	int ret;
    338 	RSA_PKEY_CTX *rctx = ctx->data;
    339 	ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
    340 							rctx->pad_mode);
    341 	if (ret < 0)
    342 		return ret;
    343 	*outlen = ret;
    344 	return 1;
    345 	}
    346 
    347 static int check_padding_md(const EVP_MD *md, int padding)
    348 	{
    349 	if (!md)
    350 		return 1;
    351 
    352 	if (padding == RSA_NO_PADDING)
    353 		{
    354 		RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_PADDING_MODE);
    355 		return 0;
    356 		}
    357 
    358 	if (padding == RSA_X931_PADDING)
    359 		{
    360 		if (RSA_X931_hash_id(EVP_MD_type(md)) == -1)
    361 			{
    362 			RSAerr(RSA_F_CHECK_PADDING_MD,
    363 						RSA_R_INVALID_X931_DIGEST);
    364 			return 0;
    365 			}
    366 		return 1;
    367 		}
    368 
    369 	return 1;
    370 	}
    371 
    372 
    373 static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
    374 	{
    375 	RSA_PKEY_CTX *rctx = ctx->data;
    376 	switch (type)
    377 		{
    378 		case EVP_PKEY_CTRL_RSA_PADDING:
    379 		if ((p1 >= RSA_PKCS1_PADDING) && (p1 <= RSA_PKCS1_PSS_PADDING))
    380 			{
    381 			if (!check_padding_md(rctx->md, p1))
    382 				return 0;
    383 			if (p1 == RSA_PKCS1_PSS_PADDING)
    384 				{
    385 				if (!(ctx->operation &
    386 				     (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY)))
    387 					goto bad_pad;
    388 				if (!rctx->md)
    389 					rctx->md = EVP_sha1();
    390 				}
    391 			if (p1 == RSA_PKCS1_OAEP_PADDING)
    392 				{
    393 				if (!(ctx->operation & EVP_PKEY_OP_TYPE_CRYPT))
    394 					goto bad_pad;
    395 				if (!rctx->md)
    396 					rctx->md = EVP_sha1();
    397 				}
    398 			rctx->pad_mode = p1;
    399 			return 1;
    400 			}
    401 		bad_pad:
    402 		RSAerr(RSA_F_PKEY_RSA_CTRL,
    403 				RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
    404 		return -2;
    405 
    406 		case EVP_PKEY_CTRL_RSA_PSS_SALTLEN:
    407 		if (p1 < -2)
    408 			return -2;
    409 		if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING)
    410 			{
    411 			RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
    412 			return -2;
    413 			}
    414 		rctx->saltlen = p1;
    415 		return 1;
    416 
    417 		case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
    418 		if (p1 < 256)
    419 			{
    420 			RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_KEYBITS);
    421 			return -2;
    422 			}
    423 		rctx->nbits = p1;
    424 		return 1;
    425 
    426 		case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
    427 		if (!p2)
    428 			return -2;
    429 		rctx->pub_exp = p2;
    430 		return 1;
    431 
    432 		case EVP_PKEY_CTRL_MD:
    433 		if (!check_padding_md(p2, rctx->pad_mode))
    434 			return 0;
    435 		rctx->md = p2;
    436 		return 1;
    437 
    438 		case EVP_PKEY_CTRL_DIGESTINIT:
    439 		case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
    440 		case EVP_PKEY_CTRL_PKCS7_DECRYPT:
    441 		case EVP_PKEY_CTRL_PKCS7_SIGN:
    442 #ifndef OPENSSL_NO_CMS
    443 		case EVP_PKEY_CTRL_CMS_ENCRYPT:
    444 		case EVP_PKEY_CTRL_CMS_DECRYPT:
    445 		case EVP_PKEY_CTRL_CMS_SIGN:
    446 #endif
    447 		return 1;
    448 		case EVP_PKEY_CTRL_PEER_KEY:
    449 			RSAerr(RSA_F_PKEY_RSA_CTRL,
    450 			RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
    451 			return -2;
    452 
    453 		default:
    454 		return -2;
    455 
    456 		}
    457 	}
    458 
    459 static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
    460 			const char *type, const char *value)
    461 	{
    462 	if (!value)
    463 		{
    464 		RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_VALUE_MISSING);
    465 		return 0;
    466 		}
    467 	if (!strcmp(type, "rsa_padding_mode"))
    468 		{
    469 		int pm;
    470 		if (!strcmp(value, "pkcs1"))
    471 			pm = RSA_PKCS1_PADDING;
    472 		else if (!strcmp(value, "sslv23"))
    473 			pm = RSA_SSLV23_PADDING;
    474 		else if (!strcmp(value, "none"))
    475 			pm = RSA_NO_PADDING;
    476 		else if (!strcmp(value, "oeap"))
    477 			pm = RSA_PKCS1_OAEP_PADDING;
    478 		else if (!strcmp(value, "x931"))
    479 			pm = RSA_X931_PADDING;
    480 		else if (!strcmp(value, "pss"))
    481 			pm = RSA_PKCS1_PSS_PADDING;
    482 		else
    483 			{
    484 			RSAerr(RSA_F_PKEY_RSA_CTRL_STR,
    485 						RSA_R_UNKNOWN_PADDING_TYPE);
    486 			return -2;
    487 			}
    488 		return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
    489 		}
    490 
    491 	if (!strcmp(type, "rsa_pss_saltlen"))
    492 		{
    493 		int saltlen;
    494 		saltlen = atoi(value);
    495 		return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
    496 		}
    497 
    498 	if (!strcmp(type, "rsa_keygen_bits"))
    499 		{
    500 		int nbits;
    501 		nbits = atoi(value);
    502 		return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
    503 		}
    504 
    505 	if (!strcmp(type, "rsa_keygen_pubexp"))
    506 		{
    507 		int ret;
    508 		BIGNUM *pubexp = NULL;
    509 		if (!BN_asc2bn(&pubexp, value))
    510 			return 0;
    511 		ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
    512 		if (ret <= 0)
    513 			BN_free(pubexp);
    514 		return ret;
    515 		}
    516 
    517 	return -2;
    518 	}
    519 
    520 static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
    521 	{
    522 	RSA *rsa = NULL;
    523 	RSA_PKEY_CTX *rctx = ctx->data;
    524 	BN_GENCB *pcb, cb;
    525 	int ret;
    526 	if (!rctx->pub_exp)
    527 		{
    528 		rctx->pub_exp = BN_new();
    529 		if (!rctx->pub_exp || !BN_set_word(rctx->pub_exp, RSA_F4))
    530 			return 0;
    531 		}
    532 	rsa = RSA_new();
    533 	if (!rsa)
    534 		return 0;
    535 	if (ctx->pkey_gencb)
    536 		{
    537 		pcb = &cb;
    538 		evp_pkey_set_cb_translate(pcb, ctx);
    539 		}
    540 	else
    541 		pcb = NULL;
    542 	ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb);
    543 	if (ret > 0)
    544 		EVP_PKEY_assign_RSA(pkey, rsa);
    545 	else
    546 		RSA_free(rsa);
    547 	return ret;
    548 	}
    549 
    550 const EVP_PKEY_METHOD rsa_pkey_meth =
    551 	{
    552 	EVP_PKEY_RSA,
    553 	EVP_PKEY_FLAG_AUTOARGLEN,
    554 	pkey_rsa_init,
    555 	pkey_rsa_copy,
    556 	pkey_rsa_cleanup,
    557 
    558 	0,0,
    559 
    560 	0,
    561 	pkey_rsa_keygen,
    562 
    563 	0,
    564 	pkey_rsa_sign,
    565 
    566 	0,
    567 	pkey_rsa_verify,
    568 
    569 	0,
    570 	pkey_rsa_verifyrecover,
    571 
    572 
    573 	0,0,0,0,
    574 
    575 	0,
    576 	pkey_rsa_encrypt,
    577 
    578 	0,
    579 	pkey_rsa_decrypt,
    580 
    581 	0,0,
    582 
    583 	pkey_rsa_ctrl,
    584 	pkey_rsa_ctrl_str
    585 
    586 
    587 	};
    588