Factor some common code in x509_verify{,_child}
diff --git a/library/x509_crt.c b/library/x509_crt.c
index 6ab30e6..be2e526 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -1527,6 +1527,34 @@
     return( 0 );
 }
 
+/*
+ * Iterate upwards in the given cert chain to find our parent.
+ *
+ * Ignore any upper cert that can't be used to sign other certificates
+ * (basic constraints CA=true for now, keyUsage soon).
+ */
+static x509_crt *x509_crt_find_parent( x509_crt *crt )
+{
+    x509_crt *parent;
+
+    for( parent = crt->next; parent != NULL; parent = parent->next )
+    {
+        if( parent->version == 0 ||
+            parent->ca_istrue == 0 ||
+            crt->issuer_raw.len != parent->subject_raw.len ||
+            memcmp( crt->issuer_raw.p, parent->subject_raw.p,
+                    crt->issuer_raw.len ) != 0 )
+        {
+            continue;
+        }
+
+        /* If we get there, we found a suitable parent */
+        break;
+    }
+
+    return( parent );
+}
+
 static int x509_crt_verify_top(
                 x509_crt *child, x509_crt *trust_ca,
                 x509_crl *ca_crl, int path_cnt, int *flags,
@@ -1689,23 +1717,7 @@
     *flags |= x509_crt_verifycrl(child, parent, ca_crl);
 #endif
 
-    grandparent = parent->next;
-
-    while( grandparent != NULL )
-    {
-        if( grandparent->version == 0 ||
-            grandparent->ca_istrue == 0 ||
-            parent->issuer_raw.len != grandparent->subject_raw.len ||
-            memcmp( parent->issuer_raw.p, grandparent->subject_raw.p,
-                    parent->issuer_raw.len ) != 0 )
-        {
-            grandparent = grandparent->next;
-            continue;
-        }
-        break;
-    }
-
-    if( grandparent != NULL )
+    if( ( grandparent = x509_crt_find_parent( parent) ) != NULL )
     {
         /*
          * Part of the chain
@@ -1800,26 +1812,7 @@
         }
     }
 
-    /*
-     * Iterate upwards in the given cert chain, to find our crt parent.
-     * Ignore any upper cert with CA != TRUE.
-     */
-    parent = crt->next;
-
-    while( parent != NULL && parent->version != 0 )
-    {
-        if( parent->ca_istrue == 0 ||
-            crt->issuer_raw.len != parent->subject_raw.len ||
-            memcmp( crt->issuer_raw.p, parent->subject_raw.p,
-                    crt->issuer_raw.len ) != 0 )
-        {
-            parent = parent->next;
-            continue;
-        }
-        break;
-    }
-
-    if( parent != NULL )
+    if( ( parent = x509_crt_find_parent( crt ) ) != NULL )
     {
         /*
          * Part of the chain