blob: 43c10e2513c8ad7b2c15aec722876a325422e0be [file] [log] [blame]
Rich Salz9e200682016-05-18 09:16:36 -04001/*
2 * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (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
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000010/* Simple S/MIME verification example */
11#include <openssl/pem.h>
12#include <openssl/cms.h>
13#include <openssl/err.h>
14
15int main(int argc, char **argv)
Matt Caswell0f113f32015-01-22 03:40:55 +000016{
17 BIO *in = NULL, *out = NULL, *tbio = NULL, *cont = NULL;
18 X509_STORE *st = NULL;
19 X509 *cacert = NULL;
20 CMS_ContentInfo *cms = NULL;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000021
Matt Caswell0f113f32015-01-22 03:40:55 +000022 int ret = 1;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000023
Matt Caswell0f113f32015-01-22 03:40:55 +000024 OpenSSL_add_all_algorithms();
25 ERR_load_crypto_strings();
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000026
Matt Caswell0f113f32015-01-22 03:40:55 +000027 /* Set up trusted CA certificate store */
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000028
Matt Caswell0f113f32015-01-22 03:40:55 +000029 st = X509_STORE_new();
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000030
Matt Caswell0f113f32015-01-22 03:40:55 +000031 /* Read in CA certificate */
32 tbio = BIO_new_file("cacert.pem", "r");
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000033
Matt Caswell0f113f32015-01-22 03:40:55 +000034 if (!tbio)
35 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000036
Matt Caswell0f113f32015-01-22 03:40:55 +000037 cacert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000038
Matt Caswell0f113f32015-01-22 03:40:55 +000039 if (!cacert)
40 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000041
Matt Caswell0f113f32015-01-22 03:40:55 +000042 if (!X509_STORE_add_cert(st, cacert))
43 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000044
Matt Caswell0f113f32015-01-22 03:40:55 +000045 /* Open message being verified */
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000046
Matt Caswell0f113f32015-01-22 03:40:55 +000047 in = BIO_new_file("smout.txt", "r");
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000048
Matt Caswell0f113f32015-01-22 03:40:55 +000049 if (!in)
50 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000051
Matt Caswell0f113f32015-01-22 03:40:55 +000052 /* parse message */
53 cms = SMIME_read_CMS(in, &cont);
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000054
Matt Caswell0f113f32015-01-22 03:40:55 +000055 if (!cms)
56 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000057
Matt Caswell0f113f32015-01-22 03:40:55 +000058 /* File to output verified content to */
59 out = BIO_new_file("smver.txt", "w");
60 if (!out)
61 goto err;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000062
Matt Caswell0f113f32015-01-22 03:40:55 +000063 if (!CMS_verify(cms, NULL, st, cont, out, 0)) {
64 fprintf(stderr, "Verification Failure\n");
65 goto err;
66 }
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000067
Matt Caswell0f113f32015-01-22 03:40:55 +000068 fprintf(stderr, "Verification Successful\n");
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000069
Matt Caswell0f113f32015-01-22 03:40:55 +000070 ret = 0;
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000071
Matt Caswell0f113f32015-01-22 03:40:55 +000072 err:
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000073
Matt Caswell0f113f32015-01-22 03:40:55 +000074 if (ret) {
75 fprintf(stderr, "Error Verifying Data\n");
76 ERR_print_errors_fp(stderr);
77 }
Dr. Stephen Henson3b28bc92008-04-11 16:52:45 +000078
Rich Salz25aaa982015-05-01 14:37:16 -040079 CMS_ContentInfo_free(cms);
Rich Salz222561f2015-04-30 17:33:59 -040080 X509_free(cacert);
Rich Salzca3a82c2015-03-25 11:31:18 -040081 BIO_free(in);
82 BIO_free(out);
83 BIO_free(tbio);
Matt Caswell0f113f32015-01-22 03:40:55 +000084 return ret;
Matt Caswell0f113f32015-01-22 03:40:55 +000085}