| Index: openssl/crypto/pkcs7/pk7_attr.c
|
| ===================================================================
|
| --- openssl/crypto/pkcs7/pk7_attr.c (revision 105093)
|
| +++ openssl/crypto/pkcs7/pk7_attr.c (working copy)
|
| @@ -60,6 +60,7 @@
|
| #include <stdlib.h>
|
| #include <openssl/bio.h>
|
| #include <openssl/asn1.h>
|
| +#include <openssl/asn1t.h>
|
| #include <openssl/pem.h>
|
| #include <openssl/pkcs7.h>
|
| #include <openssl/x509.h>
|
| @@ -68,27 +69,12 @@
|
| int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, STACK_OF(X509_ALGOR) *cap)
|
| {
|
| ASN1_STRING *seq;
|
| - unsigned char *p, *pp;
|
| - int len;
|
| - len=i2d_ASN1_SET_OF_X509_ALGOR(cap,NULL,i2d_X509_ALGOR,
|
| - V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL,
|
| - IS_SEQUENCE);
|
| - if(!(pp=(unsigned char *)OPENSSL_malloc(len))) {
|
| - PKCS7err(PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP,ERR_R_MALLOC_FAILURE);
|
| - return 0;
|
| - }
|
| - p=pp;
|
| - i2d_ASN1_SET_OF_X509_ALGOR(cap,&p,i2d_X509_ALGOR, V_ASN1_SEQUENCE,
|
| - V_ASN1_UNIVERSAL, IS_SEQUENCE);
|
| if(!(seq = ASN1_STRING_new())) {
|
| PKCS7err(PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP,ERR_R_MALLOC_FAILURE);
|
| return 0;
|
| }
|
| - if(!ASN1_STRING_set (seq, pp, len)) {
|
| - PKCS7err(PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP,ERR_R_MALLOC_FAILURE);
|
| - return 0;
|
| - }
|
| - OPENSSL_free (pp);
|
| + seq->length = ASN1_item_i2d((ASN1_VALUE *)cap,&seq->data,
|
| + ASN1_ITEM_rptr(X509_ALGORS));
|
| return PKCS7_add_signed_attribute(si, NID_SMIMECapabilities,
|
| V_ASN1_SEQUENCE, seq);
|
| }
|
| @@ -102,10 +88,9 @@
|
| if (!cap || (cap->type != V_ASN1_SEQUENCE))
|
| return NULL;
|
| p = cap->value.sequence->data;
|
| - return d2i_ASN1_SET_OF_X509_ALGOR(NULL, &p,
|
| - cap->value.sequence->length,
|
| - d2i_X509_ALGOR, X509_ALGOR_free,
|
| - V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL);
|
| + return (STACK_OF(X509_ALGOR) *)
|
| + ASN1_item_d2i(NULL, &p, cap->value.sequence->length,
|
| + ASN1_ITEM_rptr(X509_ALGORS));
|
| }
|
|
|
| /* Basic smime-capabilities OID and optional integer arg */
|
| @@ -139,3 +124,42 @@
|
| sk_X509_ALGOR_push (sk, alg);
|
| return 1;
|
| }
|
| +
|
| +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid)
|
| + {
|
| + if (PKCS7_get_signed_attribute(si, NID_pkcs9_contentType))
|
| + return 0;
|
| + if (!coid)
|
| + coid = OBJ_nid2obj(NID_pkcs7_data);
|
| + return PKCS7_add_signed_attribute(si, NID_pkcs9_contentType,
|
| + V_ASN1_OBJECT, coid);
|
| + }
|
| +
|
| +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t)
|
| + {
|
| + if (!t && !(t=X509_gmtime_adj(NULL,0)))
|
| + {
|
| + PKCS7err(PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME,
|
| + ERR_R_MALLOC_FAILURE);
|
| + return 0;
|
| + }
|
| + return PKCS7_add_signed_attribute(si, NID_pkcs9_signingTime,
|
| + V_ASN1_UTCTIME, t);
|
| + }
|
| +
|
| +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si,
|
| + const unsigned char *md, int mdlen)
|
| + {
|
| + ASN1_OCTET_STRING *os;
|
| + os = ASN1_OCTET_STRING_new();
|
| + if (!os)
|
| + return 0;
|
| + if (!ASN1_STRING_set(os, md, mdlen)
|
| + || !PKCS7_add_signed_attribute(si, NID_pkcs9_messageDigest,
|
| + V_ASN1_OCTET_STRING, os))
|
| + {
|
| + ASN1_OCTET_STRING_free(os);
|
| + return 0;
|
| + }
|
| + return 1;
|
| + }
|
|
|