Delete nonexistant function from pkcs7.h header file. WIN32 build fix from
[openssl.git] / apps / cms.c
index 7a637786d24fa984673e1d7e95946a3075a58b8f..30dd296bc022ecb3d9a8ab54b68f2796da7e499f 100644 (file)
@@ -91,6 +91,8 @@ static CMS_ReceiptRequest *make_receipt_request(STACK *rr_to, int rr_allorfirst,
 #define SMIME_COMPRESS         (12 | SMIME_OP)
 #define SMIME_ENCRYPTED_DECRYPT        (13 | SMIME_IP)
 #define SMIME_ENCRYPTED_ENCRYPT        (14 | SMIME_OP)
+#define SMIME_SIGN_RECEIPT     (15 | SMIME_IP | SMIME_OP)
+#define SMIME_VERIFY_RECEIPT   (16 | SMIME_IP)
 
 int MAIN(int, char **);
 
@@ -101,17 +103,17 @@ int MAIN(int argc, char **argv)
        int ret = 0;
        char **args;
        const char *inmode = "r", *outmode = "w";
-       char *infile = NULL, *outfile = NULL;
+       char *infile = NULL, *outfile = NULL, *rctfile = NULL;
        char *signerfile = NULL, *recipfile = NULL;
        STACK *sksigners = NULL, *skkeys = NULL;
        char *certfile = NULL, *keyfile = NULL, *contfile=NULL;
        const EVP_CIPHER *cipher = NULL;
-       CMS_ContentInfo *cms = NULL;
+       CMS_ContentInfo *cms = NULL, *rcms = NULL;
        X509_STORE *store = NULL;
        X509 *cert = NULL, *recip = NULL, *signer = NULL;
        EVP_PKEY *key = NULL;
        STACK_OF(X509) *encerts = NULL, *other = NULL;
-       BIO *in = NULL, *out = NULL, *indata = NULL;
+       BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL;
        int badarg = 0;
        int flags = CMS_DETACHED, noout = 0, print = 0;
        int rr_print = 0, rr_allorfirst = -1;
@@ -124,7 +126,7 @@ int MAIN(int argc, char **argv)
        int need_rand = 0;
        const EVP_MD *sign_md = NULL;
        int informat = FORMAT_SMIME, outformat = FORMAT_SMIME;
-        int keyform = FORMAT_PEM;
+        int rctformat = FORMAT_SMIME, keyform = FORMAT_PEM;
 #ifndef OPENSSL_NO_ENGINE
        char *engine=NULL;
 #endif
@@ -157,10 +159,20 @@ int MAIN(int argc, char **argv)
                        operation = SMIME_DECRYPT;
                else if (!strcmp (*args, "-sign"))
                        operation = SMIME_SIGN;
+               else if (!strcmp (*args, "-sign_receipt"))
+                       operation = SMIME_SIGN_RECEIPT;
                else if (!strcmp (*args, "-resign"))
                        operation = SMIME_RESIGN;
                else if (!strcmp (*args, "-verify"))
                        operation = SMIME_VERIFY;
+               else if (!strcmp(*args,"-verify_receipt"))
+                       {
+                       operation = SMIME_VERIFY_RECEIPT;
+                       if (!args[1])
+                               goto argerr;
+                       args++;
+                       rctfile = *args;
+                       }
                else if (!strcmp (*args, "-cmsout"))
                        operation = SMIME_CMSOUT;
                else if (!strcmp (*args, "-data_out"))
@@ -425,6 +437,12 @@ int MAIN(int argc, char **argv)
                                goto argerr;
                        keyform = str2fmt(*++args);
                        }
+               else if (!strcmp (*args, "-rctform"))
+                       {
+                       if (!args[1])
+                               goto argerr;
+                       rctformat = str2fmt(*++args);
+                       }
                else if (!strcmp (*args, "-certfile"))
                        {
                        if (!args[1])
@@ -525,6 +543,7 @@ int MAIN(int argc, char **argv)
                keyfile = NULL;
                need_rand = 1;
                }
+
        else if (operation == SMIME_DECRYPT)
                {
                if (!recipfile && !keyfile && !secret_key)
@@ -708,12 +727,22 @@ int MAIN(int argc, char **argv)
                        }
                }
 
+       if (operation == SMIME_SIGN_RECEIPT)
+               {
+               if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL,
+                       e, "receipt signer certificate file")))
+                       {
+                       ERR_print_errors(bio_err);
+                       goto end;
+                       }
+               }
+
        if (operation == SMIME_DECRYPT)
                {
                if (!keyfile)
                        keyfile = recipfile;
                }
-       else if (operation == SMIME_SIGN)
+       else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT))
                {
                if (!keyfile)
                        keyfile = signerfile;
@@ -770,6 +799,35 @@ int MAIN(int argc, char **argv)
                        }
                }
 
+       if (rctfile)
+               {
+               char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r";
+               if (!(rctin = BIO_new_file(rctfile, rctmode)))
+                       {
+                       BIO_printf (bio_err,
+                                "Can't open receipt file %s\n", rctfile);
+                       goto end;
+                       }
+               
+               if (rctformat == FORMAT_SMIME) 
+                       rcms = SMIME_read_CMS(rctin, NULL);
+               else if (rctformat == FORMAT_PEM) 
+                       rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL);
+               else if (rctformat == FORMAT_ASN1) 
+                       rcms = d2i_CMS_bio(rctin, NULL);
+               else
+                       {
+                       BIO_printf(bio_err, "Bad input format for receipt\n");
+                       goto end;
+                       }
+
+               if (!rcms)
+                       {
+                       BIO_printf(bio_err, "Error reading receipt\n");
+                       goto end;
+                       }
+               }
+
        if (outfile)
                {
                if (!(out = BIO_new_file(outfile, outmode)))
@@ -790,7 +848,7 @@ int MAIN(int argc, char **argv)
 #endif
                }
 
-       if (operation == SMIME_VERIFY)
+       if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT))
                {
                if (!(store = setup_verify(bio_err, CAfile, CApath)))
                        goto end;
@@ -843,6 +901,21 @@ int MAIN(int argc, char **argv)
                                                secret_key, secret_keylen,
                                                flags);
 
+               }
+       else if (operation == SMIME_SIGN_RECEIPT)
+               {
+               CMS_ContentInfo *srcms = NULL;
+               STACK_OF(CMS_SignerInfo) *sis;
+               CMS_SignerInfo *si;
+               sis = CMS_get0_SignerInfos(cms);
+               if (!sis)
+                       goto end;
+               si = sk_CMS_SignerInfo_value(sis, 0);
+               srcms = CMS_sign_receipt(si, signer, key, other, flags);
+               if (!srcms)
+                       goto end;
+               CMS_ContentInfo_free(cms);
+               cms = srcms;
                }
        else if (operation & SMIME_SIGNERS)
                {
@@ -1001,6 +1074,16 @@ int MAIN(int argc, char **argv)
                        receipt_request_print(bio_err, cms);
                                        
                }
+       else if (operation == SMIME_VERIFY_RECEIPT)
+               {
+               if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0)
+                       BIO_printf(bio_err, "Verification successful\n");
+               else
+                       {
+                       BIO_printf(bio_err, "Verification failure\n");
+                       goto end;
+                       }
+               }
        else
                {
                if (noout)
@@ -1068,6 +1151,8 @@ end:
        X509_free(signer);
        EVP_PKEY_free(key);
        CMS_ContentInfo_free(cms);
+       CMS_ContentInfo_free(rcms);
+       BIO_free(rctin);
        BIO_free(in);
        BIO_free(indata);
        BIO_free_all(out);