diff options
| author | djm <> | 2012-10-13 21:23:50 +0000 |
|---|---|---|
| committer | djm <> | 2012-10-13 21:23:50 +0000 |
| commit | d56dbc3c72494d4b68c03f5bcc3ae1f9df7b17df (patch) | |
| tree | 10ebe51c3542099b0ab8325d8f322372375dc3b4 /src/lib/libcrypto/rsa/rsa_pmeth.c | |
| parent | bc685bd401e5657f7fb51b4e1a62a7a5c5ea4098 (diff) | |
| parent | 228cae30b117c2493f69ad3c195341cd6ec8d430 (diff) | |
| download | openbsd-d56dbc3c72494d4b68c03f5bcc3ae1f9df7b17df.tar.gz openbsd-d56dbc3c72494d4b68c03f5bcc3ae1f9df7b17df.tar.bz2 openbsd-d56dbc3c72494d4b68c03f5bcc3ae1f9df7b17df.zip | |
This commit was generated by cvs2git to track changes on a CVS vendor
branch.
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_pmeth.c')
| -rw-r--r-- | src/lib/libcrypto/rsa/rsa_pmeth.c | 154 |
1 files changed, 145 insertions, 9 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_pmeth.c b/src/lib/libcrypto/rsa/rsa_pmeth.c index c6892ecd09..5b2ecf56ad 100644 --- a/src/lib/libcrypto/rsa/rsa_pmeth.c +++ b/src/lib/libcrypto/rsa/rsa_pmeth.c | |||
| @@ -63,6 +63,12 @@ | |||
| 63 | #include <openssl/rsa.h> | 63 | #include <openssl/rsa.h> |
| 64 | #include <openssl/bn.h> | 64 | #include <openssl/bn.h> |
| 65 | #include <openssl/evp.h> | 65 | #include <openssl/evp.h> |
| 66 | #ifndef OPENSSL_NO_CMS | ||
| 67 | #include <openssl/cms.h> | ||
| 68 | #endif | ||
| 69 | #ifdef OPENSSL_FIPS | ||
| 70 | #include <openssl/fips.h> | ||
| 71 | #endif | ||
| 66 | #include "evp_locl.h" | 72 | #include "evp_locl.h" |
| 67 | #include "rsa_locl.h" | 73 | #include "rsa_locl.h" |
| 68 | 74 | ||
| @@ -79,6 +85,8 @@ typedef struct | |||
| 79 | int pad_mode; | 85 | int pad_mode; |
| 80 | /* message digest */ | 86 | /* message digest */ |
| 81 | const EVP_MD *md; | 87 | const EVP_MD *md; |
| 88 | /* message digest for MGF1 */ | ||
| 89 | const EVP_MD *mgf1md; | ||
| 82 | /* PSS/OAEP salt length */ | 90 | /* PSS/OAEP salt length */ |
| 83 | int saltlen; | 91 | int saltlen; |
| 84 | /* Temp buffer */ | 92 | /* Temp buffer */ |
| @@ -95,6 +103,7 @@ static int pkey_rsa_init(EVP_PKEY_CTX *ctx) | |||
| 95 | rctx->pub_exp = NULL; | 103 | rctx->pub_exp = NULL; |
| 96 | rctx->pad_mode = RSA_PKCS1_PADDING; | 104 | rctx->pad_mode = RSA_PKCS1_PADDING; |
| 97 | rctx->md = NULL; | 105 | rctx->md = NULL; |
| 106 | rctx->mgf1md = NULL; | ||
| 98 | rctx->tbuf = NULL; | 107 | rctx->tbuf = NULL; |
| 99 | 108 | ||
| 100 | rctx->saltlen = -2; | 109 | rctx->saltlen = -2; |
| @@ -147,6 +156,31 @@ static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx) | |||
| 147 | OPENSSL_free(rctx); | 156 | OPENSSL_free(rctx); |
| 148 | } | 157 | } |
| 149 | } | 158 | } |
| 159 | #ifdef OPENSSL_FIPS | ||
| 160 | /* FIP checker. Return value indicates status of context parameters: | ||
| 161 | * 1 : redirect to FIPS. | ||
| 162 | * 0 : don't redirect to FIPS. | ||
| 163 | * -1 : illegal operation in FIPS mode. | ||
| 164 | */ | ||
| 165 | |||
| 166 | static int pkey_fips_check_ctx(EVP_PKEY_CTX *ctx) | ||
| 167 | { | ||
| 168 | RSA_PKEY_CTX *rctx = ctx->data; | ||
| 169 | RSA *rsa = ctx->pkey->pkey.rsa; | ||
| 170 | int rv = -1; | ||
| 171 | if (!FIPS_mode()) | ||
| 172 | return 0; | ||
| 173 | if (rsa->flags & RSA_FLAG_NON_FIPS_ALLOW) | ||
| 174 | rv = 0; | ||
| 175 | if (!(rsa->meth->flags & RSA_FLAG_FIPS_METHOD) && rv) | ||
| 176 | return -1; | ||
| 177 | if (rctx->md && !(rctx->md->flags & EVP_MD_FLAG_FIPS)) | ||
| 178 | return rv; | ||
| 179 | if (rctx->mgf1md && !(rctx->mgf1md->flags & EVP_MD_FLAG_FIPS)) | ||
| 180 | return rv; | ||
| 181 | return 1; | ||
| 182 | } | ||
| 183 | #endif | ||
| 150 | 184 | ||
| 151 | static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | 185 | static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, |
| 152 | const unsigned char *tbs, size_t tbslen) | 186 | const unsigned char *tbs, size_t tbslen) |
| @@ -155,6 +189,15 @@ static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | |||
| 155 | RSA_PKEY_CTX *rctx = ctx->data; | 189 | RSA_PKEY_CTX *rctx = ctx->data; |
| 156 | RSA *rsa = ctx->pkey->pkey.rsa; | 190 | RSA *rsa = ctx->pkey->pkey.rsa; |
| 157 | 191 | ||
| 192 | #ifdef OPENSSL_FIPS | ||
| 193 | ret = pkey_fips_check_ctx(ctx); | ||
| 194 | if (ret < 0) | ||
| 195 | { | ||
| 196 | RSAerr(RSA_F_PKEY_RSA_SIGN, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 197 | return -1; | ||
| 198 | } | ||
| 199 | #endif | ||
| 200 | |||
| 158 | if (rctx->md) | 201 | if (rctx->md) |
| 159 | { | 202 | { |
| 160 | if (tbslen != (size_t)EVP_MD_size(rctx->md)) | 203 | if (tbslen != (size_t)EVP_MD_size(rctx->md)) |
| @@ -163,7 +206,36 @@ static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | |||
| 163 | RSA_R_INVALID_DIGEST_LENGTH); | 206 | RSA_R_INVALID_DIGEST_LENGTH); |
| 164 | return -1; | 207 | return -1; |
| 165 | } | 208 | } |
| 166 | if (rctx->pad_mode == RSA_X931_PADDING) | 209 | #ifdef OPENSSL_FIPS |
| 210 | if (ret > 0) | ||
| 211 | { | ||
| 212 | unsigned int slen; | ||
| 213 | ret = FIPS_rsa_sign_digest(rsa, tbs, tbslen, rctx->md, | ||
| 214 | rctx->pad_mode, | ||
| 215 | rctx->saltlen, | ||
| 216 | rctx->mgf1md, | ||
| 217 | sig, &slen); | ||
| 218 | if (ret > 0) | ||
| 219 | *siglen = slen; | ||
| 220 | else | ||
| 221 | *siglen = 0; | ||
| 222 | return ret; | ||
| 223 | } | ||
| 224 | #endif | ||
| 225 | |||
| 226 | if (EVP_MD_type(rctx->md) == NID_mdc2) | ||
| 227 | { | ||
| 228 | unsigned int sltmp; | ||
| 229 | if (rctx->pad_mode != RSA_PKCS1_PADDING) | ||
| 230 | return -1; | ||
| 231 | ret = RSA_sign_ASN1_OCTET_STRING(NID_mdc2, | ||
| 232 | tbs, tbslen, sig, &sltmp, rsa); | ||
| 233 | |||
| 234 | if (ret <= 0) | ||
| 235 | return ret; | ||
| 236 | ret = sltmp; | ||
| 237 | } | ||
| 238 | else if (rctx->pad_mode == RSA_X931_PADDING) | ||
| 167 | { | 239 | { |
| 168 | if (!setup_tbuf(rctx, ctx)) | 240 | if (!setup_tbuf(rctx, ctx)) |
| 169 | return -1; | 241 | return -1; |
| @@ -186,8 +258,10 @@ static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | |||
| 186 | { | 258 | { |
| 187 | if (!setup_tbuf(rctx, ctx)) | 259 | if (!setup_tbuf(rctx, ctx)) |
| 188 | return -1; | 260 | return -1; |
| 189 | if (!RSA_padding_add_PKCS1_PSS(rsa, rctx->tbuf, tbs, | 261 | if (!RSA_padding_add_PKCS1_PSS_mgf1(rsa, |
| 190 | rctx->md, rctx->saltlen)) | 262 | rctx->tbuf, tbs, |
| 263 | rctx->md, rctx->mgf1md, | ||
| 264 | rctx->saltlen)) | ||
| 191 | return -1; | 265 | return -1; |
| 192 | ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf, | 266 | ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf, |
| 193 | sig, rsa, RSA_NO_PADDING); | 267 | sig, rsa, RSA_NO_PADDING); |
| @@ -269,8 +343,30 @@ static int pkey_rsa_verify(EVP_PKEY_CTX *ctx, | |||
| 269 | RSA_PKEY_CTX *rctx = ctx->data; | 343 | RSA_PKEY_CTX *rctx = ctx->data; |
| 270 | RSA *rsa = ctx->pkey->pkey.rsa; | 344 | RSA *rsa = ctx->pkey->pkey.rsa; |
| 271 | size_t rslen; | 345 | size_t rslen; |
| 346 | #ifdef OPENSSL_FIPS | ||
| 347 | int rv; | ||
| 348 | rv = pkey_fips_check_ctx(ctx); | ||
| 349 | if (rv < 0) | ||
| 350 | { | ||
| 351 | RSAerr(RSA_F_PKEY_RSA_VERIFY, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 352 | return -1; | ||
| 353 | } | ||
| 354 | #endif | ||
| 272 | if (rctx->md) | 355 | if (rctx->md) |
| 273 | { | 356 | { |
| 357 | #ifdef OPENSSL_FIPS | ||
| 358 | if (rv > 0) | ||
| 359 | { | ||
| 360 | return FIPS_rsa_verify_digest(rsa, | ||
| 361 | tbs, tbslen, | ||
| 362 | rctx->md, | ||
| 363 | rctx->pad_mode, | ||
| 364 | rctx->saltlen, | ||
| 365 | rctx->mgf1md, | ||
| 366 | sig, siglen); | ||
| 367 | |||
| 368 | } | ||
| 369 | #endif | ||
| 274 | if (rctx->pad_mode == RSA_PKCS1_PADDING) | 370 | if (rctx->pad_mode == RSA_PKCS1_PADDING) |
| 275 | return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen, | 371 | return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen, |
| 276 | sig, siglen, rsa); | 372 | sig, siglen, rsa); |
| @@ -289,7 +385,8 @@ static int pkey_rsa_verify(EVP_PKEY_CTX *ctx, | |||
| 289 | rsa, RSA_NO_PADDING); | 385 | rsa, RSA_NO_PADDING); |
| 290 | if (ret <= 0) | 386 | if (ret <= 0) |
| 291 | return 0; | 387 | return 0; |
| 292 | ret = RSA_verify_PKCS1_PSS(rsa, tbs, rctx->md, | 388 | ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs, |
| 389 | rctx->md, rctx->mgf1md, | ||
| 293 | rctx->tbuf, rctx->saltlen); | 390 | rctx->tbuf, rctx->saltlen); |
| 294 | if (ret <= 0) | 391 | if (ret <= 0) |
| 295 | return 0; | 392 | return 0; |
| @@ -403,15 +500,25 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) | |||
| 403 | RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); | 500 | RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); |
| 404 | return -2; | 501 | return -2; |
| 405 | 502 | ||
| 503 | case EVP_PKEY_CTRL_GET_RSA_PADDING: | ||
| 504 | *(int *)p2 = rctx->pad_mode; | ||
| 505 | return 1; | ||
| 506 | |||
| 406 | case EVP_PKEY_CTRL_RSA_PSS_SALTLEN: | 507 | case EVP_PKEY_CTRL_RSA_PSS_SALTLEN: |
| 407 | if (p1 < -2) | 508 | case EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN: |
| 408 | return -2; | ||
| 409 | if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) | 509 | if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) |
| 410 | { | 510 | { |
| 411 | RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN); | 511 | RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN); |
| 412 | return -2; | 512 | return -2; |
| 413 | } | 513 | } |
| 414 | rctx->saltlen = p1; | 514 | if (type == EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN) |
| 515 | *(int *)p2 = rctx->saltlen; | ||
| 516 | else | ||
| 517 | { | ||
| 518 | if (p1 < -2) | ||
| 519 | return -2; | ||
| 520 | rctx->saltlen = p1; | ||
| 521 | } | ||
| 415 | return 1; | 522 | return 1; |
| 416 | 523 | ||
| 417 | case EVP_PKEY_CTRL_RSA_KEYGEN_BITS: | 524 | case EVP_PKEY_CTRL_RSA_KEYGEN_BITS: |
| @@ -435,16 +542,45 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) | |||
| 435 | rctx->md = p2; | 542 | rctx->md = p2; |
| 436 | return 1; | 543 | return 1; |
| 437 | 544 | ||
| 545 | case EVP_PKEY_CTRL_RSA_MGF1_MD: | ||
| 546 | case EVP_PKEY_CTRL_GET_RSA_MGF1_MD: | ||
| 547 | if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) | ||
| 548 | { | ||
| 549 | RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_MGF1_MD); | ||
| 550 | return -2; | ||
| 551 | } | ||
| 552 | if (type == EVP_PKEY_CTRL_GET_RSA_MGF1_MD) | ||
| 553 | { | ||
| 554 | if (rctx->mgf1md) | ||
| 555 | *(const EVP_MD **)p2 = rctx->mgf1md; | ||
| 556 | else | ||
| 557 | *(const EVP_MD **)p2 = rctx->md; | ||
| 558 | } | ||
| 559 | else | ||
| 560 | rctx->mgf1md = p2; | ||
| 561 | return 1; | ||
| 562 | |||
| 438 | case EVP_PKEY_CTRL_DIGESTINIT: | 563 | case EVP_PKEY_CTRL_DIGESTINIT: |
| 439 | case EVP_PKEY_CTRL_PKCS7_ENCRYPT: | 564 | case EVP_PKEY_CTRL_PKCS7_ENCRYPT: |
| 440 | case EVP_PKEY_CTRL_PKCS7_DECRYPT: | 565 | case EVP_PKEY_CTRL_PKCS7_DECRYPT: |
| 441 | case EVP_PKEY_CTRL_PKCS7_SIGN: | 566 | case EVP_PKEY_CTRL_PKCS7_SIGN: |
| 567 | return 1; | ||
| 442 | #ifndef OPENSSL_NO_CMS | 568 | #ifndef OPENSSL_NO_CMS |
| 443 | case EVP_PKEY_CTRL_CMS_ENCRYPT: | ||
| 444 | case EVP_PKEY_CTRL_CMS_DECRYPT: | 569 | case EVP_PKEY_CTRL_CMS_DECRYPT: |
| 570 | { | ||
| 571 | X509_ALGOR *alg = NULL; | ||
| 572 | ASN1_OBJECT *encalg = NULL; | ||
| 573 | if (p2) | ||
| 574 | CMS_RecipientInfo_ktri_get0_algs(p2, NULL, NULL, &alg); | ||
| 575 | if (alg) | ||
| 576 | X509_ALGOR_get0(&encalg, NULL, NULL, alg); | ||
| 577 | if (encalg && OBJ_obj2nid(encalg) == NID_rsaesOaep) | ||
| 578 | rctx->pad_mode = RSA_PKCS1_OAEP_PADDING; | ||
| 579 | } | ||
| 580 | case EVP_PKEY_CTRL_CMS_ENCRYPT: | ||
| 445 | case EVP_PKEY_CTRL_CMS_SIGN: | 581 | case EVP_PKEY_CTRL_CMS_SIGN: |
| 446 | #endif | ||
| 447 | return 1; | 582 | return 1; |
| 583 | #endif | ||
| 448 | case EVP_PKEY_CTRL_PEER_KEY: | 584 | case EVP_PKEY_CTRL_PEER_KEY: |
| 449 | RSAerr(RSA_F_PKEY_RSA_CTRL, | 585 | RSAerr(RSA_F_PKEY_RSA_CTRL, |
| 450 | RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); | 586 | RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); |
