Home | History | Annotate | Line # | Download | only in cms
      1 /*
      2  * Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /* Simple S/MIME encrypt example */
     11 #include <openssl/pem.h>
     12 #include <openssl/cms.h>
     13 #include <openssl/err.h>
     14 
     15 int main(int argc, char **argv)
     16 {
     17     BIO *in = NULL, *out = NULL, *tbio = NULL;
     18     X509 *rcert = NULL;
     19     STACK_OF(X509) *recips = NULL;
     20     CMS_ContentInfo *cms = NULL;
     21     int ret = EXIT_FAILURE;
     22 
     23     /*
     24      * On OpenSSL 1.0.0 and later only:
     25      * for streaming set CMS_STREAM
     26      */
     27     int flags = CMS_STREAM;
     28 
     29     OpenSSL_add_all_algorithms();
     30     ERR_load_crypto_strings();
     31 
     32     /* Read in recipient certificate */
     33     tbio = BIO_new_file("signer.pem", "r");
     34 
     35     if (!tbio)
     36         goto err;
     37 
     38     rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
     39 
     40     if (!rcert)
     41         goto err;
     42 
     43     /* Create recipient STACK and add recipient cert to it */
     44     recips = sk_X509_new_null();
     45 
     46     if (!recips || !sk_X509_push(recips, rcert))
     47         goto err;
     48 
     49     /*
     50      * OSSL_STACK_OF_X509_free() will free up recipient STACK and its contents
     51      * so set rcert to NULL so it isn't freed up twice.
     52      */
     53     rcert = NULL;
     54 
     55     /* Open content being encrypted */
     56 
     57     in = BIO_new_file("encr.txt", "r");
     58 
     59     if (!in)
     60         goto err;
     61 
     62     /* encrypt content */
     63     cms = CMS_encrypt(recips, in, EVP_des_ede3_cbc(), flags);
     64 
     65     if (!cms)
     66         goto err;
     67 
     68     out = BIO_new_file("smencr.txt", "w");
     69     if (!out)
     70         goto err;
     71 
     72     /* Write out S/MIME message */
     73     if (!SMIME_write_CMS(out, cms, in, flags))
     74         goto err;
     75 
     76     printf("Encryption Successful\n");
     77 
     78     ret = EXIT_SUCCESS;
     79 err:
     80     if (ret != EXIT_SUCCESS) {
     81         fprintf(stderr, "Error Encrypting Data\n");
     82         ERR_print_errors_fp(stderr);
     83     }
     84 
     85     CMS_ContentInfo_free(cms);
     86     X509_free(rcert);
     87     OSSL_STACK_OF_X509_free(recips);
     88     BIO_free(in);
     89     BIO_free(out);
     90     BIO_free(tbio);
     91     return ret;
     92 }
     93