159191Skris/* a_x509a.c */
2296465Sdelphij/*
3296465Sdelphij * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4296465Sdelphij * 1999.
559191Skris */
659191Skris/* ====================================================================
759191Skris * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
859191Skris *
959191Skris * Redistribution and use in source and binary forms, with or without
1059191Skris * modification, are permitted provided that the following conditions
1159191Skris * are met:
1259191Skris *
1359191Skris * 1. Redistributions of source code must retain the above copyright
14296465Sdelphij *    notice, this list of conditions and the following disclaimer.
1559191Skris *
1659191Skris * 2. Redistributions in binary form must reproduce the above copyright
1759191Skris *    notice, this list of conditions and the following disclaimer in
1859191Skris *    the documentation and/or other materials provided with the
1959191Skris *    distribution.
2059191Skris *
2159191Skris * 3. All advertising materials mentioning features or use of this
2259191Skris *    software must display the following acknowledgment:
2359191Skris *    "This product includes software developed by the OpenSSL Project
2459191Skris *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
2559191Skris *
2659191Skris * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
2759191Skris *    endorse or promote products derived from this software without
2859191Skris *    prior written permission. For written permission, please contact
2959191Skris *    licensing@OpenSSL.org.
3059191Skris *
3159191Skris * 5. Products derived from this software may not be called "OpenSSL"
3259191Skris *    nor may "OpenSSL" appear in their names without prior written
3359191Skris *    permission of the OpenSSL Project.
3459191Skris *
3559191Skris * 6. Redistributions of any form whatsoever must retain the following
3659191Skris *    acknowledgment:
3759191Skris *    "This product includes software developed by the OpenSSL Project
3859191Skris *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
3959191Skris *
4059191Skris * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
4159191Skris * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4259191Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
4359191Skris * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
4459191Skris * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4559191Skris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
4659191Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
4759191Skris * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4859191Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
4959191Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
5059191Skris * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
5159191Skris * OF THE POSSIBILITY OF SUCH DAMAGE.
5259191Skris * ====================================================================
5359191Skris *
5459191Skris * This product includes cryptographic software written by Eric Young
5559191Skris * (eay@cryptsoft.com).  This product includes software written by Tim
5659191Skris * Hudson (tjh@cryptsoft.com).
5759191Skris *
5859191Skris */
5959191Skris
6059191Skris#include <stdio.h>
6159191Skris#include "cryptlib.h"
6259191Skris#include <openssl/evp.h>
63109998Smarkm#include <openssl/asn1t.h>
6459191Skris#include <openssl/x509.h>
6559191Skris
66296465Sdelphij/*
67296465Sdelphij * X509_CERT_AUX routines. These are used to encode additional user
68296465Sdelphij * modifiable data about a certificate. This data is appended to the X509
69296465Sdelphij * encoding when the *_X509_AUX routines are used. This means that the
70296465Sdelphij * "traditional" X509 routines will simply ignore the extra data.
7159191Skris */
7259191Skris
7359191Skrisstatic X509_CERT_AUX *aux_get(X509 *x);
7459191Skris
75109998SmarkmASN1_SEQUENCE(X509_CERT_AUX) = {
76296465Sdelphij        ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
77296465Sdelphij        ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
78296465Sdelphij        ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
79296465Sdelphij        ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
80296465Sdelphij        ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
81109998Smarkm} ASN1_SEQUENCE_END(X509_CERT_AUX)
8259191Skris
83109998SmarkmIMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
8459191Skris
8559191Skrisstatic X509_CERT_AUX *aux_get(X509 *x)
8659191Skris{
87296465Sdelphij    if (!x)
88296465Sdelphij        return NULL;
89296465Sdelphij    if (!x->aux && !(x->aux = X509_CERT_AUX_new()))
90296465Sdelphij        return NULL;
91296465Sdelphij    return x->aux;
9259191Skris}
9359191Skris
9459191Skrisint X509_alias_set1(X509 *x, unsigned char *name, int len)
9559191Skris{
96296465Sdelphij    X509_CERT_AUX *aux;
97296465Sdelphij    if (!name) {
98296465Sdelphij        if (!x || !x->aux || !x->aux->alias)
99296465Sdelphij            return 1;
100296465Sdelphij        ASN1_UTF8STRING_free(x->aux->alias);
101296465Sdelphij        x->aux->alias = NULL;
102296465Sdelphij        return 1;
103296465Sdelphij    }
104296465Sdelphij    if (!(aux = aux_get(x)))
105296465Sdelphij        return 0;
106296465Sdelphij    if (!aux->alias && !(aux->alias = ASN1_UTF8STRING_new()))
107296465Sdelphij        return 0;
108296465Sdelphij    return ASN1_STRING_set(aux->alias, name, len);
10959191Skris}
11059191Skris
11168651Skrisint X509_keyid_set1(X509 *x, unsigned char *id, int len)
11268651Skris{
113296465Sdelphij    X509_CERT_AUX *aux;
114296465Sdelphij    if (!id) {
115296465Sdelphij        if (!x || !x->aux || !x->aux->keyid)
116296465Sdelphij            return 1;
117296465Sdelphij        ASN1_OCTET_STRING_free(x->aux->keyid);
118296465Sdelphij        x->aux->keyid = NULL;
119296465Sdelphij        return 1;
120296465Sdelphij    }
121296465Sdelphij    if (!(aux = aux_get(x)))
122296465Sdelphij        return 0;
123296465Sdelphij    if (!aux->keyid && !(aux->keyid = ASN1_OCTET_STRING_new()))
124296465Sdelphij        return 0;
125296465Sdelphij    return ASN1_STRING_set(aux->keyid, id, len);
12668651Skris}
12768651Skris
12859191Skrisunsigned char *X509_alias_get0(X509 *x, int *len)
12959191Skris{
130296465Sdelphij    if (!x->aux || !x->aux->alias)
131296465Sdelphij        return NULL;
132296465Sdelphij    if (len)
133296465Sdelphij        *len = x->aux->alias->length;
134296465Sdelphij    return x->aux->alias->data;
13559191Skris}
13659191Skris
137160814Ssimonunsigned char *X509_keyid_get0(X509 *x, int *len)
138160814Ssimon{
139296465Sdelphij    if (!x->aux || !x->aux->keyid)
140296465Sdelphij        return NULL;
141296465Sdelphij    if (len)
142296465Sdelphij        *len = x->aux->keyid->length;
143296465Sdelphij    return x->aux->keyid->data;
144160814Ssimon}
145160814Ssimon
14659191Skrisint X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj)
14759191Skris{
148296465Sdelphij    X509_CERT_AUX *aux;
149296465Sdelphij    ASN1_OBJECT *objtmp;
150296465Sdelphij    if (!(objtmp = OBJ_dup(obj)))
151296465Sdelphij        return 0;
152296465Sdelphij    if (!(aux = aux_get(x)))
153296465Sdelphij        return 0;
154296465Sdelphij    if (!aux->trust && !(aux->trust = sk_ASN1_OBJECT_new_null()))
155296465Sdelphij        return 0;
156296465Sdelphij    return sk_ASN1_OBJECT_push(aux->trust, objtmp);
15759191Skris}
15859191Skris
15959191Skrisint X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj)
16059191Skris{
161296465Sdelphij    X509_CERT_AUX *aux;
162296465Sdelphij    ASN1_OBJECT *objtmp;
163296465Sdelphij    if (!(objtmp = OBJ_dup(obj)))
164296465Sdelphij        return 0;
165296465Sdelphij    if (!(aux = aux_get(x)))
166296465Sdelphij        return 0;
167296465Sdelphij    if (!aux->reject && !(aux->reject = sk_ASN1_OBJECT_new_null()))
168296465Sdelphij        return 0;
169296465Sdelphij    return sk_ASN1_OBJECT_push(aux->reject, objtmp);
17059191Skris}
17159191Skris
17259191Skrisvoid X509_trust_clear(X509 *x)
17359191Skris{
174296465Sdelphij    if (x->aux && x->aux->trust) {
175296465Sdelphij        sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
176296465Sdelphij        x->aux->trust = NULL;
177296465Sdelphij    }
17859191Skris}
17959191Skris
18059191Skrisvoid X509_reject_clear(X509 *x)
18159191Skris{
182296465Sdelphij    if (x->aux && x->aux->reject) {
183296465Sdelphij        sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
184296465Sdelphij        x->aux->reject = NULL;
185296465Sdelphij    }
18659191Skris}
18759191Skris
188160814SsimonASN1_SEQUENCE(X509_CERT_PAIR) = {
189296465Sdelphij        ASN1_EXP_OPT(X509_CERT_PAIR, forward, X509, 0),
190296465Sdelphij        ASN1_EXP_OPT(X509_CERT_PAIR, reverse, X509, 1)
191160814Ssimon} ASN1_SEQUENCE_END(X509_CERT_PAIR)
192160814Ssimon
193160814SsimonIMPLEMENT_ASN1_FUNCTIONS(X509_CERT_PAIR)
194