| 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; | 
| +	} | 
|  |