blob: 14a08825324b7f62ad0bf74205cef5d43d3b106e [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"
10/* END_HEADER */
11
12/* BEGIN_DEPENDENCIES
Dave Rodgman2364aae2022-11-04 11:33:04 +000013 * depends_on:MBEDTLS_PKCS7_C:MBEDTLS_RSA_C
Nayna Jainc9deb182020-11-16 19:03:12 +000014 * END_DEPENDENCIES
15 */
16
Nick Child45525d32022-02-25 11:54:34 -060017/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Nick Child8a94de42022-09-14 10:51:51 -050018void pkcs7_parse( char *pkcs7_file, int res_expect )
Nayna Jainc9deb182020-11-16 19:03:12 +000019{
20 unsigned char *pkcs7_buf = NULL;
21 size_t buflen;
22 int res;
23
24 mbedtls_pkcs7 pkcs7;
25
26 mbedtls_pkcs7_init( &pkcs7 );
27
28 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
29 TEST_ASSERT( res == 0 );
30
31 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nick Child8a94de42022-09-14 10:51:51 -050032 TEST_ASSERT( res == res_expect );
Nayna Jainc9deb182020-11-16 19:03:12 +000033
34exit:
35 mbedtls_free( pkcs7_buf );
36 mbedtls_pkcs7_free( &pkcs7 );
37}
38/* END_CASE */
39
Nick Child45525d32022-02-25 11:54:34 -060040/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Nick Child8a94de42022-09-14 10:51:51 -050041void pkcs7_verify( char *pkcs7_file, char *crt, char *filetobesigned, int do_hash_alg, int res_expect )
Nayna Jainc9deb182020-11-16 19:03:12 +000042{
43 unsigned char *pkcs7_buf = NULL;
44 size_t buflen;
45 unsigned char *data = NULL;
46 unsigned char hash[32];
47 struct stat st;
48 size_t datalen;
49 int res;
50 FILE *file;
51 const mbedtls_md_info_t *md_info;
52 mbedtls_md_type_t md_alg;
53
54 mbedtls_pkcs7 pkcs7;
55 mbedtls_x509_crt x509;
56
Nick Child8a10f662022-06-06 12:18:40 -050057 USE_PSA_INIT();
58
Nayna Jainc9deb182020-11-16 19:03:12 +000059 mbedtls_pkcs7_init( &pkcs7 );
60 mbedtls_x509_crt_init( &x509 );
61
62 res = mbedtls_x509_crt_parse_file( &x509, crt );
63 TEST_ASSERT( res == 0 );
64
65 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
66 TEST_ASSERT( res == 0 );
67
68 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +000069 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +000070
Nayna Jain673a2262020-12-14 22:44:49 +000071 res = stat( filetobesigned, &st );
Nayna Jainc9deb182020-11-16 19:03:12 +000072 TEST_ASSERT( res == 0 );
73
74 file = fopen( filetobesigned, "rb" );
75 TEST_ASSERT( file != NULL );
76
77 datalen = st.st_size;
78 data = mbedtls_calloc( datalen, 1 );
Nick Child8ce1b1a2022-09-14 14:51:23 -050079 TEST_ASSERT( data != NULL );
Nayna Jainc9deb182020-11-16 19:03:12 +000080
81 buflen = fread( (void *)data , sizeof( unsigned char ), datalen, file );
Nick Child8ce1b1a2022-09-14 14:51:23 -050082 TEST_ASSERT( buflen == datalen );
Nayna Jainc9deb182020-11-16 19:03:12 +000083 fclose( file );
84
Nick Child8a94de42022-09-14 10:51:51 -050085 if( do_hash_alg )
86 {
Nick Child8ce1b1a2022-09-14 14:51:23 -050087 res = mbedtls_oid_get_md_alg( &pkcs7.signed_data.digest_alg_identifiers, &md_alg );
Nick Child8a94de42022-09-14 10:51:51 -050088 TEST_ASSERT( res == 0 );
89 TEST_ASSERT( md_alg == (mbedtls_md_type_t) do_hash_alg );
90 md_info = mbedtls_md_info_from_type( md_alg );
Nayna Jainc9deb182020-11-16 19:03:12 +000091
Nick Child8a94de42022-09-14 10:51:51 -050092 res = mbedtls_md( md_info, data, datalen, hash );
93 TEST_ASSERT( res == 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +000094
Nick Child8a94de42022-09-14 10:51:51 -050095 res = mbedtls_pkcs7_signed_hash_verify( &pkcs7, &x509, hash, sizeof(hash) );
96 }
97 else
98 {
99 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509, data, datalen );
100 }
101 TEST_ASSERT( res == res_expect );
Nayna Jainc9deb182020-11-16 19:03:12 +0000102
103exit:
104 mbedtls_x509_crt_free( &x509 );
105 mbedtls_free( data );
106 mbedtls_pkcs7_free( &pkcs7 );
107 mbedtls_free( pkcs7_buf );
Nick Child8a10f662022-06-06 12:18:40 -0500108 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000109}
110/* END_CASE */
111
Nick Child45525d32022-02-25 11:54:34 -0600112/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Nick Child8a94de42022-09-14 10:51:51 -0500113void pkcs7_verify_multiple_signers( char *pkcs7_file, char *crt1, char *crt2, char *filetobesigned, int do_hash_alg, int res_expect )
Nick Child62b2d7e2022-07-14 16:24:59 -0500114{
115 unsigned char *pkcs7_buf = NULL;
116 size_t buflen;
117 unsigned char *data = NULL;
118 unsigned char hash[32];
119 struct stat st;
120 size_t datalen;
121 int res;
122 FILE *file;
123 const mbedtls_md_info_t *md_info;
124 mbedtls_md_type_t md_alg;
125
126 mbedtls_pkcs7 pkcs7;
127 mbedtls_x509_crt x509_1;
128 mbedtls_x509_crt x509_2;
129
130 USE_PSA_INIT();
131
132 mbedtls_pkcs7_init( &pkcs7 );
133 mbedtls_x509_crt_init( &x509_1 );
134 mbedtls_x509_crt_init( &x509_2 );
135
136 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
137 TEST_ASSERT( res == 0 );
138
139 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
140 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
141
142 TEST_ASSERT( pkcs7.signed_data.no_of_signers == 2 );
143
144 res = mbedtls_x509_crt_parse_file( &x509_1, crt1 );
145 TEST_ASSERT( res == 0 );
146
147 res = mbedtls_x509_crt_parse_file( &x509_2, crt2 );
148 TEST_ASSERT( res == 0 );
149
150 res = stat( filetobesigned, &st );
151 TEST_ASSERT( res == 0 );
152
Nick Childfc234b72022-11-02 15:23:39 -0500153 file = fopen( filetobesigned, "rb" );
Nick Child62b2d7e2022-07-14 16:24:59 -0500154 TEST_ASSERT( file != NULL );
155
156 datalen = st.st_size;
157 data = ( unsigned char* ) calloc( datalen, sizeof(unsigned char) );
158 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
159 TEST_ASSERT( buflen == datalen );
160
161 fclose( file );
162
Nick Child8a94de42022-09-14 10:51:51 -0500163 if( do_hash_alg )
164 {
Nick Child8ce1b1a2022-09-14 14:51:23 -0500165 res = mbedtls_oid_get_md_alg( &pkcs7.signed_data.digest_alg_identifiers, &md_alg );
Nick Child8a94de42022-09-14 10:51:51 -0500166 TEST_ASSERT( res == 0 );
167 TEST_ASSERT( md_alg == MBEDTLS_MD_SHA256 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500168
Nick Child8a94de42022-09-14 10:51:51 -0500169 md_info = mbedtls_md_info_from_type( md_alg );
Nick Child62b2d7e2022-07-14 16:24:59 -0500170
Nick Child8a94de42022-09-14 10:51:51 -0500171 res = mbedtls_md( md_info, data, datalen, hash );
172 TEST_ASSERT( res == 0 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500173
Nick Child8ce1b1a2022-09-14 14:51:23 -0500174 res = mbedtls_pkcs7_signed_hash_verify( &pkcs7, &x509_1, hash, sizeof(hash) );
Nick Child8a94de42022-09-14 10:51:51 -0500175 TEST_ASSERT( res == res_expect );
176 }
177 else
178 {
179 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_1, data, datalen );
180 TEST_ASSERT( res == res_expect );
181 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500182
183 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_2, data, datalen );
Nick Child8a94de42022-09-14 10:51:51 -0500184 TEST_ASSERT( res == res_expect );
Nick Child62b2d7e2022-07-14 16:24:59 -0500185
186exit:
187 mbedtls_x509_crt_free( &x509_1 );
188 mbedtls_x509_crt_free( &x509_2 );
189 mbedtls_pkcs7_free( &pkcs7 );
190 mbedtls_free( data );
191 mbedtls_free( pkcs7_buf );
192 USE_PSA_DONE();
193}
194/* END_CASE */