OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
cms_denc.c
Go to the documentation of this file.
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 
17 
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  }