blob: 3d7dec68647f49ed7e1069fa3950f523b8e15c21 [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 );
Gilles Peskine23365552022-11-27 21:30:58 +010029 TEST_EQUAL( res, 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +000030
31 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Gilles Peskine23365552022-11-27 21:30:58 +010032 TEST_EQUAL( 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
57 mbedtls_pkcs7_init( &pkcs7 );
58 mbedtls_x509_crt_init( &x509 );
59
Gilles Peskine391005c2022-11-27 21:32:37 +010060 USE_PSA_INIT();
61
Nayna Jainc9deb182020-11-16 19:03:12 +000062 res = mbedtls_x509_crt_parse_file( &x509, crt );
Gilles Peskine23365552022-11-27 21:30:58 +010063 TEST_EQUAL( res, 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +000064
65 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
Gilles Peskine23365552022-11-27 21:30:58 +010066 TEST_EQUAL( res, 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +000067
68 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Gilles Peskine23365552022-11-27 21:30:58 +010069 TEST_EQUAL( 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 );
Gilles Peskine23365552022-11-27 21:30:58 +010072 TEST_EQUAL( res, 0 );
Nayna Jainc9deb182020-11-16 19:03:12 +000073
74 file = fopen( filetobesigned, "rb" );
75 TEST_ASSERT( file != NULL );
76
77 datalen = st.st_size;
Dave Rodgmanebd0caf2022-11-10 15:33:54 +000078 ASSERT_ALLOC( data, datalen );
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 );
Gilles Peskine23365552022-11-27 21:30:58 +010082 TEST_EQUAL( 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 );
Gilles Peskine23365552022-11-27 21:30:58 +010088 TEST_EQUAL( res, 0 );
89 TEST_EQUAL( md_alg, (mbedtls_md_type_t) do_hash_alg );
Nick Child8a94de42022-09-14 10:51:51 -050090 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 );
Gilles Peskine23365552022-11-27 21:30:58 +010093 TEST_EQUAL( 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 }
Gilles Peskine23365552022-11-27 21:30:58 +0100101 TEST_EQUAL( 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
Nick Child62b2d7e2022-07-14 16:24:59 -0500130 mbedtls_pkcs7_init( &pkcs7 );
131 mbedtls_x509_crt_init( &x509_1 );
132 mbedtls_x509_crt_init( &x509_2 );
133
Gilles Peskine391005c2022-11-27 21:32:37 +0100134 USE_PSA_INIT();
135
Nick Child62b2d7e2022-07-14 16:24:59 -0500136 res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen );
Gilles Peskine23365552022-11-27 21:30:58 +0100137 TEST_EQUAL( res, 0 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500138
139 res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen );
Gilles Peskine23365552022-11-27 21:30:58 +0100140 TEST_EQUAL( res, MBEDTLS_PKCS7_SIGNED_DATA );
Nick Child62b2d7e2022-07-14 16:24:59 -0500141
Gilles Peskine23365552022-11-27 21:30:58 +0100142 TEST_EQUAL( pkcs7.signed_data.no_of_signers, 2 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500143
144 res = mbedtls_x509_crt_parse_file( &x509_1, crt1 );
Gilles Peskine23365552022-11-27 21:30:58 +0100145 TEST_EQUAL( res, 0 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500146
147 res = mbedtls_x509_crt_parse_file( &x509_2, crt2 );
Gilles Peskine23365552022-11-27 21:30:58 +0100148 TEST_EQUAL( res, 0 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500149
150 res = stat( filetobesigned, &st );
Gilles Peskine23365552022-11-27 21:30:58 +0100151 TEST_EQUAL( res, 0 );
Nick Child62b2d7e2022-07-14 16:24:59 -0500152
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;
Dave Rodgmanebd0caf2022-11-10 15:33:54 +0000157 ASSERT_ALLOC( data, datalen );
Nick Child62b2d7e2022-07-14 16:24:59 -0500158 buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file );
Gilles Peskine23365552022-11-27 21:30:58 +0100159 TEST_EQUAL( buflen, datalen );
Nick Child62b2d7e2022-07-14 16:24:59 -0500160
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 );
Gilles Peskine23365552022-11-27 21:30:58 +0100166 TEST_EQUAL( res, 0 );
167 TEST_EQUAL( 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 );
Gilles Peskine23365552022-11-27 21:30:58 +0100172 TEST_EQUAL( 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) );
Gilles Peskine23365552022-11-27 21:30:58 +0100175 TEST_EQUAL( res, res_expect );
Nick Child8a94de42022-09-14 10:51:51 -0500176 }
177 else
178 {
179 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_1, data, datalen );
Gilles Peskine23365552022-11-27 21:30:58 +0100180 TEST_EQUAL( res, res_expect );
Nick Child8a94de42022-09-14 10:51:51 -0500181 }
Nick Child62b2d7e2022-07-14 16:24:59 -0500182
183 res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_2, data, datalen );
Gilles Peskine23365552022-11-27 21:30:58 +0100184 TEST_EQUAL( 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 */