blob: a0da1d72d934cb72547b7c251a0cd1fa90824dbd [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
Nick Childc5474472023-01-27 21:06:39 +000081 /* crt_files are space seprated list */
82 for (i = 0; i < strlen(crt_files); i++) {
83 if (crt_files[i] == ' ') {
84 n_crts++;
85 }
Nick Child8a94de42022-09-14 10:51:51 -050086 }
Nayna Jainc9deb182020-11-16 19:03:12 +000087
Tom Cosgrove05b2a872023-07-21 11:31:13 +010088 TEST_CALLOC(crts, n_crts);
89 TEST_CALLOC(crt_files_arr, n_crts);
Nayna Jainc9deb182020-11-16 19:03:12 +000090
Nick Childc5474472023-01-27 21:06:39 +000091 for (i = 0; i < strlen(crt_files); i++) {
92 for (k = i; k < strlen(crt_files); k++) {
93 if (crt_files[k] == ' ') {
94 break;
95 }
96 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +010097 TEST_CALLOC(crt_files_arr[cnt], (k-i)+1);
Nick Childc5474472023-01-27 21:06:39 +000098 crt_files_arr[cnt][k-i] = '\0';
99 memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
100 i = k;
101 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500102
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 mbedtls_pkcs7_init(&pkcs7);
Nick Childc5474472023-01-27 21:06:39 +0000104 for (i = 0; i < n_crts; i++) {
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100105 TEST_CALLOC(crts[i], 1);
Nick Childc5474472023-01-27 21:06:39 +0000106 mbedtls_x509_crt_init(crts[i]);
107 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500108
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 */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100130 TEST_CALLOC(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);
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100138 TEST_CALLOC(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);
Manuel Pégourié-Gonnard33a13022023-03-17 14:02:49 +0100167 MD_OR_USE_PSA_DONE();
Nick Child62b2d7e2022-07-14 16:24:59 -0500168}
169/* END_CASE */