| Index: openssl/crypto/asn1/a_sign.c
|
| ===================================================================
|
| --- openssl/crypto/asn1/a_sign.c (revision 105093)
|
| +++ openssl/crypto/asn1/a_sign.c (working copy)
|
| @@ -123,6 +123,7 @@
|
| #include <openssl/x509.h>
|
| #include <openssl/objects.h>
|
| #include <openssl/buffer.h>
|
| +#include "asn1_locl.h"
|
|
|
| #ifndef NO_ASN1_OLD
|
|
|
| @@ -218,45 +219,47 @@
|
| {
|
| EVP_MD_CTX ctx;
|
| unsigned char *buf_in=NULL,*buf_out=NULL;
|
| - int i,inl=0,outl=0,outll=0;
|
| - X509_ALGOR *a;
|
| + int inl=0,outl=0,outll=0;
|
| + int signid, paramtype;
|
|
|
| - EVP_MD_CTX_init(&ctx);
|
| - for (i=0; i<2; i++)
|
| + if (type == NULL)
|
| {
|
| - if (i == 0)
|
| - a=algor1;
|
| - else
|
| - a=algor2;
|
| - if (a == NULL) continue;
|
| - if (type->pkey_type == NID_dsaWithSHA1 ||
|
| - type->pkey_type == NID_ecdsa_with_SHA1)
|
| + int def_nid;
|
| + if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) > 0)
|
| + type = EVP_get_digestbynid(def_nid);
|
| + }
|
| +
|
| + if (type == NULL)
|
| + {
|
| + ASN1err(ASN1_F_ASN1_ITEM_SIGN, ASN1_R_NO_DEFAULT_DIGEST);
|
| + return 0;
|
| + }
|
| +
|
| + if (type->flags & EVP_MD_FLAG_PKEY_METHOD_SIGNATURE)
|
| + {
|
| + if (!pkey->ameth ||
|
| + !OBJ_find_sigid_by_algs(&signid, EVP_MD_nid(type),
|
| + pkey->ameth->pkey_id))
|
| {
|
| - /* special case: RFC 3279 tells us to omit 'parameters'
|
| - * with id-dsa-with-sha1 and ecdsa-with-SHA1 */
|
| - ASN1_TYPE_free(a->parameter);
|
| - a->parameter = NULL;
|
| + ASN1err(ASN1_F_ASN1_ITEM_SIGN,
|
| + ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED);
|
| + return 0;
|
| }
|
| - else if ((a->parameter == NULL) ||
|
| - (a->parameter->type != V_ASN1_NULL))
|
| - {
|
| - ASN1_TYPE_free(a->parameter);
|
| - if ((a->parameter=ASN1_TYPE_new()) == NULL) goto err;
|
| - a->parameter->type=V_ASN1_NULL;
|
| - }
|
| - ASN1_OBJECT_free(a->algorithm);
|
| - a->algorithm=OBJ_nid2obj(type->pkey_type);
|
| - if (a->algorithm == NULL)
|
| - {
|
| - ASN1err(ASN1_F_ASN1_ITEM_SIGN,ASN1_R_UNKNOWN_OBJECT_TYPE);
|
| - goto err;
|
| - }
|
| - if (a->algorithm->length == 0)
|
| - {
|
| - ASN1err(ASN1_F_ASN1_ITEM_SIGN,ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD);
|
| - goto err;
|
| - }
|
| }
|
| + else
|
| + signid = type->pkey_type;
|
| +
|
| + if (pkey->ameth->pkey_flags & ASN1_PKEY_SIGPARAM_NULL)
|
| + paramtype = V_ASN1_NULL;
|
| + else
|
| + paramtype = V_ASN1_UNDEF;
|
| +
|
| + if (algor1)
|
| + X509_ALGOR_set0(algor1, OBJ_nid2obj(signid), paramtype, NULL);
|
| + if (algor2)
|
| + X509_ALGOR_set0(algor2, OBJ_nid2obj(signid), paramtype, NULL);
|
| +
|
| + EVP_MD_CTX_init(&ctx);
|
| inl=ASN1_item_i2d(asn,&buf_in, it);
|
| outll=outl=EVP_PKEY_size(pkey);
|
| buf_out=(unsigned char *)OPENSSL_malloc((unsigned int)outl);
|
| @@ -267,12 +270,7 @@
|
| goto err;
|
| }
|
|
|
| - if (!EVP_SignInit_ex(&ctx,type, NULL))
|
| - {
|
| - outl=0;
|
| - ASN1err(ASN1_F_ASN1_ITEM_SIGN,ERR_R_EVP_LIB);
|
| - goto err;
|
| - }
|
| + EVP_SignInit_ex(&ctx,type, NULL);
|
| EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
|
| if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out,
|
| (unsigned int *)&outl,pkey))
|
|
|