rsa_ossl.c 23.0 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 1995-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 "internal/cryptlib.h"
11
#include "internal/bn_int.h"
R
Richard Levitte 已提交
12
#include "rsa_locl.h"
13

R
Rich Salz 已提交
14
static int rsa_ossl_public_encrypt(int flen, const unsigned char *from,
15
                                  unsigned char *to, RSA *rsa, int padding);
R
Rich Salz 已提交
16
static int rsa_ossl_private_encrypt(int flen, const unsigned char *from,
17
                                   unsigned char *to, RSA *rsa, int padding);
R
Rich Salz 已提交
18
static int rsa_ossl_public_decrypt(int flen, const unsigned char *from,
19
                                  unsigned char *to, RSA *rsa, int padding);
R
Rich Salz 已提交
20
static int rsa_ossl_private_decrypt(int flen, const unsigned char *from,
21
                                   unsigned char *to, RSA *rsa, int padding);
R
Rich Salz 已提交
22
static int rsa_ossl_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa,
23
                           BN_CTX *ctx);
R
Rich Salz 已提交
24 25 26
static int rsa_ossl_init(RSA *rsa);
static int rsa_ossl_finish(RSA *rsa);
static RSA_METHOD rsa_pkcs1_ossl_meth = {
27
    "OpenSSL PKCS#1 RSA",
R
Rich Salz 已提交
28 29 30 31 32
    rsa_ossl_public_encrypt,
    rsa_ossl_public_decrypt,     /* signature verification */
    rsa_ossl_private_encrypt,    /* signing */
    rsa_ossl_private_decrypt,
    rsa_ossl_mod_exp,
33 34
    BN_mod_exp_mont,            /* XXX probably we should not use Montgomery
                                 * if e == 3 */
R
Rich Salz 已提交
35 36
    rsa_ossl_init,
    rsa_ossl_finish,
37 38 39 40 41 42
    RSA_FLAG_FIPS_METHOD,       /* flags */
    NULL,
    0,                          /* rsa_sign */
    0,                          /* rsa_verify */
    NULL                        /* rsa_keygen */
};
43

44 45 46 47 48 49 50 51 52 53 54 55
static const RSA_METHOD *default_RSA_meth = &rsa_pkcs1_ossl_meth;

void RSA_set_default_method(const RSA_METHOD *meth)
{
    default_RSA_meth = meth;
}

const RSA_METHOD *RSA_get_default_method(void)
{
    return default_RSA_meth;
}

R
Rich Salz 已提交
56
const RSA_METHOD *RSA_PKCS1_OpenSSL(void)
57
{
R
Rich Salz 已提交
58
    return &rsa_pkcs1_ossl_meth;
59
}
60

61 62 63 64 65
const RSA_METHOD *RSA_null_method(void)
{
    return NULL;
}

R
Rich Salz 已提交
66
static int rsa_ossl_public_encrypt(int flen, const unsigned char *from,
67 68 69 70 71 72 73 74
                                  unsigned char *to, RSA *rsa, int padding)
{
    BIGNUM *f, *ret;
    int i, j, k, num = 0, r = -1;
    unsigned char *buf = NULL;
    BN_CTX *ctx = NULL;

    if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
R
Rich Salz 已提交
75
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
76 77 78 79
        return -1;
    }

    if (BN_ucmp(rsa->n, rsa->e) <= 0) {
R
Rich Salz 已提交
80
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
81 82 83 84 85 86
        return -1;
    }

    /* for large moduli, enforce exponent limit */
    if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
        if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
R
Rich Salz 已提交
87
            RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
88 89 90 91 92 93 94 95 96 97 98
            return -1;
        }
    }

    if ((ctx = BN_CTX_new()) == NULL)
        goto err;
    BN_CTX_start(ctx);
    f = BN_CTX_get(ctx);
    ret = BN_CTX_get(ctx);
    num = BN_num_bytes(rsa->n);
    buf = OPENSSL_malloc(num);
