blob: 65384a85509520bd4f85ceae07d6400bbd08b383 [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"
Manuel Pégourié-Gonnardd55d66f2023-06-20 10:14:58 +020011#include "mbedtls/error.h"
Nayna Jainc9deb182020-11-16 19:03:12 +000012/* END_HEADER */
13
14/* BEGIN_DEPENDENCIES
Dave Rodgman651fb522023-03-12 10:00:44 +000015 * depends_on:MBEDTLS_PKCS7_C
Nayna Jainc9deb182020-11-16 19:03:12 +000016 * END_DEPENDENCIES
17 */
Nick Childb7817702022-12-12 15:49:35 -060018/* BEGIN_SUITE_HELPERS */
19int pkcs7_parse_buffer(unsigned char *pkcs7_buf, int buflen)
20{
21 int res;
22 mbedtls_pkcs7 pkcs7;
23
24 mbedtls_pkcs7_init(&pkcs7);
25 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
26 mbedtls_pkcs7_free(&pkcs7);
27 return res;
28}
29/* END_SUITE_HELPERS */
Nayna Jainc9deb182020-11-16 19:03:12 +000030
Nick Child4983ddf2022-12-14 15:04:40 -060031/* BEGIN_CASE */
32void pkcs7_asn1_fail(data_t *pkcs7_buf)
33{
34 int res;
35 res = pkcs7_parse_buffer(pkcs7_buf->x, pkcs7_buf->len);
36 TEST_ASSERT(res != MBEDTLS_PKCS7_SIGNED_DATA);
37
38}
39/* END_CASE */
40
Nick Child45525d32022-02-25 11:54:34 -060041/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +010042void pkcs7_parse(char *pkcs7_file, int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000043{
44 unsigned char *pkcs7_buf = NULL;
45 size_t buflen;
46 int res;
47
Gilles Peskine449bd832023-01-11 14:50:10 +010048 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
49 TEST_EQUAL(res, 0);
Nayna Jainc9deb182020-11-16 19:03:12 +000050
Nick Childb7817702022-12-12 15:49:35 -060051 res = pkcs7_parse_buffer(pkcs7_buf, buflen);
Gilles Peskine449bd832023-01-11 14:50:10 +010052 TEST_EQUAL(res, res_expect);
Nayna Jainc9deb182020-11-16 19:03:12 +000053
54exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010055 mbedtls_free(pkcs7_buf);
Nayna Jainc9deb182020-11-16 19:03:12 +000056}
57/* END_CASE */
58
Nick Child45525d32022-02-25 11:54:34 -060059/* 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 +000060void pkcs7_verify(char *pkcs7_file,
61 char *crt_files,
62 char *filetobesigned,
63 int do_hash_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010064 int res_expect)
Nayna Jainc9deb182020-11-16 19:03:12 +000065{
66 unsigned char *pkcs7_buf = NULL;
Nick Childc5474472023-01-27 21:06:39 +000067 size_t buflen, i, k, cnt = 0, n_crts = 1;
Nayna Jainc9deb182020-11-16 19:03:12 +000068 unsigned char *data = NULL;
Nick Childc5474472023-01-27 21:06:39 +000069 char **crt_files_arr = NULL;
Nick Child951f7002023-01-30 16:35:58 +000070 unsigned char *hash = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000071 struct stat st;
72 size_t datalen;
73 int res;
74 FILE *file;
75 const mbedtls_md_info_t *md_info;
Nayna Jainc9deb182020-11-16 19:03:12 +000076 mbedtls_pkcs7 pkcs7;
Nick Childc5474472023-01-27 21:06:39 +000077 mbedtls_x509_crt **crts = NULL;
Nayna Jainc9deb182020-11-16 19:03:12 +000078
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +010079 MD_OR_USE_PSA_INIT();
Nayna Jainc9deb182020-11-16 19:03:12 +000080
Paul Elliott45b6e5e2023-09-12 11:29:16 +010081 mbedtls_pkcs7_init(&pkcs7);
82
Nick Childc5474472023-01-27 21:06:39 +000083 /* crt_files are space seprated list */
84 for (i = 0; i < strlen(crt_files); i++) {
85 if (crt_files[i] == ' ') {
86 n_crts++;
87 }
Nick Child8a94de42022-09-14 10:51:51 -050088 }
Nayna Jainc9deb182020-11-16 19:03:12 +000089
Tom Cosgrove05b2a872023-07-21 11:31:13 +010090 TEST_CALLOC(crts, n_crts);
91 TEST_CALLOC(crt_files_arr, n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000092
Nick Childc5474472023-01-27 21:06:39 +000093 for (i = 0; i < strlen(crt_files); i++) {
94 for (k = i; k < strlen(crt_files); k++) {
95 if (crt_files[k] == ' ') {
96 break;
97 }
98 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +010099 TEST_CALLOC(crt_files_arr[cnt], (k-i)+1);
Nick Childc5474472023-01-27 21:06:39 +0000100 crt_files_arr[cnt][k-i] = '\0';
101 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
102 i = k;
103 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500104
Nick Childc5474472023-01-27 21:06:39 +0000105 for (i = 0; i < n_crts; i++) {
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100106 TEST_CALLOC(crts[i], 1);
Nick Childc5474472023-01-27 21:06:39 +0000107 mbedtls_x509_crt_init(crts[i]);
108 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500109
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
111 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500112
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
114 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
Nick Child62b2d7e2022-07-14 16:24:59 -0500115
Nick Childc5474472023-01-27 21:06:39 +0000116 TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts);
Nick Child62b2d7e2022-07-14 16:24:59 -0500117
Nick Childc5474472023-01-27 21:06:39 +0000118 for (i = 0; i < n_crts; i++) {
119 res = mbedtls_x509_crt_parse_file(crts[i], crt_files_arr[i]);
120 TEST_EQUAL(res, 0);
121 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500122
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 res = stat(filetobesigned, &st);
124 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500125
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 file = fopen(filetobesigned, "rb");
127 TEST_ASSERT(file != NULL);
Nick Child62b2d7e2022-07-14 16:24:59 -0500128
129 datalen = st.st_size;
Dave Rodgman716163e2023-02-20 14:46:51 +0000130 /* Special-case for zero-length input so that data will be non-NULL */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100131 TEST_CALLOC(data, datalen == 0 ? 1 : datalen);
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
133 TEST_EQUAL(buflen, datalen);
Nick Child62b2d7e2022-07-14 16:24:59 -0500134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 fclose(file);
Nick Child62b2d7e2022-07-14 16:24:59 -0500136
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 if (do_hash_alg) {
Nick Childff2746f2022-12-15 13:06:21 -0600138 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100139 TEST_CALLOC(hash, mbedtls_md_get_size(md_info));
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 res = mbedtls_md(md_info, data, datalen, hash);
141 TEST_EQUAL(res, 0);
Nick Child62b2d7e2022-07-14 16:24:59 -0500142
Nick Childc5474472023-01-27 21:06:39 +0000143 for (i = 0; i < n_crts; i++) {
144 res =
145 mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
146 mbedtls_md_get_size(md_info));
147 TEST_EQUAL(res, res_expect);
148 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 } else {
Nick Childc5474472023-01-27 21:06:39 +0000150 for (i = 0; i < n_crts; i++) {
151 res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
152 TEST_EQUAL(res, res_expect);
153 }
Nick Child8a94de42022-09-14 10:51:51 -0500154 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500155
Nick Child62b2d7e2022-07-14 16:24:59 -0500156exit:
Nick Childc5474472023-01-27 21:06:39 +0000157 for (i = 0; i < n_crts; i++) {
158 mbedtls_x509_crt_free(crts[i]);
159 mbedtls_free(crts[i]);
160 mbedtls_free(crt_files_arr[i]);
161 }
Nick Child951f7002023-01-30 16:35:58 +0000162 mbedtls_free(hash);
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 mbedtls_pkcs7_free(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000164 mbedtls_free(crt_files_arr);
165 mbedtls_free(crts);
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 mbedtls_free(data);
167 mbedtls_free(pkcs7_buf);
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +0100168 MD_OR_USE_PSA_DONE();
Nick Child62b2d7e2022-07-14 16:24:59 -0500169}
170/* END_CASE */