Home | History | Annotate | Download | only in asn1
      1 /* a_x509a.c */
      2 /* Written by Dr Stephen N Henson (steve (at) openssl.org) for the OpenSSL
      3  * project 1999.
      4  */
      5 /* ====================================================================
      6  * Copyright (c) 1999 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 (at) 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 (at) cryptsoft.com).  This product includes software written by Tim
     55  * Hudson (tjh (at) cryptsoft.com).
     56  *
     57  */
     58 
     59 #include <stdio.h>
     60 #include "cryptlib.h"
     61 #include <openssl/evp.h>
     62 #include <openssl/asn1t.h>
     63 #include <openssl/x509.h>
     64 
     65 /* X509_CERT_AUX routines. These are used to encode additional
     66  * user modifiable data about a certificate. This data is
     67  * appended to the X509 encoding when the *_X509_AUX routines
     68  * are used. This means that the "traditional" X509 routines
     69  * will simply ignore the extra data.
     70  */
     71 
     72 static X509_CERT_AUX *aux_get(X509 *x);
     73 
     74 ASN1_SEQUENCE(X509_CERT_AUX) = {
     75 	ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
     76 	ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
     77 	ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
     78 	ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
     79 	ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
     80 } ASN1_SEQUENCE_END(X509_CERT_AUX)
     81 
     82 IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
     83 
     84 static X509_CERT_AUX *aux_get(X509 *x)
     85 {
     86 	if(!x) return NULL;
     87 	if(!x->aux && !(x->aux = X509_CERT_AUX_new())) return NULL;
     88 	return x->aux;
     89 }
     90 
     91 int X509_alias_set1(X509 *x, unsigned char *name, int len)
     92 {
     93 	X509_CERT_AUX *aux;
     94 	if (!name)
     95 		{
     96 		if (!x || !x->aux || !x->aux->alias)
     97 			return 1;
     98 		ASN1_UTF8STRING_free(x->aux->alias);
     99 		x->aux->alias = NULL;
    100 		return 1;
    101 		}
    102 	if(!(aux = aux_get(x))) return 0;
    103 	if(!aux->alias && !(aux->alias = ASN1_UTF8STRING_new())) return 0;
    104 	return ASN1_STRING_set(aux->alias, name, len);
    105 }
    106 
    107 int X509_keyid_set1(X509 *x, unsigned char *id, int len)
    108 {
    109 	X509_CERT_AUX *aux;
    110 	if (!id)
    111 		{
    112 		if (!x || !x->aux || !x->aux->keyid)
    113 			return 1;
    114 		ASN1_OCTET_STRING_free(x->aux->keyid);
    115 		x->aux->keyid = NULL;
    116 		return 1;
    117 		}
    118 	if(!(aux = aux_get(x))) return 0;
    119 	if(!aux->keyid && !(aux->keyid = ASN1_OCTET_STRING_new())) return 0;
    120 	return ASN1_STRING_set(aux->keyid, id, len);
    121 }
    122 
    123 unsigned char *X509_alias_get0(X509 *x, int *len)
    124 {
    125 	if(!x->aux || !x->aux->alias) return NULL;
    126 	if(len) *len = x->aux->alias->length;
    127 	return x->aux->alias->data;
    128 }
    129 
    130 unsigned char *X509_keyid_get0(X509 *x, int *len)
    131 {
    132 	if(!x->aux || !x->aux->keyid) return NULL;
    133 	if(len) *len = x->aux->keyid->length;
    134 	return x->aux->keyid->data;
    135 }
    136 
    137 int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj)
    138 {
    139 	X509_CERT_AUX *aux;
    140 	ASN1_OBJECT *objtmp;
    141 	if(!(objtmp = OBJ_dup(obj))) return 0;
    142 	if(!(aux = aux_get(x))) return 0;
    143 	if(!aux->trust
    144 		&& !(aux->trust = sk_ASN1_OBJECT_new_null())) return 0;
    145 	return sk_ASN1_OBJECT_push(aux->trust, objtmp);
    146 }
    147 
    148 int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj)
    149 {
    150 	X509_CERT_AUX *aux;
    151 	ASN1_OBJECT *objtmp;
    152 	if(!(objtmp = OBJ_dup(obj))) return 0;
    153 	if(!(aux = aux_get(x))) return 0;
    154 	if(!aux->reject
    155 		&& !(aux->reject = sk_ASN1_OBJECT_new_null())) return 0;
    156 	return sk_ASN1_OBJECT_push(aux->reject, objtmp);
    157 }
    158 
    159 void X509_trust_clear(X509 *x)
    160 {
    161 	if(x->aux && x->aux->trust) {
    162 		sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
    163 		x->aux->trust = NULL;
    164 	}
    165 }
    166 
    167 void X509_reject_clear(X509 *x)
    168 {
    169 	if(x->aux && x->aux->reject) {
    170 		sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
    171 		x->aux->reject = NULL;
    172 	}
    173 }
    174 
    175 ASN1_SEQUENCE(X509_CERT_PAIR) = {
    176 	ASN1_EXP_OPT(X509_CERT_PAIR, forward, X509, 0),
    177 	ASN1_EXP_OPT(X509_CERT_PAIR, reverse, X509, 1)
    178 } ASN1_SEQUENCE_END(X509_CERT_PAIR)
    179 
    180 IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_PAIR)
    181