blob: 4c8bf233ef9d74417200ac111471ab18ab63f2db [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"
Valerio Setti25b282e2024-01-17 10:55:32 +01007#include "x509_internal.h"
Nayna Jainc9deb182020-11-16 19:03:12 +00008#include "mbedtls/oid.h"
9#include "sys/types.h"
10#include "sys/stat.h"
Dave Rodgman651fb522023-03-12 10:00:44 +000011#include "mbedtls/rsa.h"
Manuel Pégourié-Gonnardd55d66f2023-06-20 10:14:58 +020012#include "mbedtls/error.h"
Nayna Jainc9deb182020-11-16 19:03:12 +000013/* END_HEADER */
14
15/* BEGIN_DEPENDENCIES
Dave Rodgman651fb522023-03-12 10:00:44 +000016 * depends_on:MBEDTLS_PKCS7_C
Nayna Jainc9deb182020-11-16 19:03:12 +000017 * END_DEPENDENCIES
18 */
Nick Childb7817702022-12-12 15:49:35 -060019/* BEGIN_SUITE_HELPERS */
20int pkcs7_parse_buffer(unsigned char *pkcs7_buf, int buflen)
21{
22 int res;
23 mbedtls_pkcs7 pkcs7;
24
25 mbedtls_pkcs7_init(&pkcs7);
26 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
27 mbedtls_pkcs7_free(&pkcs7);
28 return res;
29}
30/* END_SUITE_HELPERS */
Nayna Jainc9deb182020-11-16 19:03:12 +000031
Nick Child4983ddf2022-12-14 15:04:40 -060032/* BEGIN_CASE */
33void pkcs7_asn1_fail(data_t *pkcs7_buf)
34{
35 int res;
36 res = pkcs7_parse_buffer(pkcs7_buf->x, pkcs7_buf->len);
37 TEST_ASSERT(res != MBEDTLS_PKCS7_SIGNED_DATA);
38
39}
40/* END_CASE */
41
Nick Child45525d32022-02-25 11:54:34 -060042/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010043void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000044{
45 unsigned char *pkcs7_buf = NULL;
46 size_t buflen;
47 int res;
48
Gilles Peskine449bd832023-01-11 14:50:10 +010049 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
50 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000051
Nick Childb7817702022-12-12 15:49:35 -060052 res = pkcs7_parse_buffer(pkcs7_buf, buflen);
Gilles Peskine449bd832023-01-11 14:50:10 +010053 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000054
55exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010056 mbedtls_free(pkcs7_buf);
Nayna Jainc9deb182020-11-16 19:03:12 +000057}
58/* END_CASE */
59
Nick Child45525d32022-02-25 11:54:34 -060060/* 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 +000061void pkcs7_verify(char *pkcs7_file,
62 char *crt_files,
63 char *filetobesigned,
64 int do_hash_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010065 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000066{
67 unsigned char *pkcs7_buf = NULL;
Nick Childc5474472023-01-27 21:06:39 +000068 size_t buflen, i, k, cnt = 0, n_crts = 1;
Nayna Jainc9deb182020-11-16 19:03:12 +000069 unsigned char *data = NULL;
Nick Childc5474472023-01-27 21:06:39 +000070 char **crt_files_arr = NULL;
Nick Child951f7002023-01-30 16:35:58 +000071 unsigned char *hash = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000072 struct stat st;
73 size_t datalen;
74 int res;
75 FILE *file;
76 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000077 mbedtls_pkcs7 pkcs7;
Nick Childc5474472023-01-27 21:06:39 +000078 mbedtls_x509_crt **crts = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000079
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +010080 MD_OR_USE_PSA_INIT();
Nayna Jainc9deb182020-11-16 19:03:12 +000081
Paul Elliott45b6e5e2023-09-12 11:29:16 +010082 mbedtls_pkcs7_init(&pkcs7);
83
Nick Childc5474472023-01-27 21:06:39 +000084 /* crt_files are space seprated list */
85 for (i = 0; i < strlen(crt_files); i++) {
86 if (crt_files[i] == ' ') {
87 n_crts++;
88 }
Nick Child8a94de42022-09-14 10:51:51 -050089 }
Nayna Jainc9deb182020-11-16 19:03:12 +000090
Tom Cosgrove05b2a872023-07-21 11:31:13 +010091 TEST_CALLOC(crts, n_crts);
92 TEST_CALLOC(crt_files_arr, n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000093
Nick Childc5474472023-01-27 21:06:39 +000094 for (i = 0; i < strlen(crt_files); i++) {
95 for (k = i; k < strlen(crt_files); k++) {
96 if (crt_files[k] == ' ') {
97 break;
98 }
99 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100100 TEST_CALLOC(crt_files_arr[cnt], (k-i)+1);
Nick Childc5474472023-01-27 21:06:39 +0000101 crt_files_arr[cnt][k-i] = '\0';
102 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
103 i = k;
104 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500105
Nick Childc5474472023-01-27 21:06:39 +0000106 for (i = 0; i < n_crts; i++) {
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100107 TEST_CALLOC(crts[i], 1);
Nick Childc5474472023-01-27 21:06:39 +0000108 mbedtls_x509_crt_init(crts[i]);
109 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500110
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
112 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500113
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
115 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500116
Nick Childc5474472023-01-27 21:06:39 +0000117 TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts);
Nick Child62b2d7e2022-07-14 16:24:59 -0500118
Nick Childc5474472023-01-27 21:06:39 +0000119 for (i = 0; i < n_crts; i++) {
120 res = mbedtls_x509_crt_parse_file(crts[i], crt_files_arr[i]);
121 TEST_EQUAL(res, 0);
122 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 res = stat(filetobesigned, &st);
125 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500126
Gilles Peskine449bd832023-01-11 14:50:10 +0100127 file = fopen(filetobesigned, "rb");
128 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500129
130 datalen = st.st_size;
Dave Rodgman716163e2023-02-20 14:46:51 +0000131 /* Special-case for zero-length input so that data will be non-NULL */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100132 TEST_CALLOC(data, datalen == 0 ? 1 : datalen);
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
134 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500137
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600139 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100140 TEST_CALLOC(hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 res = mbedtls_md(md_info, data, datalen, hash);
142 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500143
Nick Childc5474472023-01-27 21:06:39 +0000144 for (i = 0; i < n_crts; i++) {
145 res =
146 mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
147 mbedtls_md_get_size(md_info));
148 TEST_EQUAL(res, res_expect);
149 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 } else {
Nick Childc5474472023-01-27 21:06:39 +0000151 for (i = 0; i < n_crts; i++) {
152 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
153 TEST_EQUAL(res, res_expect);
154 }
Nick Child8a94de42022-09-14 10:51:51 -0500155 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500156
Nick Child62b2d7e2022-07-14 16:24:59 -0500157exit:
Nick Childc5474472023-01-27 21:06:39 +0000158 for (i = 0; i < n_crts; i++) {
159 mbedtls_x509_crt_free(crts[i]);
160 mbedtls_free(crts[i]);
161 mbedtls_free(crt_files_arr[i]);
162 }
Nick Child951f7002023-01-30 16:35:58 +0000163 mbedtls_free(hash);
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 mbedtls_pkcs7_free(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000165 mbedtls_free(crt_files_arr);
166 mbedtls_free(crts);
Gilles Peskine449bd832023-01-11 14:50:10 +0100167 mbedtls_free(data);
168 mbedtls_free(pkcs7_buf);
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +0100169 MD_OR_USE_PSA_DONE();
Nick Child62b2d7e2022-07-14 16:24:59 -0500170}
171/* END_CASE */