rsa_ameth.c 28.0 KB
Newer Older
1
/*
2
 * Copyright 2006-2017 The OpenSSL Project Authors. All Rights Reserved.
3
 *
R
Rich Salz 已提交
4 5 6 7
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9 10
 */

#include <stdio.h>
11
#include "internal/cryptlib.h"
12 13
#include <openssl/asn1t.h>
#include <openssl/x509.h>
14
#include <openssl/bn.h>
R
Rich Salz 已提交
15
#include <openssl/cms.h>
16
#include "internal/asn1_int.h"
D
Dr. Stephen Henson 已提交
17
#include "internal/evp_int.h"
R
Richard Levitte 已提交
18
#include "rsa_locl.h"
19

D
David Bar 已提交
20
#ifndef OPENSSL_NO_CMS
21 22 23 24
static int rsa_cms_sign(CMS_SignerInfo *si);
static int rsa_cms_verify(CMS_SignerInfo *si);
static int rsa_cms_decrypt(CMS_RecipientInfo *ri);
static int rsa_cms_encrypt(CMS_RecipientInfo *ri);
D
David Bar 已提交
25
#endif
26

D
Dr. Stephen Henson 已提交
27 28
static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg);

29 30 31 32 33
/* Set any parameters associated with pkey */
static int rsa_param_encode(const EVP_PKEY *pkey,
                            ASN1_STRING **pstr, int *pstrtype)
{
    const RSA *rsa = pkey->pkey.rsa;
D
Dr. Stephen Henson 已提交
34

35 36 37 38 39 40 41 42 43 44 45 46
    *pstr = NULL;
    /* If RSA it's just NULL type */
    if (pkey->ameth->pkey_id == EVP_PKEY_RSA) {
        *pstrtype = V_ASN1_NULL;
        return 1;
    }
    /* If no PSS parameters we omit parameters entirely */
    if (rsa->pss == NULL) {
        *pstrtype = V_ASN1_UNDEF;
        return 1;
    }
    /* Encode PSS parameters */
47
    if (ASN1_item_pack(rsa->pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), pstr) == NULL)
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
        return 0;

    *pstrtype = V_ASN1_SEQUENCE;
    return 1;
}
/* Decode any parameters and set them in RSA structure */
static int rsa_param_decode(RSA *rsa, const X509_ALGOR *alg)
{
    const ASN1_OBJECT *algoid;
    const void *algp;
    int algptype;

    X509_ALGOR_get0(&algoid, &algptype, &algp, alg);
    if (OBJ_obj2nid(algoid) == EVP_PKEY_RSA)
        return 1;
    if (algptype == V_ASN1_UNDEF)
        return 1;
D
Dr. Stephen Henson 已提交
65 66
    if (algptype != V_ASN1_SEQUENCE) {
        RSAerr(RSA_F_RSA_PARAM_DECODE, RSA_R_INVALID_PSS_PARAMETERS);
67
        return 0;
D
Dr. Stephen Henson 已提交
68
    }
D
Dr. Stephen Henson 已提交
69
    rsa->pss = rsa_pss_decode(alg);
70 71 72 73 74
    if (rsa->pss == NULL)
        return 0;
    return 1;
}

75
static int rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
76 77 78
{
    unsigned char *penc = NULL;
    int penclen;
79 80
    ASN1_STRING *str;
    int strtype;
D
Dr. Stephen Henson 已提交
81

82 83
    if (!rsa_param_encode(pkey, &str, &strtype))
        return 0;
84 85 86
    penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc);
    if (penclen <= 0)
        return 0;
87 88
    if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(pkey->ameth->pkey_id),
                               strtype, str, penc, penclen))
89 90 91 92 93
        return 1;

    OPENSSL_free(penc);
    return 0;
}
94 95

static int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
96 97 98
{
    const unsigned char *p;
    int pklen;
99
    X509_ALGOR *alg;
100
    RSA *rsa = NULL;
101

102
    if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &alg, pubkey))
103
        return 0;
104
    if ((rsa = d2i_RSAPublicKey(NULL, &p, pklen)) == NULL) {
105 106 107
        RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB);
        return 0;
    }
108 109 110 111
    if (!rsa_param_decode(rsa, alg)) {
        RSA_free(rsa);
        return 0;
    }
112
    EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, rsa);
113 114
    return 1;
}
115

116
static int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
117 118 119 120 121 122
{
    if (BN_cmp(b->pkey.rsa->n, a->pkey.rsa->n) != 0
        || BN_cmp(b->pkey.rsa->e, a->pkey.rsa->e) != 0)
        return 0;
    return 1;
}
123

124
static int old_rsa_priv_decode(EVP_PKEY *pkey,
125 126 127
                               const unsigned char **pder, int derlen)
{
    RSA *rsa;
128 129

    if ((rsa = d2i_RSAPrivateKey(NULL, pder, derlen)) == NULL) {
130 131 132
        RSAerr(RSA_F_OLD_RSA_PRIV_DECODE, ERR_R_RSA_LIB);
        return 0;
    }
133
    EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, rsa);
134 135
    return 1;
}
136

