blob: d5a69dae1321d30ec61416935aa4af8351e6c613 [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 */
16
Nick Child45525d32022-02-25 11:54:34 -060017/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010018void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000019{
20 unsigned char *pkcs7_buf = NULL;
21 size_t buflen;
22 int res;
23
24 mbedtls_pkcs7 pkcs7;
25
Gilles Peskine449bd832023-01-11 14:50:10 +010026 mbedtls_pkcs7_init(&pkcs7);
Nayna Jainc9deb182020-11-16 19:03:12 +000027
Gilles Peskine449bd832023-01-11 14:50:10 +010028 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
29 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000030
Gilles Peskine449bd832023-01-11 14:50:10 +010031 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
32 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000033
34exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010035 mbedtls_free(pkcs7_buf);
36 mbedtls_pkcs7_free(&pkcs7);
Nayna Jainc9deb182020-11-16 19:03:12 +000037}
38/* END_CASE */
39
Nick Child45525d32022-02-25 11:54:34 -060040/* 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 +010041void pkcs7_verify(char *pkcs7_file, char *crt, char *filetobesigned, int do_hash_alg,
42 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000043{
44 unsigned char *pkcs7_buf = NULL;
45 size_t buflen;
46 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -060047 unsigned char hash[64];
Nayna Jainc9deb182020-11-16 19:03:12 +000048 struct stat st;
49 size_t datalen;
50 int res;
51 FILE *file;
52 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000053
54 mbedtls_pkcs7 pkcs7;
55 mbedtls_x509_crt x509;
56
Gilles Peskine449bd832023-01-11 14:50:10 +010057 mbedtls_pkcs7_init(&pkcs7);
58 mbedtls_x509_crt_init(&x509);
Nayna Jainc9deb182020-11-16 19:03:12 +000059
Gilles Peskine391005c2022-11-27 21:32:37 +010060 USE_PSA_INIT();
61
Gilles Peskine449bd832023-01-11 14:50:10 +010062 res = mbedtls_x509_crt_parse_file(&x509, crt);
63 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000064
Gilles Peskine449bd832023-01-11 14:50:10 +010065 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
66 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000067
Gilles Peskine449bd832023-01-11 14:50:10 +010068 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
69 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nayna Jainc9deb182020-11-16 19:03:12 +000070
Gilles Peskine449bd832023-01-11 14:50:10 +010071 res = stat(filetobesigned, &st);
72 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000073
Gilles Peskine449bd832023-01-11 14:50:10 +010074 file = fopen(filetobesigned, "rb");
75 TEST_ASSERT(file != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000076
77 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +010078 ASSERT_ALLOC(data, datalen);
79 TEST_ASSERT(data != NULL);
Nayna Jainc9deb182020-11-16 19:03:12 +000080
Gilles Peskine449bd832023-01-11 14:50:10 +010081 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
82 TEST_EQUAL(buflen, datalen);
83 fclose(file);
Nayna Jainc9deb182020-11-16 19:03:12 +000084
Gilles Peskine449bd832023-01-11 14:50:10 +010085 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -060086 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nayna Jainc9deb182020-11-16 19:03:12 +000087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 res = mbedtls_md(md_info, data, datalen, hash);
89 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000090
Nick Childff2746f2022-12-15 13:06:21 -060091 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +010092 } else {
93 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509, data, datalen);
Nick Child8a94de42022-09-14 10:51:51 -050094 }
Gilles Peskine449bd832023-01-11 14:50:10 +010095 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000096
97exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010098 mbedtls_x509_crt_free(&x509);
99 mbedtls_free(data);
100 mbedtls_pkcs7_free(&pkcs7);
101 mbedtls_free(pkcs7_buf);
Nick Child8a10f662022-06-06 12:18:40 -0500102 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000103}
104/* END_CASE */
105
Nick Child45525d32022-02-25 11:54:34 -0600106/* 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 +0100107void pkcs7_verify_multiple_signers(char *pkcs7_file,
108 char *crt1,
109 char *crt2,
110 char *filetobesigned,
111 int do_hash_alg,
112 int res_expect)
Nick Child62b2d7e2022-07-14 16:24:59 -0500113{
114 unsigned char *pkcs7_buf = NULL;
115 size_t buflen;
116 unsigned char *data = NULL;
Nick Childff2746f2022-12-15 13:06:21 -0600117 unsigned char hash[64];
Nick Child62b2d7e2022-07-14 16:24:59 -0500118 struct stat st;
119 size_t datalen;
120 int res;
121 FILE *file;
122 const mbedtls_md_info_t *md_info;
Nick Child62b2d7e2022-07-14 16:24:59 -0500123
124 mbedtls_pkcs7 pkcs7;
125 mbedtls_x509_crt x509_1;
126 mbedtls_x509_crt x509_2;
127
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 mbedtls_pkcs7_init(&pkcs7);
129 mbedtls_x509_crt_init(&x509_1);
130 mbedtls_x509_crt_init(&x509_2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500131
Gilles Peskine391005c2022-11-27 21:32:37 +0100132 USE_PSA_INIT();
133
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
135 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500136
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
138 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500139
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 TEST_EQUAL(pkcs7.signed_data.no_of_signers, 2);
Nick Child62b2d7e2022-07-14 16:24:59 -0500141
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 res = mbedtls_x509_crt_parse_file(&x509_1, crt1);
143 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500144
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 res = mbedtls_x509_crt_parse_file(&x509_2, crt2);
146 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 res = stat(filetobesigned, &st);
149 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500150
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 file = fopen(filetobesigned, "rb");
152 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500153
154 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +0100155 ASSERT_ALLOC(data, datalen);
156 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
157 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500160
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600162 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child62b2d7e2022-07-14 16:24:59 -0500163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 res = mbedtls_md(md_info, data, datalen, hash);
165 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500166
Nick Childff2746f2022-12-15 13:06:21 -0600167 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_1, hash, mbedtls_md_get_size(md_info));
168 TEST_EQUAL(res, res_expect);
169 res = mbedtls_pkcs7_signed_hash_verify(&pkcs7, &x509_2, hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 TEST_EQUAL(res, res_expect);
171 } else {
172 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_1, data, datalen);
173 TEST_EQUAL(res, res_expect);
Nick Childff2746f2022-12-15 13:06:21 -0600174 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, &x509_2, data, datalen);
175 TEST_EQUAL(res, res_expect);
Nick Child8a94de42022-09-14 10:51:51 -0500176 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500177
Nick Child62b2d7e2022-07-14 16:24:59 -0500178exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 mbedtls_x509_crt_free(&x509_1);
180 mbedtls_x509_crt_free(&x509_2);
181 mbedtls_pkcs7_free(&pkcs7);
182 mbedtls_free(data);
183 mbedtls_free(pkcs7_buf);
Nick Child62b2d7e2022-07-14 16:24:59 -0500184 USE_PSA_DONE();
185}
186/* END_CASE */