1/* S/MIME detached data decrypt 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 8int main(int argc, char **argv) 9 { 10 BIO *in = NULL, *out = NULL, *tbio = NULL, *dcont = NULL; 11 X509 *rcert = NULL; 12 EVP_PKEY *rkey = NULL; 13 CMS_ContentInfo *cms = NULL; 14 int ret = 1; 15 16 OpenSSL_add_all_algorithms(); 17 ERR_load_crypto_strings(); 18 19 /* Read in recipient certificate and private key */ 20 tbio = BIO_new_file("signer.pem", "r"); 21 22 if (!tbio) 23 goto err; 24 25 rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL); 26 27 BIO_reset(tbio); 28 29 rkey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL); 30 31 if (!rcert || !rkey) 32 goto err; 33 34 /* Open PEM file containing enveloped data */ 35 36 in = BIO_new_file("smencr.pem", "r"); 37 38 if (!in) 39 goto err; 40 41 /* Parse PEM content */ 42 cms = PEM_read_bio_CMS(in, NULL, 0, NULL); 43 44 if (!cms) 45 goto err; 46 47 /* Open file containing detached content */ 48 dcont = BIO_new_file("smencr.out", "rb"); 49 50 if (!in) 51 goto err; 52 53 out = BIO_new_file("encrout.txt", "w"); 54 if (!out) 55 goto err; 56 57 /* Decrypt S/MIME message */ 58 if (!CMS_decrypt(cms, rkey, rcert, dcont, out, 0)) 59 goto err; 60 61 ret = 0; 62 63 err: 64 65 if (ret) 66 { 67 fprintf(stderr, "Error Decrypting Data\n"); 68 ERR_print_errors_fp(stderr); 69 } 70 71 if (cms) 72 CMS_ContentInfo_free(cms); 73 if (rcert) 74 X509_free(rcert); 75 if (rkey) 76 EVP_PKEY_free(rkey); 77 78 if (in) 79 BIO_free(in); 80 if (out) 81 BIO_free(out); 82 if (tbio) 83 BIO_free(tbio); 84 if (dcont) 85 BIO_free(dcont); 86 87 return ret; 88 89 } 90