137
static int old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
138 139 140
{
    return i2d_RSAPrivateKey(pkey->pkey.rsa, pder);
}
141

142
static int rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
143 144 145
{
    unsigned char *rk = NULL;
    int rklen;
146 147
    ASN1_STRING *str;
    int strtype;
D
Dr. Stephen Henson 已提交
148

149 150
    if (!rsa_param_encode(pkey, &str, &strtype))
        return 0;
151 152 153 154
    rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk);

    if (rklen <= 0) {
        RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
D
Dr. Stephen Henson 已提交
155
        ASN1_STRING_free(str);
156 157 158
        return 0;
    }

159
    if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(pkey->ameth->pkey_id), 0,
160
                         strtype, str, rk, rklen)) {
161
        RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
D
Dr. Stephen Henson 已提交
162
        ASN1_STRING_free(str);
163 164 165 166 167
        return 0;
    }

    return 1;
}
168

169
static int rsa_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
170 171
{
    const unsigned char *p;
172
    RSA *rsa;
173
    int pklen;
174 175 176 177 178 179 180 181 182 183 184
    const X509_ALGOR *alg;

    if (!PKCS8_pkey_get0(NULL, &p, &pklen, &alg, p8))
        return 0;
    rsa = d2i_RSAPrivateKey(NULL, &p, pklen);
    if (rsa == NULL) {
        RSAerr(RSA_F_RSA_PRIV_DECODE, ERR_R_RSA_LIB);
        return 0;
    }
    if (!rsa_param_decode(rsa, alg)) {
        RSA_free(rsa);
185
        return 0;
186 187 188
    }
    EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, rsa);
    return 1;
189
}
190

191
static int int_rsa_size(const EVP_PKEY *pkey)
192 193 194
{
    return RSA_size(pkey->pkey.rsa);
}
195 196

static int rsa_bits(const EVP_PKEY *pkey)
197 198 199
{
    return BN_num_bits(pkey->pkey.rsa->n);
}
200

201
static int rsa_security_bits(const EVP_PKEY *pkey)
202 203 204
{
    return RSA_security_bits(pkey->pkey.rsa);
}
205

206
static void int_rsa_free(EVP_PKEY *pkey)
207 208 209
{
    RSA_free(pkey->pkey.rsa);
}
210

D
Dr. Stephen Henson 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223
static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg)
{
    if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
        return NULL;
    return ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(X509_ALGOR),
                                     alg->parameter);
}

static int rsa_pss_param_print(BIO *bp, int pss_key, RSA_PSS_PARAMS *pss,
                               int indent)
{
    int rv = 0;
    X509_ALGOR *maskHash = NULL;
D
Dr. Stephen Henson 已提交
224

D
Dr. Stephen Henson 已提交
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
    if (!BIO_indent(bp, indent, 128))
        goto err;
    if (pss_key) {
        if (pss == NULL) {
            if (BIO_puts(bp, "No PSS parameter restrictions\n") <= 0)
                return 0;
            return 1;
        } else {
            if (BIO_puts(bp, "PSS parameter restrictions:") <= 0)
                return 0;
        }
    } else if (pss == NULL) {
        if (BIO_puts(bp,"(INVALID PSS PARAMETERS)\n") <= 0)
            return 0;
        return 1;
    }
    if (BIO_puts(bp, "\n") <= 0)
        goto err;
    if (pss_key)
        indent += 2;
    if (!BIO_indent(bp, indent, 128))
        goto err;
    if (BIO_puts(bp, "Hash Algorithm: ") <= 0)
        goto err;

    if (pss->hashAlgorithm) {
        if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0)
            goto err;
253
    } else if (BIO_puts(bp, "sha1 (default)") <= 0) {
D
Dr. Stephen Henson 已提交
254
        goto err;
255
    }
D
Dr. Stephen Henson 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273

    if (BIO_puts(bp, "\n") <= 0)
        goto err;

    if (!BIO_indent(bp, indent, 128))
        goto err;

    if (BIO_puts(bp, "Mask Algorithm: ") <= 0)
        goto err;
    if (pss->maskGenAlgorithm) {
        if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0)
            goto err;
        if (BIO_puts(bp, " with ") <= 0)
            goto err;
        maskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
        if (maskHash != NULL) {
            if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0)
                goto err;
274
        } else if (BIO_puts(bp, "INVALID") <= 0) {
D
Dr. Stephen Henson 已提交
275
            goto err;
276 277
        }
    } else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) {
D
Dr. Stephen Henson 已提交
278
        goto err;
279
    }
D
Dr. Stephen Henson 已提交
280 281 282 283 284 285 286 287 288
    BIO_puts(bp, "\n");

    if (!BIO_indent(bp, indent, 128))
        goto err;
    if (BIO_printf(bp, "%s Salt Length: 0x", pss_key ? "Minimum" : "") <= 0)
        goto err;
    if (pss->saltLength) {
        if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0)
            goto err;
289
    } else if (BIO_puts(bp, "14 (default)") <= 0) {
D
Dr. Stephen Henson 已提交
290
        goto err;
291
    }
