blob: f799c8fb50f6ee551d283d965b49c8387428946a [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 Child4983ddf2022-12-14 15:04:40 -060029/* BEGIN_CASE */
30void pkcs7_asn1_fail(data_t *pkcs7_buf)
31{
32 int res;
33 res = pkcs7_parse_buffer(pkcs7_buf->x, pkcs7_buf->len);
34 TEST_ASSERT(res != MBEDTLS_PKCS7_SIGNED_DATA);
35
36}
37/* END_CASE */
38
Nick Child45525d32022-02-25 11:54:34 -060039/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010040void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000041{
42 unsigned char *pkcs7_buf = NULL;
43 size_t buflen;
44 int res;
45
Gilles Peskine449bd832023-01-11 14:50:10 +010046 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
47 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000048
Nick Childb7817702022-12-12 15:49:35 -060049 res = pkcs7_parse_buffer(pkcs7_buf, buflen);
Gilles Peskine449bd832023-01-11 14:50:10 +010050 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000051
52exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010053 mbedtls_free(pkcs7_buf);
Nayna Jainc9deb182020-11-16 19:03:12 +000054}
55/* END_CASE */
56
Nick Child45525d32022-02-25 11:54:34 -060057/* 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 +010058void pkcs7_verify(char *pkcs7_file, char *crt, char *filetobesigned, int do_hash_alg,
59 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000060{
61 unsigned char *pkcs7_buf = NULL;
62 size_t buflen;
63 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -060064 unsigned char hash[64];
Nayna Jainc9deb182020-11-16 19:03:12 +000065 struct stat st;
66 size_t datalen;
67 int res;
68 FILE *file;
69 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000070
71 mbedtls_pkcs7 pkcs7;
72 mbedtls_x509_crt x509;
73
Gilles Peskine449bd832023-01-11 14:50:10 +010074 mbedtls_pkcs7_init(&pkcs7);
75 mbedtls_x509_crt_init(&x509);
Nayna Jainc9deb182020-11-16 19:03:12 +000076
Gilles Peskine391005c2022-11-27 21:32:37 +010077 USE_PSA_INIT();
78
Gilles Peskine449bd832023-01-11 14:50:10 +010079 res = mbedtls_x509_crt_parse_file(&x509, crt);
80 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000081
Gilles Peskine449bd832023-01-11 14:50:10 +010082 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
83 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000084
Gilles Peskine449bd832023-01-11 14:50:10 +010085 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
86 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nayna Jainc9deb182020-11-16 19:03:12 +000087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 res = stat(filetobesigned, &st);
89 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000090
Gilles Peskine449bd832023-01-11 14:50:10 +010091 file = fopen(filetobesigned, "rb");
92 TEST_ASSERT(file != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000093
94 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +010095 ASSERT_ALLOC(data, datalen);
96 TEST_ASSERT(data != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000097
Gilles Peskine449bd832023-01-11 14:50:10 +010098 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
99 TEST_EQUAL(buflen, datalen);
100 fclose(file);
Nayna Jainc9deb182020-11-16 19:03:12 +0000101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600103 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nayna Jainc9deb182020-11-16 19:03:12 +0000104
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 res = mbedtls_md(md_info, data, datalen, hash);
106 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +0000107
Nick Childff2746f2022-12-15 13:06:21 -0600108 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 } else {
110 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509, data, datalen);
Nick Child8a94de42022-09-14 10:51:51 -0500111 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +0000113
114exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 mbedtls_x509_crt_free(&x509);
116 mbedtls_free(data);
117 mbedtls_pkcs7_free(&pkcs7);
118 mbedtls_free(pkcs7_buf);
Nick Child8a10f662022-06-06 12:18:40 -0500119 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000120}
121/* END_CASE */
122
Nick Child45525d32022-02-25 11:54:34 -0600123/* 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 +0100124void pkcs7_verify_multiple_signers(char *pkcs7_file,
125 char *crt1,
126 char *crt2,
127 char *filetobesigned,
128 int do_hash_alg,
129 int res_expect)
Nick Child62b2d7e2022-07-14 16:24:59 -0500130{
131 unsigned char *pkcs7_buf = NULL;
132 size_t buflen;
133 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -0600134 unsigned char hash[64];
Nick Child62b2d7e2022-07-14 16:24:59 -0500135 struct stat st;
136 size_t datalen;
137 int res;
138 FILE *file;
139 const mbedtls_md_info_t *md_info;
Nick Child62b2d7e2022-07-14 16:24:59 -0500140
141 mbedtls_pkcs7 pkcs7;
142 mbedtls_x509_crt x509_1;
143 mbedtls_x509_crt x509_2;
144
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 mbedtls_pkcs7_init(&pkcs7);
146 mbedtls_x509_crt_init(&x509_1);
147 mbedtls_x509_crt_init(&x509_2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500148
Gilles Peskine391005c2022-11-27 21:32:37 +0100149 USE_PSA_INIT();
150
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
152 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500153
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
155 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500156
Gilles Peskine449bd832023-01-11 14:50:10 +0100157 TEST_EQUAL(pkcs7.signed_data.no_of_signers, 2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 res = mbedtls_x509_crt_parse_file(&x509_1, crt1);
160 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500161
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 res = mbedtls_x509_crt_parse_file(&x509_2, crt2);
163 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500164
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 res = stat(filetobesigned, &st);
166 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500167
Gilles Peskine449bd832023-01-11 14:50:10 +0100168 file = fopen(filetobesigned, "rb");
169 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500170
171 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +0100172 ASSERT_ALLOC(data, datalen);
173 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
174 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500175
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600179 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child62b2d7e2022-07-14 16:24:59 -0500180
Gilles Peskine449bd832023-01-11 14:50:10 +0100181 res = mbedtls_md(md_info, data, datalen, hash);
182 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500183
Nick Childff2746f2022-12-15 13:06:21 -0600184 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_1, hash, mbedtls_md_get_size(md_info));
185 TEST_EQUAL(res, res_expect);
186 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_2, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 TEST_EQUAL(res, res_expect);
188 } else {
189 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_1, data, datalen);
190 TEST_EQUAL(res, res_expect);
Nick Childff2746f2022-12-15 13:06:21 -0600191 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_2, data, datalen);
192 TEST_EQUAL(res, res_expect);
Nick Child8a94de42022-09-14 10:51:51 -0500193 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500194
Nick Child62b2d7e2022-07-14 16:24:59 -0500195exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100196 mbedtls_x509_crt_free(&x509_1);
197 mbedtls_x509_crt_free(&x509_2);
198 mbedtls_pkcs7_free(&pkcs7);
199 mbedtls_free(data);
200 mbedtls_free(pkcs7_buf);
Nick Child62b2d7e2022-07-14 16:24:59 -0500201 USE_PSA_DONE();
202}
203/* END_CASE */