99
    if (ret == NULL || buf == NULL) {
R
Rich Salz 已提交
100
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT, ERR_R_MALLOC_FAILURE);
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
        goto err;
    }

    switch (padding) {
    case RSA_PKCS1_PADDING:
        i = RSA_padding_add_PKCS1_type_2(buf, num, from, flen);
        break;
    case RSA_PKCS1_OAEP_PADDING:
        i = RSA_padding_add_PKCS1_OAEP(buf, num, from, flen, NULL, 0);
        break;
    case RSA_SSLV23_PADDING:
        i = RSA_padding_add_SSLv23(buf, num, from, flen);
        break;
    case RSA_NO_PADDING:
        i = RSA_padding_add_none(buf, num, from, flen);
        break;
    default:
R
Rich Salz 已提交
118
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
119 120 121 122 123 124 125 126 127 128
        goto err;
    }
    if (i <= 0)
        goto err;

    if (BN_bin2bn(buf, num, f) == NULL)
        goto err;

    if (BN_ucmp(f, rsa->n) >= 0) {
        /* usually the padding functions would catch this */
R
Rich Salz 已提交
129
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_ENCRYPT,
130 131 132 133 134 135
               RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
        goto err;
    }

    if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
        if (!BN_MONT_CTX_set_locked
136
            (&rsa->_method_mod_n, rsa->lock, rsa->n, ctx))
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
            goto err;

    if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
                               rsa->_method_mod_n))
        goto err;

    /*
     * put in leading 0 bytes if the number is less than the length of the
     * modulus
     */
    j = BN_num_bytes(ret);
    i = BN_bn2bin(ret, &(to[num - j]));
    for (k = 0; k < (num - i); k++)
        to[k] = 0;

    r = num;
 err:
R
Rich Salz 已提交
154
    if (ctx != NULL)
155
        BN_CTX_end(ctx);
R
Rich Salz 已提交
156
    BN_CTX_free(ctx);
R
Rich Salz 已提交
157
    OPENSSL_clear_free(buf, num);
158
    return r;
159
}
160

B
Bodo Möller 已提交
161
static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx)
162
{
163 164
    BN_BLINDING *ret;

165
    CRYPTO_THREAD_write_lock(rsa->lock);
166 167

    if (rsa->blinding == NULL) {
168
        rsa->blinding = RSA_setup_blinding(rsa, ctx);
169 170 171 172 173 174
    }

    ret = rsa->blinding;
    if (ret == NULL)
        goto err;

175
    if (BN_BLINDING_is_current_thread(ret)) {
176 177 178 179 180 181 182 183 184 185 186 187 188 189
        /* rsa->blinding is ours! */

        *local = 1;
    } else {
        /* resort to rsa->mt_blinding instead */

        /*
         * instructs rsa_blinding_convert(), rsa_blinding_invert() that the
         * BN_BLINDING is shared, meaning that accesses require locks, and
         * that the blinding factor must be stored outside the BN_BLINDING
         */
        *local = 0;

        if (rsa->mt_blinding == NULL) {
190
            rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
191 192 193
        }
        ret = rsa->mt_blinding;
    }
B
Bodo Möller 已提交
194

B
Bodo Möller 已提交
195
 err:
196
    CRYPTO_THREAD_unlock(rsa->lock);
197
    return ret;
198
}
B
Bodo Möller 已提交
199

B
Bodo Möller 已提交
200
static int rsa_blinding_convert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
201 202 203 204 205 206 207 208 209 210 211 212
                                BN_CTX *ctx)
{
    if (unblind == NULL)
        /*
         * Local blinding: store the unblinding factor in BN_BLINDING.
         */
        return BN_BLINDING_convert_ex(f, NULL, b, ctx);
    else {
        /*
         * Shared blinding: store the unblinding factor outside BN_BLINDING.
         */
        int ret;
213 214

        BN_BLINDING_lock(b);
215
        ret = BN_BLINDING_convert_ex(f, unblind, b, ctx);
216 217
        BN_BLINDING_unlock(b);

218 219 220
        return ret;
    }
}
B
Bodo Möller 已提交
221 222

