blob: 62f9f66b69d0441bd191793727d50c7ccc18581c [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 */
Nick Childc5474472023-01-27 21:06:39 +000058void pkcs7_verify(char *pkcs7_file,
59 char *crt_files,
60 char *filetobesigned,
61 int do_hash_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010062 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000063{
64 unsigned char *pkcs7_buf = NULL;
Nick Childc5474472023-01-27 21:06:39 +000065 size_t buflen, i, k, cnt = 0, n_crts = 1;
Nayna Jainc9deb182020-11-16 19:03:12 +000066 unsigned char *data = NULL;
Nick Childc5474472023-01-27 21:06:39 +000067 char **crt_files_arr = NULL;
Nick Child951f7002023-01-30 16:35:58 +000068 unsigned char *hash = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000069 struct stat st;
70 size_t datalen;
71 int res;
72 FILE *file;
73 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000074 mbedtls_pkcs7 pkcs7;
Nick Childc5474472023-01-27 21:06:39 +000075 mbedtls_x509_crt **crts = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000076
Nayna Jainc9deb182020-11-16 19:03:12 +000077
Nick Childc5474472023-01-27 21:06:39 +000078 /* crt_files are space seprated list */
79 for (i = 0; i < strlen(crt_files); i++) {
80 if (crt_files[i] == ' ') {
81 n_crts++;
82 }
Nick Child8a94de42022-09-14 10:51:51 -050083 }
Nayna Jainc9deb182020-11-16 19:03:12 +000084
Nick Childc5474472023-01-27 21:06:39 +000085 ASSERT_ALLOC(crts, sizeof(*crts)*n_crts);
86 ASSERT_ALLOC(crt_files_arr, sizeof(*crt_files_arr)*n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000087
Nick Childc5474472023-01-27 21:06:39 +000088 for (i = 0; i < strlen(crt_files); i++) {
89 for (k = i; k < strlen(crt_files); k++) {
90 if (crt_files[k] == ' ') {
91 break;
92 }
93 }
94 ASSERT_ALLOC(crt_files_arr[cnt], (k-i)+1);
95 crt_files_arr[cnt][k-i] = '\0';
96 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
97 i = k;
98 }
Nick Child62b2d7e2022-07-14 16:24:59 -050099
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 mbedtls_pkcs7_init(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000101 for (i = 0; i < n_crts; i++) {
102 ASSERT_ALLOC(crts[i], sizeof(*crts[i]));
103 mbedtls_x509_crt_init(crts[i]);
104 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500105
Gilles Peskine391005c2022-11-27 21:32:37 +0100106 USE_PSA_INIT();
107
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
109 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500110
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
112 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500113
Nick Childc5474472023-01-27 21:06:39 +0000114 TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts);
Nick Child62b2d7e2022-07-14 16:24:59 -0500115
Nick Childc5474472023-01-27 21:06:39 +0000116 for (i = 0; i < n_crts; i++) {
117 res = mbedtls_x509_crt_parse_file(crts[i], crt_files_arr[i]);
118 TEST_EQUAL(res, 0);
119 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500120
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 res = stat(filetobesigned, &st);
122 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 file = fopen(filetobesigned, "rb");
125 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500126
127 datalen = st.st_size;
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 ASSERT_ALLOC(data, datalen);
129 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
130 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500131
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500133
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600135 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child951f7002023-01-30 16:35:58 +0000136 ASSERT_ALLOC(hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 res = mbedtls_md(md_info, data, datalen, hash);
138 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500139
Nick Childc5474472023-01-27 21:06:39 +0000140 for (i = 0; i < n_crts; i++) {
141 res =
142 mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
143 mbedtls_md_get_size(md_info));
144 TEST_EQUAL(res, res_expect);
145 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 } else {
Nick Childc5474472023-01-27 21:06:39 +0000147 for (i = 0; i < n_crts; i++) {
148 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
149 TEST_EQUAL(res, res_expect);
150 }
Nick Child8a94de42022-09-14 10:51:51 -0500151 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500152
Nick Child62b2d7e2022-07-14 16:24:59 -0500153exit:
Nick Childc5474472023-01-27 21:06:39 +0000154 for (i = 0; i < n_crts; i++) {
155 mbedtls_x509_crt_free(crts[i]);
156 mbedtls_free(crts[i]);
157 mbedtls_free(crt_files_arr[i]);
158 }
Nick Child951f7002023-01-30 16:35:58 +0000159 mbedtls_free(hash);
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 mbedtls_pkcs7_free(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000161 mbedtls_free(crt_files_arr);
162 mbedtls_free(crts);
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 mbedtls_free(data);
164 mbedtls_free(pkcs7_buf);
Nick Child62b2d7e2022-07-14 16:24:59 -0500165 USE_PSA_DONE();
166}
167/* END_CASE */