Line data Source code
1 : /* v3_bitst.c */
2 : /*
3 : * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4 : * 1999.
5 : */
6 : /* ====================================================================
7 : * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
8 : *
9 : * Redistribution and use in source and binary forms, with or without
10 : * modification, are permitted provided that the following conditions
11 : * are met:
12 : *
13 : * 1. Redistributions of source code must retain the above copyright
14 : * notice, this list of conditions and the following disclaimer.
15 : *
16 : * 2. Redistributions in binary form must reproduce the above copyright
17 : * notice, this list of conditions and the following disclaimer in
18 : * the documentation and/or other materials provided with the
19 : * distribution.
20 : *
21 : * 3. All advertising materials mentioning features or use of this
22 : * software must display the following acknowledgment:
23 : * "This product includes software developed by the OpenSSL Project
24 : * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25 : *
26 : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27 : * endorse or promote products derived from this software without
28 : * prior written permission. For written permission, please contact
29 : * licensing@OpenSSL.org.
30 : *
31 : * 5. Products derived from this software may not be called "OpenSSL"
32 : * nor may "OpenSSL" appear in their names without prior written
33 : * permission of the OpenSSL Project.
34 : *
35 : * 6. Redistributions of any form whatsoever must retain the following
36 : * acknowledgment:
37 : * "This product includes software developed by the OpenSSL Project
38 : * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39 : *
40 : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41 : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44 : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49 : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51 : * OF THE POSSIBILITY OF SUCH DAMAGE.
52 : * ====================================================================
53 : *
54 : * This product includes cryptographic software written by Eric Young
55 : * (eay@cryptsoft.com). This product includes software written by Tim
56 : * Hudson (tjh@cryptsoft.com).
57 : *
58 : */
59 :
60 : #include <stdio.h>
61 : #include "cryptlib.h"
62 : #include <openssl/conf.h>
63 : #include <openssl/x509v3.h>
64 :
65 : static BIT_STRING_BITNAME ns_cert_type_table[] = {
66 : {0, "SSL Client", "client"},
67 : {1, "SSL Server", "server"},
68 : {2, "S/MIME", "email"},
69 : {3, "Object Signing", "objsign"},
70 : {4, "Unused", "reserved"},
71 : {5, "SSL CA", "sslCA"},
72 : {6, "S/MIME CA", "emailCA"},
73 : {7, "Object Signing CA", "objCA"},
74 : {-1, NULL, NULL}
75 : };
76 :
77 : static BIT_STRING_BITNAME key_usage_type_table[] = {
78 : {0, "Digital Signature", "digitalSignature"},
79 : {1, "Non Repudiation", "nonRepudiation"},
80 : {2, "Key Encipherment", "keyEncipherment"},
81 : {3, "Data Encipherment", "dataEncipherment"},
82 : {4, "Key Agreement", "keyAgreement"},
83 : {5, "Certificate Sign", "keyCertSign"},
84 : {6, "CRL Sign", "cRLSign"},
85 : {7, "Encipher Only", "encipherOnly"},
86 : {8, "Decipher Only", "decipherOnly"},
87 : {-1, NULL, NULL}
88 : };
89 :
90 : const X509V3_EXT_METHOD v3_nscert =
91 : EXT_BITSTRING(NID_netscape_cert_type, ns_cert_type_table);
92 : const X509V3_EXT_METHOD v3_key_usage =
93 : EXT_BITSTRING(NID_key_usage, key_usage_type_table);
94 :
95 0 : STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
96 : ASN1_BIT_STRING *bits,
97 : STACK_OF(CONF_VALUE) *ret)
98 : {
99 : BIT_STRING_BITNAME *bnam;
100 0 : for (bnam = method->usr_data; bnam->lname; bnam++) {
101 0 : if (ASN1_BIT_STRING_get_bit(bits, bnam->bitnum))
102 0 : X509V3_add_value(bnam->lname, NULL, &ret);
103 : }
104 0 : return ret;
105 : }
106 :
107 0 : ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
108 : X509V3_CTX *ctx,
109 : STACK_OF(CONF_VALUE) *nval)
110 : {
111 : CONF_VALUE *val;
112 : ASN1_BIT_STRING *bs;
113 : int i;
114 : BIT_STRING_BITNAME *bnam;
115 0 : if (!(bs = M_ASN1_BIT_STRING_new())) {
116 0 : X509V3err(X509V3_F_V2I_ASN1_BIT_STRING, ERR_R_MALLOC_FAILURE);
117 0 : return NULL;
118 : }
119 0 : for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
120 0 : val = sk_CONF_VALUE_value(nval, i);
121 0 : for (bnam = method->usr_data; bnam->lname; bnam++) {
122 0 : if (!strcmp(bnam->sname, val->name) ||
123 0 : !strcmp(bnam->lname, val->name)) {
124 0 : if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) {
125 0 : X509V3err(X509V3_F_V2I_ASN1_BIT_STRING,
126 : ERR_R_MALLOC_FAILURE);
127 0 : M_ASN1_BIT_STRING_free(bs);
128 0 : return NULL;
129 : }
130 : break;
131 : }
132 : }
133 0 : if (!bnam->lname) {
134 0 : X509V3err(X509V3_F_V2I_ASN1_BIT_STRING,
135 : X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT);
136 0 : X509V3_conf_err(val);
137 0 : M_ASN1_BIT_STRING_free(bs);
138 0 : return NULL;
139 : }
140 : }
141 : return bs;
142 : }
|