static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
223 224 225 226 227 228 229 230 231 232 233 234
                               BN_CTX *ctx)
{
    /*
     * For local blinding, unblind is set to NULL, and BN_BLINDING_invert_ex
     * will use the unblinding factor stored in BN_BLINDING. If BN_BLINDING
     * is shared between threads, unblind must be non-null:
     * BN_BLINDING_invert_ex will then use the local unblinding factor, and
     * will only read the modulus from BN_BLINDING. In both cases it's safe
     * to access the blinding without a lock.
     */
    return BN_BLINDING_invert_ex(f, unblind, b, ctx);
}
B
Bodo Möller 已提交
235

B
Bodo Möller 已提交
236
/* signing */
R
Rich Salz 已提交
237
static int rsa_ossl_private_encrypt(int flen, const unsigned char *from,
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
                                   unsigned char *to, RSA *rsa, int padding)
{
    BIGNUM *f, *ret, *res;
    int i, j, k, num = 0, r = -1;
    unsigned char *buf = NULL;
    BN_CTX *ctx = NULL;
    int local_blinding = 0;
    /*
     * Used only if the blinding structure is shared. A non-NULL unblind
     * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
     * the unblinding factor outside the blinding structure.
     */
    BIGNUM *unblind = NULL;
    BN_BLINDING *blinding = NULL;

    if ((ctx = BN_CTX_new()) == NULL)
        goto err;
    BN_CTX_start(ctx);
    f = BN_CTX_get(ctx);
    ret = BN_CTX_get(ctx);
    num = BN_num_bytes(rsa->n);
    buf = OPENSSL_malloc(num);
260
    if (ret == NULL || buf == NULL) {
R
Rich Salz 已提交
261
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
        goto err;
    }

    switch (padding) {
    case RSA_PKCS1_PADDING:
        i = RSA_padding_add_PKCS1_type_1(buf, num, from, flen);
        break;
    case RSA_X931_PADDING:
        i = RSA_padding_add_X931(buf, num, from, flen);
        break;
    case RSA_NO_PADDING:
        i = RSA_padding_add_none(buf, num, from, flen);
        break;
    case RSA_SSLV23_PADDING:
    default:
R
Rich Salz 已提交
277
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
278 279 280 281 282 283 284 285 286 287
        goto err;
    }
    if (i <= 0)
        goto err;

    if (BN_bin2bn(buf, num, f) == NULL)
        goto err;

    if (BN_ucmp(f, rsa->n) >= 0) {
        /* usually the padding functions would catch this */
R
Rich Salz 已提交
288
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT,
289 290 291 292 293 294 295
               RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
        goto err;
    }

    if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
        blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
        if (blinding == NULL) {
R
Rich Salz 已提交
296
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
297 298 299 300 301 302
            goto err;
        }
    }

    if (blinding != NULL) {
        if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
R
Rich Salz 已提交
303
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
304 305 306 307 308 309 310 311 312 313 314 315 316
            goto err;
        }
        if (!rsa_blinding_convert(blinding, f, unblind, ctx))
            goto err;
    }

    if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
        ((rsa->p != NULL) &&
         (rsa->q != NULL) &&
         (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
        if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
            goto err;
    } else {
317 318 319 320
        BIGNUM *d = BN_new();
        if (d == NULL) {
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
            goto err;
321
        }
322
        BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
323 324 325

        if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
            if (!BN_MONT_CTX_set_locked
326
                (&rsa->_method_mod_n, rsa->lock, rsa->n, ctx)) {
327
                BN_free(d);
328 329 330 331 332
                goto err;
            }

        if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
                                   rsa->_method_mod_n)) {
333
            BN_free(d);
334 335
            goto err;
        }
