crypto/bn/asm/x86_64-mont*.pl: add missing clang detection.
[openssl.git] / crypto / x509v3 / pcy_node.c
index 3d6bd34cc5d75787f8e50aea2530cc4324a93003..bd1e7f1ae8b7b4636a028c0c1a30295f321a5dca 100644 (file)
@@ -1,5 +1,5 @@
 /* pcy_node.c */
-/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
+/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  * project 2004.
  */
 /* ====================================================================
  *
  */
 
-#include <memory.h>
 #include <openssl/asn1.h>
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
 #include "pcy_int.h"
 
-static int node_cmp(void *pa, void *pb)
+static int node_cmp(const X509_POLICY_NODE * const *a,
+                       const X509_POLICY_NODE * const *b)
        {
-       X509_POLICY_NODE **a = pa, **b = pb;
        return OBJ_cmp((*a)->data->valid_policy, (*b)->data->valid_policy);
        }
 
@@ -93,9 +92,21 @@ X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes,
        }
 
 X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level,
+                                       const X509_POLICY_NODE *parent, 
                                        const ASN1_OBJECT *id)
        {
-       return tree_find_sk(level->nodes, id);
+       X509_POLICY_NODE *node;
+       int i;
+       for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++)
+               {
+               node = sk_X509_POLICY_NODE_value(level->nodes, i);
+               if (node->parent == parent)
+                       {
+                       if (!OBJ_cmp(node->data->valid_policy, id))
+                               return node;
+                       }
+               }
+       return NULL;
        }
 
 X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
@@ -156,4 +167,31 @@ void policy_node_free(X509_POLICY_NODE *node)
        OPENSSL_free(node);
        }
 
+/* See if a policy node matches a policy OID. If mapping enabled look through
+ * expected policy set otherwise just valid policy.
+ */
+
+int policy_node_match(const X509_POLICY_LEVEL *lvl,
+                     const X509_POLICY_NODE *node, const ASN1_OBJECT *oid)
+       {
+       int i;
+       ASN1_OBJECT *policy_oid;
+       const X509_POLICY_DATA *x = node->data;
+
+       if (        (lvl->flags & X509_V_FLAG_INHIBIT_MAP)
+               || !(x->flags & POLICY_DATA_FLAG_MAP_MASK))
+               {
+               if (!OBJ_cmp(x->valid_policy, oid))
+                       return 1;
+               return 0;
+               }
+
+       for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++)
+               {
+               policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i);
+               if (!OBJ_cmp(policy_oid, oid))
+                       return 1;
+               }
+       return 0;
 
+       }