1 /* $OpenBSD: rsa_ameth.c,v 1.16 2016/10/19 16:49:11 jsing Exp $ */ 2 /* Written by Dr Stephen N Henson (steve@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@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@cryptsoft.com). This product includes software written by Tim 55 * Hudson (tjh@cryptsoft.com). 56 * 57 */ 58 59 #include <stdio.h> 60 61 #include <openssl/opensslconf.h> 62 63 #include <openssl/asn1t.h> 64 #include <openssl/bn.h> 65 #include <openssl/err.h> 66 #include <openssl/rsa.h> 67 #include <openssl/x509.h> 68 69 70 #include "asn1_locl.h" 71 72 static int 73 rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) 74 { 75 unsigned char *penc = NULL; 76 int penclen; 77 78 penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc); 79 if (penclen <= 0) 80 return 0; 81 if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_RSA), 82 V_ASN1_NULL, NULL, penc, penclen)) 83 return 1; 84 85 free(penc); 86 return 0; 87 } 88 89 static int 90 rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) 91 { 92 const unsigned char *p; 93 int pklen; 94 RSA *rsa = NULL; 95 96 if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey)) 97 return 0; 98 if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen))) { 99 RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB); 100 return 0; 101 } 102 EVP_PKEY_assign_RSA (pkey, rsa); 103 return 1; 104 } 105 106 static int 107 rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) 108 { 109 if (BN_cmp(b->pkey.rsa->n, a->pkey.rsa->n) != 0 || 110 BN_cmp(b->pkey.rsa->e, a->pkey.rsa->e) != 0) 111 return 0; 112 return 1; 113 } 114 115 static int 116 old_rsa_priv_decode(EVP_PKEY *pkey, const unsigned char **pder, int derlen) 117 { 118 RSA *rsa; 119 120 if (!(rsa = d2i_RSAPrivateKey (NULL, pder, derlen))) { 121 RSAerr(RSA_F_OLD_RSA_PRIV_DECODE, ERR_R_RSA_LIB); 122 return 0; 123 } 124 EVP_PKEY_assign_RSA(pkey, rsa); 125 return 1; 126 } 127 128 static int 129 old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder) 130 { 131 return i2d_RSAPrivateKey(pkey->pkey.rsa, pder); 132 } 133 134 static int 135 rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) 136 { 137 unsigned char *rk = NULL; 138 int rklen; 139 140 rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk); 141 142 if (rklen <= 0) { 143 RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); 144 return 0; 145 } 146 147 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_rsaEncryption), 0, 148 V_ASN1_NULL, NULL, rk, rklen)) { 149 RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); 150 return 0; 151 } 152 153 return 1; 154 } 155 156 static int 157 rsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8) 158 { 159 const unsigned char *p; 160 int pklen; 161 162 if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL, p8)) 163 return 0; 164 return old_rsa_priv_decode(pkey, &p, pklen); 165 } 166 167 static int 168 int_rsa_size(const EVP_PKEY *pkey) 169 { 170 return RSA_size(pkey->pkey.rsa); 171 } 172 173 static int 174 rsa_bits(const EVP_PKEY *pkey) 175 { 176 return BN_num_bits(pkey->pkey.rsa->n); 177 } 178 179 static void 180 int_rsa_free(EVP_PKEY *pkey) 181 { 182 RSA_free(pkey->pkey.rsa); 183 } 184 185 static void 186 update_buflen(const BIGNUM *b, size_t *pbuflen) 187 { 188 size_t i; 189 190 if (!b) 191 return; 192 if (*pbuflen < (i = (size_t)BN_num_bytes(b))) 193 *pbuflen = i; 194 } 195 196 static int 197 do_rsa_print(BIO *bp, const RSA *x, int off, int priv) 198 { 199 char *str; 200 const char *s; 201 unsigned char *m = NULL; 202 int ret = 0, mod_len = 0; 203 size_t buf_len = 0; 204 205 update_buflen(x->n, &buf_len); 206 update_buflen(x->e, &buf_len); 207 208 if (priv) { 209 update_buflen(x->d, &buf_len); 210 update_buflen(x->p, &buf_len); 211 update_buflen(x->q, &buf_len); 212 update_buflen(x->dmp1, &buf_len); 213 update_buflen(x->dmq1, &buf_len); 214 update_buflen(x->iqmp, &buf_len); 215 } 216 217 m = malloc(buf_len + 10); 218 if (m == NULL) { 219 RSAerr(RSA_F_DO_RSA_PRINT, ERR_R_MALLOC_FAILURE); 220 goto err; 221 } 222 223 if (x->n != NULL) 224 mod_len = BN_num_bits(x->n); 225 226 if (!BIO_indent(bp, off, 128)) 227 goto err; 228 229 if (priv && x->d) { 230 if (BIO_printf(bp, "Private-Key: (%d bit)\n", mod_len) <= 0) 231 goto err; 232 str = "modulus:"; 233 s = "publicExponent:"; 234 } else { 235 if (BIO_printf(bp, "Public-Key: (%d bit)\n", mod_len) <= 0) 236 goto err; 237 str = "Modulus:"; 238 s= "Exponent:"; 239 } 240 if (!ASN1_bn_print(bp, str, x->n, m, off)) 241 goto err; 242 if (!ASN1_bn_print(bp, s, x->e, m, off)) 243 goto err; 244 if (priv) { 245 if (!ASN1_bn_print(bp, "privateExponent:", x->d,m, off)) 246 goto err; 247 if (!ASN1_bn_print(bp, "prime1:", x->p, m, off)) 248 goto err; 249 if (!ASN1_bn_print(bp, "prime2:", x->q, m, off)) 250 goto err; 251 if (!ASN1_bn_print(bp, "exponent1:", x->dmp1, m, off)) 252 goto err; 253 if (!ASN1_bn_print(bp, "exponent2:", x->dmq1, m, off)) 254 goto err; 255 if (!ASN1_bn_print(bp, "coefficient:", x->iqmp, m, off)) 256 goto err; 257 } 258 ret = 1; 259 err: 260 free(m); 261 return (ret); 262 } 263 264 static int 265 rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx) 266 { 267 return do_rsa_print(bp, pkey->pkey.rsa, indent, 0); 268 } 269 270 static int 271 rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx) 272 { 273 return do_rsa_print(bp, pkey->pkey.rsa, indent, 1); 274 } 275 276 static RSA_PSS_PARAMS * 277 rsa_pss_decode(const X509_ALGOR *alg, X509_ALGOR **pmaskHash) 278 { 279 const unsigned char *p; 280 int plen; 281 RSA_PSS_PARAMS *pss; 282 283 *pmaskHash = NULL; 284 285 if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE) 286 return NULL; 287 288 p = alg->parameter->value.sequence->data; 289 plen = alg->parameter->value.sequence->length; 290 pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen); 291 292 if (!pss) 293 return NULL; 294 295 if (pss->maskGenAlgorithm) { 296 ASN1_TYPE *param = pss->maskGenAlgorithm->parameter; 297 if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1 && 298 param && param->type == V_ASN1_SEQUENCE) { 299 p = param->value.sequence->data; 300 plen = param->value.sequence->length; 301 *pmaskHash = d2i_X509_ALGOR(NULL, &p, plen); 302 } 303 } 304 305 return pss; 306 } 307 308 static int 309 rsa_pss_param_print(BIO *bp, RSA_PSS_PARAMS *pss, X509_ALGOR *maskHash, 310 int indent) 311 { 312 int rv = 0; 313 314 if (!pss) { 315 if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0) 316 return 0; 317 return 1; 318 } 319 if (BIO_puts(bp, "\n") <= 0) 320 goto err; 321 if (!BIO_indent(bp, indent, 128)) 322 goto err; 323 if (BIO_puts(bp, "Hash Algorithm: ") <= 0) 324 goto err; 325 326 if (pss->hashAlgorithm) { 327 if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0) 328 goto err; 329 } else if (BIO_puts(bp, "sha1 (default)") <= 0) 330 goto err; 331 332 if (BIO_puts(bp, "\n") <= 0) 333 goto err; 334 335 if (!BIO_indent(bp, indent, 128)) 336 goto err; 337 338 if (BIO_puts(bp, "Mask Algorithm: ") <= 0) 339 goto err; 340 if (pss->maskGenAlgorithm) { 341 if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0) 342 goto err; 343 if (BIO_puts(bp, " with ") <= 0) 344 goto err; 345 if (maskHash) { 346 if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) 347 goto err; 348 } else if (BIO_puts(bp, "INVALID") <= 0) 349 goto err; 350 } else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) 351 goto err; 352 BIO_puts(bp, "\n"); 353 354 if (!BIO_indent(bp, indent, 128)) 355 goto err; 356 if (BIO_puts(bp, "Salt Length: 0x") <= 0) 357 goto err; 358 if (pss->saltLength) { 359 if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0) 360 goto err; 361 } else if (BIO_puts(bp, "14 (default)") <= 0) 362 goto err; 363 BIO_puts(bp, "\n"); 364 365 if (!BIO_indent(bp, indent, 128)) 366 goto err; 367 if (BIO_puts(bp, "Trailer Field: 0x") <= 0) 368 goto err; 369 if (pss->trailerField) { 370 if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0) 371 goto err; 372 } else if (BIO_puts(bp, "BC (default)") <= 0) 373 goto err; 374 BIO_puts(bp, "\n"); 375 376 rv = 1; 377 378 err: 379 return rv; 380 } 381 382 static int 383 rsa_sig_print(BIO *bp, const X509_ALGOR *sigalg, const ASN1_STRING *sig, 384 int indent, ASN1_PCTX *pctx) 385 { 386 if (OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss) { 387 int rv; 388 RSA_PSS_PARAMS *pss; 389 X509_ALGOR *maskHash; 390 pss = rsa_pss_decode(sigalg, &maskHash); 391 rv = rsa_pss_param_print(bp, pss, maskHash, indent); 392 if (pss) 393 RSA_PSS_PARAMS_free(pss); 394 if (maskHash) 395 X509_ALGOR_free(maskHash); 396 if (!rv) 397 return 0; 398 } else if (!sig && BIO_puts(bp, "\n") <= 0) 399 return 0; 400 if (sig) 401 return X509_signature_dump(bp, sig, indent); 402 return 1; 403 } 404 405 static int 406 rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) 407 { 408 X509_ALGOR *alg = NULL; 409 410 switch (op) { 411 case ASN1_PKEY_CTRL_PKCS7_SIGN: 412 if (arg1 == 0) 413 PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, NULL, &alg); 414 break; 415 416 case ASN1_PKEY_CTRL_PKCS7_ENCRYPT: 417 if (arg1 == 0) 418 PKCS7_RECIP_INFO_get0_alg(arg2, &alg); 419 break; 420 421 case ASN1_PKEY_CTRL_DEFAULT_MD_NID: 422 *(int *)arg2 = NID_sha1; 423 return 1; 424 425 default: 426 return -2; 427 } 428 429 if (alg) 430 X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption), 431 V_ASN1_NULL, 0); 432 433 return 1; 434 } 435 436 /* Customised RSA item verification routine. This is called 437 * when a signature is encountered requiring special handling. We 438 * currently only handle PSS. 439 */ 440 static int 441 rsa_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, 442 X509_ALGOR *sigalg, ASN1_BIT_STRING *sig, EVP_PKEY *pkey) 443 { 444 int rv = -1; 445 int saltlen; 446 const EVP_MD *mgf1md = NULL, *md = NULL; 447 RSA_PSS_PARAMS *pss; 448 X509_ALGOR *maskHash; 449 EVP_PKEY_CTX *pkctx; 450 451 /* Sanity check: make sure it is PSS */ 452 if (OBJ_obj2nid(sigalg->algorithm) != NID_rsassaPss) { 453 RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_SIGNATURE_TYPE); 454 return -1; 455 } 456 457 /* Decode PSS parameters */ 458 pss = rsa_pss_decode(sigalg, &maskHash); 459 460 if (pss == NULL) { 461 RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_PSS_PARAMETERS); 462 goto err; 463 } 464 /* Check mask and lookup mask hash algorithm */ 465 if (pss->maskGenAlgorithm) { 466 if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) != NID_mgf1) { 467 RSAerr(RSA_F_RSA_ITEM_VERIFY, 468 RSA_R_UNSUPPORTED_MASK_ALGORITHM); 469 goto err; 470 } 471 if (!maskHash) { 472 RSAerr(RSA_F_RSA_ITEM_VERIFY, 473 RSA_R_UNSUPPORTED_MASK_PARAMETER); 474 goto err; 475 } 476 mgf1md = EVP_get_digestbyobj(maskHash->algorithm); 477 if (mgf1md == NULL) { 478 RSAerr(RSA_F_RSA_ITEM_VERIFY, 479 RSA_R_UNKNOWN_MASK_DIGEST); 480 goto err; 481 } 482 } else 483 mgf1md = EVP_sha1(); 484 485 if (pss->hashAlgorithm) { 486 md = EVP_get_digestbyobj(pss->hashAlgorithm->algorithm); 487 if (md == NULL) { 488 RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNKNOWN_PSS_DIGEST); 489 goto err; 490 } 491 } else 492 md = EVP_sha1(); 493 494 if (pss->saltLength) { 495 saltlen = ASN1_INTEGER_get(pss->saltLength); 496 497 /* Could perform more salt length sanity checks but the main 498 * RSA routines will trap other invalid values anyway. 499 */ 500 if (saltlen < 0) { 501 RSAerr(RSA_F_RSA_ITEM_VERIFY, 502 RSA_R_INVALID_SALT_LENGTH); 503 goto err; 504 } 505 } else 506 saltlen = 20; 507 508 /* low-level routines support only trailer field 0xbc (value 1) 509 * and PKCS#1 says we should reject any other value anyway. 510 */ 511 if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1) { 512 RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_TRAILER); 513 goto err; 514 } 515 516 /* We have all parameters now set up context */ 517 518 if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey)) 519 goto err; 520 521 if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0) 522 goto err; 523 524 if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0) 525 goto err; 526 527 if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0) 528 goto err; 529 /* Carry on */ 530 rv = 2; 531 532 err: 533 RSA_PSS_PARAMS_free(pss); 534 if (maskHash) 535 X509_ALGOR_free(maskHash); 536 return rv; 537 } 538 539 static int 540 rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, 541 X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig) 542 { 543 int pad_mode; 544 EVP_PKEY_CTX *pkctx = ctx->pctx; 545 546 if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0) 547 return 0; 548 if (pad_mode == RSA_PKCS1_PADDING) 549 return 2; 550 if (pad_mode == RSA_PKCS1_PSS_PADDING) { 551 const EVP_MD *sigmd, *mgf1md; 552 RSA_PSS_PARAMS *pss = NULL; 553 X509_ALGOR *mgf1alg = NULL; 554 ASN1_STRING *os1 = NULL, *os2 = NULL; 555 EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx); 556 int saltlen, rv = 0; 557 558 sigmd = EVP_MD_CTX_md(ctx); 559 if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0) 560 goto err; 561 if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen)) 562 goto err; 563 if (saltlen == -1) 564 saltlen = EVP_MD_size(sigmd); 565 else if (saltlen == -2) { 566 saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2; 567 if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0) 568 saltlen--; 569 } 570 pss = RSA_PSS_PARAMS_new(); 571 if (!pss) 572 goto err; 573 if (saltlen != 20) { 574 pss->saltLength = ASN1_INTEGER_new(); 575 if (!pss->saltLength) 576 goto err; 577 if (!ASN1_INTEGER_set(pss->saltLength, saltlen)) 578 goto err; 579 } 580 if (EVP_MD_type(sigmd) != NID_sha1) { 581 pss->hashAlgorithm = X509_ALGOR_new(); 582 if (!pss->hashAlgorithm) 583 goto err; 584 X509_ALGOR_set_md(pss->hashAlgorithm, sigmd); 585 } 586 if (EVP_MD_type(mgf1md) != NID_sha1) { 587 ASN1_STRING *stmp = NULL; 588 /* need to embed algorithm ID inside another */ 589 mgf1alg = X509_ALGOR_new(); 590 X509_ALGOR_set_md(mgf1alg, mgf1md); 591 if (!ASN1_item_pack(mgf1alg, ASN1_ITEM_rptr(X509_ALGOR), 592 &stmp)) 593 goto err; 594 pss->maskGenAlgorithm = X509_ALGOR_new(); 595 if (!pss->maskGenAlgorithm) 596 goto err; 597 X509_ALGOR_set0(pss->maskGenAlgorithm, 598 OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp); 599 } 600 /* Finally create string with pss parameter encoding. */ 601 if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os1)) 602 goto err; 603 if (alg2) { 604 os2 = ASN1_STRING_dup(os1); 605 if (!os2) 606 goto err; 607 X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_rsassaPss), 608 V_ASN1_SEQUENCE, os2); 609 } 610 X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_rsassaPss), 611 V_ASN1_SEQUENCE, os1); 612 os1 = os2 = NULL; 613 rv = 3; 614 err: 615 if (mgf1alg) 616 X509_ALGOR_free(mgf1alg); 617 if (pss) 618 RSA_PSS_PARAMS_free(pss); 619 ASN1_STRING_free(os1); 620 return rv; 621 } 622 return 2; 623 } 624 625 const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[] = { 626 { 627 .pkey_id = EVP_PKEY_RSA, 628 .pkey_base_id = EVP_PKEY_RSA, 629 .pkey_flags = ASN1_PKEY_SIGPARAM_NULL, 630 631 .pem_str = "RSA", 632 .info = "OpenSSL RSA method", 633 634 .pub_decode = rsa_pub_decode, 635 .pub_encode = rsa_pub_encode, 636 .pub_cmp = rsa_pub_cmp, 637 .pub_print = rsa_pub_print, 638 639 .priv_decode = rsa_priv_decode, 640 .priv_encode = rsa_priv_encode, 641 .priv_print = rsa_priv_print, 642 643 .pkey_size = int_rsa_size, 644 .pkey_bits = rsa_bits, 645 646 .sig_print = rsa_sig_print, 647 648 .pkey_free = int_rsa_free, 649 .pkey_ctrl = rsa_pkey_ctrl, 650 .old_priv_decode = old_rsa_priv_decode, 651 .old_priv_encode = old_rsa_priv_encode, 652 .item_verify = rsa_item_verify, 653 .item_sign = rsa_item_sign 654 }, 655 656 { 657 .pkey_id = EVP_PKEY_RSA2, 658 .pkey_base_id = EVP_PKEY_RSA, 659 .pkey_flags = ASN1_PKEY_ALIAS 660 } 661 }; 662