336 337
        /* We MUST free d before any further use of rsa->d */
        BN_free(d);
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
    }

    if (blinding)
        if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
            goto err;

    if (padding == RSA_X931_PADDING) {
        BN_sub(f, rsa->n, ret);
        if (BN_cmp(ret, f) > 0)
            res = f;
        else
            res = ret;
    } else
        res = ret;

    /*
     * put in leading 0 bytes if the number is less than the length of the
     * modulus
     */
    j = BN_num_bytes(res);
    i = BN_bn2bin(res, &(to[num - j]));
    for (k = 0; k < (num - i); k++)
        to[k] = 0;

    r = num;
 err:
R
Rich Salz 已提交
364
    if (ctx != NULL)
365
        BN_CTX_end(ctx);
R
Rich Salz 已提交
366
    BN_CTX_free(ctx);
R
Rich Salz 已提交
367
    OPENSSL_clear_free(buf, num);
368
    return r;
369
}
370

R
Rich Salz 已提交
371
static int rsa_ossl_private_decrypt(int flen, const unsigned char *from,
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
                                   unsigned char *to, RSA *rsa, int padding)
{
    BIGNUM *f, *ret;
    int j, num = 0, r = -1;
    unsigned char *p;
    unsigned char *buf = NULL;
    BN_CTX *ctx = NULL;
    int local_blinding = 0;
    /*
     * Used only if the blinding structure is shared. A non-NULL unblind
     * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
     * the unblinding factor outside the blinding structure.
     */
    BIGNUM *unblind = NULL;
    BN_BLINDING *blinding = NULL;

    if ((ctx = BN_CTX_new()) == NULL)
        goto err;
    BN_CTX_start(ctx);
    f = BN_CTX_get(ctx);
    ret = BN_CTX_get(ctx);
    num = BN_num_bytes(rsa->n);
    buf = OPENSSL_malloc(num);
395
    if (ret == NULL || buf == NULL) {
R
Rich Salz 已提交
396
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
397 398 399 400 401 402 403 404
        goto err;
    }

    /*
     * This check was for equality but PGP does evil things and chops off the
     * top '0' bytes
     */
    if (flen > num) {
R
Rich Salz 已提交
405
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT,
406 407 408 409 410 411 412 413 414
               RSA_R_DATA_GREATER_THAN_MOD_LEN);
        goto err;
    }

    /* make data into a big number */
    if (BN_bin2bn(from, (int)flen, f) == NULL)
        goto err;

    if (BN_ucmp(f, rsa->n) >= 0) {
R
Rich Salz 已提交
415
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT,
416 417 418 419 420 421 422
               RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
        goto err;
    }

    if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
        blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
        if (blinding == NULL) {
R
Rich Salz 已提交
423
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
424 425 426 427 428 429
            goto err;
        }
    }

    if (blinding != NULL) {
        if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
R
Rich Salz 已提交
430
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
431 432 433 434 435 436 437 438 439 440 441 442 443 444
            goto err;
        }
        if (!rsa_blinding_convert(blinding, f, unblind, ctx))
            goto err;
    }

    /* do the decrypt */
    if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
        ((rsa->p != NULL) &&
         (rsa->q != NULL) &&
         (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
        if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
            goto err;
    } else {
445 446 447 448
        BIGNUM *d = BN_new();
        if (d == NULL) {
            RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
            goto err;
449
        }
450
        BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
451 452 453

        if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
            if (!BN_MONT_CTX_set_locked
454
                (&rsa->_method_mod_n, rsa->lock, rsa->n, ctx)) {
455
                BN_free(d);
456 457 458 459
                goto err;
            }
        if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
                                   rsa->_method_mod_n)) {
460
            BN_free(d);
461 462
            goto err;
        }
463 464
        /* We MUST free d before any further use of rsa->d */
        BN_free(d);
