blob: 016714ba668406ba3aafe07805e51c1a2993c1f6 [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
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +010078 MD_OR_USE_PSA_INIT();
Nayna Jainc9deb182020-11-16 19:03:12 +000079
Nick Childc5474472023-01-27 21:06:39 +000080 /* crt_files are space seprated list */
81 for (i = 0; i < strlen(crt_files); i++) {
82 if (crt_files[i] == ' ') {
83 n_crts++;
84 }
Nick Child8a94de42022-09-14 10:51:51 -050085 }
Nayna Jainc9deb182020-11-16 19:03:12 +000086
Nick Childc5474472023-01-27 21:06:39 +000087 ASSERT_ALLOC(crts, sizeof(*crts)*n_crts);
88 ASSERT_ALLOC(crt_files_arr, sizeof(*crt_files_arr)*n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000089
Nick Childc5474472023-01-27 21:06:39 +000090 for (i = 0; i < strlen(crt_files); i++) {
91 for (k = i; k < strlen(crt_files); k++) {
92 if (crt_files[k] == ' ') {
93 break;
94 }
95 }
96 ASSERT_ALLOC(crt_files_arr[cnt], (k-i)+1);
97 crt_files_arr[cnt][k-i] = '\0';
98 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
99 i = k;
100 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 mbedtls_pkcs7_init(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000103 for (i = 0; i < n_crts; i++) {
104 ASSERT_ALLOC(crts[i], sizeof(*crts[i]));
105 mbedtls_x509_crt_init(crts[i]);
106 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500107
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;
Dave Rodgman716163e2023-02-20 14:46:51 +0000128 /* Special-case for zero-length input so that data will be non-NULL */
129 ASSERT_ALLOC(data, datalen == 0 ? 1 : datalen);
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
131 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500132
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600136 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Nick Child951f7002023-01-30 16:35:58 +0000137 ASSERT_ALLOC(hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 res = mbedtls_md(md_info, data, datalen, hash);
139 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500140
Nick Childc5474472023-01-27 21:06:39 +0000141 for (i = 0; i < n_crts; i++) {
142 res =
143 mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
144 mbedtls_md_get_size(md_info));
145 TEST_EQUAL(res, res_expect);
146 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 } else {
Nick Childc5474472023-01-27 21:06:39 +0000148 for (i = 0; i < n_crts; i++) {
149 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
150 TEST_EQUAL(res, res_expect);
151 }
Nick Child8a94de42022-09-14 10:51:51 -0500152 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500153
Nick Child62b2d7e2022-07-14 16:24:59 -0500154exit:
Nick Childc5474472023-01-27 21:06:39 +0000155 for (i = 0; i < n_crts; i++) {
156 mbedtls_x509_crt_free(crts[i]);
157 mbedtls_free(crts[i]);
158 mbedtls_free(crt_files_arr[i]);
159 }
Nick Child951f7002023-01-30 16:35:58 +0000160 mbedtls_free(hash);
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 mbedtls_pkcs7_free(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000162 mbedtls_free(crt_files_arr);
163 mbedtls_free(crts);
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 mbedtls_free(data);
165 mbedtls_free(pkcs7_buf);
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +0100166 MD_OR_USE_PSA_DONE();
Nick Child62b2d7e2022-07-14 16:24:59 -0500167}
168/* END_CASE */