Return an error if no recipient type matches.
[openssl.git] / demos / cms / cms_denc.c
1 /* S/MIME detached data encrypt example: rarely done but
2  * should the need arise this is an example....
3  */
4 #include <openssl/pem.h>
5 #include <openssl/cms.h>
6 #include <openssl/err.h>
7
8 int main(int argc, char **argv)
9         {
10         BIO *in = NULL, *out = NULL, *tbio = NULL, *dout = NULL;
11         X509 *rcert = NULL;
12         STACK_OF(X509) *recips = NULL;
13         CMS_ContentInfo *cms = NULL;
14         int ret = 1;
15
16         int flags = CMS_STREAM|CMS_DETACHED;
17
18         OpenSSL_add_all_algorithms();
19         ERR_load_crypto_strings();
20
21         /* Read in recipient certificate */
22         tbio = BIO_new_file("signer.pem", "r");
23
24         if (!tbio)
25                 goto err;
26
27         rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
28
29         if (!rcert)
30                 goto err;
31
32         /* Create recipient STACK and add recipient cert to it */
33         recips = sk_X509_new_null();
34
35         if (!recips || !sk_X509_push(recips, rcert))
36                 goto err;
37
38         /* sk_X509_pop_free will free up recipient STACK and its contents
39          * so set rcert to NULL so it isn't freed up twice.
40          */
41         rcert = NULL;
42
43         /* Open content being encrypted */
44
45         in = BIO_new_file("encr.txt", "r");
46
47         dout = BIO_new_file("smencr.out", "wb");
48
49         if (!in)
50                 goto err;
51
52         /* encrypt content */
53         cms = CMS_encrypt(recips, in, EVP_des_ede3_cbc(), flags);
54
55         if (!cms)
56                 goto err;
57
58         out = BIO_new_file("smencr.pem", "w");
59         if (!out)
60                 goto err;
61
62         if (!CMS_final(cms, in, dout, flags))
63                 goto err;
64
65         /* Write out CMS structure without content */
66         if (!PEM_write_bio_CMS(out, cms))
67                 goto err;
68
69         ret = 0;
70
71         err:
72
73         if (ret)
74                 {
75                 fprintf(stderr, "Error Encrypting Data\n");
76                 ERR_print_errors_fp(stderr);
77                 }
78
79         if (cms)
80                 CMS_ContentInfo_free(cms);
81         if (rcert)
82                 X509_free(rcert);
83         if (recips)
84                 sk_X509_pop_free(recips, X509_free);
85
86         if (in)
87                 BIO_free(in);
88         if (out)
89                 BIO_free(out);
90         if (dout)
91                 BIO_free(dout);
92         if (tbio)
93                 BIO_free(tbio);
94
95         return ret;
96
97         }