465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
    }

    if (blinding)
        if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
            goto err;

    p = buf;
    j = BN_bn2bin(ret, p);      /* j is only used with no-padding mode */

    switch (padding) {
    case RSA_PKCS1_PADDING:
        r = RSA_padding_check_PKCS1_type_2(to, num, buf, j, num);
        break;
    case RSA_PKCS1_OAEP_PADDING:
        r = RSA_padding_check_PKCS1_OAEP(to, num, buf, j, num, NULL, 0);
        break;
    case RSA_SSLV23_PADDING:
        r = RSA_padding_check_SSLv23(to, num, buf, j, num);
        break;
    case RSA_NO_PADDING:
        r = RSA_padding_check_none(to, num, buf, j, num);
        break;
    default:
R
Rich Salz 已提交
488
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
489 490 491
        goto err;
    }
    if (r < 0)
R
Rich Salz 已提交
492
        RSAerr(RSA_F_RSA_OSSL_PRIVATE_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
493 494

 err:
R
Rich Salz 已提交
495
    if (ctx != NULL)
496
        BN_CTX_end(ctx);
R
Rich Salz 已提交
497
    BN_CTX_free(ctx);
R
Rich Salz 已提交
498
    OPENSSL_clear_free(buf, num);
499
    return r;
500
}
501

B
Bodo Möller 已提交
502
/* signature verification */
R
Rich Salz 已提交
503
static int rsa_ossl_public_decrypt(int flen, const unsigned char *from,
504 505 506 507 508 509 510 511 512
                                  unsigned char *to, RSA *rsa, int padding)
{
    BIGNUM *f, *ret;
    int i, num = 0, r = -1;
    unsigned char *p;
    unsigned char *buf = NULL;
    BN_CTX *ctx = NULL;

    if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
R
Rich Salz 已提交
513
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
514 515 516 517
        return -1;
    }

    if (BN_ucmp(rsa->n, rsa->e) <= 0) {
R
Rich Salz 已提交
518
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
519 520 521 522 523 524
        return -1;
    }

    /* for large moduli, enforce exponent limit */
    if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
        if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
R
Rich Salz 已提交
525
            RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
526 527 528 529 530 531 532 533 534 535 536
            return -1;
        }
    }

    if ((ctx = BN_CTX_new()) == NULL)
        goto err;
    BN_CTX_start(ctx);
    f = BN_CTX_get(ctx);
    ret = BN_CTX_get(ctx);
    num = BN_num_bytes(rsa->n);
    buf = OPENSSL_malloc(num);
537
    if (ret == NULL || buf == NULL) {
R
Rich Salz 已提交
538
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, ERR_R_MALLOC_FAILURE);
539 540 541 542 543 544 545 546
        goto err;
    }

    /*
     * This check was for equality but PGP does evil things and chops off the
     * top '0' bytes
     */
    if (flen > num) {
R
Rich Salz 已提交
547
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_DATA_GREATER_THAN_MOD_LEN);
548 549 550 551 552 553 554
        goto err;
    }

    if (BN_bin2bn(from, flen, f) == NULL)
        goto err;

    if (BN_ucmp(f, rsa->n) >= 0) {
R
Rich Salz 已提交
555
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT,
556 557 558 559 560 561
               RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
        goto err;
    }

    if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
        if (!BN_MONT_CTX_set_locked
562
            (&rsa->_method_mod_n, rsa->lock, rsa->n, ctx))
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
            goto err;

    if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
                               rsa->_method_mod_n))
        goto err;

    if ((padding == RSA_X931_PADDING) && ((bn_get_words(ret)[0] & 0xf) != 12))
        if (!BN_sub(ret, rsa->n, ret))
            goto err;

    p = buf;
    i = BN_bn2bin(ret, p);

    switch (padding) {
    case RSA_PKCS1_PADDING:
        r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
        break;
    case RSA_X931_PADDING:
        r = RSA_padding_check_X931(to, num, buf, i, num);
        break;
    case RSA_NO_PADDING:
        r = RSA_padding_check_none(to, num, buf, i, num);
        break;
    default:
R
Rich Salz 已提交
587
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
588 589 590
        goto err;
    }
    if (r < 0)