D
Dr. Stephen Henson 已提交
292 293 294 295 296 297 298 299 300
    BIO_puts(bp, "\n");

    if (!BIO_indent(bp, indent, 128))
        goto err;
    if (BIO_puts(bp, "Trailer Field: 0x") <= 0)
        goto err;
    if (pss->trailerField) {
        if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0)
            goto err;
301
    } else if (BIO_puts(bp, "BC (default)") <= 0) {
D
Dr. Stephen Henson 已提交
302
        goto err;
303
    }
D
Dr. Stephen Henson 已提交
304 305 306 307 308 309 310 311 312 313 314
    BIO_puts(bp, "\n");

    rv = 1;

 err:
    X509_ALGOR_free(maskHash);
    return rv;

}

static int pkey_rsa_print(BIO *bp, const EVP_PKEY *pkey, int off, int priv)
315
{
D
Dr. Stephen Henson 已提交
316
    const RSA *x = pkey->pkey.rsa;
317 318 319 320 321 322 323 324 325 326
    char *str;
    const char *s;
    int ret = 0, mod_len = 0;

    if (x->n != NULL)
        mod_len = BN_num_bits(x->n);

    if (!BIO_indent(bp, off, 128))
        goto err;

327
    if (BIO_printf(bp, "%s ", pkey_is_pss(pkey) ?  "RSA-PSS" : "RSA") <= 0)
D
Dr. Stephen Henson 已提交
328 329
        goto err;

330
    if (priv && x->d) {
331
        if (BIO_printf(bp, "Private-Key: (%d bit)\n", mod_len) <= 0)
332 333 334 335
            goto err;
        str = "modulus:";
        s = "publicExponent:";
    } else {
336
        if (BIO_printf(bp, "Public-Key: (%d bit)\n", mod_len) <= 0)
337 338 339 340
            goto err;
        str = "Modulus:";
        s = "Exponent:";
    }
341
    if (!ASN1_bn_print(bp, str, x->n, NULL, off))
342
        goto err;
343
    if (!ASN1_bn_print(bp, s, x->e, NULL, off))
344 345
        goto err;
    if (priv) {
346
        if (!ASN1_bn_print(bp, "privateExponent:", x->d, NULL, off))
347
            goto err;
348
        if (!ASN1_bn_print(bp, "prime1:", x->p, NULL, off))
349
            goto err;
350
        if (!ASN1_bn_print(bp, "prime2:", x->q, NULL, off))
351
            goto err;
352
        if (!ASN1_bn_print(bp, "exponent1:", x->dmp1, NULL, off))
353
            goto err;
354
        if (!ASN1_bn_print(bp, "exponent2:", x->dmq1, NULL, off))
355
            goto err;
356
        if (!ASN1_bn_print(bp, "coefficient:", x->iqmp, NULL, off))
357 358
            goto err;
    }
359
    if (pkey_is_pss(pkey) && !rsa_pss_param_print(bp, 1, x->pss, off))
D
Dr. Stephen Henson 已提交
360
        goto err;
361 362
    ret = 1;
 err:
D
Dr. Stephen Henson 已提交
363
    return ret;
364
}
365 366

static int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
367 368
                         ASN1_PCTX *ctx)
{
D
Dr. Stephen Henson 已提交
369
    return pkey_rsa_print(bp, pkey, indent, 0);
370
}
371 372

static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
373 374
                          ASN1_PCTX *ctx)
{
D
Dr. Stephen Henson 已提交
375
    return pkey_rsa_print(bp, pkey, indent, 1);
376
}
377

D
Dr. Stephen Henson 已提交
378
static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg)
379 380 381
{
    RSA_PSS_PARAMS *pss;

D
Dr. Stephen Henson 已提交
382 383
    pss = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(RSA_PSS_PARAMS),
                                    alg->parameter);
384

D
Dr. Stephen Henson 已提交
385
    if (pss == NULL)
386 387
        return NULL;

D
Dr. Stephen Henson 已提交
388 389 390 391 392 393 394
    if (pss->maskGenAlgorithm != NULL) {
        pss->maskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
        if (pss->maskHash == NULL) {
            RSA_PSS_PARAMS_free(pss);
            return NULL;
        }
    }
395 396 397 398

    return pss;
}

399
static int rsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
400 401
                         const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx)
{
D
Dr. Stephen Henson 已提交
402
    if (OBJ_obj2nid(sigalg->algorithm) == EVP_PKEY_RSA_PSS) {
403
        int rv;
D
Dr. Stephen Henson 已提交
404
        RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg);
D
Dr. Stephen Henson 已提交
405

D
Dr. Stephen Henson 已提交
406
        rv = rsa_pss_param_print(bp, 0, pss, indent);
R
Rich Salz 已提交
407
        RSA_PSS_PARAMS_free(pss);
408 409
        if (!rv)
            return 0;
D
Dr. Stephen Henson 已提交
410
    } else if (!sig && BIO_puts(bp, "\n") <= 0) {
411
        return 0;
D
Dr. Stephen Henson 已提交
412
    }
413 414 415 416
    if (sig)
        return X509_signature_dump(bp, sig, indent);
    return 1;
}
417 418

