1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* pcy_int.h */
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * project 2004.
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* ====================================================================
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright (c) 2004 The OpenSSL Project.  All rights reserved.
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met:
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the above copyright
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer.
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer in
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    the documentation and/or other materials provided with the
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    distribution.
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    software must display the following acknowledgment:
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software developed by the OpenSSL Project
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    endorse or promote products derived from this software without
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    prior written permission. For written permission, please contact
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    licensing@OpenSSL.org.
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 5. Products derived from this software may not be called "OpenSSL"
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    nor may "OpenSSL" appear in their names without prior written
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    permission of the OpenSSL Project.
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 6. Redistributions of any form whatsoever must retain the following
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    acknowledgment:
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software developed by the OpenSSL Project
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OF THE POSSIBILITY OF SUCH DAMAGE.
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ====================================================================
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This product includes cryptographic software written by Eric Young
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * (eay@cryptsoft.com).  This product includes software written by Tim
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Hudson (tjh@cryptsoft.com).
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
60d9e397b599b13d642138480a28c14db7a136bf0Adam Langleytypedef struct X509_POLICY_DATA_st X509_POLICY_DATA;
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
62d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyDECLARE_STACK_OF(X509_POLICY_DATA)
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Internal structures */
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* This structure and the field names correspond to the Policy 'node' of
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * RFC3280. NB this structure contains no pointers to parent or child
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * data: X509_POLICY_NODE contains that. This means that the main policy data
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * can be kept static and cached with the certificate.
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct X509_POLICY_DATA_st
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	{
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	unsigned int flags;
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Policy OID and qualifiers for this data */
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	ASN1_OBJECT *valid_policy;
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(POLICYQUALINFO) *qualifier_set;
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(ASN1_OBJECT) *expected_policy_set;
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	};
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* X509_POLICY_DATA flags values */
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* This flag indicates the structure has been mapped using a policy mapping
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * extension. If policy mapping is not active its references get deleted.
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_MAPPED			0x1
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* This flag indicates the data doesn't correspond to a policy in Certificate
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Policies: it has been mapped to any policy.
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_MAPPED_ANY		0x2
94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* AND with flags to see if any mapping has occurred */
96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_MAP_MASK		0x3
98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* qualifiers are shared and shouldn't be freed */
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_SHARED_QUALIFIERS	0x4
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Parent node is an extra node and should be freed */
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_EXTRA_NODE		0x8
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Corresponding CertificatePolicies is critical */
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_DATA_FLAG_CRITICAL		0x10
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* This structure is cached with a certificate */
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct X509_POLICY_CACHE_st {
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* anyPolicy data or NULL if no anyPolicy */
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	X509_POLICY_DATA *anyPolicy;
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* other policy data */
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(X509_POLICY_DATA) *data;
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* If InhibitAnyPolicy present this is its value or -1 if absent. */
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	long any_skip;
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* If policyConstraints and requireExplicitPolicy present this is its
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	 * value or -1 if absent.
122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	 */
123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	long explicit_skip;
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* If policyConstraints and policyMapping present this is its
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	 * value or -1 if absent.
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         */
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	long map_skip;
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	};
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/*#define POLICY_CACHE_FLAG_CRITICAL		POLICY_DATA_FLAG_CRITICAL*/
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* This structure represents the relationship between nodes */
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct X509_POLICY_NODE_st
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	{
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* node data this refers to */
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	const X509_POLICY_DATA *data;
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Parent node */
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	X509_POLICY_NODE *parent;
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Number of child nodes */
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	int nchild;
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	};
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct X509_POLICY_LEVEL_st
145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	{
146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Cert for this level */
147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	X509 *cert;
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* nodes at this level */
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(X509_POLICY_NODE) *nodes;
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* anyPolicy node */
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	X509_POLICY_NODE *anyPolicy;
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Extra data */
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/*STACK_OF(X509_POLICY_DATA) *extra_data;*/
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	unsigned int flags;
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	};
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct X509_POLICY_TREE_st
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	{
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* This is the tree 'level' data */
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	X509_POLICY_LEVEL *levels;
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	int nlevel;
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* Extra policy data when additional nodes (not from the certificate)
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	 * are required.
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	 */
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(X509_POLICY_DATA) *extra_data;
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	/* This is the authority constained policy set */
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(X509_POLICY_NODE) *auth_policies;
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	STACK_OF(X509_POLICY_NODE) *user_policies;
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	unsigned int flags;
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley	};
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Set if anyPolicy present in user policies */
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define POLICY_FLAG_ANY_POLICY		0x2
174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Useful macros */
176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define node_data_critical(data) (data->flags & POLICY_DATA_FLAG_CRITICAL)
178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define node_critical(node) node_data_critical(node->data)
179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Internal functions */
181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
182d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *id,
183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley								int crit);
184d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid policy_data_free(X509_POLICY_DATA *data);
185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
186d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache,
187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley							const ASN1_OBJECT *id);
188d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps);
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
191d9e397b599b13d642138480a28c14db7a136bf0Adam LangleySTACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void);
192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
193d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid policy_cache_init(void);
194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
195d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid policy_cache_free(X509_POLICY_CACHE *cache);
196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
197d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level,
198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley					const X509_POLICY_NODE *parent,
199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley					const ASN1_OBJECT *id);
200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
201d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk,
202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley						const ASN1_OBJECT *id);
203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
204d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley			const X509_POLICY_DATA *data,
206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley			X509_POLICY_NODE *parent,
207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley			X509_POLICY_TREE *tree);
208d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid policy_node_free(X509_POLICY_NODE *node);
209d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint policy_node_match(const X509_POLICY_LEVEL *lvl,
210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley		      const X509_POLICY_NODE *node, const ASN1_OBJECT *oid);
211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
212d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyconst X509_POLICY_CACHE *policy_cache_set(X509 *x);
213