R
Rich Salz 已提交
591
        RSAerr(RSA_F_RSA_OSSL_PUBLIC_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
592 593

 err:
R
Rich Salz 已提交
594
    if (ctx != NULL)
595
        BN_CTX_end(ctx);
R
Rich Salz 已提交
596
    BN_CTX_free(ctx);
R
Rich Salz 已提交
597
    OPENSSL_clear_free(buf, num);
598
    return r;
599
}
600

R
Rich Salz 已提交
601
static int rsa_ossl_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
602 603 604 605
{
    BIGNUM *r1, *m1, *vrfy;
    int ret = 0;

606 607
    BN_CTX_start(ctx);

608 609 610
    r1 = BN_CTX_get(ctx);
    m1 = BN_CTX_get(ctx);
    vrfy = BN_CTX_get(ctx);
611 612
    if (vrfy == NULL)
        goto err;
613 614

    {
615
        BIGNUM *p = BN_new(), *q = BN_new();
616 617

        /*
F
FdaSilvaYY 已提交
618
         * Make sure BN_mod_inverse in Montgomery initialization uses the
619
         * BN_FLG_CONSTTIME flag
620
         */
621 622 623 624
        if (p == NULL || q == NULL) {
            BN_free(p);
            BN_free(q);
            goto err;
625
        }
626 627
        BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
        BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME);
628 629 630

        if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) {
            if (!BN_MONT_CTX_set_locked
631
                (&rsa->_method_mod_p, rsa->lock, p, ctx)
632
                || !BN_MONT_CTX_set_locked(&rsa->_method_mod_q,
633
                                           rsa->lock, q, ctx)) {
634 635
                BN_free(p);
                BN_free(q);
636 637 638
                goto err;
            }
        }
639
        /*
640
         * We MUST free p and q before any further use of rsa->p and rsa->q
641
         */
642 643
        BN_free(p);
        BN_free(q);
644 645 646 647
    }

    if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
        if (!BN_MONT_CTX_set_locked
648
            (&rsa->_method_mod_n, rsa->lock, rsa->n, ctx))
649 650 651
            goto err;

    /* compute I mod q */
652
    {
653 654 655 656 657
        BIGNUM *c = BN_new();
        if (c == NULL)
            goto err;
        BN_with_flags(c, I, BN_FLG_CONSTTIME);

658
        if (!BN_mod(r1, c, rsa->q, ctx)) {
659
            BN_free(c);
660
            goto err;
661
        }
662

663
        {
664 665 666 667
            BIGNUM *dmq1 = BN_new();
            if (dmq1 == NULL) {
                BN_free(c);
                goto err;
668
            }
669 670 671
            BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME);

            /* compute r1^dmq1 mod q */
672 673
            if (!rsa->meth->bn_mod_exp(m1, r1, dmq1, rsa->q, ctx,
                rsa->_method_mod_q)) {
674 675
                BN_free(c);
                BN_free(dmq1);
676 677
                goto err;
            }
678 679
            /* We MUST free dmq1 before any further use of rsa->dmq1 */
            BN_free(dmq1);
680
        }
681

682 683
        /* compute I mod p */
        if (!BN_mod(r1, c, rsa->p, ctx)) {
684
            BN_free(c);
685
            goto err;
686
        }
687 688
        /* We MUST free c before any further use of I */
        BN_free(c);
689 690
    }

691
    {
692 693 694 695 696
        BIGNUM *dmp1 = BN_new();
        if (dmp1 == NULL)
            goto err;
        BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME);

