Update copyright year
[openssl.git] / crypto / x509 / v3_info.c
1 /*
2  * Copyright 1999-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 <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/conf.h>
13 #include <openssl/asn1.h>
14 #include <openssl/asn1t.h>
15 #include <openssl/x509v3.h>
16 #include "ext_dat.h"
17
18 DEFINE_STACK_OF(ACCESS_DESCRIPTION)
19 DEFINE_STACK_OF(CONF_VALUE)
20
21 static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
22                                                        *method, AUTHORITY_INFO_ACCESS
23                                                        *ainfo, STACK_OF(CONF_VALUE)
24                                                        *ret);
25 static AUTHORITY_INFO_ACCESS *v2i_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
26                                                         *method,
27                                                         X509V3_CTX *ctx,
28                                                         STACK_OF(CONF_VALUE)
29                                                         *nval);
30
31 const X509V3_EXT_METHOD v3_info = { NID_info_access, X509V3_EXT_MULTILINE,
32     ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS),
33     0, 0, 0, 0,
34     0, 0,
35     (X509V3_EXT_I2V) i2v_AUTHORITY_INFO_ACCESS,
36     (X509V3_EXT_V2I)v2i_AUTHORITY_INFO_ACCESS,
37     0, 0,
38     NULL
39 };
40
41 const X509V3_EXT_METHOD v3_sinfo = { NID_sinfo_access, X509V3_EXT_MULTILINE,
42     ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS),
43     0, 0, 0, 0,
44     0, 0,
45     (X509V3_EXT_I2V) i2v_AUTHORITY_INFO_ACCESS,
46     (X509V3_EXT_V2I)v2i_AUTHORITY_INFO_ACCESS,
47     0, 0,
48     NULL
49 };
50
51 ASN1_SEQUENCE(ACCESS_DESCRIPTION) = {
52         ASN1_SIMPLE(ACCESS_DESCRIPTION, method, ASN1_OBJECT),
53         ASN1_SIMPLE(ACCESS_DESCRIPTION, location, GENERAL_NAME)
54 } ASN1_SEQUENCE_END(ACCESS_DESCRIPTION)
55
56 IMPLEMENT_ASN1_FUNCTIONS(ACCESS_DESCRIPTION)
57
58 ASN1_ITEM_TEMPLATE(AUTHORITY_INFO_ACCESS) =
59         ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, ACCESS_DESCRIPTION)
60 ASN1_ITEM_TEMPLATE_END(AUTHORITY_INFO_ACCESS)
61
62 IMPLEMENT_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS)
63
64 static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(
65     X509V3_EXT_METHOD *method, AUTHORITY_INFO_ACCESS *ainfo,
66     STACK_OF(CONF_VALUE) *ret)
67 {
68     ACCESS_DESCRIPTION *desc;
69     int i, nlen;
70     char objtmp[80], *ntmp;
71     CONF_VALUE *vtmp;
72     STACK_OF(CONF_VALUE) *tret = ret;
73
74     for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) {
75         STACK_OF(CONF_VALUE) *tmp;
76
77         desc = sk_ACCESS_DESCRIPTION_value(ainfo, i);
78         tmp = i2v_GENERAL_NAME(method, desc->location, tret);
79         if (tmp == NULL)
80             goto err;
81         tret = tmp;
82         vtmp = sk_CONF_VALUE_value(tret, i);
83         i2t_ASN1_OBJECT(objtmp, sizeof(objtmp), desc->method);
84         nlen = strlen(objtmp) + 3 + strlen(vtmp->name) + 1;
85         ntmp = OPENSSL_malloc(nlen);
86         if (ntmp == NULL)
87             goto err;
88         BIO_snprintf(ntmp, nlen, "%s - %s", objtmp, vtmp->name);
89         OPENSSL_free(vtmp->name);
90         vtmp->name = ntmp;
91     }
92     if (ret == NULL && tret == NULL)
93         return sk_CONF_VALUE_new_null();
94
95     return tret;
96  err:
97     X509V3err(X509V3_F_I2V_AUTHORITY_INFO_ACCESS, ERR_R_MALLOC_FAILURE);
98     if (ret == NULL && tret != NULL)
99         sk_CONF_VALUE_pop_free(tret, X509V3_conf_free);
100     return NULL;
101 }
102
103 static AUTHORITY_INFO_ACCESS *v2i_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
104                                                         *method,
105                                                         X509V3_CTX *ctx,
106                                                         STACK_OF(CONF_VALUE)
107                                                         *nval)
108 {
109     AUTHORITY_INFO_ACCESS *ainfo = NULL;
110     CONF_VALUE *cnf, ctmp;
111     ACCESS_DESCRIPTION *acc;
112     int i, objlen;
113     const int num = sk_CONF_VALUE_num(nval);
114     char *objtmp, *ptmp;
115
116     if ((ainfo = sk_ACCESS_DESCRIPTION_new_reserve(NULL, num)) == NULL) {
117         X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS, ERR_R_MALLOC_FAILURE);
118         return NULL;
119     }
120     for (i = 0; i < num; i++) {
121         cnf = sk_CONF_VALUE_value(nval, i);
122         if ((acc = ACCESS_DESCRIPTION_new()) == NULL) {
123             X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
124                       ERR_R_MALLOC_FAILURE);
125             goto err;
126         }
127         sk_ACCESS_DESCRIPTION_push(ainfo, acc); /* Cannot fail due to reserve */
128         ptmp = strchr(cnf->name, ';');
129         if (ptmp == NULL) {
130             X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
131                       X509V3_R_INVALID_SYNTAX);
132             goto err;
133         }
134         objlen = ptmp - cnf->name;
135         ctmp.name = ptmp + 1;
136         ctmp.value = cnf->value;
137         if (!v2i_GENERAL_NAME_ex(acc->location, method, ctx, &ctmp, 0))
138             goto err;
139         if ((objtmp = OPENSSL_strndup(cnf->name, objlen)) == NULL) {
140             X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
141                       ERR_R_MALLOC_FAILURE);
142             goto err;
143         }
144         acc->method = OBJ_txt2obj(objtmp, 0);
145         if (!acc->method) {
146             X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
147                       X509V3_R_BAD_OBJECT);
148             ERR_add_error_data(2, "value=", objtmp);
149             OPENSSL_free(objtmp);
150             goto err;
151         }
152         OPENSSL_free(objtmp);
153
154     }
155     return ainfo;
156  err:
157     sk_ACCESS_DESCRIPTION_pop_free(ainfo, ACCESS_DESCRIPTION_free);
158     return NULL;
159 }
160
161 int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a)
162 {
163     i2a_ASN1_OBJECT(bp, a->method);
164     return 2;
165 }