diff options
Diffstat (limited to 'src/lib/libcrypto/cms')
| -rw-r--r-- | src/lib/libcrypto/cms/cms.h | 10 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_asn1.c | 46 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_env.c | 85 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_err.c | 4 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_ess.c | 6 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_io.c | 79 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_lcl.h | 1 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_lib.c | 32 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_sd.c | 126 |
9 files changed, 217 insertions, 172 deletions
diff --git a/src/lib/libcrypto/cms/cms.h b/src/lib/libcrypto/cms/cms.h index 25f88745f2..09c45d0412 100644 --- a/src/lib/libcrypto/cms/cms.h +++ b/src/lib/libcrypto/cms/cms.h | |||
| @@ -76,8 +76,9 @@ typedef struct CMS_Receipt_st CMS_Receipt; | |||
| 76 | 76 | ||
| 77 | DECLARE_STACK_OF(CMS_SignerInfo) | 77 | DECLARE_STACK_OF(CMS_SignerInfo) |
| 78 | DECLARE_STACK_OF(GENERAL_NAMES) | 78 | DECLARE_STACK_OF(GENERAL_NAMES) |
| 79 | DECLARE_ASN1_FUNCTIONS_const(CMS_ContentInfo) | 79 | DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) |
| 80 | DECLARE_ASN1_FUNCTIONS_const(CMS_ReceiptRequest) | 80 | DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) |
| 81 | DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) | ||
| 81 | 82 | ||
| 82 | #define CMS_SIGNERINFO_ISSUER_SERIAL 0 | 83 | #define CMS_SIGNERINFO_ISSUER_SERIAL 0 |
| 83 | #define CMS_SIGNERINFO_KEYIDENTIFIER 1 | 84 | #define CMS_SIGNERINFO_KEYIDENTIFIER 1 |
| @@ -124,9 +125,13 @@ int CMS_set_detached(CMS_ContentInfo *cms, int detached); | |||
| 124 | DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) | 125 | DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) |
| 125 | #endif | 126 | #endif |
| 126 | 127 | ||
| 128 | int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); | ||
| 127 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); | 129 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); |
| 128 | int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); | 130 | int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); |
| 129 | 131 | ||
| 132 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); | ||
| 133 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); | ||
| 134 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); | ||
| 130 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); | 135 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); |
| 131 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); | 136 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); |
| 132 | 137 | ||
| @@ -230,6 +235,7 @@ STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); | |||
| 230 | 235 | ||
| 231 | CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); | 236 | CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); |
| 232 | int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); | 237 | int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); |
| 238 | int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); | ||
| 233 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); | 239 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); |
| 234 | 240 | ||
| 235 | int CMS_SignedData_init(CMS_ContentInfo *cms); | 241 | int CMS_SignedData_init(CMS_ContentInfo *cms); |
diff --git a/src/lib/libcrypto/cms/cms_asn1.c b/src/lib/libcrypto/cms/cms_asn1.c index 7664921861..fcba4dcbcc 100644 --- a/src/lib/libcrypto/cms/cms_asn1.c +++ b/src/lib/libcrypto/cms/cms_asn1.c | |||
| @@ -87,7 +87,8 @@ ASN1_NDEF_SEQUENCE(CMS_EncapsulatedContentInfo) = { | |||
| 87 | } ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo) | 87 | } ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo) |
| 88 | 88 | ||
| 89 | /* Minor tweak to operation: free up signer key, cert */ | 89 | /* Minor tweak to operation: free up signer key, cert */ |
| 90 | static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 90 | static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| 91 | void *exarg) | ||
| 91 | { | 92 | { |
| 92 | if(operation == ASN1_OP_FREE_POST) | 93 | if(operation == ASN1_OP_FREE_POST) |
| 93 | { | 94 | { |
| @@ -130,8 +131,8 @@ ASN1_NDEF_SEQUENCE(CMS_SignedData) = { | |||
| 130 | } ASN1_NDEF_SEQUENCE_END(CMS_SignedData) | 131 | } ASN1_NDEF_SEQUENCE_END(CMS_SignedData) |
| 131 | 132 | ||
| 132 | ASN1_SEQUENCE(CMS_OriginatorInfo) = { | 133 | ASN1_SEQUENCE(CMS_OriginatorInfo) = { |
| 133 | ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0), | 134 | ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, certificates, CMS_CertificateChoices, 0), |
| 134 | ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1) | 135 | ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, crls, CMS_RevocationInfoChoice, 1) |
| 135 | } ASN1_SEQUENCE_END(CMS_OriginatorInfo) | 136 | } ASN1_SEQUENCE_END(CMS_OriginatorInfo) |
| 136 | 137 | ||
| 137 | ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = { | 138 | ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = { |
| @@ -213,7 +214,8 @@ ASN1_SEQUENCE(CMS_OtherRecipientInfo) = { | |||
| 213 | } ASN1_SEQUENCE_END(CMS_OtherRecipientInfo) | 214 | } ASN1_SEQUENCE_END(CMS_OtherRecipientInfo) |
| 214 | 215 | ||
| 215 | /* Free up RecipientInfo additional data */ | 216 | /* Free up RecipientInfo additional data */ |
| 216 | static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 217 | static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| 218 | void *exarg) | ||
| 217 | { | 219 | { |
| 218 | if(operation == ASN1_OP_FREE_PRE) | 220 | if(operation == ASN1_OP_FREE_PRE) |
| 219 | { | 221 | { |
| @@ -300,10 +302,42 @@ ASN1_ADB(CMS_ContentInfo) = { | |||
| 300 | ADB_ENTRY(NID_id_smime_ct_compressedData, ASN1_NDEF_EXP(CMS_ContentInfo, d.compressedData, CMS_CompressedData, 0)), | 302 | ADB_ENTRY(NID_id_smime_ct_compressedData, ASN1_NDEF_EXP(CMS_ContentInfo, d.compressedData, CMS_CompressedData, 0)), |
| 301 | } ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL); | 303 | } ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL); |
| 302 | 304 | ||
| 303 | ASN1_NDEF_SEQUENCE(CMS_ContentInfo) = { | 305 | /* CMS streaming support */ |
| 306 | static int cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | ||
| 307 | void *exarg) | ||
| 308 | { | ||
| 309 | ASN1_STREAM_ARG *sarg = exarg; | ||
| 310 | CMS_ContentInfo *cms = NULL; | ||
| 311 | if (pval) | ||
| 312 | cms = (CMS_ContentInfo *)*pval; | ||
| 313 | else | ||
| 314 | return 1; | ||
| 315 | switch(operation) | ||
| 316 | { | ||
| 317 | |||
| 318 | case ASN1_OP_STREAM_PRE: | ||
| 319 | if (CMS_stream(&sarg->boundary, cms) <= 0) | ||
| 320 | return 0; | ||
| 321 | case ASN1_OP_DETACHED_PRE: | ||
| 322 | sarg->ndef_bio = CMS_dataInit(cms, sarg->out); | ||
| 323 | if (!sarg->ndef_bio) | ||
| 324 | return 0; | ||
| 325 | break; | ||
| 326 | |||
| 327 | case ASN1_OP_STREAM_POST: | ||
| 328 | case ASN1_OP_DETACHED_POST: | ||
| 329 | if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0) | ||
| 330 | return 0; | ||
| 331 | break; | ||
| 332 | |||
| 333 | } | ||
| 334 | return 1; | ||
| 335 | } | ||
| 336 | |||
| 337 | ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = { | ||
| 304 | ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT), | 338 | ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT), |
| 305 | ASN1_ADB_OBJECT(CMS_ContentInfo) | 339 | ASN1_ADB_OBJECT(CMS_ContentInfo) |
| 306 | } ASN1_NDEF_SEQUENCE_END(CMS_ContentInfo) | 340 | } ASN1_NDEF_SEQUENCE_END_cb(CMS_ContentInfo, CMS_ContentInfo) |
| 307 | 341 | ||
| 308 | /* Specials for signed attributes */ | 342 | /* Specials for signed attributes */ |
| 309 | 343 | ||
diff --git a/src/lib/libcrypto/cms/cms_env.c b/src/lib/libcrypto/cms/cms_env.c index d499ae85b4..b3237d4b94 100644 --- a/src/lib/libcrypto/cms/cms_env.c +++ b/src/lib/libcrypto/cms/cms_env.c | |||
| @@ -60,6 +60,7 @@ | |||
| 60 | #include <openssl/rand.h> | 60 | #include <openssl/rand.h> |
| 61 | #include <openssl/aes.h> | 61 | #include <openssl/aes.h> |
| 62 | #include "cms_lcl.h" | 62 | #include "cms_lcl.h" |
| 63 | #include "asn1_locl.h" | ||
| 63 | 64 | ||
| 64 | /* CMS EnvelopedData Utilities */ | 65 | /* CMS EnvelopedData Utilities */ |
| 65 | 66 | ||
| @@ -151,7 +152,7 @@ CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | |||
| 151 | CMS_KeyTransRecipientInfo *ktri; | 152 | CMS_KeyTransRecipientInfo *ktri; |
| 152 | CMS_EnvelopedData *env; | 153 | CMS_EnvelopedData *env; |
| 153 | EVP_PKEY *pk = NULL; | 154 | EVP_PKEY *pk = NULL; |
| 154 | int type; | 155 | int i, type; |
| 155 | env = cms_get0_enveloped(cms); | 156 | env = cms_get0_enveloped(cms); |
| 156 | if (!env) | 157 | if (!env) |
| 157 | goto err; | 158 | goto err; |
| @@ -200,21 +201,22 @@ CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | |||
| 200 | if (!cms_set1_SignerIdentifier(ktri->rid, recip, type)) | 201 | if (!cms_set1_SignerIdentifier(ktri->rid, recip, type)) |
| 201 | goto err; | 202 | goto err; |
| 202 | 203 | ||
| 203 | /* Since we have no EVP_PKEY_ASN1_METHOD in OpenSSL 0.9.8, | 204 | if (pk->ameth && pk->ameth->pkey_ctrl) |
| 204 | * hard code algorithm parameters. | ||
| 205 | */ | ||
| 206 | |||
| 207 | if (pk->type == EVP_PKEY_RSA) | ||
| 208 | { | ||
| 209 | X509_ALGOR_set0(ktri->keyEncryptionAlgorithm, | ||
| 210 | OBJ_nid2obj(NID_rsaEncryption), | ||
| 211 | V_ASN1_NULL, 0); | ||
| 212 | } | ||
| 213 | else | ||
| 214 | { | 205 | { |
| 215 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | 206 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_ENVELOPE, |
| 207 | 0, ri); | ||
| 208 | if (i == -2) | ||
| 209 | { | ||
| 210 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | ||
| 216 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); | 211 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); |
| 217 | goto err; | 212 | goto err; |
| 213 | } | ||
| 214 | if (i <= 0) | ||
| 215 | { | ||
| 216 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | ||
| 217 | CMS_R_CTRL_FAILURE); | ||
| 218 | goto err; | ||
| 219 | } | ||
| 218 | } | 220 | } |
| 219 | 221 | ||
| 220 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) | 222 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) |
| @@ -301,8 +303,9 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 301 | { | 303 | { |
| 302 | CMS_KeyTransRecipientInfo *ktri; | 304 | CMS_KeyTransRecipientInfo *ktri; |
| 303 | CMS_EncryptedContentInfo *ec; | 305 | CMS_EncryptedContentInfo *ec; |
| 306 | EVP_PKEY_CTX *pctx = NULL; | ||
| 304 | unsigned char *ek = NULL; | 307 | unsigned char *ek = NULL; |
| 305 | int eklen; | 308 | size_t eklen; |
| 306 | 309 | ||
| 307 | int ret = 0; | 310 | int ret = 0; |
| 308 | 311 | ||
| @@ -315,7 +318,22 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 315 | ktri = ri->d.ktri; | 318 | ktri = ri->d.ktri; |
| 316 | ec = cms->d.envelopedData->encryptedContentInfo; | 319 | ec = cms->d.envelopedData->encryptedContentInfo; |
| 317 | 320 | ||
| 318 | eklen = EVP_PKEY_size(ktri->pkey); | 321 | pctx = EVP_PKEY_CTX_new(ktri->pkey, NULL); |
| 322 | if (!pctx) | ||
| 323 | return 0; | ||
| 324 | |||
| 325 | if (EVP_PKEY_encrypt_init(pctx) <= 0) | ||
| 326 | goto err; | ||
| 327 | |||
| 328 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT, | ||
| 329 | EVP_PKEY_CTRL_CMS_ENCRYPT, 0, ri) <= 0) | ||
| 330 | { | ||
| 331 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, CMS_R_CTRL_ERROR); | ||
| 332 | goto err; | ||
| 333 | } | ||
| 334 | |||
| 335 | if (EVP_PKEY_encrypt(pctx, NULL, &eklen, ec->key, ec->keylen) <= 0) | ||
| 336 | goto err; | ||
| 319 | 337 | ||
| 320 | ek = OPENSSL_malloc(eklen); | 338 | ek = OPENSSL_malloc(eklen); |
| 321 | 339 | ||
| @@ -326,9 +344,7 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 326 | goto err; | 344 | goto err; |
| 327 | } | 345 | } |
| 328 | 346 | ||
| 329 | eklen = EVP_PKEY_encrypt(ek, ec->key, ec->keylen, ktri->pkey); | 347 | if (EVP_PKEY_encrypt(pctx, ek, &eklen, ec->key, ec->keylen) <= 0) |
| 330 | |||
| 331 | if (eklen <= 0) | ||
| 332 | goto err; | 348 | goto err; |
| 333 | 349 | ||
| 334 | ASN1_STRING_set0(ktri->encryptedKey, ek, eklen); | 350 | ASN1_STRING_set0(ktri->encryptedKey, ek, eklen); |
| @@ -337,6 +353,8 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 337 | ret = 1; | 353 | ret = 1; |
| 338 | 354 | ||
| 339 | err: | 355 | err: |
| 356 | if (pctx) | ||
| 357 | EVP_PKEY_CTX_free(pctx); | ||
| 340 | if (ek) | 358 | if (ek) |
| 341 | OPENSSL_free(ek); | 359 | OPENSSL_free(ek); |
| 342 | return ret; | 360 | return ret; |
| @@ -349,8 +367,9 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | |||
| 349 | CMS_RecipientInfo *ri) | 367 | CMS_RecipientInfo *ri) |
| 350 | { | 368 | { |
| 351 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; | 369 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; |
| 370 | EVP_PKEY_CTX *pctx = NULL; | ||
| 352 | unsigned char *ek = NULL; | 371 | unsigned char *ek = NULL; |
| 353 | int eklen; | 372 | size_t eklen; |
| 354 | int ret = 0; | 373 | int ret = 0; |
| 355 | 374 | ||
| 356 | if (ktri->pkey == NULL) | 375 | if (ktri->pkey == NULL) |
| @@ -360,7 +379,24 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | |||
| 360 | return 0; | 379 | return 0; |
| 361 | } | 380 | } |
| 362 | 381 | ||
| 363 | eklen = EVP_PKEY_size(ktri->pkey); | 382 | pctx = EVP_PKEY_CTX_new(ktri->pkey, NULL); |
| 383 | if (!pctx) | ||
| 384 | return 0; | ||
| 385 | |||
| 386 | if (EVP_PKEY_decrypt_init(pctx) <= 0) | ||
| 387 | goto err; | ||
| 388 | |||
| 389 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DECRYPT, | ||
| 390 | EVP_PKEY_CTRL_CMS_DECRYPT, 0, ri) <= 0) | ||
| 391 | { | ||
| 392 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CTRL_ERROR); | ||
| 393 | goto err; | ||
| 394 | } | ||
| 395 | |||
| 396 | if (EVP_PKEY_decrypt(pctx, NULL, &eklen, | ||
| 397 | ktri->encryptedKey->data, | ||
| 398 | ktri->encryptedKey->length) <= 0) | ||
| 399 | goto err; | ||
| 364 | 400 | ||
| 365 | ek = OPENSSL_malloc(eklen); | 401 | ek = OPENSSL_malloc(eklen); |
| 366 | 402 | ||
| @@ -371,10 +407,9 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | |||
| 371 | goto err; | 407 | goto err; |
| 372 | } | 408 | } |
| 373 | 409 | ||
| 374 | eklen = EVP_PKEY_decrypt(ek, | 410 | if (EVP_PKEY_decrypt(pctx, ek, &eklen, |
| 375 | ktri->encryptedKey->data, | 411 | ktri->encryptedKey->data, |
| 376 | ktri->encryptedKey->length, ktri->pkey); | 412 | ktri->encryptedKey->length) <= 0) |
| 377 | if (eklen <= 0) | ||
| 378 | { | 413 | { |
| 379 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CMS_LIB); | 414 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CMS_LIB); |
| 380 | goto err; | 415 | goto err; |
| @@ -386,6 +421,8 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | |||
| 386 | cms->d.envelopedData->encryptedContentInfo->keylen = eklen; | 421 | cms->d.envelopedData->encryptedContentInfo->keylen = eklen; |
| 387 | 422 | ||
| 388 | err: | 423 | err: |
| 424 | if (pctx) | ||
| 425 | EVP_PKEY_CTX_free(pctx); | ||
| 389 | if (!ret && ek) | 426 | if (!ret && ek) |
| 390 | OPENSSL_free(ek); | 427 | OPENSSL_free(ek); |
| 391 | 428 | ||
diff --git a/src/lib/libcrypto/cms/cms_err.c b/src/lib/libcrypto/cms/cms_err.c index 52fa53954f..ff7b0309e5 100644 --- a/src/lib/libcrypto/cms/cms_err.c +++ b/src/lib/libcrypto/cms/cms_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/cms/cms_err.c */ | 1 | /* crypto/cms/cms_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -133,7 +133,7 @@ static ERR_STRING_DATA CMS_str_functs[]= | |||
| 133 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CERT), "CMS_SIGNERINFO_VERIFY_CERT"}, | 133 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CERT), "CMS_SIGNERINFO_VERIFY_CERT"}, |
| 134 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT), "CMS_SignerInfo_verify_content"}, | 134 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT), "CMS_SignerInfo_verify_content"}, |
| 135 | {ERR_FUNC(CMS_F_CMS_SIGN_RECEIPT), "CMS_sign_receipt"}, | 135 | {ERR_FUNC(CMS_F_CMS_SIGN_RECEIPT), "CMS_sign_receipt"}, |
| 136 | {ERR_FUNC(CMS_F_CMS_STREAM), "CMS_STREAM"}, | 136 | {ERR_FUNC(CMS_F_CMS_STREAM), "CMS_stream"}, |
| 137 | {ERR_FUNC(CMS_F_CMS_UNCOMPRESS), "CMS_uncompress"}, | 137 | {ERR_FUNC(CMS_F_CMS_UNCOMPRESS), "CMS_uncompress"}, |
| 138 | {ERR_FUNC(CMS_F_CMS_VERIFY), "CMS_verify"}, | 138 | {ERR_FUNC(CMS_F_CMS_VERIFY), "CMS_verify"}, |
| 139 | {0,NULL} | 139 | {0,NULL} |
diff --git a/src/lib/libcrypto/cms/cms_ess.c b/src/lib/libcrypto/cms/cms_ess.c index ed34ff3228..90c0b82fb5 100644 --- a/src/lib/libcrypto/cms/cms_ess.c +++ b/src/lib/libcrypto/cms/cms_ess.c | |||
| @@ -63,7 +63,7 @@ | |||
| 63 | DECLARE_ASN1_ITEM(CMS_ReceiptRequest) | 63 | DECLARE_ASN1_ITEM(CMS_ReceiptRequest) |
| 64 | DECLARE_ASN1_ITEM(CMS_Receipt) | 64 | DECLARE_ASN1_ITEM(CMS_Receipt) |
| 65 | 65 | ||
| 66 | IMPLEMENT_ASN1_FUNCTIONS_const(CMS_ReceiptRequest) | 66 | IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest) |
| 67 | 67 | ||
| 68 | /* ESS services: for now just Signed Receipt related */ | 68 | /* ESS services: for now just Signed Receipt related */ |
| 69 | 69 | ||
| @@ -344,7 +344,7 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) | |||
| 344 | 344 | ||
| 345 | /* Get original receipt request details */ | 345 | /* Get original receipt request details */ |
| 346 | 346 | ||
| 347 | if (!CMS_get1_ReceiptRequest(osi, &rr)) | 347 | if (CMS_get1_ReceiptRequest(osi, &rr) <= 0) |
| 348 | { | 348 | { |
| 349 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_RECEIPT_REQUEST); | 349 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_RECEIPT_REQUEST); |
| 350 | goto err; | 350 | goto err; |
| @@ -385,7 +385,7 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si) | |||
| 385 | 385 | ||
| 386 | /* Get original receipt request details */ | 386 | /* Get original receipt request details */ |
| 387 | 387 | ||
| 388 | if (!CMS_get1_ReceiptRequest(si, &rr)) | 388 | if (CMS_get1_ReceiptRequest(si, &rr) <= 0) |
| 389 | { | 389 | { |
| 390 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_RECEIPT_REQUEST); | 390 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_RECEIPT_REQUEST); |
| 391 | goto err; | 391 | goto err; |
diff --git a/src/lib/libcrypto/cms/cms_io.c b/src/lib/libcrypto/cms/cms_io.c index 30f5ddfe6d..1cb0264cc5 100644 --- a/src/lib/libcrypto/cms/cms_io.c +++ b/src/lib/libcrypto/cms/cms_io.c | |||
| @@ -58,6 +58,25 @@ | |||
| 58 | #include "cms.h" | 58 | #include "cms.h" |
| 59 | #include "cms_lcl.h" | 59 | #include "cms_lcl.h" |
| 60 | 60 | ||
| 61 | int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms) | ||
| 62 | { | ||
| 63 | ASN1_OCTET_STRING **pos; | ||
| 64 | pos = CMS_get0_content(cms); | ||
| 65 | if (!pos) | ||
| 66 | return 0; | ||
| 67 | if (!*pos) | ||
| 68 | *pos = ASN1_OCTET_STRING_new(); | ||
| 69 | if (*pos) | ||
| 70 | { | ||
| 71 | (*pos)->flags |= ASN1_STRING_FLAG_NDEF; | ||
| 72 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; | ||
| 73 | *boundary = &(*pos)->data; | ||
| 74 | return 1; | ||
| 75 | } | ||
| 76 | CMSerr(CMS_F_CMS_STREAM, ERR_R_MALLOC_FAILURE); | ||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | |||
| 61 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) | 80 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) |
| 62 | { | 81 | { |
| 63 | return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); | 82 | return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); |
| @@ -70,52 +89,26 @@ int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms) | |||
| 70 | 89 | ||
| 71 | IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) | 90 | IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) |
| 72 | 91 | ||
| 73 | /* Callback for int_smime_write_ASN1 */ | 92 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms) |
| 74 | |||
| 75 | static int cms_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | ||
| 76 | const ASN1_ITEM *it) | ||
| 77 | { | 93 | { |
| 78 | CMS_ContentInfo *cms = (CMS_ContentInfo *)val; | 94 | return BIO_new_NDEF(out, (ASN1_VALUE *)cms, |
| 79 | BIO *tmpbio, *cmsbio; | 95 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 80 | int r = 0; | 96 | } |
| 81 | |||
| 82 | if (!(flags & SMIME_DETACHED)) | ||
| 83 | { | ||
| 84 | SMIME_crlf_copy(data, out, flags); | ||
| 85 | return 1; | ||
| 86 | } | ||
| 87 | |||
| 88 | /* Let CMS code prepend any needed BIOs */ | ||
| 89 | |||
| 90 | cmsbio = CMS_dataInit(cms, out); | ||
| 91 | |||
| 92 | if (!cmsbio) | ||
| 93 | return 0; | ||
| 94 | |||
| 95 | /* Copy data across, passing through filter BIOs for processing */ | ||
| 96 | SMIME_crlf_copy(data, cmsbio, flags); | ||
| 97 | |||
| 98 | /* Finalize structure */ | ||
| 99 | if (CMS_dataFinal(cms, cmsbio) <= 0) | ||
| 100 | goto err; | ||
| 101 | |||
| 102 | r = 1; | ||
| 103 | |||
| 104 | err: | ||
| 105 | |||
| 106 | /* Now remove any digests prepended to the BIO */ | ||
| 107 | |||
| 108 | while (cmsbio != out) | ||
| 109 | { | ||
| 110 | tmpbio = BIO_pop(cmsbio); | ||
| 111 | BIO_free(cmsbio); | ||
| 112 | cmsbio = tmpbio; | ||
| 113 | } | ||
| 114 | 97 | ||
| 115 | return 1; | 98 | /* CMS wrappers round generalised stream and MIME routines */ |
| 116 | 99 | ||
| 100 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) | ||
| 101 | { | ||
| 102 | return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags, | ||
| 103 | ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
| 117 | } | 104 | } |
| 118 | 105 | ||
| 106 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) | ||
| 107 | { | ||
| 108 | return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *) cms, in, flags, | ||
| 109 | "CMS", | ||
| 110 | ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
| 111 | } | ||
| 119 | 112 | ||
| 120 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) | 113 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) |
| 121 | { | 114 | { |
| @@ -127,9 +120,8 @@ int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) | |||
| 127 | else | 120 | else |
| 128 | mdalgs = NULL; | 121 | mdalgs = NULL; |
| 129 | 122 | ||
| 130 | return int_smime_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, | 123 | return SMIME_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, |
| 131 | ctype_nid, econt_nid, mdalgs, | 124 | ctype_nid, econt_nid, mdalgs, |
| 132 | cms_output_data, | ||
| 133 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 125 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 134 | } | 126 | } |
| 135 | 127 | ||
| @@ -138,3 +130,4 @@ CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont) | |||
| 138 | return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, | 130 | return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, |
| 139 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 131 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 140 | } | 132 | } |
| 133 | |||
diff --git a/src/lib/libcrypto/cms/cms_lcl.h b/src/lib/libcrypto/cms/cms_lcl.h index 7d60fac67e..c8ecfa724a 100644 --- a/src/lib/libcrypto/cms/cms_lcl.h +++ b/src/lib/libcrypto/cms/cms_lcl.h | |||
| @@ -406,6 +406,7 @@ struct CMS_Receipt_st | |||
| 406 | ASN1_OCTET_STRING *originatorSignatureValue; | 406 | ASN1_OCTET_STRING *originatorSignatureValue; |
| 407 | }; | 407 | }; |
| 408 | 408 | ||
| 409 | DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) | ||
| 409 | DECLARE_ASN1_ITEM(CMS_SignerInfo) | 410 | DECLARE_ASN1_ITEM(CMS_SignerInfo) |
| 410 | DECLARE_ASN1_ITEM(CMS_IssuerAndSerialNumber) | 411 | DECLARE_ASN1_ITEM(CMS_IssuerAndSerialNumber) |
| 411 | DECLARE_ASN1_ITEM(CMS_Attributes_Sign) | 412 | DECLARE_ASN1_ITEM(CMS_Attributes_Sign) |
diff --git a/src/lib/libcrypto/cms/cms_lib.c b/src/lib/libcrypto/cms/cms_lib.c index 8e6c1d29a5..d00fe0f87b 100644 --- a/src/lib/libcrypto/cms/cms_lib.c +++ b/src/lib/libcrypto/cms/cms_lib.c | |||
| @@ -60,7 +60,8 @@ | |||
| 60 | #include "cms.h" | 60 | #include "cms.h" |
| 61 | #include "cms_lcl.h" | 61 | #include "cms_lcl.h" |
| 62 | 62 | ||
| 63 | IMPLEMENT_ASN1_FUNCTIONS_const(CMS_ContentInfo) | 63 | IMPLEMENT_ASN1_FUNCTIONS(CMS_ContentInfo) |
| 64 | IMPLEMENT_ASN1_PRINT_FUNCTION(CMS_ContentInfo) | ||
| 64 | 65 | ||
| 65 | DECLARE_ASN1_ITEM(CMS_CertificateChoices) | 66 | DECLARE_ASN1_ITEM(CMS_CertificateChoices) |
| 66 | DECLARE_ASN1_ITEM(CMS_RevocationInfoChoice) | 67 | DECLARE_ASN1_ITEM(CMS_RevocationInfoChoice) |
| @@ -346,20 +347,10 @@ void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md) | |||
| 346 | { | 347 | { |
| 347 | int param_type; | 348 | int param_type; |
| 348 | 349 | ||
| 349 | switch (EVP_MD_type(md)) | 350 | if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT) |
| 350 | { | ||
| 351 | case NID_sha1: | ||
| 352 | case NID_sha224: | ||
| 353 | case NID_sha256: | ||
| 354 | case NID_sha384: | ||
| 355 | case NID_sha512: | ||
| 356 | param_type = V_ASN1_UNDEF; | 351 | param_type = V_ASN1_UNDEF; |
| 357 | break; | 352 | else |
| 358 | |||
| 359 | default: | ||
| 360 | param_type = V_ASN1_NULL; | 353 | param_type = V_ASN1_NULL; |
| 361 | break; | ||
| 362 | } | ||
| 363 | 354 | ||
| 364 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); | 355 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
| 365 | 356 | ||
| @@ -415,7 +406,11 @@ int cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, | |||
| 415 | return 0; | 406 | return 0; |
| 416 | } | 407 | } |
| 417 | BIO_get_md_ctx(chain, &mtmp); | 408 | BIO_get_md_ctx(chain, &mtmp); |
| 418 | if (EVP_MD_CTX_type(mtmp) == nid) | 409 | if (EVP_MD_CTX_type(mtmp) == nid |
| 410 | /* Workaround for broken implementations that use signature | ||
| 411 | * algorithm OID instead of digest. | ||
| 412 | */ | ||
| 413 | || EVP_MD_pkey_type(EVP_MD_CTX_md(mtmp)) == nid) | ||
| 419 | { | 414 | { |
| 420 | EVP_MD_CTX_copy_ex(mctx, mtmp); | 415 | EVP_MD_CTX_copy_ex(mctx, mtmp); |
| 421 | return 1; | 416 | return 1; |
| @@ -557,6 +552,15 @@ int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl) | |||
| 557 | return 1; | 552 | return 1; |
| 558 | } | 553 | } |
| 559 | 554 | ||
| 555 | int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl) | ||
| 556 | { | ||
| 557 | int r; | ||
| 558 | r = CMS_add0_crl(cms, crl); | ||
| 559 | if (r > 0) | ||
| 560 | CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509_CRL); | ||
| 561 | return r; | ||
| 562 | } | ||
| 563 | |||
| 560 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) | 564 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) |
| 561 | { | 565 | { |
| 562 | STACK_OF(X509) *certs = NULL; | 566 | STACK_OF(X509) *certs = NULL; |
diff --git a/src/lib/libcrypto/cms/cms_sd.c b/src/lib/libcrypto/cms/cms_sd.c index cdac3b870d..e3192b9c57 100644 --- a/src/lib/libcrypto/cms/cms_sd.c +++ b/src/lib/libcrypto/cms/cms_sd.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | #include <openssl/err.h> | 58 | #include <openssl/err.h> |
| 59 | #include <openssl/cms.h> | 59 | #include <openssl/cms.h> |
| 60 | #include "cms_lcl.h" | 60 | #include "cms_lcl.h" |
| 61 | #include "asn1_locl.h" | ||
| 61 | 62 | ||
| 62 | /* CMS SignedData Utilities */ | 63 | /* CMS SignedData Utilities */ |
| 63 | 64 | ||
| @@ -218,10 +219,9 @@ int cms_set1_SignerIdentifier(CMS_SignerIdentifier *sid, X509 *cert, int type) | |||
| 218 | if (!X509_NAME_set(&sid->d.issuerAndSerialNumber->issuer, | 219 | if (!X509_NAME_set(&sid->d.issuerAndSerialNumber->issuer, |
| 219 | X509_get_issuer_name(cert))) | 220 | X509_get_issuer_name(cert))) |
| 220 | goto merr; | 221 | goto merr; |
| 221 | ASN1_STRING_free(sid->d.issuerAndSerialNumber->serialNumber); | 222 | if (!ASN1_STRING_copy( |
| 222 | sid->d.issuerAndSerialNumber->serialNumber = | 223 | sid->d.issuerAndSerialNumber->serialNumber, |
| 223 | ASN1_STRING_dup(X509_get_serialNumber(cert)); | 224 | X509_get_serialNumber(cert))) |
| 224 | if(!sid->d.issuerAndSerialNumber->serialNumber) | ||
| 225 | goto merr; | 225 | goto merr; |
| 226 | break; | 226 | break; |
| 227 | 227 | ||
| @@ -341,16 +341,22 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | |||
| 341 | if (!cms_set1_SignerIdentifier(si->sid, signer, type)) | 341 | if (!cms_set1_SignerIdentifier(si->sid, signer, type)) |
| 342 | goto err; | 342 | goto err; |
| 343 | 343 | ||
| 344 | /* Since no EVP_PKEY_METHOD in 0.9.8 hard code SHA1 as default */ | ||
| 345 | if (md == NULL) | 344 | if (md == NULL) |
| 346 | md = EVP_sha1(); | 345 | { |
| 347 | 346 | int def_nid; | |
| 348 | /* OpenSSL 0.9.8 only supports SHA1 with non-RSA keys */ | 347 | if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0) |
| 348 | goto err; | ||
| 349 | md = EVP_get_digestbynid(def_nid); | ||
| 350 | if (md == NULL) | ||
| 351 | { | ||
| 352 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DEFAULT_DIGEST); | ||
| 353 | goto err; | ||
| 354 | } | ||
| 355 | } | ||
| 349 | 356 | ||
| 350 | if ((pk->type != EVP_PKEY_RSA) && (EVP_MD_type(md) != NID_sha1)) | 357 | if (!md) |
| 351 | { | 358 | { |
| 352 | CMSerr(CMS_F_CMS_ADD1_SIGNER, | 359 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DIGEST_SET); |
| 353 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); | ||
| 354 | goto err; | 360 | goto err; |
| 355 | } | 361 | } |
| 356 | 362 | ||
| @@ -379,37 +385,21 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | |||
| 379 | } | 385 | } |
| 380 | } | 386 | } |
| 381 | 387 | ||
| 382 | /* Since we have no EVP_PKEY_ASN1_METHOD in OpenSSL 0.9.8, | 388 | if (pk->ameth && pk->ameth->pkey_ctrl) |
| 383 | * hard code algorithm parameters. | ||
| 384 | */ | ||
| 385 | |||
| 386 | switch (pk->type) | ||
| 387 | { | 389 | { |
| 388 | 390 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_SIGN, | |
| 389 | case EVP_PKEY_RSA: | 391 | 0, si); |
| 390 | X509_ALGOR_set0(si->signatureAlgorithm, | 392 | if (i == -2) |
| 391 | OBJ_nid2obj(NID_rsaEncryption), | 393 | { |
| 392 | V_ASN1_NULL, 0); | 394 | CMSerr(CMS_F_CMS_ADD1_SIGNER, |
| 393 | break; | ||
| 394 | |||
| 395 | case EVP_PKEY_DSA: | ||
| 396 | X509_ALGOR_set0(si->signatureAlgorithm, | ||
| 397 | OBJ_nid2obj(NID_dsaWithSHA1), | ||
| 398 | V_ASN1_UNDEF, 0); | ||
| 399 | break; | ||
| 400 | |||
| 401 | |||
| 402 | case EVP_PKEY_EC: | ||
| 403 | X509_ALGOR_set0(si->signatureAlgorithm, | ||
| 404 | OBJ_nid2obj(NID_ecdsa_with_SHA1), | ||
| 405 | V_ASN1_UNDEF, 0); | ||
| 406 | break; | ||
| 407 | |||
| 408 | default: | ||
| 409 | CMSerr(CMS_F_CMS_ADD1_SIGNER, | ||
| 410 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); | 395 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); |
| 411 | goto err; | 396 | goto err; |
| 412 | 397 | } | |
| 398 | if (i <= 0) | ||
| 399 | { | ||
| 400 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_CTRL_FAILURE); | ||
| 401 | goto err; | ||
| 402 | } | ||
| 413 | } | 403 | } |
| 414 | 404 | ||
| 415 | if (!(flags & CMS_NOATTR)) | 405 | if (!(flags & CMS_NOATTR)) |
| @@ -626,25 +616,6 @@ void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, | |||
| 626 | *psig = si->signatureAlgorithm; | 616 | *psig = si->signatureAlgorithm; |
| 627 | } | 617 | } |
| 628 | 618 | ||
| 629 | /* In OpenSSL 0.9.8 we have the link between digest types and public | ||
| 630 | * key types so we need to fixup the digest type if the public key | ||
| 631 | * type is not appropriate. | ||
| 632 | */ | ||
| 633 | |||
| 634 | static void cms_fixup_mctx(EVP_MD_CTX *mctx, EVP_PKEY *pkey) | ||
| 635 | { | ||
| 636 | if (EVP_MD_CTX_type(mctx) != NID_sha1) | ||
| 637 | return; | ||
| 638 | #ifndef OPENSSL_NO_DSA | ||
| 639 | if (pkey->type == EVP_PKEY_DSA) | ||
| 640 | mctx->digest = EVP_dss1(); | ||
| 641 | #endif | ||
| 642 | #ifndef OPENSSL_NO_ECDSA | ||
| 643 | if (pkey->type == EVP_PKEY_EC) | ||
| 644 | mctx->digest = EVP_ecdsa(); | ||
| 645 | #endif | ||
| 646 | } | ||
| 647 | |||
| 648 | static int cms_SignerInfo_content_sign(CMS_ContentInfo *cms, | 619 | static int cms_SignerInfo_content_sign(CMS_ContentInfo *cms, |
| 649 | CMS_SignerInfo *si, BIO *chain) | 620 | CMS_SignerInfo *si, BIO *chain) |
| 650 | { | 621 | { |
| @@ -693,7 +664,6 @@ static int cms_SignerInfo_content_sign(CMS_ContentInfo *cms, | |||
| 693 | ERR_R_MALLOC_FAILURE); | 664 | ERR_R_MALLOC_FAILURE); |
| 694 | goto err; | 665 | goto err; |
| 695 | } | 666 | } |
| 696 | cms_fixup_mctx(&mctx, si->pkey); | ||
| 697 | if (!EVP_SignFinal(&mctx, sig, &siglen, si->pkey)) | 667 | if (!EVP_SignFinal(&mctx, sig, &siglen, si->pkey)) |
| 698 | { | 668 | { |
| 699 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, | 669 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, |
| @@ -731,9 +701,10 @@ int cms_SignedData_final(CMS_ContentInfo *cms, BIO *chain) | |||
| 731 | int CMS_SignerInfo_sign(CMS_SignerInfo *si) | 701 | int CMS_SignerInfo_sign(CMS_SignerInfo *si) |
| 732 | { | 702 | { |
| 733 | EVP_MD_CTX mctx; | 703 | EVP_MD_CTX mctx; |
| 704 | EVP_PKEY_CTX *pctx; | ||
| 734 | unsigned char *abuf = NULL; | 705 | unsigned char *abuf = NULL; |
| 735 | int alen; | 706 | int alen; |
| 736 | unsigned int siglen; | 707 | size_t siglen; |
| 737 | const EVP_MD *md = NULL; | 708 | const EVP_MD *md = NULL; |
| 738 | 709 | ||
| 739 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); | 710 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); |
| @@ -748,40 +719,38 @@ int CMS_SignerInfo_sign(CMS_SignerInfo *si) | |||
| 748 | goto err; | 719 | goto err; |
| 749 | } | 720 | } |
| 750 | 721 | ||
| 751 | if (EVP_SignInit_ex(&mctx, md, NULL) <= 0) | 722 | if (EVP_DigestSignInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) |
| 752 | goto err; | 723 | goto err; |
| 753 | 724 | ||
| 754 | #if 0 | ||
| 755 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | 725 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, |
| 756 | EVP_PKEY_CTRL_CMS_SIGN, 0, si) <= 0) | 726 | EVP_PKEY_CTRL_CMS_SIGN, 0, si) <= 0) |
| 757 | { | 727 | { |
| 758 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); | 728 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); |
| 759 | goto err; | 729 | goto err; |
| 760 | } | 730 | } |
| 761 | #endif | ||
| 762 | 731 | ||
| 763 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, | 732 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, |
| 764 | ASN1_ITEM_rptr(CMS_Attributes_Sign)); | 733 | ASN1_ITEM_rptr(CMS_Attributes_Sign)); |
| 765 | if(!abuf) | 734 | if(!abuf) |
| 766 | goto err; | 735 | goto err; |
| 767 | if (EVP_SignUpdate(&mctx, abuf, alen) <= 0) | 736 | if (EVP_DigestSignUpdate(&mctx, abuf, alen) <= 0) |
| 737 | goto err; | ||
| 738 | if (EVP_DigestSignFinal(&mctx, NULL, &siglen) <= 0) | ||
| 768 | goto err; | 739 | goto err; |
| 769 | siglen = EVP_PKEY_size(si->pkey); | ||
| 770 | OPENSSL_free(abuf); | 740 | OPENSSL_free(abuf); |
| 771 | abuf = OPENSSL_malloc(siglen); | 741 | abuf = OPENSSL_malloc(siglen); |
| 772 | if(!abuf) | 742 | if(!abuf) |
| 773 | goto err; | 743 | goto err; |
| 774 | cms_fixup_mctx(&mctx, si->pkey); | 744 | if (EVP_DigestSignFinal(&mctx, abuf, &siglen) <= 0) |
| 775 | if (EVP_SignFinal(&mctx, abuf, &siglen, si->pkey) <= 0) | ||
| 776 | goto err; | 745 | goto err; |
| 777 | #if 0 | 746 | |
| 778 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | 747 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, |
| 779 | EVP_PKEY_CTRL_CMS_SIGN, 1, si) <= 0) | 748 | EVP_PKEY_CTRL_CMS_SIGN, 1, si) <= 0) |
| 780 | { | 749 | { |
| 781 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); | 750 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); |
| 782 | goto err; | 751 | goto err; |
| 783 | } | 752 | } |
| 784 | #endif | 753 | |
| 785 | EVP_MD_CTX_cleanup(&mctx); | 754 | EVP_MD_CTX_cleanup(&mctx); |
| 786 | 755 | ||
| 787 | ASN1_STRING_set0(si->signature, abuf, siglen); | 756 | ASN1_STRING_set0(si->signature, abuf, siglen); |
| @@ -799,6 +768,7 @@ int CMS_SignerInfo_sign(CMS_SignerInfo *si) | |||
| 799 | int CMS_SignerInfo_verify(CMS_SignerInfo *si) | 768 | int CMS_SignerInfo_verify(CMS_SignerInfo *si) |
| 800 | { | 769 | { |
| 801 | EVP_MD_CTX mctx; | 770 | EVP_MD_CTX mctx; |
| 771 | EVP_PKEY_CTX *pctx; | ||
| 802 | unsigned char *abuf = NULL; | 772 | unsigned char *abuf = NULL; |
| 803 | int alen, r = -1; | 773 | int alen, r = -1; |
| 804 | const EVP_MD *md = NULL; | 774 | const EVP_MD *md = NULL; |
| @@ -813,23 +783,22 @@ int CMS_SignerInfo_verify(CMS_SignerInfo *si) | |||
| 813 | if (md == NULL) | 783 | if (md == NULL) |
| 814 | return -1; | 784 | return -1; |
| 815 | EVP_MD_CTX_init(&mctx); | 785 | EVP_MD_CTX_init(&mctx); |
| 816 | if (EVP_VerifyInit_ex(&mctx, md, NULL) <= 0) | 786 | if (EVP_DigestVerifyInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) |
| 817 | goto err; | 787 | goto err; |
| 818 | 788 | ||
| 819 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, | 789 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, |
| 820 | ASN1_ITEM_rptr(CMS_Attributes_Verify)); | 790 | ASN1_ITEM_rptr(CMS_Attributes_Verify)); |
| 821 | if(!abuf) | 791 | if(!abuf) |
| 822 | goto err; | 792 | goto err; |
| 823 | r = EVP_VerifyUpdate(&mctx, abuf, alen); | 793 | r = EVP_DigestVerifyUpdate(&mctx, abuf, alen); |
| 824 | OPENSSL_free(abuf); | 794 | OPENSSL_free(abuf); |
| 825 | if (r <= 0) | 795 | if (r <= 0) |
| 826 | { | 796 | { |
| 827 | r = -1; | 797 | r = -1; |
| 828 | goto err; | 798 | goto err; |
| 829 | } | 799 | } |
| 830 | cms_fixup_mctx(&mctx, si->pkey); | 800 | r = EVP_DigestVerifyFinal(&mctx, |
| 831 | r = EVP_VerifyFinal(&mctx, | 801 | si->signature->data, si->signature->length); |
| 832 | si->signature->data, si->signature->length, si->pkey); | ||
| 833 | if (r <= 0) | 802 | if (r <= 0) |
| 834 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); | 803 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); |
| 835 | err: | 804 | err: |
| @@ -922,7 +891,6 @@ int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain) | |||
| 922 | } | 891 | } |
| 923 | else | 892 | else |
| 924 | { | 893 | { |
| 925 | cms_fixup_mctx(&mctx, si->pkey); | ||
| 926 | r = EVP_VerifyFinal(&mctx, si->signature->data, | 894 | r = EVP_VerifyFinal(&mctx, si->signature->data, |
| 927 | si->signature->length, si->pkey); | 895 | si->signature->length, si->pkey); |
| 928 | if (r <= 0) | 896 | if (r <= 0) |
| @@ -991,17 +959,19 @@ static int cms_add_cipher_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) | |||
| 991 | return CMS_add_simple_smimecap(sk, nid, arg); | 959 | return CMS_add_simple_smimecap(sk, nid, arg); |
| 992 | return 1; | 960 | return 1; |
| 993 | } | 961 | } |
| 994 | #if 0 | 962 | |
| 995 | static int cms_add_digest_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) | 963 | static int cms_add_digest_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) |
| 996 | { | 964 | { |
| 997 | if (EVP_get_digestbynid(nid)) | 965 | if (EVP_get_digestbynid(nid)) |
| 998 | return CMS_add_simple_smimecap(sk, nid, arg); | 966 | return CMS_add_simple_smimecap(sk, nid, arg); |
| 999 | return 1; | 967 | return 1; |
| 1000 | } | 968 | } |
| 1001 | #endif | 969 | |
| 1002 | int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap) | 970 | int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap) |
| 1003 | { | 971 | { |
| 1004 | if (!cms_add_cipher_smcap(smcap, NID_aes_256_cbc, -1) | 972 | if (!cms_add_cipher_smcap(smcap, NID_aes_256_cbc, -1) |
| 973 | || !cms_add_digest_smcap(smcap, NID_id_GostR3411_94, -1) | ||
| 974 | || !cms_add_cipher_smcap(smcap, NID_id_Gost28147_89, -1) | ||
| 1005 | || !cms_add_cipher_smcap(smcap, NID_aes_192_cbc, -1) | 975 | || !cms_add_cipher_smcap(smcap, NID_aes_192_cbc, -1) |
| 1006 | || !cms_add_cipher_smcap(smcap, NID_aes_128_cbc, -1) | 976 | || !cms_add_cipher_smcap(smcap, NID_aes_128_cbc, -1) |
| 1007 | || !cms_add_cipher_smcap(smcap, NID_des_ede3_cbc, -1) | 977 | || !cms_add_cipher_smcap(smcap, NID_des_ede3_cbc, -1) |
