blob: cc032ac12f8f2a182ef49c540fee6f0b3d4c9ce0 [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"
Dave Rodgman651fb522023-03-12 10:00:44 +000010#include "mbedtls/rsa.h"
Nayna Jainc9deb182020-11-16 19:03:12 +000011/* END_HEADER */
12
13/* BEGIN_DEPENDENCIES
Dave Rodgman651fb522023-03-12 10:00:44 +000014 * depends_on:MBEDTLS_PKCS7_C
Nayna Jainc9deb182020-11-16 19:03:12 +000015 * END_DEPENDENCIES
16 */
Nick Childb7817702022-12-12 15:49:35 -060017/* BEGIN_SUITE_HELPERS */
18int pkcs7_parse_buffer(unsigned char *pkcs7_buf, int buflen)
19{
20 int res;
21 mbedtls_pkcs7 pkcs7;
22
23 mbedtls_pkcs7_init(&pkcs7);
24 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
25 mbedtls_pkcs7_free(&pkcs7);
26 return res;
27}
28/* END_SUITE_HELPERS */
Nayna Jainc9deb182020-11-16 19:03:12 +000029
Nick Child4983ddf2022-12-14 15:04:40 -060030/* BEGIN_CASE */
31void pkcs7_asn1_fail(data_t *pkcs7_buf)
32{
33 int res;
34 res = pkcs7_parse_buffer(pkcs7_buf->x, pkcs7_buf->len);
35 TEST_ASSERT(res != MBEDTLS_PKCS7_SIGNED_DATA);
36
37}
38/* END_CASE */
39
Nick Child45525d32022-02-25 11:54:34 -060040/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010041void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000042{
43 unsigned char *pkcs7_buf = NULL;
44 size_t buflen;
45 int res;
46
Gilles Peskine449bd832023-01-11 14:50:10 +010047 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
48 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000049
Nick Childb7817702022-12-12 15:49:35 -060050 res = pkcs7_parse_buffer(pkcs7_buf, buflen);
Gilles Peskine449bd832023-01-11 14:50:10 +010051 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000052
53exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010054 mbedtls_free(pkcs7_buf);
Nayna Jainc9deb182020-11-16 19:03:12 +000055}
56/* END_CASE */
57
Nick Child45525d32022-02-25 11:54:34 -060058/* 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 +000059void pkcs7_verify(char *pkcs7_file,
60 char *crt_files,
61 char *filetobesigned,
62 int do_hash_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010063 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000064{
65 unsigned char *pkcs7_buf = NULL;
Nick Childc5474472023-01-27 21:06:39 +000066 size_t buflen, i, k, cnt = 0, n_crts = 1;
Nayna Jainc9deb182020-11-16 19:03:12 +000067 unsigned char *data = NULL;
Nick Childc5474472023-01-27 21:06:39 +000068 char **crt_files_arr = NULL;
Nick Child951f7002023-01-30 16:35:58 +000069 unsigned char *hash = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000070 struct stat st;
71 size_t datalen;
72 int res;
73 FILE *file;
74 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000075 mbedtls_pkcs7 pkcs7;
Nick Childc5474472023-01-27 21:06:39 +000076 mbedtls_x509_crt **crts = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000077
Nayna Jainc9deb182020-11-16 19:03:12 +000078
Nick Childc5474472023-01-27 21:06:39 +000079 /* crt_files are space seprated list */
80 for (i = 0; i < strlen(crt_files); i++) {
81 if (crt_files[i] == ' ') {
82 n_crts++;
83 }
Nick Child8a94de42022-09-14 10:51:51 -050084 }
Nayna Jainc9deb182020-11-16 19:03:12 +000085
Nick Childc5474472023-01-27 21:06:39 +000086 ASSERT_ALLOC(crts, sizeof(*crts)*n_crts);
87 ASSERT_ALLOC(crt_files_arr, sizeof(*crt_files_arr)*n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000088
Nick Childc5474472023-01-27 21:06:39 +000089 for (i = 0; i < strlen(crt_files); i++) {
90 for (k = i; k < strlen(crt_files); k++) {
91 if (crt_files[k] == ' ') {
92 break;
93 }
94 }
95 ASSERT_ALLOC(crt_files_arr[cnt], (k-i)+1);
96 crt_files_arr[cnt][k-i] = '\0';
97 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
98 i = k;
99 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500100
Gilles Peskine449bd832023-01-11 14:50:10 +0100101 mbedtls_pkcs7_init(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000102 for (i = 0; i < n_crts; i++) {
103 ASSERT_ALLOC(crts[i], sizeof(*crts[i]));
104 mbedtls_x509_crt_init(crts[i]);
105 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500106
Gilles Peskine391005c2022-11-27 21:32:37 +0100107 USE_PSA_INIT();
108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
110 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500111
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
113 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500114
Nick Childc5474472023-01-27 21:06:39 +0000115 TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts);
Nick Child62b2d7e2022-07-14 16:24:59 -0500116
Nick Childc5474472023-01-27 21:06:39 +0000117 for (i = 0; i < n_crts; i++) {
118 res = mbedtls_x509_crt_parse_file(crts[i], crt_files_arr[i]);
119 TEST_EQUAL(res, 0);
120 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500121
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 res = stat(filetobesigned, &st);
123 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500124
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 file = fopen(filetobesigned, "rb");
126 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500127
128 datalen = st.st_size;
Dave Rodgman716163e2023-02-20 14:46:51 +0000129 /* Special-case for zero-length input so that data will be non-NULL */
130 ASSERT_ALLOC(data, datalen == 0 ? 1 : datalen);
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
132 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500133
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600137 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child951f7002023-01-30 16:35:58 +0000138 ASSERT_ALLOC(hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 res = mbedtls_md(md_info, data, datalen, hash);
140 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500141
Nick Childc5474472023-01-27 21:06:39 +0000142 for (i = 0; i < n_crts; i++) {
143 res =
144 mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
145 mbedtls_md_get_size(md_info));
146 TEST_EQUAL(res, res_expect);
147 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 } else {
Nick Childc5474472023-01-27 21:06:39 +0000149 for (i = 0; i < n_crts; i++) {
150 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
151 TEST_EQUAL(res, res_expect);
152 }
Nick Child8a94de42022-09-14 10:51:51 -0500153 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500154
Nick Child62b2d7e2022-07-14 16:24:59 -0500155exit:
Nick Childc5474472023-01-27 21:06:39 +0000156 for (i = 0; i < n_crts; i++) {
157 mbedtls_x509_crt_free(crts[i]);
158 mbedtls_free(crts[i]);
159 mbedtls_free(crt_files_arr[i]);
160 }
Nick Child951f7002023-01-30 16:35:58 +0000161 mbedtls_free(hash);
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 mbedtls_pkcs7_free(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000163 mbedtls_free(crt_files_arr);
164 mbedtls_free(crts);
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 mbedtls_free(data);
166 mbedtls_free(pkcs7_buf);
Nick Child62b2d7e2022-07-14 16:24:59 -0500167 USE_PSA_DONE();
168}
169/* END_CASE */