static int rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
419 420
{
    X509_ALGOR *alg = NULL;
D
Dr. Stephen Henson 已提交
421

422 423 424 425 426 427 428 429
    switch (op) {

    case ASN1_PKEY_CTRL_PKCS7_SIGN:
        if (arg1 == 0)
            PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, NULL, &alg);
        break;

    case ASN1_PKEY_CTRL_PKCS7_ENCRYPT:
430 431
        if (pkey_is_pss(pkey))
            return -2;
432 433 434
        if (arg1 == 0)
            PKCS7_RECIP_INFO_get0_alg(arg2, &alg);
        break;
D
Dr. Stephen Henson 已提交
435
#ifndef OPENSSL_NO_CMS
436 437 438 439 440 441 442 443
    case ASN1_PKEY_CTRL_CMS_SIGN:
        if (arg1 == 0)
            return rsa_cms_sign(arg2);
        else if (arg1 == 1)
            return rsa_cms_verify(arg2);
        break;

    case ASN1_PKEY_CTRL_CMS_ENVELOPE:
444 445
        if (pkey_is_pss(pkey))
            return -2;
446 447 448 449 450 451 452
        if (arg1 == 0)
            return rsa_cms_encrypt(arg2);
        else if (arg1 == 1)
            return rsa_cms_decrypt(arg2);
        break;

    case ASN1_PKEY_CTRL_CMS_RI_TYPE:
453 454
        if (pkey_is_pss(pkey))
            return -2;
455 456
        *(int *)arg2 = CMS_RECIPINFO_TRANS;
        return 1;
D
Dr. Stephen Henson 已提交
457
#endif
458

459 460 461
    case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
        *(int *)arg2 = NID_sha256;
        return 1;
462

463 464
    default:
        return -2;
465

466
    }
467

468 469
    if (alg)
        X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption), V_ASN1_NULL, 0);
470

471
    return 1;
472

473
}
474

475 476
/* allocate and set algorithm ID from EVP_MD, default SHA1 */
static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md)
477
{
478
    if (md == NULL || EVP_MD_type(md) == NID_sha1)
479 480
        return 1;
    *palg = X509_ALGOR_new();
481
    if (*palg == NULL)
482 483 484 485
        return 0;
    X509_ALGOR_set_md(*palg, md);
    return 1;
}
486 487 488

/* Allocate and set MGF1 algorithm ID from EVP_MD */
static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md)
489 490 491
{
    X509_ALGOR *algtmp = NULL;
    ASN1_STRING *stmp = NULL;
D
Dr. Stephen Henson 已提交
492

493
    *palg = NULL;
494
    if (mgf1md == NULL || EVP_MD_type(mgf1md) == NID_sha1)
495 496 497 498
        return 1;
    /* need to embed algorithm ID inside another */
    if (!rsa_md_to_algor(&algtmp, mgf1md))
        goto err;
499
    if (ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp) == NULL)
500 501
         goto err;
    *palg = X509_ALGOR_new();
502
    if (*palg == NULL)
503 504 505 506
        goto err;
    X509_ALGOR_set0(*palg, OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp);
    stmp = NULL;
 err:
R
Rich Salz 已提交
507
    ASN1_STRING_free(stmp);
R
Rich Salz 已提交
508
    X509_ALGOR_free(algtmp);
509 510 511 512
    if (*palg)
        return 1;
    return 0;
}
513 514 515

/* convert algorithm ID to EVP_MD, default SHA1 */
static const EVP_MD *rsa_algor_to_md(X509_ALGOR *alg)
516 517
{
    const EVP_MD *md;
D
Dr. Stephen Henson 已提交
518

519 520 521 522 523 524 525 526 527
    if (!alg)
        return EVP_sha1();
    md = EVP_get_digestbyobj(alg->algorithm);
    if (md == NULL)
        RSAerr(RSA_F_RSA_ALGOR_TO_MD, RSA_R_UNKNOWN_DIGEST);
    return md;
}

/*
528
 * Convert EVP_PKEY_CTX in PSS mode into corresponding algorithm parameter,
529
 * suitable for setting an AlgorithmIdentifier.
530 531
 */

532
static RSA_PSS_PARAMS *rsa_ctx_to_pss(EVP_PKEY_CTX *pkctx)
533 534 535
{
    const EVP_MD *sigmd, *mgf1md;
    EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx);
536
    int saltlen;
D
Dr. Stephen Henson 已提交
537

538
    if (EVP_PKEY_CTX_get_signature_md(pkctx, &sigmd) <= 0)
539
        return NULL;
540
    if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
541
        return NULL;
542
    if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen))
543
        return NULL;
544
    if (saltlen == -1) {
545
        saltlen = EVP_MD_size(sigmd);
546
    } else if (saltlen == -2) {
547
        saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
548
        if ((EVP_PKEY_bits(pk) & 0x7) == 1)
549 550
            saltlen--;
    }
551 552 553 554 555 556 557 558

    return rsa_pss_params_create(sigmd, mgf1md, saltlen);
}

