Merge branch 'vendor/DHCPCD'
[dragonfly.git] / crypto / libressl / crypto / x509v3 / v3_pmaps.c
1 /* $OpenBSD: v3_pmaps.c,v 1.11 2017/01/29 17:49:23 beck Exp $ */
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3  * project.
4  */
5 /* ====================================================================
6  * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  *    software must display the following acknowledgment:
22  *    "This product includes software developed by the OpenSSL Project
23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  *    endorse or promote products derived from this software without
27  *    prior written permission. For written permission, please contact
28  *    licensing@OpenSSL.org.
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  *    nor may "OpenSSL" appear in their names without prior written
32  *    permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  *    acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  *
53  * This product includes cryptographic software written by Eric Young
54  * (eay@cryptsoft.com).  This product includes software written by Tim
55  * Hudson (tjh@cryptsoft.com).
56  *
57  */
58
59
60 #include <stdio.h>
61
62 #include <openssl/asn1t.h>
63 #include <openssl/conf.h>
64 #include <openssl/err.h>
65 #include <openssl/x509v3.h>
66
67 static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method,
68     X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
69 static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(
70     const X509V3_EXT_METHOD *method, void *pmps, STACK_OF(CONF_VALUE) *extlist);
71
72 const X509V3_EXT_METHOD v3_policy_mappings = {
73         .ext_nid = NID_policy_mappings,
74         .ext_flags = 0,
75         .it = &POLICY_MAPPINGS_it,
76         .ext_new = NULL,
77         .ext_free = NULL,
78         .d2i = NULL,
79         .i2d = NULL,
80         .i2s = NULL,
81         .s2i = NULL,
82         .i2v = i2v_POLICY_MAPPINGS,
83         .v2i = v2i_POLICY_MAPPINGS,
84         .i2r = NULL,
85         .r2i = NULL,
86         .usr_data = NULL,
87 };
88
89 static const ASN1_TEMPLATE POLICY_MAPPING_seq_tt[] = {
90         {
91                 .flags = 0,
92                 .tag = 0,
93                 .offset = offsetof(POLICY_MAPPING, issuerDomainPolicy),
94                 .field_name = "issuerDomainPolicy",
95                 .item = &ASN1_OBJECT_it,
96         },
97         {
98                 .flags = 0,
99                 .tag = 0,
100                 .offset = offsetof(POLICY_MAPPING, subjectDomainPolicy),
101                 .field_name = "subjectDomainPolicy",
102                 .item = &ASN1_OBJECT_it,
103         },
104 };
105
106 const ASN1_ITEM POLICY_MAPPING_it = {
107         .itype = ASN1_ITYPE_SEQUENCE,
108         .utype = V_ASN1_SEQUENCE,
109         .templates = POLICY_MAPPING_seq_tt,
110         .tcount = sizeof(POLICY_MAPPING_seq_tt) / sizeof(ASN1_TEMPLATE),
111         .funcs = NULL,
112         .size = sizeof(POLICY_MAPPING),
113         .sname = "POLICY_MAPPING",
114 };
115
116 static const ASN1_TEMPLATE POLICY_MAPPINGS_item_tt = {
117         .flags = ASN1_TFLG_SEQUENCE_OF,
118         .tag = 0,
119         .offset = 0,
120         .field_name = "POLICY_MAPPINGS",
121         .item = &POLICY_MAPPING_it,
122 };
123
124 const ASN1_ITEM POLICY_MAPPINGS_it = {
125         .itype = ASN1_ITYPE_PRIMITIVE,
126         .utype = -1,
127         .templates = &POLICY_MAPPINGS_item_tt,
128         .tcount = 0,
129         .funcs = NULL,
130         .size = 0,
131         .sname = "POLICY_MAPPINGS",
132 };
133
134
135 POLICY_MAPPING *
136 POLICY_MAPPING_new(void)
137 {
138         return (POLICY_MAPPING*)ASN1_item_new(&POLICY_MAPPING_it);
139 }
140
141 void
142 POLICY_MAPPING_free(POLICY_MAPPING *a)
143 {
144         ASN1_item_free((ASN1_VALUE *)a, &POLICY_MAPPING_it);
145 }
146
147 static STACK_OF(CONF_VALUE) *
148 i2v_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, void *a,
149     STACK_OF(CONF_VALUE) *ext_list)
150 {
151         POLICY_MAPPINGS *pmaps = a;
152         POLICY_MAPPING *pmap;
153         int i;
154         char obj_tmp1[80];
155         char obj_tmp2[80];
156
157         for (i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) {
158                 pmap = sk_POLICY_MAPPING_value(pmaps, i);
159                 i2t_ASN1_OBJECT(obj_tmp1, 80, pmap->issuerDomainPolicy);
160                 i2t_ASN1_OBJECT(obj_tmp2, 80, pmap->subjectDomainPolicy);
161                 X509V3_add_value(obj_tmp1, obj_tmp2, &ext_list);
162         }
163         return ext_list;
164 }
165
166 static void *
167 v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
168     STACK_OF(CONF_VALUE) *nval)
169 {
170         POLICY_MAPPINGS *pmaps = NULL;
171         POLICY_MAPPING *pmap = NULL;
172         ASN1_OBJECT *obj1 = NULL, *obj2 = NULL;
173         CONF_VALUE *val;
174         int i, rc;
175
176         if (!(pmaps = sk_POLICY_MAPPING_new_null())) {
177                 X509V3error(ERR_R_MALLOC_FAILURE);
178                 return NULL;
179         }
180
181         for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
182                 val = sk_CONF_VALUE_value(nval, i);
183                 if (!val->value || !val->name) {
184                         rc = X509V3_R_INVALID_OBJECT_IDENTIFIER;
185                         goto err;
186                 }
187                 obj1 = OBJ_txt2obj(val->name, 0);
188                 obj2 = OBJ_txt2obj(val->value, 0);
189                 if (!obj1 || !obj2) {
190                         rc = X509V3_R_INVALID_OBJECT_IDENTIFIER;
191                         goto err;
192                 }
193                 pmap = POLICY_MAPPING_new();
194                 if (!pmap) {
195                         rc = ERR_R_MALLOC_FAILURE;
196                         goto err;
197                 }
198                 pmap->issuerDomainPolicy = obj1;
199                 pmap->subjectDomainPolicy = obj2;
200                 obj1 = obj2 = NULL;
201                 if (sk_POLICY_MAPPING_push(pmaps, pmap) == 0) {
202                         rc = ERR_R_MALLOC_FAILURE;
203                         goto err;
204                 }
205                 pmap = NULL;
206         }
207         return pmaps;
208
209 err:
210         sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
211         X509V3error(rc);
212         if (rc == X509V3_R_INVALID_OBJECT_IDENTIFIER)
213                 X509V3_conf_err(val);
214         ASN1_OBJECT_free(obj1);
215         ASN1_OBJECT_free(obj2);
216         POLICY_MAPPING_free(pmap);
217         return NULL;
218 }