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