RSA_PSS_PARAMS *rsa_pss_params_create(const EVP_MD *sigmd,
                                      const EVP_MD *mgf1md, int saltlen)
{
    RSA_PSS_PARAMS *pss = RSA_PSS_PARAMS_new();
D
Dr. Stephen Henson 已提交
559

560
    if (pss == NULL)
561 562 563
        goto err;
    if (saltlen != 20) {
        pss->saltLength = ASN1_INTEGER_new();
564
        if (pss->saltLength == NULL)
565 566 567 568 569 570
            goto err;
        if (!ASN1_INTEGER_set(pss->saltLength, saltlen))
            goto err;
    }
    if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd))
        goto err;
571
    if (mgf1md == NULL)
D
Dr. Stephen Henson 已提交
572
        mgf1md = sigmd;
573 574
    if (!rsa_md_to_mgf1(&pss->maskGenAlgorithm, mgf1md))
        goto err;
575 576
    if (!rsa_md_to_algor(&pss->maskHash, mgf1md))
        goto err;
577
    return pss;
578
 err:
R
Rich Salz 已提交
579
    RSA_PSS_PARAMS_free(pss);
580 581 582
    return NULL;
}

583 584 585
static ASN1_STRING *rsa_ctx_to_pss_string(EVP_PKEY_CTX *pkctx)
{
    RSA_PSS_PARAMS *pss = rsa_ctx_to_pss(pkctx);
586
    ASN1_STRING *os;
D
Dr. Stephen Henson 已提交
587

588 589 590
    if (pss == NULL)
        return NULL;

591
    os = ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), NULL);
592 593 594 595
    RSA_PSS_PARAMS_free(pss);
    return os;
}

596 597
/*
 * From PSS AlgorithmIdentifier set public key parameters. If pkey isn't NULL
F
FdaSilvaYY 已提交
598
 * then the EVP_MD_CTX is setup and initialised. If it is NULL parameters are
599
 * passed to pkctx instead.
600
 */
601

602
static int rsa_pss_to_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pkctx,
603 604 605 606 607 608
                          X509_ALGOR *sigalg, EVP_PKEY *pkey)
{
    int rv = -1;
    int saltlen;
    const EVP_MD *mgf1md = NULL, *md = NULL;
    RSA_PSS_PARAMS *pss;
D
Dr. Stephen Henson 已提交
609

610
    /* Sanity check: make sure it is PSS */
D
Dr. Stephen Henson 已提交
611
    if (OBJ_obj2nid(sigalg->algorithm) != EVP_PKEY_RSA_PSS) {
612 613 614 615
        RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_UNSUPPORTED_SIGNATURE_TYPE);
        return -1;
    }
    /* Decode PSS parameters */
D
Dr. Stephen Henson 已提交
616
    pss = rsa_pss_decode(sigalg);
617

D
Dr. Stephen Henson 已提交
618
    if (!rsa_pss_get_param(pss, &md, &mgf1md, &saltlen)) {
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
        RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_INVALID_PSS_PARAMETERS);
        goto err;
    }

    /* We have all parameters now set up context */
    if (pkey) {
        if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey))
            goto err;
    } else {
        const EVP_MD *checkmd;
        if (EVP_PKEY_CTX_get_signature_md(pkctx, &checkmd) <= 0)
            goto err;
        if (EVP_MD_type(md) != EVP_MD_type(checkmd)) {
            RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_DIGEST_DOES_NOT_MATCH);
            goto err;
        }
    }

    if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0)
        goto err;

    if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0)
        goto err;

    if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
        goto err;
    /* Carry on */
    rv = 1;

 err:
    RSA_PSS_PARAMS_free(pss);
    return rv;
}
652

D
Dr. Stephen Henson 已提交
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
int rsa_pss_get_param(const RSA_PSS_PARAMS *pss, const EVP_MD **pmd,
                      const EVP_MD **pmgf1md, int *psaltlen)
{
    if (pss == NULL)
        return 0;
    *pmd = rsa_algor_to_md(pss->hashAlgorithm);
    if (*pmd == NULL)
        return 0;
    *pmgf1md = rsa_algor_to_md(pss->maskHash);
    if (*pmgf1md == NULL)
        return 0;
    if (pss->saltLength) {
        *psaltlen = ASN1_INTEGER_get(pss->saltLength);
        if (*psaltlen < 0) {
            RSAerr(RSA_F_RSA_PSS_GET_PARAM, RSA_R_INVALID_SALT_LENGTH);
            return 0;
        }
D
Dr. Stephen Henson 已提交
670
    } else {
D
Dr. Stephen Henson 已提交
671
        *psaltlen = 20;
D
Dr. Stephen Henson 已提交
672
    }
D
Dr. Stephen Henson 已提交
673 674 675 676 677 678 679

    /*
     * low-level routines support only trailer field 0xbc (value 1) and
     * PKCS#1 says we should reject any other value anyway.
     */
    if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1) {
        RSAerr(RSA_F_RSA_PSS_GET_PARAM, RSA_R_INVALID_TRAILER);
D
Dr. Stephen Henson 已提交
680
        return 0;
D
Dr. Stephen Henson 已提交
681 682 683 684 685
    }

    return 1;
}

