1238384Sjkim/* crypto/rsa/rsa_ameth.c */ 2238384Sjkim/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3238384Sjkim * project 2006. 4238384Sjkim */ 5238384Sjkim/* ==================================================================== 6238384Sjkim * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7238384Sjkim * 8238384Sjkim * Redistribution and use in source and binary forms, with or without 9238384Sjkim * modification, are permitted provided that the following conditions 10238384Sjkim * are met: 11238384Sjkim * 12238384Sjkim * 1. Redistributions of source code must retain the above copyright 13238384Sjkim * notice, this list of conditions and the following disclaimer. 14238384Sjkim * 15238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 16238384Sjkim * notice, this list of conditions and the following disclaimer in 17238384Sjkim * the documentation and/or other materials provided with the 18238384Sjkim * distribution. 19238384Sjkim * 20238384Sjkim * 3. All advertising materials mentioning features or use of this 21238384Sjkim * software must display the following acknowledgment: 22238384Sjkim * "This product includes software developed by the OpenSSL Project 23238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24238384Sjkim * 25238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26238384Sjkim * endorse or promote products derived from this software without 27238384Sjkim * prior written permission. For written permission, please contact 28238384Sjkim * licensing@OpenSSL.org. 29238384Sjkim * 30238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 31238384Sjkim * nor may "OpenSSL" appear in their names without prior written 32238384Sjkim * permission of the OpenSSL Project. 33238384Sjkim * 34238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 35238384Sjkim * acknowledgment: 36238384Sjkim * "This product includes software developed by the OpenSSL Project 37238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38238384Sjkim * 39238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 51238384Sjkim * ==================================================================== 52238384Sjkim * 53238384Sjkim * This product includes cryptographic software written by Eric Young 54238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 55238384Sjkim * Hudson (tjh@cryptsoft.com). 56238384Sjkim * 57238384Sjkim */ 58238384Sjkim 59238384Sjkim#include <stdio.h> 60238384Sjkim#include "cryptlib.h" 61238384Sjkim#include <openssl/asn1t.h> 62238384Sjkim#include <openssl/x509.h> 63238384Sjkim#include <openssl/rsa.h> 64238384Sjkim#include <openssl/bn.h> 65238384Sjkim#ifndef OPENSSL_NO_CMS 66238384Sjkim#include <openssl/cms.h> 67238384Sjkim#endif 68238384Sjkim#include "asn1_locl.h" 69238384Sjkim 70238384Sjkimstatic int rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) 71238384Sjkim { 72238384Sjkim unsigned char *penc = NULL; 73238384Sjkim int penclen; 74238384Sjkim penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc); 75238384Sjkim if (penclen <= 0) 76238384Sjkim return 0; 77238384Sjkim if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_RSA), 78238384Sjkim V_ASN1_NULL, NULL, penc, penclen)) 79238384Sjkim return 1; 80238384Sjkim 81238384Sjkim OPENSSL_free(penc); 82238384Sjkim return 0; 83238384Sjkim } 84238384Sjkim 85238384Sjkimstatic int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) 86238384Sjkim { 87238384Sjkim const unsigned char *p; 88238384Sjkim int pklen; 89238384Sjkim RSA *rsa = NULL; 90238384Sjkim if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey)) 91238384Sjkim return 0; 92238384Sjkim if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen))) 93238384Sjkim { 94238384Sjkim RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB); 95238384Sjkim return 0; 96238384Sjkim } 97238384Sjkim EVP_PKEY_assign_RSA (pkey, rsa); 98238384Sjkim return 1; 99238384Sjkim } 100238384Sjkim 101238384Sjkimstatic int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) 102238384Sjkim { 103238384Sjkim if (BN_cmp(b->pkey.rsa->n,a->pkey.rsa->n) != 0 104238384Sjkim || BN_cmp(b->pkey.rsa->e,a->pkey.rsa->e) != 0) 105238384Sjkim return 0; 106238384Sjkim return 1; 107238384Sjkim } 108238384Sjkim 109238384Sjkimstatic int old_rsa_priv_decode(EVP_PKEY *pkey, 110238384Sjkim const unsigned char **pder, int derlen) 111238384Sjkim { 112238384Sjkim RSA *rsa; 113238384Sjkim if (!(rsa = d2i_RSAPrivateKey (NULL, pder, derlen))) 114238384Sjkim { 115238384Sjkim RSAerr(RSA_F_OLD_RSA_PRIV_DECODE, ERR_R_RSA_LIB); 116238384Sjkim return 0; 117238384Sjkim } 118238384Sjkim EVP_PKEY_assign_RSA(pkey, rsa); 119238384Sjkim return 1; 120238384Sjkim } 121238384Sjkim 122238384Sjkimstatic int old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder) 123238384Sjkim { 124238384Sjkim return i2d_RSAPrivateKey(pkey->pkey.rsa, pder); 125238384Sjkim } 126238384Sjkim 127238384Sjkimstatic int rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) 128238384Sjkim { 129238384Sjkim unsigned char *rk = NULL; 130238384Sjkim int rklen; 131238384Sjkim rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk); 132238384Sjkim 133238384Sjkim if (rklen <= 0) 134238384Sjkim { 135238384Sjkim RSAerr(RSA_F_RSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE); 136238384Sjkim return 0; 137238384Sjkim } 138238384Sjkim 139238384Sjkim if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_rsaEncryption), 0, 140238384Sjkim V_ASN1_NULL, NULL, rk, rklen)) 141238384Sjkim { 142238384Sjkim RSAerr(RSA_F_RSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE); 143238384Sjkim return 0; 144238384Sjkim } 145238384Sjkim 146238384Sjkim return 1; 147238384Sjkim } 148238384Sjkim 149238384Sjkimstatic int rsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8) 150238384Sjkim { 151238384Sjkim const unsigned char *p; 152238384Sjkim int pklen; 153238384Sjkim if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL, p8)) 154238384Sjkim return 0; 155238384Sjkim return old_rsa_priv_decode(pkey, &p, pklen); 156238384Sjkim } 157238384Sjkim 158238384Sjkimstatic int int_rsa_size(const EVP_PKEY *pkey) 159238384Sjkim { 160238384Sjkim return RSA_size(pkey->pkey.rsa); 161238384Sjkim } 162238384Sjkim 163238384Sjkimstatic int rsa_bits(const EVP_PKEY *pkey) 164238384Sjkim { 165238384Sjkim return BN_num_bits(pkey->pkey.rsa->n); 166238384Sjkim } 167238384Sjkim 168238384Sjkimstatic void int_rsa_free(EVP_PKEY *pkey) 169238384Sjkim { 170238384Sjkim RSA_free(pkey->pkey.rsa); 171238384Sjkim } 172238384Sjkim 173238384Sjkim 174238384Sjkimstatic void update_buflen(const BIGNUM *b, size_t *pbuflen) 175238384Sjkim { 176238384Sjkim size_t i; 177238384Sjkim if (!b) 178238384Sjkim return; 179238384Sjkim if (*pbuflen < (i = (size_t)BN_num_bytes(b))) 180238384Sjkim *pbuflen = i; 181238384Sjkim } 182238384Sjkim 183238384Sjkimstatic int do_rsa_print(BIO *bp, const RSA *x, int off, int priv) 184238384Sjkim { 185238384Sjkim char *str; 186238384Sjkim const char *s; 187238384Sjkim unsigned char *m=NULL; 188238384Sjkim int ret=0, mod_len = 0; 189238384Sjkim size_t buf_len=0; 190238384Sjkim 191238384Sjkim update_buflen(x->n, &buf_len); 192238384Sjkim update_buflen(x->e, &buf_len); 193238384Sjkim 194238384Sjkim if (priv) 195238384Sjkim { 196238384Sjkim update_buflen(x->d, &buf_len); 197238384Sjkim update_buflen(x->p, &buf_len); 198238384Sjkim update_buflen(x->q, &buf_len); 199238384Sjkim update_buflen(x->dmp1, &buf_len); 200238384Sjkim update_buflen(x->dmq1, &buf_len); 201238384Sjkim update_buflen(x->iqmp, &buf_len); 202238384Sjkim } 203238384Sjkim 204238384Sjkim m=(unsigned char *)OPENSSL_malloc(buf_len+10); 205238384Sjkim if (m == NULL) 206238384Sjkim { 207238384Sjkim RSAerr(RSA_F_DO_RSA_PRINT,ERR_R_MALLOC_FAILURE); 208238384Sjkim goto err; 209238384Sjkim } 210238384Sjkim 211238384Sjkim if (x->n != NULL) 212238384Sjkim mod_len = BN_num_bits(x->n); 213238384Sjkim 214238384Sjkim if(!BIO_indent(bp,off,128)) 215238384Sjkim goto err; 216238384Sjkim 217238384Sjkim if (priv && x->d) 218238384Sjkim { 219238384Sjkim if (BIO_printf(bp,"Private-Key: (%d bit)\n", mod_len) 220238384Sjkim <= 0) goto err; 221238384Sjkim str = "modulus:"; 222238384Sjkim s = "publicExponent:"; 223238384Sjkim } 224238384Sjkim else 225238384Sjkim { 226238384Sjkim if (BIO_printf(bp,"Public-Key: (%d bit)\n", mod_len) 227238384Sjkim <= 0) goto err; 228238384Sjkim str = "Modulus:"; 229238384Sjkim s= "Exponent:"; 230238384Sjkim } 231238384Sjkim if (!ASN1_bn_print(bp,str,x->n,m,off)) goto err; 232238384Sjkim if (!ASN1_bn_print(bp,s,x->e,m,off)) 233238384Sjkim goto err; 234238384Sjkim if (priv) 235238384Sjkim { 236238384Sjkim if (!ASN1_bn_print(bp,"privateExponent:",x->d,m,off)) 237238384Sjkim goto err; 238238384Sjkim if (!ASN1_bn_print(bp,"prime1:",x->p,m,off)) 239238384Sjkim goto err; 240238384Sjkim if (!ASN1_bn_print(bp,"prime2:",x->q,m,off)) 241238384Sjkim goto err; 242238384Sjkim if (!ASN1_bn_print(bp,"exponent1:",x->dmp1,m,off)) 243238384Sjkim goto err; 244238384Sjkim if (!ASN1_bn_print(bp,"exponent2:",x->dmq1,m,off)) 245238384Sjkim goto err; 246238384Sjkim if (!ASN1_bn_print(bp,"coefficient:",x->iqmp,m,off)) 247238384Sjkim goto err; 248238384Sjkim } 249238384Sjkim ret=1; 250238384Sjkimerr: 251238384Sjkim if (m != NULL) OPENSSL_free(m); 252238384Sjkim return(ret); 253238384Sjkim } 254238384Sjkim 255238384Sjkimstatic int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, 256238384Sjkim ASN1_PCTX *ctx) 257238384Sjkim { 258238384Sjkim return do_rsa_print(bp, pkey->pkey.rsa, indent, 0); 259238384Sjkim } 260238384Sjkim 261238384Sjkim 262238384Sjkimstatic int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, 263238384Sjkim ASN1_PCTX *ctx) 264238384Sjkim { 265238384Sjkim return do_rsa_print(bp, pkey->pkey.rsa, indent, 1); 266238384Sjkim } 267238384Sjkim 268238384Sjkimstatic RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg, 269238384Sjkim X509_ALGOR **pmaskHash) 270238384Sjkim { 271238384Sjkim const unsigned char *p; 272238384Sjkim int plen; 273238384Sjkim RSA_PSS_PARAMS *pss; 274238384Sjkim 275238384Sjkim *pmaskHash = NULL; 276238384Sjkim 277238384Sjkim if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE) 278238384Sjkim return NULL; 279238384Sjkim p = alg->parameter->value.sequence->data; 280238384Sjkim plen = alg->parameter->value.sequence->length; 281238384Sjkim pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen); 282238384Sjkim 283238384Sjkim if (!pss) 284238384Sjkim return NULL; 285238384Sjkim 286238384Sjkim if (pss->maskGenAlgorithm) 287238384Sjkim { 288238384Sjkim ASN1_TYPE *param = pss->maskGenAlgorithm->parameter; 289238384Sjkim if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1 290238384Sjkim && param->type == V_ASN1_SEQUENCE) 291238384Sjkim { 292238384Sjkim p = param->value.sequence->data; 293238384Sjkim plen = param->value.sequence->length; 294238384Sjkim *pmaskHash = d2i_X509_ALGOR(NULL, &p, plen); 295238384Sjkim } 296238384Sjkim } 297238384Sjkim 298238384Sjkim return pss; 299238384Sjkim } 300238384Sjkim 301238384Sjkimstatic int rsa_pss_param_print(BIO *bp, RSA_PSS_PARAMS *pss, 302238384Sjkim X509_ALGOR *maskHash, int indent) 303238384Sjkim { 304238384Sjkim int rv = 0; 305238384Sjkim if (!pss) 306238384Sjkim { 307238384Sjkim if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0) 308238384Sjkim return 0; 309238384Sjkim return 1; 310238384Sjkim } 311238384Sjkim if (BIO_puts(bp, "\n") <= 0) 312238384Sjkim goto err; 313238384Sjkim if (!BIO_indent(bp, indent, 128)) 314238384Sjkim goto err; 315238384Sjkim if (BIO_puts(bp, "Hash Algorithm: ") <= 0) 316238384Sjkim goto err; 317238384Sjkim 318238384Sjkim if (pss->hashAlgorithm) 319238384Sjkim { 320238384Sjkim if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0) 321238384Sjkim goto err; 322238384Sjkim } 323238384Sjkim else if (BIO_puts(bp, "sha1 (default)") <= 0) 324238384Sjkim goto err; 325238384Sjkim 326238384Sjkim if (BIO_puts(bp, "\n") <= 0) 327238384Sjkim goto err; 328238384Sjkim 329238384Sjkim if (!BIO_indent(bp, indent, 128)) 330238384Sjkim goto err; 331238384Sjkim 332238384Sjkim if (BIO_puts(bp, "Mask Algorithm: ") <= 0) 333238384Sjkim goto err; 334238384Sjkim if (pss->maskGenAlgorithm) 335238384Sjkim { 336238384Sjkim if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0) 337238384Sjkim goto err; 338238384Sjkim if (BIO_puts(bp, " with ") <= 0) 339238384Sjkim goto err; 340238384Sjkim if (maskHash) 341238384Sjkim { 342238384Sjkim if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) 343238384Sjkim goto err; 344238384Sjkim } 345238384Sjkim else if (BIO_puts(bp, "INVALID") <= 0) 346238384Sjkim goto err; 347238384Sjkim } 348238384Sjkim else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) 349238384Sjkim goto err; 350238384Sjkim BIO_puts(bp, "\n"); 351238384Sjkim 352238384Sjkim if (!BIO_indent(bp, indent, 128)) 353238384Sjkim goto err; 354279264Sdelphij if (BIO_puts(bp, "Salt Length: 0x") <= 0) 355238384Sjkim goto err; 356238384Sjkim if (pss->saltLength) 357238384Sjkim { 358238384Sjkim if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0) 359238384Sjkim goto err; 360238384Sjkim } 361279264Sdelphij else if (BIO_puts(bp, "14 (default)") <= 0) 362238384Sjkim goto err; 363238384Sjkim BIO_puts(bp, "\n"); 364238384Sjkim 365238384Sjkim if (!BIO_indent(bp, indent, 128)) 366238384Sjkim goto err; 367279264Sdelphij if (BIO_puts(bp, "Trailer Field: 0x") <= 0) 368238384Sjkim goto err; 369238384Sjkim if (pss->trailerField) 370238384Sjkim { 371238384Sjkim if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0) 372238384Sjkim goto err; 373238384Sjkim } 374279264Sdelphij else if (BIO_puts(bp, "BC (default)") <= 0) 375238384Sjkim goto err; 376238384Sjkim BIO_puts(bp, "\n"); 377238384Sjkim 378238384Sjkim rv = 1; 379238384Sjkim 380238384Sjkim err: 381238384Sjkim return rv; 382238384Sjkim 383238384Sjkim } 384238384Sjkim 385238384Sjkimstatic int rsa_sig_print(BIO *bp, const X509_ALGOR *sigalg, 386238384Sjkim const ASN1_STRING *sig, 387238384Sjkim int indent, ASN1_PCTX *pctx) 388238384Sjkim { 389238384Sjkim if (OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss) 390238384Sjkim { 391238384Sjkim int rv; 392238384Sjkim RSA_PSS_PARAMS *pss; 393238384Sjkim X509_ALGOR *maskHash; 394238384Sjkim pss = rsa_pss_decode(sigalg, &maskHash); 395238384Sjkim rv = rsa_pss_param_print(bp, pss, maskHash, indent); 396238384Sjkim if (pss) 397238384Sjkim RSA_PSS_PARAMS_free(pss); 398238384Sjkim if (maskHash) 399238384Sjkim X509_ALGOR_free(maskHash); 400238384Sjkim if (!rv) 401238384Sjkim return 0; 402238384Sjkim } 403238384Sjkim else if (!sig && BIO_puts(bp, "\n") <= 0) 404238384Sjkim return 0; 405238384Sjkim if (sig) 406238384Sjkim return X509_signature_dump(bp, sig, indent); 407238384Sjkim return 1; 408238384Sjkim } 409238384Sjkim 410238384Sjkimstatic int rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) 411238384Sjkim { 412238384Sjkim X509_ALGOR *alg = NULL; 413238384Sjkim switch (op) 414238384Sjkim { 415238384Sjkim 416238384Sjkim case ASN1_PKEY_CTRL_PKCS7_SIGN: 417238384Sjkim if (arg1 == 0) 418238384Sjkim PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, NULL, &alg); 419238384Sjkim break; 420238384Sjkim 421238384Sjkim case ASN1_PKEY_CTRL_PKCS7_ENCRYPT: 422238384Sjkim if (arg1 == 0) 423238384Sjkim PKCS7_RECIP_INFO_get0_alg(arg2, &alg); 424238384Sjkim break; 425238384Sjkim#ifndef OPENSSL_NO_CMS 426238384Sjkim case ASN1_PKEY_CTRL_CMS_SIGN: 427238384Sjkim if (arg1 == 0) 428238384Sjkim CMS_SignerInfo_get0_algs(arg2, NULL, NULL, NULL, &alg); 429238384Sjkim break; 430238384Sjkim 431238384Sjkim case ASN1_PKEY_CTRL_CMS_ENVELOPE: 432238384Sjkim if (arg1 == 0) 433238384Sjkim CMS_RecipientInfo_ktri_get0_algs(arg2, NULL, NULL, &alg); 434238384Sjkim break; 435238384Sjkim#endif 436238384Sjkim 437238384Sjkim case ASN1_PKEY_CTRL_DEFAULT_MD_NID: 438238384Sjkim *(int *)arg2 = NID_sha1; 439238384Sjkim return 1; 440238384Sjkim 441238384Sjkim default: 442238384Sjkim return -2; 443238384Sjkim 444238384Sjkim } 445238384Sjkim 446238384Sjkim if (alg) 447238384Sjkim X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption), 448238384Sjkim V_ASN1_NULL, 0); 449238384Sjkim 450238384Sjkim return 1; 451238384Sjkim 452238384Sjkim } 453238384Sjkim 454238384Sjkim/* Customised RSA item verification routine. This is called 455238384Sjkim * when a signature is encountered requiring special handling. We 456238384Sjkim * currently only handle PSS. 457238384Sjkim */ 458238384Sjkim 459238384Sjkim 460238384Sjkimstatic int rsa_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, 461238384Sjkim X509_ALGOR *sigalg, ASN1_BIT_STRING *sig, 462238384Sjkim EVP_PKEY *pkey) 463238384Sjkim { 464238384Sjkim int rv = -1; 465238384Sjkim int saltlen; 466238384Sjkim const EVP_MD *mgf1md = NULL, *md = NULL; 467238384Sjkim RSA_PSS_PARAMS *pss; 468238384Sjkim X509_ALGOR *maskHash; 469238384Sjkim EVP_PKEY_CTX *pkctx; 470238384Sjkim /* Sanity check: make sure it is PSS */ 471238384Sjkim if (OBJ_obj2nid(sigalg->algorithm) != NID_rsassaPss) 472238384Sjkim { 473238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_SIGNATURE_TYPE); 474238384Sjkim return -1; 475238384Sjkim } 476238384Sjkim /* Decode PSS parameters */ 477238384Sjkim pss = rsa_pss_decode(sigalg, &maskHash); 478238384Sjkim 479238384Sjkim if (pss == NULL) 480238384Sjkim { 481238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_PSS_PARAMETERS); 482238384Sjkim goto err; 483238384Sjkim } 484238384Sjkim /* Check mask and lookup mask hash algorithm */ 485238384Sjkim if (pss->maskGenAlgorithm) 486238384Sjkim { 487238384Sjkim if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) != NID_mgf1) 488238384Sjkim { 489238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_MASK_ALGORITHM); 490238384Sjkim goto err; 491238384Sjkim } 492238384Sjkim if (!maskHash) 493238384Sjkim { 494238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_MASK_PARAMETER); 495238384Sjkim goto err; 496238384Sjkim } 497238384Sjkim mgf1md = EVP_get_digestbyobj(maskHash->algorithm); 498238384Sjkim if (mgf1md == NULL) 499238384Sjkim { 500238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNKNOWN_MASK_DIGEST); 501238384Sjkim goto err; 502238384Sjkim } 503238384Sjkim } 504238384Sjkim else 505238384Sjkim mgf1md = EVP_sha1(); 506238384Sjkim 507238384Sjkim if (pss->hashAlgorithm) 508238384Sjkim { 509238384Sjkim md = EVP_get_digestbyobj(pss->hashAlgorithm->algorithm); 510238384Sjkim if (md == NULL) 511238384Sjkim { 512238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNKNOWN_PSS_DIGEST); 513238384Sjkim goto err; 514238384Sjkim } 515238384Sjkim } 516238384Sjkim else 517238384Sjkim md = EVP_sha1(); 518238384Sjkim 519238384Sjkim if (pss->saltLength) 520238384Sjkim { 521238384Sjkim saltlen = ASN1_INTEGER_get(pss->saltLength); 522238384Sjkim 523238384Sjkim /* Could perform more salt length sanity checks but the main 524238384Sjkim * RSA routines will trap other invalid values anyway. 525238384Sjkim */ 526238384Sjkim if (saltlen < 0) 527238384Sjkim { 528238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_SALT_LENGTH); 529238384Sjkim goto err; 530238384Sjkim } 531238384Sjkim } 532238384Sjkim else 533238384Sjkim saltlen = 20; 534238384Sjkim 535238384Sjkim /* low-level routines support only trailer field 0xbc (value 1) 536238384Sjkim * and PKCS#1 says we should reject any other value anyway. 537238384Sjkim */ 538238384Sjkim if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1) 539238384Sjkim { 540238384Sjkim RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_TRAILER); 541238384Sjkim goto err; 542238384Sjkim } 543238384Sjkim 544238384Sjkim /* We have all parameters now set up context */ 545238384Sjkim 546238384Sjkim if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey)) 547238384Sjkim goto err; 548238384Sjkim 549238384Sjkim if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0) 550238384Sjkim goto err; 551238384Sjkim 552238384Sjkim if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0) 553238384Sjkim goto err; 554238384Sjkim 555238384Sjkim if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0) 556238384Sjkim goto err; 557238384Sjkim /* Carry on */ 558238384Sjkim rv = 2; 559238384Sjkim 560238384Sjkim err: 561238384Sjkim RSA_PSS_PARAMS_free(pss); 562238384Sjkim if (maskHash) 563238384Sjkim X509_ALGOR_free(maskHash); 564238384Sjkim return rv; 565238384Sjkim } 566238384Sjkim 567238384Sjkimstatic int rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, 568238384Sjkim X509_ALGOR *alg1, X509_ALGOR *alg2, 569238384Sjkim ASN1_BIT_STRING *sig) 570238384Sjkim { 571238384Sjkim int pad_mode; 572238384Sjkim EVP_PKEY_CTX *pkctx = ctx->pctx; 573238384Sjkim if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0) 574238384Sjkim return 0; 575238384Sjkim if (pad_mode == RSA_PKCS1_PADDING) 576238384Sjkim return 2; 577238384Sjkim if (pad_mode == RSA_PKCS1_PSS_PADDING) 578238384Sjkim { 579238384Sjkim const EVP_MD *sigmd, *mgf1md; 580238384Sjkim RSA_PSS_PARAMS *pss = NULL; 581238384Sjkim X509_ALGOR *mgf1alg = NULL; 582238384Sjkim ASN1_STRING *os1 = NULL, *os2 = NULL; 583238384Sjkim EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx); 584238384Sjkim int saltlen, rv = 0; 585238384Sjkim sigmd = EVP_MD_CTX_md(ctx); 586238384Sjkim if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0) 587238384Sjkim goto err; 588238384Sjkim if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen)) 589238384Sjkim goto err; 590238384Sjkim if (saltlen == -1) 591238384Sjkim saltlen = EVP_MD_size(sigmd); 592238384Sjkim else if (saltlen == -2) 593238384Sjkim { 594238384Sjkim saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2; 595238384Sjkim if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0) 596238384Sjkim saltlen--; 597238384Sjkim } 598238384Sjkim pss = RSA_PSS_PARAMS_new(); 599238384Sjkim if (!pss) 600238384Sjkim goto err; 601238384Sjkim if (saltlen != 20) 602238384Sjkim { 603238384Sjkim pss->saltLength = ASN1_INTEGER_new(); 604238384Sjkim if (!pss->saltLength) 605238384Sjkim goto err; 606238384Sjkim if (!ASN1_INTEGER_set(pss->saltLength, saltlen)) 607238384Sjkim goto err; 608238384Sjkim } 609238384Sjkim if (EVP_MD_type(sigmd) != NID_sha1) 610238384Sjkim { 611238384Sjkim pss->hashAlgorithm = X509_ALGOR_new(); 612238384Sjkim if (!pss->hashAlgorithm) 613238384Sjkim goto err; 614238384Sjkim X509_ALGOR_set_md(pss->hashAlgorithm, sigmd); 615238384Sjkim } 616238384Sjkim if (EVP_MD_type(mgf1md) != NID_sha1) 617238384Sjkim { 618238384Sjkim ASN1_STRING *stmp = NULL; 619238384Sjkim /* need to embed algorithm ID inside another */ 620238384Sjkim mgf1alg = X509_ALGOR_new(); 621238384Sjkim X509_ALGOR_set_md(mgf1alg, mgf1md); 622238384Sjkim if (!ASN1_item_pack(mgf1alg, ASN1_ITEM_rptr(X509_ALGOR), 623238384Sjkim &stmp)) 624238384Sjkim goto err; 625238384Sjkim pss->maskGenAlgorithm = X509_ALGOR_new(); 626238384Sjkim if (!pss->maskGenAlgorithm) 627238384Sjkim goto err; 628238384Sjkim X509_ALGOR_set0(pss->maskGenAlgorithm, 629238384Sjkim OBJ_nid2obj(NID_mgf1), 630238384Sjkim V_ASN1_SEQUENCE, stmp); 631238384Sjkim } 632238384Sjkim /* Finally create string with pss parameter encoding. */ 633238384Sjkim if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os1)) 634238384Sjkim goto err; 635238384Sjkim if (alg2) 636238384Sjkim { 637238384Sjkim os2 = ASN1_STRING_dup(os1); 638238384Sjkim if (!os2) 639238384Sjkim goto err; 640238384Sjkim X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_rsassaPss), 641238384Sjkim V_ASN1_SEQUENCE, os2); 642238384Sjkim } 643238384Sjkim X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_rsassaPss), 644238384Sjkim V_ASN1_SEQUENCE, os1); 645238384Sjkim os1 = os2 = NULL; 646238384Sjkim rv = 3; 647238384Sjkim err: 648238384Sjkim if (mgf1alg) 649238384Sjkim X509_ALGOR_free(mgf1alg); 650238384Sjkim if (pss) 651238384Sjkim RSA_PSS_PARAMS_free(pss); 652238384Sjkim if (os1) 653238384Sjkim ASN1_STRING_free(os1); 654238384Sjkim return rv; 655238384Sjkim 656238384Sjkim } 657238384Sjkim return 2; 658238384Sjkim } 659238384Sjkim 660238384Sjkimconst EVP_PKEY_ASN1_METHOD rsa_asn1_meths[] = 661238384Sjkim { 662238384Sjkim { 663238384Sjkim EVP_PKEY_RSA, 664238384Sjkim EVP_PKEY_RSA, 665238384Sjkim ASN1_PKEY_SIGPARAM_NULL, 666238384Sjkim 667238384Sjkim "RSA", 668238384Sjkim "OpenSSL RSA method", 669238384Sjkim 670238384Sjkim rsa_pub_decode, 671238384Sjkim rsa_pub_encode, 672238384Sjkim rsa_pub_cmp, 673238384Sjkim rsa_pub_print, 674238384Sjkim 675238384Sjkim rsa_priv_decode, 676238384Sjkim rsa_priv_encode, 677238384Sjkim rsa_priv_print, 678238384Sjkim 679238384Sjkim int_rsa_size, 680238384Sjkim rsa_bits, 681238384Sjkim 682238384Sjkim 0,0,0,0,0,0, 683238384Sjkim 684238384Sjkim rsa_sig_print, 685238384Sjkim int_rsa_free, 686238384Sjkim rsa_pkey_ctrl, 687238384Sjkim old_rsa_priv_decode, 688238384Sjkim old_rsa_priv_encode, 689238384Sjkim rsa_item_verify, 690238384Sjkim rsa_item_sign 691238384Sjkim }, 692238384Sjkim 693238384Sjkim { 694238384Sjkim EVP_PKEY_RSA2, 695238384Sjkim EVP_PKEY_RSA, 696238384Sjkim ASN1_PKEY_ALIAS 697238384Sjkim } 698238384Sjkim }; 699