/* BEGIN_HEADER */ #include "mbedtls/bignum.h" #include "mbedtls/pkcs7.h" #include "mbedtls/x509.h" #include "mbedtls/x509_crt.h" #include "mbedtls/x509_crl.h" #include "mbedtls/oid.h" #include "sys/types.h" #include "sys/stat.h" /* END_HEADER */ /* BEGIN_DEPENDENCIES * depends_on:MBEDTLS_PKCS7_C:MBEDTLS_RSA_C * END_DEPENDENCIES */ /* BEGIN_CASE depends_on:MBEDTLS_FS_IO */ void pkcs7_parse( char *pkcs7_file, int res_expect ) { unsigned char *pkcs7_buf = NULL; size_t buflen; int res; mbedtls_pkcs7 pkcs7; mbedtls_pkcs7_init( &pkcs7 ); res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen ); TEST_EQUAL( res, 0 ); res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen ); TEST_EQUAL( res, res_expect ); exit: mbedtls_free( pkcs7_buf ); mbedtls_pkcs7_free( &pkcs7 ); } /* END_CASE */ /* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */ void pkcs7_verify( char *pkcs7_file, char *crt, char *filetobesigned, int do_hash_alg, int res_expect ) { unsigned char *pkcs7_buf = NULL; size_t buflen; unsigned char *data = NULL; unsigned char hash[32]; struct stat st; size_t datalen; int res; FILE *file; const mbedtls_md_info_t *md_info; mbedtls_md_type_t md_alg; mbedtls_pkcs7 pkcs7; mbedtls_x509_crt x509; mbedtls_pkcs7_init( &pkcs7 ); mbedtls_x509_crt_init( &x509 ); USE_PSA_INIT(); res = mbedtls_x509_crt_parse_file( &x509, crt ); TEST_EQUAL( res, 0 ); res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen ); TEST_EQUAL( res, 0 ); res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen ); TEST_EQUAL( res, MBEDTLS_PKCS7_SIGNED_DATA ); res = stat( filetobesigned, &st ); TEST_EQUAL( res, 0 ); file = fopen( filetobesigned, "rb" ); TEST_ASSERT( file != NULL ); datalen = st.st_size; ASSERT_ALLOC( data, datalen ); TEST_ASSERT( data != NULL ); buflen = fread( (void *)data , sizeof( unsigned char ), datalen, file ); TEST_EQUAL( buflen, datalen ); fclose( file ); if( do_hash_alg ) { res = mbedtls_oid_get_md_alg( &pkcs7.signed_data.digest_alg_identifiers, &md_alg ); TEST_EQUAL( res, 0 ); TEST_EQUAL( md_alg, (mbedtls_md_type_t) do_hash_alg ); md_info = mbedtls_md_info_from_type( md_alg ); res = mbedtls_md( md_info, data, datalen, hash ); TEST_EQUAL( res, 0 ); res = mbedtls_pkcs7_signed_hash_verify( &pkcs7, &x509, hash, sizeof(hash) ); } else { res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509, data, datalen ); } TEST_EQUAL( res, res_expect ); exit: mbedtls_x509_crt_free( &x509 ); mbedtls_free( data ); mbedtls_pkcs7_free( &pkcs7 ); mbedtls_free( pkcs7_buf ); USE_PSA_DONE(); } /* END_CASE */ /* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */ void pkcs7_verify_multiple_signers( char *pkcs7_file, char *crt1, char *crt2, char *filetobesigned, int do_hash_alg, int res_expect ) { unsigned char *pkcs7_buf = NULL; size_t buflen; unsigned char *data = NULL; unsigned char hash[32]; struct stat st; size_t datalen; int res; FILE *file; const mbedtls_md_info_t *md_info; mbedtls_md_type_t md_alg; mbedtls_pkcs7 pkcs7; mbedtls_x509_crt x509_1; mbedtls_x509_crt x509_2; mbedtls_pkcs7_init( &pkcs7 ); mbedtls_x509_crt_init( &x509_1 ); mbedtls_x509_crt_init( &x509_2 ); USE_PSA_INIT(); res = mbedtls_pk_load_file( pkcs7_file, &pkcs7_buf, &buflen ); TEST_EQUAL( res, 0 ); res = mbedtls_pkcs7_parse_der( &pkcs7, pkcs7_buf, buflen ); TEST_EQUAL( res, MBEDTLS_PKCS7_SIGNED_DATA ); TEST_EQUAL( pkcs7.signed_data.no_of_signers, 2 ); res = mbedtls_x509_crt_parse_file( &x509_1, crt1 ); TEST_EQUAL( res, 0 ); res = mbedtls_x509_crt_parse_file( &x509_2, crt2 ); TEST_EQUAL( res, 0 ); res = stat( filetobesigned, &st ); TEST_EQUAL( res, 0 ); file = fopen( filetobesigned, "rb" ); TEST_ASSERT( file != NULL ); datalen = st.st_size; ASSERT_ALLOC( data, datalen ); buflen = fread( ( void * )data , sizeof( unsigned char ), datalen, file ); TEST_EQUAL( buflen, datalen ); fclose( file ); if( do_hash_alg ) { res = mbedtls_oid_get_md_alg( &pkcs7.signed_data.digest_alg_identifiers, &md_alg ); TEST_EQUAL( res, 0 ); TEST_EQUAL( md_alg, MBEDTLS_MD_SHA256 ); md_info = mbedtls_md_info_from_type( md_alg ); res = mbedtls_md( md_info, data, datalen, hash ); TEST_EQUAL( res, 0 ); res = mbedtls_pkcs7_signed_hash_verify( &pkcs7, &x509_1, hash, sizeof(hash) ); TEST_EQUAL( res, res_expect ); } else { res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_1, data, datalen ); TEST_EQUAL( res, res_expect ); } res = mbedtls_pkcs7_signed_data_verify( &pkcs7, &x509_2, data, datalen ); TEST_EQUAL( res, res_expect ); exit: mbedtls_x509_crt_free( &x509_1 ); mbedtls_x509_crt_free( &x509_2 ); mbedtls_pkcs7_free( &pkcs7 ); mbedtls_free( data ); mbedtls_free( pkcs7_buf ); USE_PSA_DONE(); } /* END_CASE */