697 698 699
        /* compute r1^dmp1 mod p */
        if (!rsa->meth->bn_mod_exp(r0, r1, dmp1, rsa->p, ctx,
                                   rsa->_method_mod_p)) {
700
            BN_free(dmp1);
701 702
            goto err;
        }
703 704
        /* We MUST free dmp1 before any further use of rsa->dmp1 */
        BN_free(dmp1);
705
    }
706 707 708 709 710 711 712 713 714 715 716 717 718 719

    if (!BN_sub(r0, r0, m1))
        goto err;
    /*
     * This will help stop the size of r0 increasing, which does affect the
     * multiply if it optimised for a power of 2 size
     */
    if (BN_is_negative(r0))
        if (!BN_add(r0, r0, rsa->p))
            goto err;

    if (!BN_mul(r1, r0, rsa->iqmp, ctx))
        goto err;

720
    {
721 722 723 724 725
        BIGNUM *pr1 = BN_new();
        if (pr1 == NULL)
            goto err;
        BN_with_flags(pr1, r1, BN_FLG_CONSTTIME);

726
        if (!BN_mod(r0, pr1, rsa->p, ctx)) {
727
            BN_free(pr1);
728 729
            goto err;
        }
730 731
        /* We MUST free pr1 before any further use of r1 */
        BN_free(pr1);
732
    }
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749

    /*
     * If p < q it is occasionally possible for the correction of adding 'p'
     * if r0 is negative above to leave the result still negative. This can
     * break the private key operations: the following second correction
     * should *always* correct this rare occurrence. This will *never* happen
     * with OpenSSL generated keys because they ensure p > q [steve]
     */
    if (BN_is_negative(r0))
        if (!BN_add(r0, r0, rsa->p))
            goto err;
    if (!BN_mul(r1, r0, rsa->q, ctx))
        goto err;
    if (!BN_add(r0, r1, m1))
        goto err;

    if (rsa->e && rsa->n) {
750 751
        if (!rsa->meth->bn_mod_exp(vrfy, r0, rsa->e, rsa->n, ctx,
                                   rsa->_method_mod_n))
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
            goto err;
        /*
         * If 'I' was greater than (or equal to) rsa->n, the operation will
         * be equivalent to using 'I mod n'. However, the result of the
         * verify will *always* be less than 'n' so we don't check for
         * absolute equality, just congruency.
         */
        if (!BN_sub(vrfy, vrfy, I))
            goto err;
        if (!BN_mod(vrfy, vrfy, rsa->n, ctx))
            goto err;
        if (BN_is_negative(vrfy))
            if (!BN_add(vrfy, vrfy, rsa->n))
                goto err;
        if (!BN_is_zero(vrfy)) {
            /*
             * 'I' and 'vrfy' aren't congruent mod n. Don't leak
             * miscalculated CRT output, just do a raw (slower) mod_exp and
             * return that instead.
             */

773 774 775 776
            BIGNUM *d = BN_new();
            if (d == NULL)
                goto err;
            BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
777 778 779

            if (!rsa->meth->bn_mod_exp(r0, I, d, rsa->n, ctx,
                                       rsa->_method_mod_n)) {
780
                BN_free(d);
781 782
                goto err;
            }
783 784
            /* We MUST free d before any further use of rsa->d */
            BN_free(d);
785 786 787 788 789
        }
    }
    ret = 1;
 err:
    BN_CTX_end(ctx);
790
    return ret;
791
}
792

R
Rich Salz 已提交
793
static int rsa_ossl_init(RSA *rsa)
794 795
{
    rsa->flags |= RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
796
    return 1;
797
}
798

R
Rich Salz 已提交
799
static int rsa_ossl_finish(RSA *rsa)
800
{
R
Rich Salz 已提交
801 802 803
    BN_MONT_CTX_free(rsa->_method_mod_n);
    BN_MONT_CTX_free(rsa->_method_mod_p);
    BN_MONT_CTX_free(rsa->_method_mod_q);
804
    return 1;
805
}