D
David Bar 已提交
686
#ifndef OPENSSL_NO_CMS
687
static int rsa_cms_verify(CMS_SignerInfo *si)
688 689 690 691
{
    int nid, nid2;
    X509_ALGOR *alg;
    EVP_PKEY_CTX *pkctx = CMS_SignerInfo_get0_pkey_ctx(si);
D
Dr. Stephen Henson 已提交
692

693 694
    CMS_SignerInfo_get0_algs(si, NULL, NULL, NULL, &alg);
    nid = OBJ_obj2nid(alg->algorithm);
D
Dr. Stephen Henson 已提交
695
    if (nid == EVP_PKEY_RSA_PSS)
696
        return rsa_pss_to_ctx(NULL, pkctx, alg, NULL);
697 698 699 700 701 702 703
    /* Only PSS allowed for PSS keys */
    if (pkey_ctx_is_pss(pkctx)) {
        RSAerr(RSA_F_RSA_CMS_VERIFY, RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
        return 0;
    }
    if (nid == NID_rsaEncryption)
        return 1;
704 705 706 707 708 709 710
    /* Workaround for some implementation that use a signature OID */
    if (OBJ_find_sigid_algs(nid, NULL, &nid2)) {
        if (nid2 == NID_rsaEncryption)
            return 1;
    }
    return 0;
}
D
David Bar 已提交
711
#endif
712 713 714 715

/*
 * Customised RSA item verification routine. This is called when a signature
 * is encountered requiring special handling. We currently only handle PSS.
716 717 718
 */

static int rsa_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
719 720 721 722
                           X509_ALGOR *sigalg, ASN1_BIT_STRING *sig,
                           EVP_PKEY *pkey)
{
    /* Sanity check: make sure it is PSS */
D
Dr. Stephen Henson 已提交
723
    if (OBJ_obj2nid(sigalg->algorithm) != EVP_PKEY_RSA_PSS) {
724 725 726
        RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_SIGNATURE_TYPE);
        return -1;
    }
727
    if (rsa_pss_to_ctx(ctx, NULL, sigalg, pkey) > 0) {
728 729
        /* Carry on */
        return 2;
730
    }
731 732
    return -1;
}
733

D
David Bar 已提交
734
#ifndef OPENSSL_NO_CMS
735
static int rsa_cms_sign(CMS_SignerInfo *si)
736 737 738 739 740
{
    int pad_mode = RSA_PKCS1_PADDING;
    X509_ALGOR *alg;
    EVP_PKEY_CTX *pkctx = CMS_SignerInfo_get0_pkey_ctx(si);
    ASN1_STRING *os = NULL;
D
Dr. Stephen Henson 已提交
741

742 743 744 745 746 747 748 749 750 751 752 753
    CMS_SignerInfo_get0_algs(si, NULL, NULL, NULL, &alg);
    if (pkctx) {
        if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
            return 0;
    }
    if (pad_mode == RSA_PKCS1_PADDING) {
        X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption), V_ASN1_NULL, 0);
        return 1;
    }
    /* We don't support it */
    if (pad_mode != RSA_PKCS1_PSS_PADDING)
        return 0;
754
    os = rsa_ctx_to_pss_string(pkctx);
755 756
    if (!os)
        return 0;
D
Dr. Stephen Henson 已提交
757
    X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_PKEY_RSA_PSS), V_ASN1_SEQUENCE, os);
758 759
    return 1;
}
D
David Bar 已提交
760
#endif
761

D
Dr. Stephen Henson 已提交
762
static int rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
763 764 765 766
                         X509_ALGOR *alg1, X509_ALGOR *alg2,
                         ASN1_BIT_STRING *sig)
{
    int pad_mode;
767
    EVP_PKEY_CTX *pkctx = EVP_MD_CTX_pkey_ctx(ctx);
D
Dr. Stephen Henson 已提交
768

769 770 771 772 773 774
    if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
        return 0;
    if (pad_mode == RSA_PKCS1_PADDING)
        return 2;
    if (pad_mode == RSA_PKCS1_PSS_PADDING) {
        ASN1_STRING *os1 = NULL;
775
        os1 = rsa_ctx_to_pss_string(pkctx);
776 777 778 779 780 781 782 783 784
        if (!os1)
            return 0;
        /* Duplicate parameters if we have to */
        if (alg2) {
            ASN1_STRING *os2 = ASN1_STRING_dup(os1);
            if (!os2) {
                ASN1_STRING_free(os1);
                return 0;
            }
D
Dr. Stephen Henson 已提交
785
            X509_ALGOR_set0(alg2, OBJ_nid2obj(EVP_PKEY_RSA_PSS),
786 787
                            V_ASN1_SEQUENCE, os2);
        }
D
Dr. Stephen Henson 已提交
788
        X509_ALGOR_set0(alg1, OBJ_nid2obj(EVP_PKEY_RSA_PSS),
789 790 791 792 793
                        V_ASN1_SEQUENCE, os1);
        return 3;
    }
    return 2;
}
D
Dr. Stephen Henson 已提交
794

