1/* 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" 10#include "mbedtls/rsa.h" 11#include "mbedtls/error.h" 12/* END_HEADER */ 13 14/* BEGIN_DEPENDENCIES 15 * depends_on:MBEDTLS_PKCS7_C 16 * END_DEPENDENCIES 17 */ 18/* 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 */ 30 31/* 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 41/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */ 42void pkcs7_parse(char *pkcs7_file, int res_expect) 43{ 44 unsigned char *pkcs7_buf = NULL; 45 size_t buflen; 46 int res; 47 48 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen); 49 TEST_EQUAL(res, 0); 50 51 res = pkcs7_parse_buffer(pkcs7_buf, buflen); 52 TEST_EQUAL(res, res_expect); 53 54exit: 55 mbedtls_free(pkcs7_buf); 56} 57/* END_CASE */ 58 59/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */ 60void pkcs7_verify(char *pkcs7_file, 61 char *crt_files, 62 char *filetobesigned, 63 int do_hash_alg, 64 int res_expect) 65{ 66 unsigned char *pkcs7_buf = NULL; 67 size_t buflen, i, k, cnt = 0, n_crts = 1; 68 unsigned char *data = NULL; 69 char **crt_files_arr = NULL; 70 unsigned char *hash = NULL; 71 struct stat st; 72 size_t datalen; 73 int res; 74 FILE *file; 75 const mbedtls_md_info_t *md_info; 76 mbedtls_pkcs7 pkcs7; 77 mbedtls_x509_crt **crts = NULL; 78 79 MD_OR_USE_PSA_INIT(); 80 81 mbedtls_pkcs7_init(&pkcs7); 82 83 /* crt_files are space seprated list */ 84 for (i = 0; i < strlen(crt_files); i++) { 85 if (crt_files[i] == ' ') { 86 n_crts++; 87 } 88 } 89 90 TEST_CALLOC(crts, n_crts); 91 TEST_CALLOC(crt_files_arr, n_crts); 92 93 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 } 99 TEST_CALLOC(crt_files_arr[cnt], (k-i)+1); 100 crt_files_arr[cnt][k-i] = '\0'; 101 memcpy(crt_files_arr[cnt++], crt_files + i, k-i); 102 i = k; 103 } 104 105 for (i = 0; i < n_crts; i++) { 106 TEST_CALLOC(crts[i], 1); 107 mbedtls_x509_crt_init(crts[i]); 108 } 109 110 res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen); 111 TEST_EQUAL(res, 0); 112 113 res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen); 114 TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA); 115 116 TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts); 117 118 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 } 122 123 res = stat(filetobesigned, &st); 124 TEST_EQUAL(res, 0); 125 126 file = fopen(filetobesigned, "rb"); 127 TEST_ASSERT(file != NULL); 128 129 datalen = st.st_size; 130 /* Special-case for zero-length input so that data will be non-NULL */ 131 TEST_CALLOC(data, datalen == 0 ? 1 : datalen); 132 buflen = fread((void *) data, sizeof(unsigned char), datalen, file); 133 TEST_EQUAL(buflen, datalen); 134 135 fclose(file); 136 137 if (do_hash_alg) { 138 md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg); 139 TEST_CALLOC(hash, mbedtls_md_get_size(md_info)); 140 res = mbedtls_md(md_info, data, datalen, hash); 141 TEST_EQUAL(res, 0); 142 143 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 } 149 } else { 150 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 } 154 } 155 156exit: 157 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 } 162 mbedtls_free(hash); 163 mbedtls_pkcs7_free(&pkcs7); 164 mbedtls_free(crt_files_arr); 165 mbedtls_free(crts); 166 mbedtls_free(data); 167 mbedtls_free(pkcs7_buf); 168 MD_OR_USE_PSA_DONE(); 169} 170/* END_CASE */ 171