Fix stacks of OPENSSL_STRING, OPENSSL_CSTRING and OPENSSL_BLOCK
[openssl.git] / crypto / x509 / pcy_map.c
1 /*
2  * Copyright 2004-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include "internal/cryptlib.h"
11 #include <openssl/x509.h>
12 #include <openssl/x509v3.h>
13 #include "crypto/x509.h"
14
15 #include "pcy_local.h"
16
17 DEFINE_STACK_OF(ASN1_OBJECT)
18
19 /*
20  * Set policy mapping entries in cache. Note: this modifies the passed
21  * POLICY_MAPPINGS structure
22  */
23
24 int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps)
25 {
26     POLICY_MAPPING *map;
27     X509_POLICY_DATA *data;
28     X509_POLICY_CACHE *cache = x->policy_cache;
29     int i;
30     int ret = 0;
31     if (sk_POLICY_MAPPING_num(maps) == 0) {
32         ret = -1;
33         goto bad_mapping;
34     }
35     for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) {
36         map = sk_POLICY_MAPPING_value(maps, i);
37         /* Reject if map to or from anyPolicy */
38         if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy)
39             || (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) {
40             ret = -1;
41             goto bad_mapping;
42         }
43
44         /* Attempt to find matching policy data */
45         data = policy_cache_find_data(cache, map->issuerDomainPolicy);
46         /* If we don't have anyPolicy can't map */
47         if (data == NULL && !cache->anyPolicy)
48             continue;
49
50         /* Create a NODE from anyPolicy */
51         if (data == NULL) {
52             data = policy_data_new(NULL, map->issuerDomainPolicy,
53                                    cache->anyPolicy->flags
54                                    & POLICY_DATA_FLAG_CRITICAL);
55             if (data == NULL)
56                 goto bad_mapping;
57             data->qualifier_set = cache->anyPolicy->qualifier_set;
58             /*
59              * map->issuerDomainPolicy = NULL;
60              */
61             data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
62             data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
63             if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
64                 policy_data_free(data);
65                 goto bad_mapping;
66             }
67         } else
68             data->flags |= POLICY_DATA_FLAG_MAPPED;
69         if (!sk_ASN1_OBJECT_push(data->expected_policy_set,
70                                  map->subjectDomainPolicy))
71             goto bad_mapping;
72         map->subjectDomainPolicy = NULL;
73
74     }
75
76     ret = 1;
77  bad_mapping:
78     if (ret == -1)
79         x->ex_flags |= EXFLAG_INVALID_POLICY;
80     sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
81     return ret;
82
83 }