795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
static int rsa_sig_info_set(X509_SIG_INFO *siginf, const X509_ALGOR *sigalg,
                            const ASN1_STRING *sig)
{
    int rv = 0;
    int mdnid, saltlen;
    uint32_t flags;
    const EVP_MD *mgf1md = NULL, *md = NULL;
    RSA_PSS_PARAMS *pss;

    /* Sanity check: make sure it is PSS */
    if (OBJ_obj2nid(sigalg->algorithm) != EVP_PKEY_RSA_PSS)
        return 0;
    /* Decode PSS parameters */
    pss = rsa_pss_decode(sigalg);
    if (!rsa_pss_get_param(pss, &md, &mgf1md, &saltlen))
        goto err;
    mdnid = EVP_MD_type(md);
    /*
     * For TLS need SHA256, SHA384 or SHA512, digest and MGF1 digest must
     * match and salt length must equal digest size
     */
    if ((mdnid == NID_sha256 || mdnid == NID_sha384 || mdnid == NID_sha512)
            && mdnid == EVP_MD_type(mgf1md) && saltlen == EVP_MD_size(md))
        flags = X509_SIG_INFO_TLS;
    else
        flags = 0;
    /* Note: security bits half number of digest bits */
    X509_SIG_INFO_set(siginf, mdnid, EVP_PKEY_RSA_PSS, EVP_MD_size(md) * 4,
                      flags);
    rv = 1;
    err:
    RSA_PSS_PARAMS_free(pss);
    return rv;
}

D
David Bar 已提交
830
#ifndef OPENSSL_NO_CMS
D
Dr. Stephen Henson 已提交
831
static RSA_OAEP_PARAMS *rsa_oaep_decode(const X509_ALGOR *alg)
832
{
D
Dr. Stephen Henson 已提交
833
    RSA_OAEP_PARAMS *oaep;
834

D
Dr. Stephen Henson 已提交
835
    oaep = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(RSA_OAEP_PARAMS),
D
Dr. Stephen Henson 已提交
836
                                     alg->parameter);
837

D
Dr. Stephen Henson 已提交
838
    if (oaep == NULL)
839
        return NULL;
840

D
Dr. Stephen Henson 已提交
841 842 843 844 845 846 847 848
    if (oaep->maskGenFunc != NULL) {
        oaep->maskHash = rsa_mgf1_decode(oaep->maskGenFunc);
        if (oaep->maskHash == NULL) {
            RSA_OAEP_PARAMS_free(oaep);
            return NULL;
        }
    }
    return oaep;
849
}
850 851

static int rsa_cms_decrypt(CMS_RecipientInfo *ri)
852 853 854 855 856 857 858 859 860
{
    EVP_PKEY_CTX *pkctx;
    X509_ALGOR *cmsalg;
    int nid;
    int rv = -1;
    unsigned char *label = NULL;
    int labellen = 0;
    const EVP_MD *mgf1md = NULL, *md = NULL;
    RSA_OAEP_PARAMS *oaep;
D
Dr. Stephen Henson 已提交
861

862
    pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
D
Dr. Stephen Henson 已提交
863
    if (pkctx == NULL)
864 865 866 867 868 869 870 871 872 873 874
        return 0;
    if (!CMS_RecipientInfo_ktri_get0_algs(ri, NULL, NULL, &cmsalg))
        return -1;
    nid = OBJ_obj2nid(cmsalg->algorithm);
    if (nid == NID_rsaEncryption)
        return 1;
    if (nid != NID_rsaesOaep) {
        RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_UNSUPPORTED_ENCRYPTION_TYPE);
        return -1;
    }
    /* Decode OAEP parameters */
D
Dr. Stephen Henson 已提交
875
    oaep = rsa_oaep_decode(cmsalg);
876 877 878 879 880 881

    if (oaep == NULL) {
        RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_INVALID_OAEP_PARAMETERS);
        goto err;
    }

D
Dr. Stephen Henson 已提交
882
    mgf1md = rsa_algor_to_md(oaep->maskHash);
D
Dr. Stephen Henson 已提交
883
    if (mgf1md == NULL)
884 885
        goto err;
    md = rsa_algor_to_md(oaep->hashFunc);
D
Dr. Stephen Henson 已提交
886
    if (md == NULL)
887 888
        goto err;

D
Dr. Stephen Henson 已提交
889
    if (oaep->pSourceFunc != NULL) {
890
        X509_ALGOR *plab = oaep->pSourceFunc;
D
Dr. Stephen Henson 已提交
891

892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
        if (OBJ_obj2nid(plab->algorithm) != NID_pSpecified) {
            RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_UNSUPPORTED_LABEL_SOURCE);
            goto err;
        }
        if (plab->parameter->type != V_ASN1_OCTET_STRING) {
            RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_INVALID_LABEL);
            goto err;
        }

        label = plab->parameter->value.octet_string->data;
        /* Stop label being freed when OAEP parameters are freed */
        plab->parameter->value.octet_string->data = NULL;
        labellen = plab->parameter->value.octet_string->length;
    }

    if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_OAEP_PADDING) <= 0)
        goto err;
    if (EVP_PKEY_CTX_set_rsa_oaep_md(pkctx, md) <= 0)
        goto err;
    if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
        goto err;
    if (EVP_PKEY_CTX_set0_rsa_oaep_label(pkctx, label, labellen) <= 0)
        goto err;
    /* Carry on */
    rv = 1;

 err:
    RSA_OAEP_PARAMS_free(oaep);
    return rv;
}
922 923

