blob: bcd04402a69a025e4449e9608bdef6b16f90295a [file] [log] [blame]
Nayna Jainc9deb182020-11-16 19:03:12 +00001/* BEGIN_HEADER */
2#include "mbedtls/bignum.h"
3#include "mbedtls/pkcs7.h"
4#include "mbedtls/x509.h"
5#include "mbedtls/x509_crt.h"
6#include "mbedtls/x509_crl.h"
7#include "mbedtls/oid.h"
8#include "sys/types.h"
9#include "sys/stat.h"
10/* END_HEADER */
11
12/* BEGIN_DEPENDENCIES
Dave Rodgman2364aae2022-11-04 11:33:04 +000013 * depends_on:MBEDTLS_PKCS7_C:MBEDTLS_RSA_C
Nayna Jainc9deb182020-11-16 19:03:12 +000014 * END_DEPENDENCIES
15 */
Nick Childb7817702022-12-12 15:49:35 -060016/* BEGIN_SUITE_HELPERS */
17int pkcs7_parse_buffer(unsigned char *pkcs7_buf, int buflen)
18{
19 int res;
20 mbedtls_pkcs7 pkcs7;
21
22 mbedtls_pkcs7_init(&pkcs7);
23 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
24 mbedtls_pkcs7_free(&pkcs7);
25 return res;
26}
27/* END_SUITE_HELPERS */
Nayna Jainc9deb182020-11-16 19:03:12 +000028
Nick Child45525d32022-02-25 11:54:34 -060029/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010030void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000031{
32 unsigned char *pkcs7_buf = NULL;
33 size_t buflen;
34 int res;
35
Gilles Peskine449bd832023-01-11 14:50:10 +010036 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
37 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000038
Nick Childb7817702022-12-12 15:49:35 -060039 res = pkcs7_parse_buffer(pkcs7_buf, buflen);
Gilles Peskine449bd832023-01-11 14:50:10 +010040 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000041
42exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010043 mbedtls_free(pkcs7_buf);
Nayna Jainc9deb182020-11-16 19:03:12 +000044}
45/* END_CASE */
46
Nick Child45525d32022-02-25 11:54:34 -060047/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +010048void pkcs7_verify(char *pkcs7_file, char *crt, char *filetobesigned, int do_hash_alg,
49 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000050{
51 unsigned char *pkcs7_buf = NULL;
52 size_t buflen;
53 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -060054 unsigned char hash[64];
Nayna Jainc9deb182020-11-16 19:03:12 +000055 struct stat st;
56 size_t datalen;
57 int res;
58 FILE *file;
59 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000060
61 mbedtls_pkcs7 pkcs7;
62 mbedtls_x509_crt x509;
63
Gilles Peskine449bd832023-01-11 14:50:10 +010064 mbedtls_pkcs7_init(&pkcs7);
65 mbedtls_x509_crt_init(&x509);
Nayna Jainc9deb182020-11-16 19:03:12 +000066
Gilles Peskine391005c2022-11-27 21:32:37 +010067 USE_PSA_INIT();
68
Gilles Peskine449bd832023-01-11 14:50:10 +010069 res = mbedtls_x509_crt_parse_file(&x509, crt);
70 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000071
Gilles Peskine449bd832023-01-11 14:50:10 +010072 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
73 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000074
Gilles Peskine449bd832023-01-11 14:50:10 +010075 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
76 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nayna Jainc9deb182020-11-16 19:03:12 +000077
Gilles Peskine449bd832023-01-11 14:50:10 +010078 res = stat(filetobesigned, &st);
79 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000080
Gilles Peskine449bd832023-01-11 14:50:10 +010081 file = fopen(filetobesigned, "rb");
82 TEST_ASSERT(file != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000083
84 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +010085 ASSERT_ALLOC(data, datalen);
86 TEST_ASSERT(data != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
89 TEST_EQUAL(buflen, datalen);
90 fclose(file);
Nayna Jainc9deb182020-11-16 19:03:12 +000091
Gilles Peskine449bd832023-01-11 14:50:10 +010092 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -060093 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nayna Jainc9deb182020-11-16 19:03:12 +000094
Gilles Peskine449bd832023-01-11 14:50:10 +010095 res = mbedtls_md(md_info, data, datalen, hash);
96 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000097
Nick Childff2746f2022-12-15 13:06:21 -060098 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +010099 } else {
100 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509, data, datalen);
Nick Child8a94de42022-09-14 10:51:51 -0500101 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +0000103
104exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 mbedtls_x509_crt_free(&x509);
106 mbedtls_free(data);
107 mbedtls_pkcs7_free(&pkcs7);
108 mbedtls_free(pkcs7_buf);
Nick Child8a10f662022-06-06 12:18:40 -0500109 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000110}
111/* END_CASE */
112
Nick Child45525d32022-02-25 11:54:34 -0600113/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100114void pkcs7_verify_multiple_signers(char *pkcs7_file,
115 char *crt1,
116 char *crt2,
117 char *filetobesigned,
118 int do_hash_alg,
119 int res_expect)
Nick Child62b2d7e2022-07-14 16:24:59 -0500120{
121 unsigned char *pkcs7_buf = NULL;
122 size_t buflen;
123 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -0600124 unsigned char hash[64];
Nick Child62b2d7e2022-07-14 16:24:59 -0500125 struct stat st;
126 size_t datalen;
127 int res;
128 FILE *file;
129 const mbedtls_md_info_t *md_info;
Nick Child62b2d7e2022-07-14 16:24:59 -0500130
131 mbedtls_pkcs7 pkcs7;
132 mbedtls_x509_crt x509_1;
133 mbedtls_x509_crt x509_2;
134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 mbedtls_pkcs7_init(&pkcs7);
136 mbedtls_x509_crt_init(&x509_1);
137 mbedtls_x509_crt_init(&x509_2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500138
Gilles Peskine391005c2022-11-27 21:32:37 +0100139 USE_PSA_INIT();
140
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
142 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500143
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
145 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500146
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 TEST_EQUAL(pkcs7.signed_data.no_of_signers, 2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500148
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 res = mbedtls_x509_crt_parse_file(&x509_1, crt1);
150 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500151
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 res = mbedtls_x509_crt_parse_file(&x509_2, crt2);
153 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500154
Gilles Peskine449bd832023-01-11 14:50:10 +0100155 res = stat(filetobesigned, &st);
156 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500157
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 file = fopen(filetobesigned, "rb");
159 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500160
161 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 ASSERT_ALLOC(data, datalen);
163 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
164 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500165
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500167
Gilles Peskine449bd832023-01-11 14:50:10 +0100168 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600169 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child62b2d7e2022-07-14 16:24:59 -0500170
Gilles Peskine449bd832023-01-11 14:50:10 +0100171 res = mbedtls_md(md_info, data, datalen, hash);
172 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500173
Nick Childff2746f2022-12-15 13:06:21 -0600174 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_1, hash, mbedtls_md_get_size(md_info));
175 TEST_EQUAL(res, res_expect);
176 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_2, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100177 TEST_EQUAL(res, res_expect);
178 } else {
179 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_1, data, datalen);
180 TEST_EQUAL(res, res_expect);
Nick Childff2746f2022-12-15 13:06:21 -0600181 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_2, data, datalen);
182 TEST_EQUAL(res, res_expect);
Nick Child8a94de42022-09-14 10:51:51 -0500183 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500184
Nick Child62b2d7e2022-07-14 16:24:59 -0500185exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 mbedtls_x509_crt_free(&x509_1);
187 mbedtls_x509_crt_free(&x509_2);
188 mbedtls_pkcs7_free(&pkcs7);
189 mbedtls_free(data);
190 mbedtls_free(pkcs7_buf);
Nick Child62b2d7e2022-07-14 16:24:59 -0500191 USE_PSA_DONE();
192}
193/* END_CASE */