Make the ver_chain length explicit
diff --git a/library/x509_crt.c b/library/x509_crt.c
index 676dcfb..18dffae 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -2086,22 +2086,25 @@
mbedtls_x509_crt *trust_ca,
mbedtls_x509_crl *ca_crl,
const mbedtls_x509_crt_profile *profile,
- x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE] )
+ x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE],
+ size_t *chain_len )
{
uint32_t *flags;
mbedtls_x509_crt *child;
mbedtls_x509_crt *parent;
int parent_is_trusted = 0;
int child_is_trusted = 0;
- int path_cnt = 0;
+ int path_cnt = 0; /* like chain_len but not updated at the same time */
int self_cnt = 0;
child = crt;
+ *chain_len = 0;
while( 1 ) {
/* Add certificate to the verification chain */
ver_chain[path_cnt].crt = child;
flags = &ver_chain[path_cnt].flags;
+ ++*chain_len;
/* Check time-validity (all certificates) */
if( mbedtls_x509_time_is_past( &child->valid_to ) )
@@ -2245,18 +2248,16 @@
static int x509_crt_merge_flags_with_cb(
uint32_t *flags,
x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE],
+ size_t chain_len,
int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
void *p_vrfy )
{
int ret;
- size_t i, j;
+ size_t i;
uint32_t cur_flags;
- for( i = X509_MAX_VERIFY_CHAIN_SIZE; i != 0; --i )
+ for( i = chain_len; i != 0; --i )
{
- if( ver_chain[i-1].crt == NULL )
- continue;
-
cur_flags = ver_chain[i-1].flags;
if( NULL != f_vrfy )
@@ -2302,10 +2303,12 @@
int ret;
mbedtls_pk_type_t pk_type;
x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE];
+ size_t chain_len;
uint32_t *ee_flags = &ver_chain[0].flags;
*flags = 0;
memset( ver_chain, 0, sizeof( ver_chain ) );
+ chain_len = 0;
if( profile == NULL )
{
@@ -2327,12 +2330,14 @@
*ee_flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
/* Check the chain */
- ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile, ver_chain );
+ ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile,
+ ver_chain, &chain_len );
if( ret != 0 )
goto exit;
/* Build final flags, calling callback on the way if any */
- ret = x509_crt_merge_flags_with_cb( flags, ver_chain, f_vrfy, p_vrfy );
+ ret = x509_crt_merge_flags_with_cb( flags,
+ ver_chain, chain_len, f_vrfy, p_vrfy );
exit:
/* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by