static int rsa_cms_encrypt(CMS_RecipientInfo *ri)
924 925 926 927 928 929 930 931
{
    const EVP_MD *md, *mgf1md;
    RSA_OAEP_PARAMS *oaep = NULL;
    ASN1_STRING *os = NULL;
    X509_ALGOR *alg;
    EVP_PKEY_CTX *pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
    int pad_mode = RSA_PKCS1_PADDING, rv = 0, labellen;
    unsigned char *label;
D
Dr. Stephen Henson 已提交
932

933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
    CMS_RecipientInfo_ktri_get0_algs(ri, NULL, NULL, &alg);
    if (pkctx) {
        if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
            return 0;
    }
    if (pad_mode == RSA_PKCS1_PADDING) {
        X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption), V_ASN1_NULL, 0);
        return 1;
    }
    /* Not supported */
    if (pad_mode != RSA_PKCS1_OAEP_PADDING)
        return 0;
    if (EVP_PKEY_CTX_get_rsa_oaep_md(pkctx, &md) <= 0)
        goto err;
    if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
        goto err;
    labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label);
    if (labellen < 0)
        goto err;
    oaep = RSA_OAEP_PARAMS_new();
953
    if (oaep == NULL)
954 955 956 957 958 959
        goto err;
    if (!rsa_md_to_algor(&oaep->hashFunc, md))
        goto err;
    if (!rsa_md_to_mgf1(&oaep->maskGenFunc, mgf1md))
        goto err;
    if (labellen > 0) {
960
        ASN1_OCTET_STRING *los;
961
        oaep->pSourceFunc = X509_ALGOR_new();
962
        if (oaep->pSourceFunc == NULL)
963
            goto err;
964
        los = ASN1_OCTET_STRING_new();
965
        if (los == NULL)
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980
            goto err;
        if (!ASN1_OCTET_STRING_set(los, label, labellen)) {
            ASN1_OCTET_STRING_free(los);
            goto err;
        }
        X509_ALGOR_set0(oaep->pSourceFunc, OBJ_nid2obj(NID_pSpecified),
                        V_ASN1_OCTET_STRING, los);
    }
    /* create string with pss parameter encoding. */
    if (!ASN1_item_pack(oaep, ASN1_ITEM_rptr(RSA_OAEP_PARAMS), &os))
         goto err;
    X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaesOaep), V_ASN1_SEQUENCE, os);
    os = NULL;
    rv = 1;
 err:
R
Rich Salz 已提交
981
    RSA_OAEP_PARAMS_free(oaep);
R
Rich Salz 已提交
982
    ASN1_STRING_free(os);
983 984
    return rv;
}
D
David Bar 已提交
985
#endif
986

P
Paul Yang 已提交
987 988 989 990 991
static int rsa_pkey_check(const EVP_PKEY *pkey)
{
    return RSA_check_key_ex(pkey->pkey.rsa, NULL);
}

K
Kurt Roeckx 已提交
992
const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[2] = {
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
    {
     EVP_PKEY_RSA,
     EVP_PKEY_RSA,
     ASN1_PKEY_SIGPARAM_NULL,

     "RSA",
     "OpenSSL RSA method",

     rsa_pub_decode,
     rsa_pub_encode,
     rsa_pub_cmp,
     rsa_pub_print,

     rsa_priv_decode,
     rsa_priv_encode,
     rsa_priv_print,

     int_rsa_size,
     rsa_bits,
     rsa_security_bits,

     0, 0, 0, 0, 0, 0,

     rsa_sig_print,
     int_rsa_free,
     rsa_pkey_ctrl,
     old_rsa_priv_decode,
     old_rsa_priv_encode,
     rsa_item_verify,
1022
     rsa_item_sign,
P
Paul Yang 已提交
1023 1024
     rsa_sig_info_set,
     rsa_pkey_check
1025
    },
1026 1027 1028 1029 1030 1031

    {
     EVP_PKEY_RSA2,
     EVP_PKEY_RSA,
     ASN1_PKEY_ALIAS}
};
D
Dr. Stephen Henson 已提交
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061

const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth = {
     EVP_PKEY_RSA_PSS,
     EVP_PKEY_RSA_PSS,
     ASN1_PKEY_SIGPARAM_NULL,

     "RSA-PSS",
     "OpenSSL RSA-PSS method",

     rsa_pub_decode,
     rsa_pub_encode,
     rsa_pub_cmp,
     rsa_pub_print,

     rsa_priv_decode,
     rsa_priv_encode,
     rsa_priv_print,

     int_rsa_size,
     rsa_bits,
     rsa_security_bits,

     0, 0, 0, 0, 0, 0,

     rsa_sig_print,
     int_rsa_free,
     rsa_pkey_ctrl,
     0, 0,
     rsa_item_verify,
     rsa_item_sign,
P
Paul Yang 已提交
1062 1063
     0,
     rsa_pkey_check
D
Dr. Stephen Henson 已提交
1064
};