v3_extku.c revision 280297
1227569Sphilip/* v3_extku.c */
2227569Sphilip/*
3227569Sphilip * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4227569Sphilip * 1999.
5227569Sphilip */
6227569Sphilip/* ====================================================================
7227569Sphilip * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
8227569Sphilip *
9227569Sphilip * Redistribution and use in source and binary forms, with or without
10227569Sphilip * modification, are permitted provided that the following conditions
11227569Sphilip * are met:
12227569Sphilip *
13227569Sphilip * 1. Redistributions of source code must retain the above copyright
14227569Sphilip *    notice, this list of conditions and the following disclaimer.
15227569Sphilip *
16227569Sphilip * 2. Redistributions in binary form must reproduce the above copyright
17227569Sphilip *    notice, this list of conditions and the following disclaimer in
18227569Sphilip *    the documentation and/or other materials provided with the
19227569Sphilip *    distribution.
20227569Sphilip *
21227569Sphilip * 3. All advertising materials mentioning features or use of this
22227569Sphilip *    software must display the following acknowledgment:
23227569Sphilip *    "This product includes software developed by the OpenSSL Project
24227569Sphilip *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25227569Sphilip *
26227569Sphilip * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27227569Sphilip *    endorse or promote products derived from this software without
28227569Sphilip *    prior written permission. For written permission, please contact
29227569Sphilip *    licensing@OpenSSL.org.
30227569Sphilip *
31227569Sphilip * 5. Products derived from this software may not be called "OpenSSL"
32227569Sphilip *    nor may "OpenSSL" appear in their names without prior written
33227569Sphilip *    permission of the OpenSSL Project.
34227569Sphilip *
35227569Sphilip * 6. Redistributions of any form whatsoever must retain the following
36227569Sphilip *    acknowledgment:
37227569Sphilip *    "This product includes software developed by the OpenSSL Project
38227569Sphilip *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39227569Sphilip *
40227569Sphilip * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41227569Sphilip * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42227569Sphilip * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43227569Sphilip * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44227569Sphilip * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45227569Sphilip * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46227569Sphilip * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47227569Sphilip * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48227569Sphilip * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49227569Sphilip * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50227569Sphilip * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51227569Sphilip * OF THE POSSIBILITY OF SUCH DAMAGE.
52227569Sphilip * ====================================================================
53227569Sphilip *
54227569Sphilip * This product includes cryptographic software written by Eric Young
55278221Sarybchik * (eay@cryptsoft.com).  This product includes software written by Tim
56227569Sphilip * Hudson (tjh@cryptsoft.com).
57227569Sphilip *
58227569Sphilip */
59227569Sphilip
60227569Sphilip#include <stdio.h>
61227569Sphilip#include "cryptlib.h"
62227569Sphilip#include <openssl/asn1t.h>
63278221Sarybchik#include <openssl/conf.h>
64227569Sphilip#include <openssl/x509v3.h>
65227569Sphilip
66227569Sphilipstatic void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
67227569Sphilip                                    X509V3_CTX *ctx,
68227569Sphilip                                    STACK_OF(CONF_VALUE) *nval);
69227569Sphilipstatic STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
70278221Sarybchik                                                    *method, void *eku, STACK_OF(CONF_VALUE)
71227569Sphilip                                                    *extlist);
72227569Sphilip
73227569Sphilipconst X509V3_EXT_METHOD v3_ext_ku = {
74227569Sphilip    NID_ext_key_usage, 0,
75227569Sphilip    ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
76227569Sphilip    0, 0, 0, 0,
77227569Sphilip    0, 0,
78278221Sarybchik    i2v_EXTENDED_KEY_USAGE,
79227569Sphilip    v2i_EXTENDED_KEY_USAGE,
80227569Sphilip    0, 0,
81227569Sphilip    NULL
82227569Sphilip};
83227569Sphilip
84227569Sphilip/* NB OCSP acceptable responses also is a SEQUENCE OF OBJECT */
85227569Sphilipconst X509V3_EXT_METHOD v3_ocsp_accresp = {
86227569Sphilip    NID_id_pkix_OCSP_acceptableResponses, 0,
87227569Sphilip    ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
88227569Sphilip    0, 0, 0, 0,
89227569Sphilip    0, 0,
90227569Sphilip    i2v_EXTENDED_KEY_USAGE,
91227569Sphilip    v2i_EXTENDED_KEY_USAGE,
92227569Sphilip    0, 0,
93227569Sphilip    NULL
94227569Sphilip};
95227569Sphilip
96227569SphilipASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) =
97227569Sphilip        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, EXTENDED_KEY_USAGE, ASN1_OBJECT)
98227569SphilipASN1_ITEM_TEMPLATE_END(EXTENDED_KEY_USAGE)
99227569Sphilip
100227569SphilipIMPLEMENT_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
101227569Sphilip
102227569Sphilipstatic STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
103227569Sphilip                                                    *method, void *a, STACK_OF(CONF_VALUE)
104227569Sphilip                                                    *ext_list)
105227569Sphilip{
106227569Sphilip    EXTENDED_KEY_USAGE *eku = a;
107227569Sphilip    int i;
108227569Sphilip    ASN1_OBJECT *obj;
109227569Sphilip    char obj_tmp[80];
110227569Sphilip    for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
111227569Sphilip        obj = sk_ASN1_OBJECT_value(eku, i);
112227569Sphilip        i2t_ASN1_OBJECT(obj_tmp, 80, obj);
113227569Sphilip        X509V3_add_value(NULL, obj_tmp, &ext_list);
114227569Sphilip    }
115227569Sphilip    return ext_list;
116227569Sphilip}
117227569Sphilip
118227569Sphilipstatic void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
119227569Sphilip                                    X509V3_CTX *ctx,
120227569Sphilip                                    STACK_OF(CONF_VALUE) *nval)
121227569Sphilip{
122227569Sphilip    EXTENDED_KEY_USAGE *extku;
123227569Sphilip    char *extval;
124227569Sphilip    ASN1_OBJECT *objtmp;
125227569Sphilip    CONF_VALUE *val;
126227569Sphilip    int i;
127227569Sphilip
128227569Sphilip    if (!(extku = sk_ASN1_OBJECT_new_null())) {
129227569Sphilip        X509V3err(X509V3_F_V2I_EXTENDED_KEY_USAGE, ERR_R_MALLOC_FAILURE);
130227569Sphilip        return NULL;
131227569Sphilip    }
132227569Sphilip
133227569Sphilip    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
134227569Sphilip        val = sk_CONF_VALUE_value(nval, i);
135227569Sphilip        if (val->value)
136227569Sphilip            extval = val->value;
137227569Sphilip        else
138227569Sphilip            extval = val->name;
139227569Sphilip        if (!(objtmp = OBJ_txt2obj(extval, 0))) {
140227569Sphilip            sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free);
141227569Sphilip            X509V3err(X509V3_F_V2I_EXTENDED_KEY_USAGE,
142227569Sphilip                      X509V3_R_INVALID_OBJECT_IDENTIFIER);
143227569Sphilip            X509V3_conf_err(val);
144227569Sphilip            return NULL;
145227569Sphilip        }
146227569Sphilip        sk_ASN1_OBJECT_push(extku, objtmp);
147227569Sphilip    }
148227569Sphilip    return extku;
149227569Sphilip}
150227569Sphilip