1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* Simple S/MIME signing example */ 11e1051a39Sopenharmony_ci#include <openssl/pem.h> 12e1051a39Sopenharmony_ci#include <openssl/cms.h> 13e1051a39Sopenharmony_ci#include <openssl/err.h> 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_ciint main(int argc, char **argv) 16e1051a39Sopenharmony_ci{ 17e1051a39Sopenharmony_ci BIO *in = NULL, *out = NULL, *tbio = NULL; 18e1051a39Sopenharmony_ci X509 *scert = NULL; 19e1051a39Sopenharmony_ci EVP_PKEY *skey = NULL; 20e1051a39Sopenharmony_ci CMS_ContentInfo *cms = NULL; 21e1051a39Sopenharmony_ci int ret = 1; 22e1051a39Sopenharmony_ci 23e1051a39Sopenharmony_ci /* 24e1051a39Sopenharmony_ci * For simple S/MIME signing use CMS_DETACHED. On OpenSSL 1.0.0 only: for 25e1051a39Sopenharmony_ci * streaming detached set CMS_DETACHED|CMS_STREAM for streaming 26e1051a39Sopenharmony_ci * non-detached set CMS_STREAM 27e1051a39Sopenharmony_ci */ 28e1051a39Sopenharmony_ci int flags = CMS_DETACHED | CMS_STREAM; 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ci OpenSSL_add_all_algorithms(); 31e1051a39Sopenharmony_ci ERR_load_crypto_strings(); 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_ci /* Read in signer certificate and private key */ 34e1051a39Sopenharmony_ci tbio = BIO_new_file("signer.pem", "r"); 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_ci if (!tbio) 37e1051a39Sopenharmony_ci goto err; 38e1051a39Sopenharmony_ci 39e1051a39Sopenharmony_ci scert = PEM_read_bio_X509(tbio, NULL, 0, NULL); 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_ci BIO_reset(tbio); 42e1051a39Sopenharmony_ci 43e1051a39Sopenharmony_ci skey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL); 44e1051a39Sopenharmony_ci 45e1051a39Sopenharmony_ci if (!scert || !skey) 46e1051a39Sopenharmony_ci goto err; 47e1051a39Sopenharmony_ci 48e1051a39Sopenharmony_ci /* Open content being signed */ 49e1051a39Sopenharmony_ci 50e1051a39Sopenharmony_ci in = BIO_new_file("sign.txt", "r"); 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_ci if (!in) 53e1051a39Sopenharmony_ci goto err; 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci /* Sign content */ 56e1051a39Sopenharmony_ci cms = CMS_sign(scert, skey, NULL, in, flags); 57e1051a39Sopenharmony_ci 58e1051a39Sopenharmony_ci if (!cms) 59e1051a39Sopenharmony_ci goto err; 60e1051a39Sopenharmony_ci 61e1051a39Sopenharmony_ci out = BIO_new_file("smout.txt", "w"); 62e1051a39Sopenharmony_ci if (!out) 63e1051a39Sopenharmony_ci goto err; 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ci if (!(flags & CMS_STREAM)) 66e1051a39Sopenharmony_ci BIO_reset(in); 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci /* Write out S/MIME message */ 69e1051a39Sopenharmony_ci if (!SMIME_write_CMS(out, cms, in, flags)) 70e1051a39Sopenharmony_ci goto err; 71e1051a39Sopenharmony_ci 72e1051a39Sopenharmony_ci ret = 0; 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci err: 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci if (ret) { 77e1051a39Sopenharmony_ci fprintf(stderr, "Error Signing Data\n"); 78e1051a39Sopenharmony_ci ERR_print_errors_fp(stderr); 79e1051a39Sopenharmony_ci } 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ci CMS_ContentInfo_free(cms); 82e1051a39Sopenharmony_ci X509_free(scert); 83e1051a39Sopenharmony_ci EVP_PKEY_free(skey); 84e1051a39Sopenharmony_ci BIO_free(in); 85e1051a39Sopenharmony_ci BIO_free(out); 86e1051a39Sopenharmony_ci BIO_free(tbio); 87e1051a39Sopenharmony_ci return ret; 88e1051a39Sopenharmony_ci} 89