| Index: openssl/crypto/cms/cms_sd.c
|
| ===================================================================
|
| --- openssl/crypto/cms/cms_sd.c (revision 105093)
|
| +++ openssl/crypto/cms/cms_sd.c (working copy)
|
| @@ -58,6 +58,7 @@
|
| #include <openssl/err.h>
|
| #include <openssl/cms.h>
|
| #include "cms_lcl.h"
|
| +#include "asn1_locl.h"
|
|
|
| /* CMS SignedData Utilities */
|
|
|
| @@ -218,10 +219,9 @@
|
| if (!X509_NAME_set(&sid->d.issuerAndSerialNumber->issuer,
|
| X509_get_issuer_name(cert)))
|
| goto merr;
|
| - ASN1_STRING_free(sid->d.issuerAndSerialNumber->serialNumber);
|
| - sid->d.issuerAndSerialNumber->serialNumber =
|
| - ASN1_STRING_dup(X509_get_serialNumber(cert));
|
| - if(!sid->d.issuerAndSerialNumber->serialNumber)
|
| + if (!ASN1_STRING_copy(
|
| + sid->d.issuerAndSerialNumber->serialNumber,
|
| + X509_get_serialNumber(cert)))
|
| goto merr;
|
| break;
|
|
|
| @@ -341,16 +341,22 @@
|
| if (!cms_set1_SignerIdentifier(si->sid, signer, type))
|
| goto err;
|
|
|
| - /* Since no EVP_PKEY_METHOD in 0.9.8 hard code SHA1 as default */
|
| if (md == NULL)
|
| - md = EVP_sha1();
|
| + {
|
| + int def_nid;
|
| + if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0)
|
| + goto err;
|
| + md = EVP_get_digestbynid(def_nid);
|
| + if (md == NULL)
|
| + {
|
| + CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DEFAULT_DIGEST);
|
| + goto err;
|
| + }
|
| + }
|
|
|
| - /* OpenSSL 0.9.8 only supports SHA1 with non-RSA keys */
|
| -
|
| - if ((pk->type != EVP_PKEY_RSA) && (EVP_MD_type(md) != NID_sha1))
|
| + if (!md)
|
| {
|
| - CMSerr(CMS_F_CMS_ADD1_SIGNER,
|
| - CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE);
|
| + CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DIGEST_SET);
|
| goto err;
|
| }
|
|
|
| @@ -379,37 +385,21 @@
|
| }
|
| }
|
|
|
| - /* Since we have no EVP_PKEY_ASN1_METHOD in OpenSSL 0.9.8,
|
| - * hard code algorithm parameters.
|
| - */
|
| -
|
| - switch (pk->type)
|
| + if (pk->ameth && pk->ameth->pkey_ctrl)
|
| {
|
| -
|
| - case EVP_PKEY_RSA:
|
| - X509_ALGOR_set0(si->signatureAlgorithm,
|
| - OBJ_nid2obj(NID_rsaEncryption),
|
| - V_ASN1_NULL, 0);
|
| - break;
|
| -
|
| - case EVP_PKEY_DSA:
|
| - X509_ALGOR_set0(si->signatureAlgorithm,
|
| - OBJ_nid2obj(NID_dsaWithSHA1),
|
| - V_ASN1_UNDEF, 0);
|
| - break;
|
| -
|
| -
|
| - case EVP_PKEY_EC:
|
| - X509_ALGOR_set0(si->signatureAlgorithm,
|
| - OBJ_nid2obj(NID_ecdsa_with_SHA1),
|
| - V_ASN1_UNDEF, 0);
|
| - break;
|
| -
|
| - default:
|
| - CMSerr(CMS_F_CMS_ADD1_SIGNER,
|
| + i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_SIGN,
|
| + 0, si);
|
| + if (i == -2)
|
| + {
|
| + CMSerr(CMS_F_CMS_ADD1_SIGNER,
|
| CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE);
|
| - goto err;
|
| -
|
| + goto err;
|
| + }
|
| + if (i <= 0)
|
| + {
|
| + CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_CTRL_FAILURE);
|
| + goto err;
|
| + }
|
| }
|
|
|
| if (!(flags & CMS_NOATTR))
|
| @@ -626,25 +616,6 @@
|
| *psig = si->signatureAlgorithm;
|
| }
|
|
|
| -/* In OpenSSL 0.9.8 we have the link between digest types and public
|
| - * key types so we need to fixup the digest type if the public key
|
| - * type is not appropriate.
|
| - */
|
| -
|
| -static void cms_fixup_mctx(EVP_MD_CTX *mctx, EVP_PKEY *pkey)
|
| - {
|
| - if (EVP_MD_CTX_type(mctx) != NID_sha1)
|
| - return;
|
| -#ifndef OPENSSL_NO_DSA
|
| - if (pkey->type == EVP_PKEY_DSA)
|
| - mctx->digest = EVP_dss1();
|
| -#endif
|
| -#ifndef OPENSSL_NO_ECDSA
|
| - if (pkey->type == EVP_PKEY_EC)
|
| - mctx->digest = EVP_ecdsa();
|
| -#endif
|
| - }
|
| -
|
| static int cms_SignerInfo_content_sign(CMS_ContentInfo *cms,
|
| CMS_SignerInfo *si, BIO *chain)
|
| {
|
| @@ -693,7 +664,6 @@
|
| ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| }
|
| - cms_fixup_mctx(&mctx, si->pkey);
|
| if (!EVP_SignFinal(&mctx, sig, &siglen, si->pkey))
|
| {
|
| CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN,
|
| @@ -731,9 +701,10 @@
|
| int CMS_SignerInfo_sign(CMS_SignerInfo *si)
|
| {
|
| EVP_MD_CTX mctx;
|
| + EVP_PKEY_CTX *pctx;
|
| unsigned char *abuf = NULL;
|
| int alen;
|
| - unsigned int siglen;
|
| + size_t siglen;
|
| const EVP_MD *md = NULL;
|
|
|
| md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm);
|
| @@ -748,40 +719,38 @@
|
| goto err;
|
| }
|
|
|
| - if (EVP_SignInit_ex(&mctx, md, NULL) <= 0)
|
| + if (EVP_DigestSignInit(&mctx, &pctx, md, NULL, si->pkey) <= 0)
|
| goto err;
|
|
|
| -#if 0
|
| if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN,
|
| EVP_PKEY_CTRL_CMS_SIGN, 0, si) <= 0)
|
| {
|
| CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR);
|
| goto err;
|
| }
|
| -#endif
|
|
|
| alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf,
|
| ASN1_ITEM_rptr(CMS_Attributes_Sign));
|
| if(!abuf)
|
| goto err;
|
| - if (EVP_SignUpdate(&mctx, abuf, alen) <= 0)
|
| + if (EVP_DigestSignUpdate(&mctx, abuf, alen) <= 0)
|
| goto err;
|
| - siglen = EVP_PKEY_size(si->pkey);
|
| + if (EVP_DigestSignFinal(&mctx, NULL, &siglen) <= 0)
|
| + goto err;
|
| OPENSSL_free(abuf);
|
| abuf = OPENSSL_malloc(siglen);
|
| if(!abuf)
|
| goto err;
|
| - cms_fixup_mctx(&mctx, si->pkey);
|
| - if (EVP_SignFinal(&mctx, abuf, &siglen, si->pkey) <= 0)
|
| + if (EVP_DigestSignFinal(&mctx, abuf, &siglen) <= 0)
|
| goto err;
|
| -#if 0
|
| +
|
| if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN,
|
| EVP_PKEY_CTRL_CMS_SIGN, 1, si) <= 0)
|
| {
|
| CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR);
|
| goto err;
|
| }
|
| -#endif
|
| +
|
| EVP_MD_CTX_cleanup(&mctx);
|
|
|
| ASN1_STRING_set0(si->signature, abuf, siglen);
|
| @@ -799,6 +768,7 @@
|
| int CMS_SignerInfo_verify(CMS_SignerInfo *si)
|
| {
|
| EVP_MD_CTX mctx;
|
| + EVP_PKEY_CTX *pctx;
|
| unsigned char *abuf = NULL;
|
| int alen, r = -1;
|
| const EVP_MD *md = NULL;
|
| @@ -813,23 +783,22 @@
|
| if (md == NULL)
|
| return -1;
|
| EVP_MD_CTX_init(&mctx);
|
| - if (EVP_VerifyInit_ex(&mctx, md, NULL) <= 0)
|
| + if (EVP_DigestVerifyInit(&mctx, &pctx, md, NULL, si->pkey) <= 0)
|
| goto err;
|
|
|
| alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf,
|
| ASN1_ITEM_rptr(CMS_Attributes_Verify));
|
| if(!abuf)
|
| goto err;
|
| - r = EVP_VerifyUpdate(&mctx, abuf, alen);
|
| + r = EVP_DigestVerifyUpdate(&mctx, abuf, alen);
|
| OPENSSL_free(abuf);
|
| if (r <= 0)
|
| {
|
| r = -1;
|
| goto err;
|
| }
|
| - cms_fixup_mctx(&mctx, si->pkey);
|
| - r = EVP_VerifyFinal(&mctx,
|
| - si->signature->data, si->signature->length, si->pkey);
|
| + r = EVP_DigestVerifyFinal(&mctx,
|
| + si->signature->data, si->signature->length);
|
| if (r <= 0)
|
| CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE);
|
| err:
|
| @@ -922,7 +891,6 @@
|
| }
|
| else
|
| {
|
| - cms_fixup_mctx(&mctx, si->pkey);
|
| r = EVP_VerifyFinal(&mctx, si->signature->data,
|
| si->signature->length, si->pkey);
|
| if (r <= 0)
|
| @@ -991,17 +959,19 @@
|
| return CMS_add_simple_smimecap(sk, nid, arg);
|
| return 1;
|
| }
|
| -#if 0
|
| +
|
| static int cms_add_digest_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg)
|
| {
|
| if (EVP_get_digestbynid(nid))
|
| return CMS_add_simple_smimecap(sk, nid, arg);
|
| return 1;
|
| }
|
| -#endif
|
| +
|
| int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap)
|
| {
|
| if (!cms_add_cipher_smcap(smcap, NID_aes_256_cbc, -1)
|
| + || !cms_add_digest_smcap(smcap, NID_id_GostR3411_94, -1)
|
| + || !cms_add_cipher_smcap(smcap, NID_id_Gost28147_89, -1)
|
| || !cms_add_cipher_smcap(smcap, NID_aes_192_cbc, -1)
|
| || !cms_add_cipher_smcap(smcap, NID_aes_128_cbc, -1)
|
| || !cms_add_cipher_smcap(smcap, NID_des_ede3_cbc, -1)
|
|
|