| OLD | NEW |
| 1 /* crypto/cms/cms_smime.c */ | 1 /* crypto/cms/cms_smime.c */ |
| 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 * project. | 3 * project. |
| 4 */ | 4 */ |
| 5 /* ==================================================================== | 5 /* ==================================================================== |
| 6 * Copyright (c) 2008 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2008 The OpenSSL Project. All rights reserved. |
| 7 * | 7 * |
| 8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
| 9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
| 10 * are met: | 10 * are met: |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 return r; | 164 return r; |
| 165 } | 165 } |
| 166 | 166 |
| 167 CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags) | 167 CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags) |
| 168 { | 168 { |
| 169 CMS_ContentInfo *cms; | 169 CMS_ContentInfo *cms; |
| 170 cms = cms_Data_create(); | 170 cms = cms_Data_create(); |
| 171 if (!cms) | 171 if (!cms) |
| 172 return NULL; | 172 return NULL; |
| 173 | 173 |
| 174 » if (CMS_final(cms, in, NULL, flags)) | 174 » if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) |
| 175 return cms; | 175 return cms; |
| 176 | 176 |
| 177 CMS_ContentInfo_free(cms); | 177 CMS_ContentInfo_free(cms); |
| 178 | 178 |
| 179 return NULL; | 179 return NULL; |
| 180 } | 180 } |
| 181 | 181 |
| 182 int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 182 int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, |
| 183 unsigned int flags) | 183 unsigned int flags) |
| 184 { | 184 { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 207 unsigned int flags) | 207 unsigned int flags) |
| 208 { | 208 { |
| 209 CMS_ContentInfo *cms; | 209 CMS_ContentInfo *cms; |
| 210 if (!md) | 210 if (!md) |
| 211 md = EVP_sha1(); | 211 md = EVP_sha1(); |
| 212 cms = cms_DigestedData_create(md); | 212 cms = cms_DigestedData_create(md); |
| 213 if (!cms) | 213 if (!cms) |
| 214 return NULL; | 214 return NULL; |
| 215 | 215 |
| 216 if(!(flags & CMS_DETACHED)) | 216 if(!(flags & CMS_DETACHED)) |
| 217 { | |
| 218 flags &= ~CMS_STREAM; | |
| 219 CMS_set_detached(cms, 0); | 217 CMS_set_detached(cms, 0); |
| 220 } | |
| 221 | 218 |
| 222 if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) | 219 if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) |
| 223 return cms; | 220 return cms; |
| 224 | 221 |
| 225 CMS_ContentInfo_free(cms); | 222 CMS_ContentInfo_free(cms); |
| 226 return NULL; | 223 return NULL; |
| 227 } | 224 } |
| 228 | 225 |
| 229 int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, | 226 int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, |
| 230 const unsigned char *key, size_t keylen, | 227 const unsigned char *key, size_t keylen, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 CMSerr(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT, CMS_R_NO_CIPHER); | 259 CMSerr(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT, CMS_R_NO_CIPHER); |
| 263 return NULL; | 260 return NULL; |
| 264 } | 261 } |
| 265 cms = CMS_ContentInfo_new(); | 262 cms = CMS_ContentInfo_new(); |
| 266 if (!cms) | 263 if (!cms) |
| 267 return NULL; | 264 return NULL; |
| 268 if (!CMS_EncryptedData_set1_key(cms, cipher, key, keylen)) | 265 if (!CMS_EncryptedData_set1_key(cms, cipher, key, keylen)) |
| 269 return NULL; | 266 return NULL; |
| 270 | 267 |
| 271 if(!(flags & CMS_DETACHED)) | 268 if(!(flags & CMS_DETACHED)) |
| 272 { | |
| 273 flags &= ~CMS_STREAM; | |
| 274 CMS_set_detached(cms, 0); | 269 CMS_set_detached(cms, 0); |
| 275 } | |
| 276 | 270 |
| 277 if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 271 if ((flags & (CMS_STREAM|CMS_PARTIAL)) |
| 278 || CMS_final(cms, in, NULL, flags)) | 272 || CMS_final(cms, in, NULL, flags)) |
| 279 return cms; | 273 return cms; |
| 280 | 274 |
| 281 CMS_ContentInfo_free(cms); | 275 CMS_ContentInfo_free(cms); |
| 282 return NULL; | 276 return NULL; |
| 283 } | 277 } |
| 284 | 278 |
| 285 static int cms_signerinfo_verify_cert(CMS_SignerInfo *si, | 279 static int cms_signerinfo_verify_cert(CMS_SignerInfo *si, |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 sk_X509_CRL_pop_free(crls, X509_CRL_free); | 443 sk_X509_CRL_pop_free(crls, X509_CRL_free); |
| 450 | 444 |
| 451 return ret; | 445 return ret; |
| 452 } | 446 } |
| 453 | 447 |
| 454 int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, | 448 int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, |
| 455 STACK_OF(X509) *certs, | 449 STACK_OF(X509) *certs, |
| 456 X509_STORE *store, unsigned int flags) | 450 X509_STORE *store, unsigned int flags) |
| 457 { | 451 { |
| 458 int r; | 452 int r; |
| 453 flags &= ~(CMS_DETACHED|CMS_TEXT); |
| 459 r = CMS_verify(rcms, certs, store, NULL, NULL, flags); | 454 r = CMS_verify(rcms, certs, store, NULL, NULL, flags); |
| 460 if (r <= 0) | 455 if (r <= 0) |
| 461 return r; | 456 return r; |
| 462 return cms_Receipt_verify(rcms, ocms); | 457 return cms_Receipt_verify(rcms, ocms); |
| 463 } | 458 } |
| 464 | 459 |
| 465 CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, | 460 CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, |
| 466 BIO *data, unsigned int flags) | 461 BIO *data, unsigned int flags) |
| 467 { | 462 { |
| 468 CMS_ContentInfo *cms; | 463 CMS_ContentInfo *cms; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 479 } | 474 } |
| 480 | 475 |
| 481 for (i = 0; i < sk_X509_num(certs); i++) | 476 for (i = 0; i < sk_X509_num(certs); i++) |
| 482 { | 477 { |
| 483 X509 *x = sk_X509_value(certs, i); | 478 X509 *x = sk_X509_value(certs, i); |
| 484 if (!CMS_add1_cert(cms, x)) | 479 if (!CMS_add1_cert(cms, x)) |
| 485 goto merr; | 480 goto merr; |
| 486 } | 481 } |
| 487 | 482 |
| 488 if(!(flags & CMS_DETACHED)) | 483 if(!(flags & CMS_DETACHED)) |
| 489 { | |
| 490 flags &= ~CMS_STREAM; | |
| 491 CMS_set_detached(cms, 0); | 484 CMS_set_detached(cms, 0); |
| 492 } | |
| 493 | 485 |
| 494 if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 486 if ((flags & (CMS_STREAM|CMS_PARTIAL)) |
| 495 || CMS_final(cms, data, NULL, flags)) | 487 || CMS_final(cms, data, NULL, flags)) |
| 496 return cms; | 488 return cms; |
| 497 else | 489 else |
| 498 goto err; | 490 goto err; |
| 499 | 491 |
| 500 merr: | 492 merr: |
| 501 CMSerr(CMS_F_CMS_SIGN, ERR_R_MALLOC_FAILURE); | 493 CMSerr(CMS_F_CMS_SIGN, ERR_R_MALLOC_FAILURE); |
| 502 | 494 |
| 503 err: | 495 err: |
| 504 if (cms) | 496 if (cms) |
| 505 CMS_ContentInfo_free(cms); | 497 CMS_ContentInfo_free(cms); |
| 506 return NULL; | 498 return NULL; |
| 507 } | 499 } |
| 508 | 500 |
| 509 CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | 501 CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, |
| 510 X509 *signcert, EVP_PKEY *pkey, | 502 X509 *signcert, EVP_PKEY *pkey, |
| 511 STACK_OF(X509) *certs, | 503 STACK_OF(X509) *certs, |
| 512 unsigned int flags) | 504 unsigned int flags) |
| 513 { | 505 { |
| 514 CMS_SignerInfo *rct_si; | 506 CMS_SignerInfo *rct_si; |
| 515 CMS_ContentInfo *cms = NULL; | 507 CMS_ContentInfo *cms = NULL; |
| 516 ASN1_OCTET_STRING **pos, *os; | 508 ASN1_OCTET_STRING **pos, *os; |
| 517 BIO *rct_cont = NULL; | 509 BIO *rct_cont = NULL; |
| 518 int r = 0; | 510 int r = 0; |
| 519 | 511 |
| 520 » flags &= ~CMS_STREAM; | 512 » flags &= ~(CMS_STREAM|CMS_TEXT); |
| 521 /* Not really detached but avoids content being allocated */ | 513 /* Not really detached but avoids content being allocated */ |
| 522 flags |= CMS_PARTIAL|CMS_BINARY|CMS_DETACHED; | 514 flags |= CMS_PARTIAL|CMS_BINARY|CMS_DETACHED; |
| 523 if (!pkey || !signcert) | 515 if (!pkey || !signcert) |
| 524 { | 516 { |
| 525 CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_NO_KEY_OR_CERT); | 517 CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_NO_KEY_OR_CERT); |
| 526 return NULL; | 518 return NULL; |
| 527 } | 519 } |
| 528 | 520 |
| 529 /* Initialize signed data */ | 521 /* Initialize signed data */ |
| 530 | 522 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 { | 583 { |
| 592 recip = sk_X509_value(certs, i); | 584 recip = sk_X509_value(certs, i); |
| 593 if (!CMS_add1_recipient_cert(cms, recip, flags)) | 585 if (!CMS_add1_recipient_cert(cms, recip, flags)) |
| 594 { | 586 { |
| 595 CMSerr(CMS_F_CMS_ENCRYPT, CMS_R_RECIPIENT_ERROR); | 587 CMSerr(CMS_F_CMS_ENCRYPT, CMS_R_RECIPIENT_ERROR); |
| 596 goto err; | 588 goto err; |
| 597 } | 589 } |
| 598 } | 590 } |
| 599 | 591 |
| 600 if(!(flags & CMS_DETACHED)) | 592 if(!(flags & CMS_DETACHED)) |
| 601 { | |
| 602 flags &= ~CMS_STREAM; | |
| 603 CMS_set_detached(cms, 0); | 593 CMS_set_detached(cms, 0); |
| 604 } | |
| 605 | 594 |
| 606 if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 595 if ((flags & (CMS_STREAM|CMS_PARTIAL)) |
| 607 || CMS_final(cms, data, NULL, flags)) | 596 || CMS_final(cms, data, NULL, flags)) |
| 608 return cms; | 597 return cms; |
| 609 else | 598 else |
| 610 goto err; | 599 goto err; |
| 611 | 600 |
| 612 merr: | 601 merr: |
| 613 CMSerr(CMS_F_CMS_ENCRYPT, ERR_R_MALLOC_FAILURE); | 602 CMSerr(CMS_F_CMS_ENCRYPT, ERR_R_MALLOC_FAILURE); |
| 614 err: | 603 err: |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) | 763 CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) |
| 775 { | 764 { |
| 776 CMS_ContentInfo *cms; | 765 CMS_ContentInfo *cms; |
| 777 if (comp_nid <= 0) | 766 if (comp_nid <= 0) |
| 778 comp_nid = NID_zlib_compression; | 767 comp_nid = NID_zlib_compression; |
| 779 cms = cms_CompressedData_create(comp_nid); | 768 cms = cms_CompressedData_create(comp_nid); |
| 780 if (!cms) | 769 if (!cms) |
| 781 return NULL; | 770 return NULL; |
| 782 | 771 |
| 783 if(!(flags & CMS_DETACHED)) | 772 if(!(flags & CMS_DETACHED)) |
| 784 { | |
| 785 flags &= ~CMS_STREAM; | |
| 786 CMS_set_detached(cms, 0); | 773 CMS_set_detached(cms, 0); |
| 787 } | |
| 788 | 774 |
| 789 » if (CMS_final(cms, in, NULL, flags)) | 775 » if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) |
| 790 return cms; | 776 return cms; |
| 791 | 777 |
| 792 CMS_ContentInfo_free(cms); | 778 CMS_ContentInfo_free(cms); |
| 793 return NULL; | 779 return NULL; |
| 794 } | 780 } |
| 795 | 781 |
| 796 #else | 782 #else |
| 797 | 783 |
| 798 int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 784 int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, |
| 799 unsigned int flags) | 785 unsigned int flags) |
| 800 { | 786 { |
| 801 CMSerr(CMS_F_CMS_UNCOMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 787 CMSerr(CMS_F_CMS_UNCOMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 802 return 0; | 788 return 0; |
| 803 } | 789 } |
| 804 | 790 |
| 805 CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) | 791 CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) |
| 806 { | 792 { |
| 807 CMSerr(CMS_F_CMS_COMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 793 CMSerr(CMS_F_CMS_COMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 808 return NULL; | 794 return NULL; |
| 809 } | 795 } |
| 810 | 796 |
| 811 #endif | 797 #endif |
| OLD | NEW |