]>
Commit | Line | Data |
---|---|---|
f3eba36c | 1 | /* Simple S/MIME decryption example */ |
3b28bc99 DSH |
2 | #include <openssl/pem.h> |
3 | #include <openssl/cms.h> | |
4 | #include <openssl/err.h> | |
5 | ||
6 | int main(int argc, char **argv) | |
ae5c8664 MC |
7 | { |
8 | BIO *in = NULL, *out = NULL, *tbio = NULL; | |
9 | X509 *rcert = NULL; | |
10 | EVP_PKEY *rkey = NULL; | |
11 | CMS_ContentInfo *cms = NULL; | |
12 | int ret = 1; | |
3b28bc99 | 13 | |
ae5c8664 MC |
14 | OpenSSL_add_all_algorithms(); |
15 | ERR_load_crypto_strings(); | |
3b28bc99 | 16 | |
ae5c8664 MC |
17 | /* Read in recipient certificate and private key */ |
18 | tbio = BIO_new_file("signer.pem", "r"); | |
3b28bc99 | 19 | |
ae5c8664 MC |
20 | if (!tbio) |
21 | goto err; | |
3b28bc99 | 22 | |
ae5c8664 | 23 | rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL); |
3b28bc99 | 24 | |
ae5c8664 | 25 | BIO_reset(tbio); |
3b28bc99 | 26 | |
ae5c8664 | 27 | rkey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL); |
3b28bc99 | 28 | |
ae5c8664 MC |
29 | if (!rcert || !rkey) |
30 | goto err; | |
3b28bc99 | 31 | |
ae5c8664 | 32 | /* Open S/MIME message to decrypt */ |
3b28bc99 | 33 | |
ae5c8664 | 34 | in = BIO_new_file("smencr.txt", "r"); |
3b28bc99 | 35 | |
ae5c8664 MC |
36 | if (!in) |
37 | goto err; | |
3b28bc99 | 38 | |
ae5c8664 MC |
39 | /* Parse message */ |
40 | cms = SMIME_read_CMS(in, NULL); | |
3b28bc99 | 41 | |
ae5c8664 MC |
42 | if (!cms) |
43 | goto err; | |
3b28bc99 | 44 | |
ae5c8664 MC |
45 | out = BIO_new_file("decout.txt", "w"); |
46 | if (!out) | |
47 | goto err; | |
3b28bc99 | 48 | |
ae5c8664 MC |
49 | /* Decrypt S/MIME message */ |
50 | if (!CMS_decrypt(cms, rkey, rcert, NULL, out, 0)) | |
51 | goto err; | |
3b28bc99 | 52 | |
ae5c8664 | 53 | ret = 0; |
3b28bc99 | 54 | |
ae5c8664 | 55 | err: |
3b28bc99 | 56 | |
ae5c8664 MC |
57 | if (ret) { |
58 | fprintf(stderr, "Error Decrypting Data\n"); | |
59 | ERR_print_errors_fp(stderr); | |
60 | } | |
3b28bc99 | 61 | |
ae5c8664 MC |
62 | if (cms) |
63 | CMS_ContentInfo_free(cms); | |
64 | if (rcert) | |
65 | X509_free(rcert); | |
66 | if (rkey) | |
67 | EVP_PKEY_free(rkey); | |
3b28bc99 | 68 | |
ae5c8664 MC |
69 | if (in) |
70 | BIO_free(in); | |
71 | if (out) | |
72 | BIO_free(out); | |
73 | if (tbio) | |
74 | BIO_free(tbio); | |
3b28bc99 | 75 | |
ae5c8664 | 76 | return ret; |
3b28bc99 | 77 | |
ae5c8664 | 78 | } |