xref: /netbsd-src/crypto/external/bsd/openssl/dist/demos/cms/cms_enc.c (revision b1c86f5f087524e68db12794ee9c3e3da1ab17a0)
1 /* Simple S/MIME encrypt example */
2 #include <openssl/pem.h>
3 #include <openssl/cms.h>
4 #include <openssl/err.h>
5 
6 int main(int argc, char **argv)
7 	{
8 	BIO *in = NULL, *out = NULL, *tbio = NULL;
9 	X509 *rcert = NULL;
10 	STACK_OF(X509) *recips = NULL;
11 	CMS_ContentInfo *cms = NULL;
12 	int ret = 1;
13 
14 	/*
15 	 * On OpenSSL 0.9.9 only:
16 	 * for streaming set CMS_STREAM
17 	 */
18 	int flags = CMS_STREAM;
19 
20 	OpenSSL_add_all_algorithms();
21 	ERR_load_crypto_strings();
22 
23 	/* Read in recipient certificate */
24 	tbio = BIO_new_file("signer.pem", "r");
25 
26 	if (!tbio)
27 		goto err;
28 
29 	rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
30 
31 	if (!rcert)
32 		goto err;
33 
34 	/* Create recipient STACK and add recipient cert to it */
35 	recips = sk_X509_new_null();
36 
37 	if (!recips || !sk_X509_push(recips, rcert))
38 		goto err;
39 
40 	/* sk_X509_pop_free will free up recipient STACK and its contents
41 	 * so set rcert to NULL so it isn't freed up twice.
42 	 */
43 	rcert = NULL;
44 
45 	/* Open content being encrypted */
46 
47 	in = BIO_new_file("encr.txt", "r");
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.txt", "w");
59 	if (!out)
60 		goto err;
61 
62 	/* Write out S/MIME message */
63 	if (!SMIME_write_CMS(out, cms, in, flags))
64 		goto err;
65 
66 	ret = 0;
67 
68 	err:
69 
70 	if (ret)
71 		{
72 		fprintf(stderr, "Error Encrypting Data\n");
73 		ERR_print_errors_fp(stderr);
74 		}
75 
76 	if (cms)
77 		CMS_ContentInfo_free(cms);
78 	if (rcert)
79 		X509_free(rcert);
80 	if (recips)
81 		sk_X509_pop_free(recips, X509_free);
82 
83 	if (in)
84 		BIO_free(in);
85 	if (out)
86 		BIO_free(out);
87 	if (tbio)
88 		BIO_free(tbio);
89 
90 	return ret;
91 
92 	}
93