diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3/pcy_node.c')
-rw-r--r-- | src/lib/libcrypto/x509v3/pcy_node.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/lib/libcrypto/x509v3/pcy_node.c b/src/lib/libcrypto/x509v3/pcy_node.c index 6587cb05ab..bd1e7f1ae8 100644 --- a/src/lib/libcrypto/x509v3/pcy_node.c +++ b/src/lib/libcrypto/x509v3/pcy_node.c | |||
@@ -92,13 +92,25 @@ X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes, | |||
92 | } | 92 | } |
93 | 93 | ||
94 | X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level, | 94 | X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level, |
95 | const X509_POLICY_NODE *parent, | ||
95 | const ASN1_OBJECT *id) | 96 | const ASN1_OBJECT *id) |
96 | { | 97 | { |
97 | return tree_find_sk(level->nodes, id); | 98 | X509_POLICY_NODE *node; |
99 | int i; | ||
100 | for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) | ||
101 | { | ||
102 | node = sk_X509_POLICY_NODE_value(level->nodes, i); | ||
103 | if (node->parent == parent) | ||
104 | { | ||
105 | if (!OBJ_cmp(node->data->valid_policy, id)) | ||
106 | return node; | ||
107 | } | ||
108 | } | ||
109 | return NULL; | ||
98 | } | 110 | } |
99 | 111 | ||
100 | X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, | 112 | X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, |
101 | X509_POLICY_DATA *data, | 113 | const X509_POLICY_DATA *data, |
102 | X509_POLICY_NODE *parent, | 114 | X509_POLICY_NODE *parent, |
103 | X509_POLICY_TREE *tree) | 115 | X509_POLICY_TREE *tree) |
104 | { | 116 | { |
@@ -155,4 +167,31 @@ void policy_node_free(X509_POLICY_NODE *node) | |||
155 | OPENSSL_free(node); | 167 | OPENSSL_free(node); |
156 | } | 168 | } |
157 | 169 | ||
170 | /* See if a policy node matches a policy OID. If mapping enabled look through | ||
171 | * expected policy set otherwise just valid policy. | ||
172 | */ | ||
173 | |||
174 | int policy_node_match(const X509_POLICY_LEVEL *lvl, | ||
175 | const X509_POLICY_NODE *node, const ASN1_OBJECT *oid) | ||
176 | { | ||
177 | int i; | ||
178 | ASN1_OBJECT *policy_oid; | ||
179 | const X509_POLICY_DATA *x = node->data; | ||
180 | |||
181 | if ( (lvl->flags & X509_V_FLAG_INHIBIT_MAP) | ||
182 | || !(x->flags & POLICY_DATA_FLAG_MAP_MASK)) | ||
183 | { | ||
184 | if (!OBJ_cmp(x->valid_policy, oid)) | ||
185 | return 1; | ||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++) | ||
190 | { | ||
191 | policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i); | ||
192 | if (!OBJ_cmp(policy_oid, oid)) | ||
193 | return 1; | ||
194 | } | ||
195 | return 0; | ||
158 | 196 | ||
197 | } | ||