Allow verification of other types than DATA.
authorRichard Levitte <levitte@openssl.org>
Wed, 2 Jan 2002 11:54:38 +0000 (11:54 +0000)
committerRichard Levitte <levitte@openssl.org>
Wed, 2 Jan 2002 11:54:38 +0000 (11:54 +0000)
Submitted by Leonard Janke <leonard@votehere.net>

crypto/pkcs7/pk7_doit.c

index fce4a841a66bbeddddb084fcc915c26715dcb621..f016fdb2e255969c2e4bc7fba813e250c6cb3efc 100644 (file)
@@ -67,6 +67,38 @@ static int add_attribute(STACK_OF(X509_ATTRIBUTE) **sk, int nid, int atrtype,
                         void *value);
 static ASN1_TYPE *get_attribute(STACK_OF(X509_ATTRIBUTE) *sk, int nid);
 
                         void *value);
 static ASN1_TYPE *get_attribute(STACK_OF(X509_ATTRIBUTE) *sk, int nid);
 
+static int PKCS7_type_is_other(PKCS7* p7)
+       {
+       int isOther=1;
+       
+       int nid=OBJ_obj2nid(p7->type);
+
+       switch( nid )
+               {
+       case NID_pkcs7_data:
+       case NID_pkcs7_signed:
+       case NID_pkcs7_enveloped:
+       case NID_pkcs7_signedAndEnveloped:
+       case NID_pkcs7_digest:
+       case NID_pkcs7_encrypted:
+               isOther=0;
+               break;
+       default:
+               isOther=1;
+               }
+
+       return isOther;
+
+       }
+
+static int PKCS7_type_is_octet_string(PKCS7* p7)
+       {
+       if ( 0==PKCS7_type_is_other(p7) )
+               return 0;
+
+       return (V_ASN1_OCTET_STRING==p7->d.other->type) ? 1 : 0;
+       }
+
 BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
        {
        int i,j;
 BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
        {
        int i,j;
@@ -222,13 +254,20 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
                if (PKCS7_is_detached(p7))
                        bio=BIO_new(BIO_s_null());
                else {
                if (PKCS7_is_detached(p7))
                        bio=BIO_new(BIO_s_null());
                else {
-                       if (PKCS7_type_is_signed(p7) &&
-                               PKCS7_type_is_data(p7->d.sign->contents)) {
-                               ASN1_OCTET_STRING *os;
-                               os=p7->d.sign->contents->d.data;
-                               if (os->length > 0) bio = 
-                                       BIO_new_mem_buf(os->data, os->length);
-                       } 
+                       if (PKCS7_type_is_signed(p7) ) { 
+                               if ( PKCS7_type_is_data(p7->d.sign->contents)) {
+                                       ASN1_OCTET_STRING *os;
+                                       os=p7->d.sign->contents->d.data;
+                                       if (os->length > 0)
+                                               bio = BIO_new_mem_buf(os->data, os->length);
+                               }
+                               else if ( PKCS7_type_is_octet_string(p7->d.sign->contents) ) {
+                                       ASN1_OCTET_STRING *os;
+                                       os=p7->d.sign->contents->d.other->value.octet_string;
+                                       if (os->length > 0)
+                                               bio = BIO_new_mem_buf(os->data, os->length);
+                               }
+                       }
                        if(bio == NULL) {
                                bio=BIO_new(BIO_s_mem());
                                BIO_set_mem_eof_return(bio,0);
                        if(bio == NULL) {
                                bio=BIO_new(BIO_s_mem());
                                BIO_set_mem_eof_return(bio,0);