blob: 261824d1549b7c24f0f435f5381c02646addd328 [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
Nick Child45525d32022-02-25 11:54:34 -060013 * depends_on:MBEDTLS_PKCS7_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:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +000018void pkcs7_parse( char *pkcs7_file )
19{
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 );
Nayna Jain673a2262020-12-14 22:44:49 +000032 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
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 */
Nayna Jainc9deb182020-11-16 19:03:12 +000041void pkcs7_parse_without_cert( char *pkcs7_file )
42{
43 unsigned char *pkcs7_buf = NULL;
44 size_t buflen;
45 int res;
46
47 mbedtls_pkcs7 pkcs7;
48
49 mbedtls_pkcs7_init( &pkcs7 );
50
51 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
52 TEST_ASSERT( res == 0 );
53
54 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +000055 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +000056
57exit:
58 mbedtls_free( pkcs7_buf );
59 mbedtls_pkcs7_free( &pkcs7 );
60}
61/* END_CASE */
62
Nick Child45525d32022-02-25 11:54:34 -060063/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_RSA_C */
Daniel Axtens35384792020-09-02 14:48:45 +100064void pkcs7_parse_multiple_certs( char *pkcs7_file )
Nayna Jainc9deb182020-11-16 19:03:12 +000065{
66 unsigned char *pkcs7_buf = NULL;
67 size_t buflen;
68 int res;
69
70 mbedtls_pkcs7 pkcs7;
71
72 mbedtls_pkcs7_init( &pkcs7 );
73
74 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
75 TEST_ASSERT( res == 0 );
76
77 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Daniel Axtens35384792020-09-02 14:48:45 +100078 TEST_ASSERT( res == MBEDTLS_ERR_PKCS7_INVALID_CERT );
Nayna Jainc9deb182020-11-16 19:03:12 +000079
80exit:
81 mbedtls_free( pkcs7_buf );
82 mbedtls_pkcs7_free( &pkcs7 );
83}
84/* END_CASE */
85
Nick Child45525d32022-02-25 11:54:34 -060086/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +000087void pkcs7_parse_corrupted_cert( char *pkcs7_file )
88{
89 unsigned char *pkcs7_buf = NULL;
90 size_t buflen;
91 int res;
92
93 mbedtls_pkcs7 pkcs7;
94
95 mbedtls_pkcs7_init( &pkcs7 );
96
97 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
98 TEST_ASSERT( res == 0 );
99
100 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
101 TEST_ASSERT( res == MBEDTLS_ERR_PKCS7_INVALID_CERT );
102
103exit:
104 mbedtls_free( pkcs7_buf );
105 mbedtls_pkcs7_free( &pkcs7 );
106}
107/* END_CASE */
108
Nick Child45525d32022-02-25 11:54:34 -0600109/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +0000110void pkcs7_parse_corrupted_signer_info( char *pkcs7_file )
111{
112 unsigned char *pkcs7_buf = NULL;
113 size_t buflen;
114 int res;
115
116 mbedtls_pkcs7 pkcs7;
117
118 mbedtls_pkcs7_init( &pkcs7 );
119
120 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
121 TEST_ASSERT( res == 0 );
122
123 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
124 TEST_ASSERT( res < 0 );
125
126exit:
127 mbedtls_free( pkcs7_buf );
128 mbedtls_pkcs7_free( &pkcs7 );
129}
130/* END_CASE */
131
Nick Child45525d32022-02-25 11:54:34 -0600132/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Nayna Jainc9deb182020-11-16 19:03:12 +0000133void pkcs7_parse_version( char *pkcs7_file )
134{
135 unsigned char *pkcs7_buf = NULL;
136 size_t buflen;
137 int res;
138
139 mbedtls_pkcs7 pkcs7;
140
141 mbedtls_pkcs7_init( &pkcs7 );
142
143 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
144 TEST_ASSERT( res == 0 );
145
146 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
147 TEST_ASSERT( res == MBEDTLS_ERR_PKCS7_INVALID_VERSION );
148
149exit:
150 mbedtls_free( pkcs7_buf );
151 mbedtls_pkcs7_free( &pkcs7 );
152}
153/* END_CASE */
154
Nick Child45525d32022-02-25 11:54:34 -0600155/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Nayna Jainc9deb182020-11-16 19:03:12 +0000156void pkcs7_parse_content_oid( char *pkcs7_file )
157{
158 unsigned char *pkcs7_buf = NULL;
159 size_t buflen;
160 int res;
161 mbedtls_pkcs7 pkcs7;
162
163 mbedtls_pkcs7_init( &pkcs7 );
164
165 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen);
166 TEST_ASSERT( res == 0 );
167
168 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
169 TEST_ASSERT( res != 0 );
170 TEST_ASSERT( res == MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE );
171exit:
172 mbedtls_free( pkcs7_buf );
173 mbedtls_pkcs7_free( &pkcs7 );
174}
175/* END_CASE */
176
Nick Child45525d32022-02-25 11:54:34 -0600177/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +0000178void pkcs7_verify( char *pkcs7_file, char *crt, char *filetobesigned )
179{
180 unsigned char *pkcs7_buf = NULL;
181 size_t buflen;
182 unsigned char *data = NULL;
183 struct stat st;
184 size_t datalen;
185 int res;
186 FILE *file;
187
188 mbedtls_pkcs7 pkcs7;
189 mbedtls_x509_crt x509;
190
Nick Child8a10f662022-06-06 12:18:40 -0500191 USE_PSA_INIT();
192
Nayna Jainc9deb182020-11-16 19:03:12 +0000193 mbedtls_pkcs7_init( &pkcs7 );
194 mbedtls_x509_crt_init( &x509 );
195
196 res = mbedtls_x509_crt_parse_file( &x509, crt );
197 TEST_ASSERT( res == 0 );
198
199 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
200 TEST_ASSERT( res == 0 );
201
202 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +0000203 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +0000204 mbedtls_free( pkcs7_buf );
205
Nayna Jain673a2262020-12-14 22:44:49 +0000206 res = stat( filetobesigned, &st );
Nayna Jainc9deb182020-11-16 19:03:12 +0000207 TEST_ASSERT( res == 0 );
208
209 file = fopen( filetobesigned, "rb" );
210 TEST_ASSERT( file != NULL );
211
212 datalen = st.st_size;
213 data = mbedtls_calloc( datalen, 1 );
214 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
215 TEST_ASSERT( buflen == datalen);
216
217 fclose(file);
218
219 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509, data, datalen );
220 TEST_ASSERT( res == 0 );
221
222exit:
223 mbedtls_x509_crt_free( &x509 );
224 mbedtls_free( data );
225 mbedtls_pkcs7_free( &pkcs7 );
Nick Child8a10f662022-06-06 12:18:40 -0500226 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000227}
228/* END_CASE */
229
Nick Child45525d32022-02-25 11:54:34 -0600230/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_SHA256_C */
Nayna Jainc9deb182020-11-16 19:03:12 +0000231void pkcs7_verify_hash( char *pkcs7_file, char *crt, char *filetobesigned )
232{
233 unsigned char *pkcs7_buf = NULL;
234 size_t buflen;
235 unsigned char *data = NULL;
236 unsigned char hash[32];
237 struct stat st;
238 size_t datalen;
239 int res;
240 FILE *file;
241 const mbedtls_md_info_t *md_info;
242 mbedtls_md_type_t md_alg;
243
244 mbedtls_pkcs7 pkcs7;
245 mbedtls_x509_crt x509;
246
Nick Child8a10f662022-06-06 12:18:40 -0500247 USE_PSA_INIT();
248
Nayna Jainc9deb182020-11-16 19:03:12 +0000249 mbedtls_pkcs7_init( &pkcs7 );
250 mbedtls_x509_crt_init( &x509 );
251
252 res = mbedtls_x509_crt_parse_file( &x509, crt );
253 TEST_ASSERT( res == 0 );
254
255 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
256 TEST_ASSERT( res == 0 );
257
258 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +0000259 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +0000260
Nayna Jain673a2262020-12-14 22:44:49 +0000261 res = stat( filetobesigned, &st );
Nayna Jainc9deb182020-11-16 19:03:12 +0000262 TEST_ASSERT( res == 0 );
263
264 file = fopen( filetobesigned, "rb" );
265 TEST_ASSERT( file != NULL );
266
267 datalen = st.st_size;
268 data = mbedtls_calloc( datalen, 1 );
269 TEST_ASSERT( data != NULL);
270
271 buflen = fread( (void *)data , sizeof( unsigned char ), datalen, file );
272 TEST_ASSERT( buflen == datalen);
273 fclose( file );
274
275 res = mbedtls_oid_get_md_alg( &(pkcs7.signed_data.digest_alg_identifiers), &md_alg );
276 TEST_ASSERT( res == 0 );
277 TEST_ASSERT( md_alg == MBEDTLS_MD_SHA256 );
278
279 md_info = mbedtls_md_info_from_type( md_alg );
280
Nick Child66718412022-02-22 17:19:59 -0600281 res = mbedtls_md( md_info, data, datalen, hash );
282 TEST_ASSERT( res == 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +0000283
Nick Child66718412022-02-22 17:19:59 -0600284 res = mbedtls_pkcs7_signed_hash_verify( &pkcs7, &x509, hash, sizeof(hash) );
Nayna Jainc9deb182020-11-16 19:03:12 +0000285 TEST_ASSERT( res == 0 );
286
287exit:
288 mbedtls_x509_crt_free( &x509 );
289 mbedtls_free( data );
290 mbedtls_pkcs7_free( &pkcs7 );
291 mbedtls_free( pkcs7_buf );
Nick Child8a10f662022-06-06 12:18:40 -0500292 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000293}
294/* END_CASE */
295
Nick Child45525d32022-02-25 11:54:34 -0600296/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +0000297void pkcs7_verify_badcert( char *pkcs7_file, char *crt, char *filetobesigned )
298{
299 unsigned char *pkcs7_buf = NULL;
300 size_t buflen;
301 unsigned char *data = NULL;
302 struct stat st;
303 size_t datalen;
304 int res;
305 FILE *file;
306
307 mbedtls_pkcs7 pkcs7;
308 mbedtls_x509_crt x509;
309
Nick Child8a10f662022-06-06 12:18:40 -0500310 USE_PSA_INIT();
311
Nayna Jainc9deb182020-11-16 19:03:12 +0000312 mbedtls_pkcs7_init( &pkcs7 );
313 mbedtls_x509_crt_init( &x509 );
314
315 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
316 TEST_ASSERT( res == 0 );
317
318 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +0000319 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +0000320
321 res = mbedtls_x509_crt_parse_file( &x509, crt );
322 TEST_ASSERT( res == 0 );
323
Nayna Jain673a2262020-12-14 22:44:49 +0000324 res = stat( filetobesigned, &st );
Nayna Jainc9deb182020-11-16 19:03:12 +0000325 TEST_ASSERT( res == 0 );
326
327 file = fopen( filetobesigned, "rb" );
328 TEST_ASSERT( file != NULL );
329
330 datalen = st.st_size;
331 data = mbedtls_calloc( datalen, 1 );
332 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
333 TEST_ASSERT( buflen == datalen);
334
335 fclose(file);
336
337 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509, data, datalen );
338 TEST_ASSERT( res != 0 );
339
340exit:
341 mbedtls_x509_crt_free( &x509 );
342 mbedtls_free( data );
343 mbedtls_pkcs7_free( &pkcs7 );
344 mbedtls_free( pkcs7_buf );
Nick Child8a10f662022-06-06 12:18:40 -0500345 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000346}
347/* END_CASE */
348
Nick Child45525d32022-02-25 11:54:34 -0600349/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
Nayna Jainc9deb182020-11-16 19:03:12 +0000350void pkcs7_verify_tampered_data( char *pkcs7_file, char *crt, char *filetobesigned )
351{
352 unsigned char *pkcs7_buf = NULL;
353 size_t buflen;
354 unsigned char *data = NULL;
355 struct stat st;
356 size_t datalen;
357 int res;
358 FILE *file;
359
360 mbedtls_pkcs7 pkcs7;
361 mbedtls_x509_crt x509;
362
Nick Child8a10f662022-06-06 12:18:40 -0500363 USE_PSA_INIT();
364
Nayna Jainc9deb182020-11-16 19:03:12 +0000365 mbedtls_pkcs7_init( &pkcs7 );
366 mbedtls_x509_crt_init( &x509 );
367
368 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
369 TEST_ASSERT( res == 0 );
370
371 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Nayna Jain673a2262020-12-14 22:44:49 +0000372 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
Nayna Jainc9deb182020-11-16 19:03:12 +0000373
374 res = mbedtls_x509_crt_parse_file( &x509, crt );
375 TEST_ASSERT( res == 0 );
376
Nayna Jain673a2262020-12-14 22:44:49 +0000377 res = stat( filetobesigned, &st );
Nayna Jainc9deb182020-11-16 19:03:12 +0000378 TEST_ASSERT( res == 0 );
379
380 file = fopen( filetobesigned, "rb" );
381 TEST_ASSERT( file != NULL );
382
383 datalen = st.st_size;
384 data = mbedtls_calloc( datalen, 1 );
385 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
386 TEST_ASSERT( buflen == datalen);
387
388 fclose(file);
389
390 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509, data, datalen );
391 TEST_ASSERT( res != 0 );
392
393exit:
394 mbedtls_x509_crt_free( &x509 );
395 mbedtls_pkcs7_free( &pkcs7 );
396 mbedtls_free( data );
397 mbedtls_free( pkcs7_buf );
Nick Child8a10f662022-06-06 12:18:40 -0500398 USE_PSA_DONE();
Nayna Jainc9deb182020-11-16 19:03:12 +0000399}
400/* END_CASE */
401
Daniel Axtens35384792020-09-02 14:48:45 +1000402/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
403void pkcs7_verify_multiple_signers( char *pkcs7_file, char *crt1, char *crt2, char *filetobesigned )
404{
405 unsigned char *pkcs7_buf = NULL;
406 size_t buflen;
407 unsigned char *data = NULL;
408 struct stat st;
409 size_t datalen;
410 int res;
411 FILE *file;
412
413 mbedtls_pkcs7 pkcs7;
414 mbedtls_x509_crt x509_1;
415 mbedtls_x509_crt x509_2;
416
417 USE_PSA_INIT();
418
419 mbedtls_pkcs7_init( &pkcs7 );
420 mbedtls_x509_crt_init( &x509_1 );
421 mbedtls_x509_crt_init( &x509_2 );
422
423 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
424 TEST_ASSERT( res == 0 );
425
426 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
427 TEST_ASSERT( res == MBEDTLS_PKCS7_SIGNED_DATA );
428
429 TEST_ASSERT( pkcs7.signed_data.no_of_signers == 2 );
430
431 res = mbedtls_x509_crt_parse_file( &x509_1, crt1 );
432 TEST_ASSERT( res == 0 );
433
434 res = mbedtls_x509_crt_parse_file( &x509_2, crt2 );
435 TEST_ASSERT( res == 0 );
436
437 res = stat( filetobesigned, &st );
438 TEST_ASSERT( res == 0 );
439
440 file = fopen( filetobesigned, "r" );
441 TEST_ASSERT( file != NULL );
442
443 datalen = st.st_size;
444 data = ( unsigned char* ) calloc( datalen, sizeof(unsigned char) );
445 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
446 TEST_ASSERT( buflen == datalen );
447
448 fclose( file );
449
450 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_1, data, datalen );
451 TEST_ASSERT( res == 0 );
452
453 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_2, data, datalen );
454 TEST_ASSERT( res == 0 );
455
456exit:
457 mbedtls_x509_crt_free( &x509_1 );
458 mbedtls_x509_crt_free( &x509_2 );
459 mbedtls_pkcs7_free( &pkcs7 );
460 mbedtls_free( data );
461 mbedtls_free( pkcs7_buf );
462 USE_PSA_DONE();
463}
464/* END_CASE */
465
Nick Child45525d32022-02-25 11:54:34 -0600466/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Nayna Jainc9deb182020-11-16 19:03:12 +0000467void pkcs7_parse_failure( char *pkcs7_file )
468{
469 unsigned char *pkcs7_buf = NULL;
470 size_t buflen;
471 int res;
472 mbedtls_pkcs7 pkcs7;
473
474 mbedtls_pkcs7_init( &pkcs7 );
475
476 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
477 TEST_ASSERT( res == 0 );
478
479 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
480 TEST_ASSERT( res != 0 );
481exit:
482 mbedtls_free( pkcs7_buf );
483 mbedtls_pkcs7_free( &pkcs7 );
484}
485/* END_CASE */