OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
cms_enc.c
Go to the documentation of this file.
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 1.0.0 and later only:
16  * for streaming set CMS_STREAM
17  */
18  int flags = CMS_STREAM;
19 
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  }