Home | History | Annotate | Download | only in x509
      1 /* Written by Dr Stephen N Henson (steve (at) openssl.org) for the OpenSSL
      2  * project 1999. */
      3 /* ====================================================================
      4  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  *
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  *
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *
     18  * 3. All advertising materials mentioning features or use of this
     19  *    software must display the following acknowledgment:
     20  *    "This product includes software developed by the OpenSSL Project
     21  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
     22  *
     23  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     24  *    endorse or promote products derived from this software without
     25  *    prior written permission. For written permission, please contact
     26  *    licensing (at) OpenSSL.org.
     27  *
     28  * 5. Products derived from this software may not be called "OpenSSL"
     29  *    nor may "OpenSSL" appear in their names without prior written
     30  *    permission of the OpenSSL Project.
     31  *
     32  * 6. Redistributions of any form whatsoever must retain the following
     33  *    acknowledgment:
     34  *    "This product includes software developed by the OpenSSL Project
     35  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
     36  *
     37  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     38  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     39  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     40  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     43  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     44  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     45  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     46  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     47  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     48  * OF THE POSSIBILITY OF SUCH DAMAGE.
     49  * ====================================================================
     50  *
     51  * This product includes cryptographic software written by Eric Young
     52  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     53  * Hudson (tjh (at) cryptsoft.com). */
     54 
     55 #include <stdio.h>
     56 
     57 #include <openssl/asn1t.h>
     58 #include <openssl/evp.h>
     59 #include <openssl/obj.h>
     60 #include <openssl/x509.h>
     61 
     62 
     63 /* X509_CERT_AUX routines. These are used to encode additional
     64  * user modifiable data about a certificate. This data is
     65  * appended to the X509 encoding when the *_X509_AUX routines
     66  * are used. This means that the "traditional" X509 routines
     67  * will simply ignore the extra data. */
     68 
     69 static X509_CERT_AUX *aux_get(X509 *x);
     70 
     71 ASN1_SEQUENCE(X509_CERT_AUX) = {
     72 	ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
     73 	ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
     74 	ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
     75 	ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
     76 	ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
     77 } ASN1_SEQUENCE_END(X509_CERT_AUX)
     78 
     79 IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
     80 
     81 static X509_CERT_AUX *aux_get(X509 *x)
     82 {
     83 	if(!x) return NULL;
     84 	if(!x->aux && !(x->aux = X509_CERT_AUX_new())) return NULL;
     85 	return x->aux;
     86 }
     87 
     88 int X509_alias_set1(X509 *x, unsigned char *name, int len)
     89 {
     90 	X509_CERT_AUX *aux;
     91 	if (!name)
     92 		{
     93 		if (!x || !x->aux || !x->aux->alias)
     94 			return 1;
     95 		ASN1_UTF8STRING_free(x->aux->alias);
     96 		x->aux->alias = NULL;
     97 		return 1;
     98 		}
     99 	if(!(aux = aux_get(x))) return 0;
    100 	if(!aux->alias && !(aux->alias = ASN1_UTF8STRING_new())) return 0;
    101 	return ASN1_STRING_set(aux->alias, name, len);
    102 }
    103 
    104 int X509_keyid_set1(X509 *x, unsigned char *id, int len)
    105 {
    106 	X509_CERT_AUX *aux;
    107 	if (!id)
    108 		{
    109 		if (!x || !x->aux || !x->aux->keyid)
    110 			return 1;
    111 		ASN1_OCTET_STRING_free(x->aux->keyid);
    112 		x->aux->keyid = NULL;
    113 		return 1;
    114 		}
    115 	if(!(aux = aux_get(x))) return 0;
    116 	if(!aux->keyid && !(aux->keyid = ASN1_OCTET_STRING_new())) return 0;
    117 	return ASN1_STRING_set(aux->keyid, id, len);
    118 }
    119 
    120 unsigned char *X509_alias_get0(X509 *x, int *len)
    121 {
    122 	if(!x->aux || !x->aux->alias) return NULL;
    123 	if(len) *len = x->aux->alias->length;
    124 	return x->aux->alias->data;
    125 }
    126 
    127 unsigned char *X509_keyid_get0(X509 *x, int *len)
    128 {
    129 	if(!x->aux || !x->aux->keyid) return NULL;
    130 	if(len) *len = x->aux->keyid->length;
    131 	return x->aux->keyid->data;
    132 }
    133 
    134 int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj)
    135 {
    136 	ASN1_OBJECT *objtmp = OBJ_dup(obj);
    137 	if (objtmp == NULL)
    138 		goto err;
    139 	X509_CERT_AUX *aux = aux_get(x);
    140 	if (aux->trust == NULL)
    141 		{
    142 		aux->trust = sk_ASN1_OBJECT_new_null();
    143 		if (aux->trust == NULL)
    144 			goto err;
    145 		}
    146 	if (!sk_ASN1_OBJECT_push(aux->trust, objtmp))
    147 		goto err;
    148 	return 1;
    149 
    150 err:
    151 	ASN1_OBJECT_free(objtmp);
    152 	return 0;
    153 }
    154 
    155 int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj)
    156 {
    157 	ASN1_OBJECT *objtmp = OBJ_dup(obj);
    158 	if (objtmp == NULL)
    159 		goto err;
    160 	X509_CERT_AUX *aux = aux_get(x);
    161 	if (aux->reject == NULL)
    162 		{
    163 		aux->reject = sk_ASN1_OBJECT_new_null();
    164 		if (aux->reject == NULL)
    165 			goto err;
    166 		}
    167 	if (!sk_ASN1_OBJECT_push(aux->reject, objtmp))
    168 		goto err;
    169 	return 1;
    170 
    171 err:
    172 	ASN1_OBJECT_free(objtmp);
    173 	return 0;
    174 }
    175 
    176 void X509_trust_clear(X509 *x)
    177 {
    178 	if(x->aux && x->aux->trust) {
    179 		sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
    180 		x->aux->trust = NULL;
    181 	}
    182 }
    183 
    184 void X509_reject_clear(X509 *x)
    185 {
    186 	if(x->aux && x->aux->reject) {
    187 		sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
    188 		x->aux->reject = NULL;
    189 	}
    190 }
    191 
    192 ASN1_SEQUENCE(X509_CERT_PAIR) = {
    193 	ASN1_EXP_OPT(X509_CERT_PAIR, forward, X509, 0),
    194 	ASN1_EXP_OPT(X509_CERT_PAIR, reverse, X509, 1)
    195 } ASN1_SEQUENCE_END(X509_CERT_PAIR)
    196 
    197 IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_PAIR)
    198