Ugh, BIO_find_type() cannot be passed a NULL.
[openssl.git] / crypto / pkcs7 / pk7_smime.c
index 7cb553632c822014a0b6f037884fb6554b8a70b1..c8cd5a7f73eb370ecd3c6f9d3c55b4f1e5b599dd 100644 (file)
 #include <openssl/x509v3.h>
 
 PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs,
-                                                       BIO *data, int flags)
+                 BIO *data, int flags)
 {
        PKCS7 *p7;
        PKCS7_SIGNER_INFO *si;
        BIO *p7bio;
-       STACK *smcap;
+       STACK_OF(X509_ALGOR) *smcap;
        int i;
 
        if(!X509_check_private_key(signcert, pkey)) {
@@ -109,7 +109,9 @@ PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs,
                PKCS7_add_signed_attribute(si, NID_pkcs9_contentType,
                                V_ASN1_OBJECT, OBJ_nid2obj(NID_pkcs7_data));
                /* Add SMIMECapabilities */
-               if(!(smcap = sk_new(NULL))) {
+               if(!(flags & PKCS7_NOSMIMECAP))
+               {
+               if(!(smcap = sk_X509_ALGOR_new(NULL))) {
                        PKCS7err(PKCS7_F_PKCS7_SIGN,ERR_R_MALLOC_FAILURE);
                        return NULL;
                }
@@ -127,7 +129,8 @@ PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs,
                PKCS7_simple_smimecap (smcap, NID_rc2_cbc, 40);
 #endif
                PKCS7_add_attrib_smimecap (si, smcap);
-               sk_pop_free(smcap, X509_ALGOR_free);
+               sk_X509_ALGOR_pop_free(smcap, X509_ALGOR_free);
+               }
        }
 
        if(flags & PKCS7_DETACHED)PKCS7_set_detached(p7, 1);
@@ -150,7 +153,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
        PKCS7_SIGNER_INFO *si;
        X509_STORE_CTX cert_ctx;
        char buf[4096];
-       int i, j=0;
+       int i, j=0, k;
        BIO *p7bio;
        BIO *tmpout;
 
@@ -184,14 +187,14 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
        }
 
 
-       signers = PKCS7_iget_signers(p7, certs, flags);
+       signers = PKCS7_get0_signers(p7, certs, flags);
 
        if(!signers) return 0;
 
        /* Now verify the certificates */
 
-       if (!(flags & PKCS7_NOVERIFY)) for (i = 0; i < sk_X509_num(signers); i++) {
-               signer = sk_X509_value (signers, i);
+       if (!(flags & PKCS7_NOVERIFY)) for (k = 0; k < sk_X509_num(signers); k++) {
+               signer = sk_X509_value (signers, k);
                if (!(flags & PKCS7_NOCHAIN)) {
                        X509_STORE_CTX_init(&cert_ctx, store, signer,
                                                        p7->d.sign->cert);
@@ -264,7 +267,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
        return 0;
 }
 
-STACK_OF(X509) *PKCS7_iget_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags)
+STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags)
 {
        STACK_OF(X509) *signers;
        STACK_OF(PKCS7_SIGNER_INFO) *sinfos;
@@ -274,16 +277,16 @@ STACK_OF(X509) *PKCS7_iget_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags)
        int i;
 
        if(!p7) {
-               PKCS7err(PKCS7_F_PKCS7_IGET_SIGNERS,PKCS7_R_INVALID_NULL_POINTER);
+               PKCS7err(PKCS7_F_PKCS7_GET0_SIGNERS,PKCS7_R_INVALID_NULL_POINTER);
                return NULL;
        }
 
        if(!PKCS7_type_is_signed(p7)) {
-               PKCS7err(PKCS7_F_PKCS7_IGET_SIGNERS,PKCS7_R_WRONG_CONTENT_TYPE);
+               PKCS7err(PKCS7_F_PKCS7_GET0_SIGNERS,PKCS7_R_WRONG_CONTENT_TYPE);
                return NULL;
        }
        if(!(signers = sk_X509_new(NULL))) {
-               PKCS7err(PKCS7_F_PKCS7_IGET_SIGNERS,ERR_R_MALLOC_FAILURE);
+               PKCS7err(PKCS7_F_PKCS7_GET0_SIGNERS,ERR_R_MALLOC_FAILURE);
                return NULL;
        }
 
@@ -292,7 +295,7 @@ STACK_OF(X509) *PKCS7_iget_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags)
        sinfos = PKCS7_get_signer_info(p7);
 
        if(sk_PKCS7_SIGNER_INFO_num(sinfos) <= 0) {
-               PKCS7err(PKCS7_F_PKCS7_IGET_SIGNERS,PKCS7_R_NO_SIGNERS);
+               PKCS7err(PKCS7_F_PKCS7_GET0_SIGNERS,PKCS7_R_NO_SIGNERS);
                return 0;
        }
 
@@ -309,7 +312,7 @@ STACK_OF(X509) *PKCS7_iget_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags)
                              X509_find_by_issuer_and_serial (p7->d.sign->cert,
                                                ias->issuer, ias->serial);
            if (!signer) {
-                       PKCS7err(PKCS7_F_PKCS7_IGET_SIGNERS,PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND);
+                       PKCS7err(PKCS7_F_PKCS7_GET0_SIGNERS,PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND);
                        sk_X509_free(signers);
                        return 0;
            }
@@ -329,8 +332,6 @@ PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, EVP_CIPHER *cipher,
        BIO *p7bio = NULL;
        int i;
        X509 *x509;
-       char inbuf[4096];
-       static char txthdr[] = "Content-type: text/plain\r\n\r\n";
        if(!(p7 = PKCS7_new())) {
                PKCS7err(PKCS7_F_PKCS7_ENCRYPT,ERR_R_MALLOC_FAILURE);
                return NULL;
@@ -356,12 +357,6 @@ PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, EVP_CIPHER *cipher,
                goto err;
        }
 
-       if(flags & PKCS7_TEXT) {
-               if(BIO_write(p7bio, txthdr, sizeof(txthdr) - 1) < 0) {
-                       goto err;
-               }
-       }
-
        SMIME_crlf_copy(in, p7bio, flags);
 
        BIO_flush(p7bio);