pkcs7: Handle md errors in multisigner pkcs7 verification
In resonse to feedback [1], if `mbedtls_md_info_from_type` were to
fail then skip the signer and try the next one.
Additionally, use a for loop instead of a while loop when iterating
over signers because it simplifies the use of `continue`.
[1] https://github.com/Mbed-TLS/mbedtls/pull/3431#discussion_r967198650
Signed-off-by: Nick Child <nick.child@ibm.com>
diff --git a/library/pkcs7.c b/library/pkcs7.c
index 2299cfd..3178ddc 100644
--- a/library/pkcs7.c
+++ b/library/pkcs7.c
@@ -656,17 +656,21 @@
* We could also cache hashes by md, so if there are several sigs all using
* the same algo we don't recalculate the hash each time.
*/
- signer = &pkcs7->signed_data.signers;
- while( signer )
+ for( signer = &pkcs7->signed_data.signers; signer; signer = signer->next )
{
ret = mbedtls_oid_get_md_alg( &signer->alg_identifier, &md_alg );
if( ret != 0 )
{
ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
- goto out;
+ continue;
}
md_info = mbedtls_md_info_from_type( md_alg );
+ if( md_info == NULL )
+ {
+ ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
+ continue;
+ }
hash = mbedtls_calloc( mbedtls_md_get_size( md_info ), 1 );
if( hash == NULL ) {
@@ -677,8 +681,9 @@
ret = mbedtls_md( md_info, data, datalen, hash );
if( ret != 0 )
{
+ ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
mbedtls_free( hash );
- goto out;
+ continue;
}
ret = mbedtls_pk_verify( &pk_cxt, md_alg, hash,
@@ -689,8 +694,6 @@
if( ret == 0 )
break;
-
- signer = signer->next;
}
out:
@@ -716,16 +719,21 @@
}
signer = &pkcs7->signed_data.signers;
- while( signer )
+ for( signer = &pkcs7->signed_data.signers; signer; signer = signer->next )
{
ret = mbedtls_oid_get_md_alg( &signer->alg_identifier, &md_alg );
if( ret != 0 )
{
ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
- goto out;
+ continue;
}
md_info = mbedtls_md_info_from_type( md_alg );
+ if( md_info == NULL )
+ {
+ ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
+ continue;
+ }
if( hashlen != mbedtls_md_get_size( md_info ) )
{
@@ -739,8 +747,6 @@
pkcs7->signed_data.signers.sig.len );
if( ret == 0 )
break;
-
- signer = signer->next;
}
out: