xref: /freebsd/crypto/openssl/crypto/x509/x_x509a.c (revision b077aed3)
1e71b7053SJung-uk Kim /*
2*b077aed3SPierre Pronchery  * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim  */
9e71b7053SJung-uk Kim 
10e71b7053SJung-uk Kim #include <stdio.h>
11e71b7053SJung-uk Kim #include "internal/cryptlib.h"
12e71b7053SJung-uk Kim #include <openssl/evp.h>
13e71b7053SJung-uk Kim #include <openssl/asn1t.h>
14e71b7053SJung-uk Kim #include <openssl/x509.h>
1517f01e99SJung-uk Kim #include "crypto/x509.h"
16e71b7053SJung-uk Kim 
17e71b7053SJung-uk Kim /*
18e71b7053SJung-uk Kim  * X509_CERT_AUX routines. These are used to encode additional user
19e71b7053SJung-uk Kim  * modifiable data about a certificate. This data is appended to the X509
20e71b7053SJung-uk Kim  * encoding when the *_X509_AUX routines are used. This means that the
21e71b7053SJung-uk Kim  * "traditional" X509 routines will simply ignore the extra data.
22e71b7053SJung-uk Kim  */
23e71b7053SJung-uk Kim 
24e71b7053SJung-uk Kim static X509_CERT_AUX *aux_get(X509 *x);
25e71b7053SJung-uk Kim 
26e71b7053SJung-uk Kim ASN1_SEQUENCE(X509_CERT_AUX) = {
27e71b7053SJung-uk Kim         ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
28e71b7053SJung-uk Kim         ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
29e71b7053SJung-uk Kim         ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
30e71b7053SJung-uk Kim         ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
31e71b7053SJung-uk Kim         ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
32e71b7053SJung-uk Kim } ASN1_SEQUENCE_END(X509_CERT_AUX)
33e71b7053SJung-uk Kim 
34e71b7053SJung-uk Kim IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
35e71b7053SJung-uk Kim 
36e71b7053SJung-uk Kim int X509_trusted(const X509 *x)
37e71b7053SJung-uk Kim {
38e71b7053SJung-uk Kim     return x->aux ? 1 : 0;
39e71b7053SJung-uk Kim }
40e71b7053SJung-uk Kim 
aux_get(X509 * x)41e71b7053SJung-uk Kim static X509_CERT_AUX *aux_get(X509 *x)
42e71b7053SJung-uk Kim {
43e71b7053SJung-uk Kim     if (x == NULL)
44e71b7053SJung-uk Kim         return NULL;
45e71b7053SJung-uk Kim     if (x->aux == NULL && (x->aux = X509_CERT_AUX_new()) == NULL)
46e71b7053SJung-uk Kim         return NULL;
47e71b7053SJung-uk Kim     return x->aux;
48e71b7053SJung-uk Kim }
49e71b7053SJung-uk Kim 
X509_alias_set1(X509 * x,const unsigned char * name,int len)50e71b7053SJung-uk Kim int X509_alias_set1(X509 *x, const unsigned char *name, int len)
51e71b7053SJung-uk Kim {
52e71b7053SJung-uk Kim     X509_CERT_AUX *aux;
53e71b7053SJung-uk Kim     if (!name) {
54e71b7053SJung-uk Kim         if (!x || !x->aux || !x->aux->alias)
55e71b7053SJung-uk Kim             return 1;
56e71b7053SJung-uk Kim         ASN1_UTF8STRING_free(x->aux->alias);
57e71b7053SJung-uk Kim         x->aux->alias = NULL;
58e71b7053SJung-uk Kim         return 1;
59e71b7053SJung-uk Kim     }
60e71b7053SJung-uk Kim     if ((aux = aux_get(x)) == NULL)
61e71b7053SJung-uk Kim         return 0;
62e71b7053SJung-uk Kim     if (aux->alias == NULL && (aux->alias = ASN1_UTF8STRING_new()) == NULL)
63e71b7053SJung-uk Kim         return 0;
64e71b7053SJung-uk Kim     return ASN1_STRING_set(aux->alias, name, len);
65e71b7053SJung-uk Kim }
66e71b7053SJung-uk Kim 
X509_keyid_set1(X509 * x,const unsigned char * id,int len)67e71b7053SJung-uk Kim int X509_keyid_set1(X509 *x, const unsigned char *id, int len)
68e71b7053SJung-uk Kim {
69e71b7053SJung-uk Kim     X509_CERT_AUX *aux;
70e71b7053SJung-uk Kim     if (!id) {
71e71b7053SJung-uk Kim         if (!x || !x->aux || !x->aux->keyid)
72e71b7053SJung-uk Kim             return 1;
73e71b7053SJung-uk Kim         ASN1_OCTET_STRING_free(x->aux->keyid);
74e71b7053SJung-uk Kim         x->aux->keyid = NULL;
75e71b7053SJung-uk Kim         return 1;
76e71b7053SJung-uk Kim     }
77e71b7053SJung-uk Kim     if ((aux = aux_get(x)) == NULL)
78e71b7053SJung-uk Kim         return 0;
79e71b7053SJung-uk Kim     if (aux->keyid == NULL
80e71b7053SJung-uk Kim         && (aux->keyid = ASN1_OCTET_STRING_new()) == NULL)
81e71b7053SJung-uk Kim         return 0;
82e71b7053SJung-uk Kim     return ASN1_STRING_set(aux->keyid, id, len);
83e71b7053SJung-uk Kim }
84e71b7053SJung-uk Kim 
X509_alias_get0(X509 * x,int * len)85e71b7053SJung-uk Kim unsigned char *X509_alias_get0(X509 *x, int *len)
86e71b7053SJung-uk Kim {
87e71b7053SJung-uk Kim     if (!x->aux || !x->aux->alias)
88e71b7053SJung-uk Kim         return NULL;
89e71b7053SJung-uk Kim     if (len)
90e71b7053SJung-uk Kim         *len = x->aux->alias->length;
91e71b7053SJung-uk Kim     return x->aux->alias->data;
92e71b7053SJung-uk Kim }
93e71b7053SJung-uk Kim 
X509_keyid_get0(X509 * x,int * len)94e71b7053SJung-uk Kim unsigned char *X509_keyid_get0(X509 *x, int *len)
95e71b7053SJung-uk Kim {
96e71b7053SJung-uk Kim     if (!x->aux || !x->aux->keyid)
97e71b7053SJung-uk Kim         return NULL;
98e71b7053SJung-uk Kim     if (len)
99e71b7053SJung-uk Kim         *len = x->aux->keyid->length;
100e71b7053SJung-uk Kim     return x->aux->keyid->data;
101e71b7053SJung-uk Kim }
102e71b7053SJung-uk Kim 
X509_add1_trust_object(X509 * x,const ASN1_OBJECT * obj)103e71b7053SJung-uk Kim int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj)
104e71b7053SJung-uk Kim {
105e71b7053SJung-uk Kim     X509_CERT_AUX *aux;
106e71b7053SJung-uk Kim     ASN1_OBJECT *objtmp = NULL;
107e71b7053SJung-uk Kim     if (obj) {
108e71b7053SJung-uk Kim         objtmp = OBJ_dup(obj);
109e71b7053SJung-uk Kim         if (!objtmp)
110e71b7053SJung-uk Kim             return 0;
111e71b7053SJung-uk Kim     }
112e71b7053SJung-uk Kim     if ((aux = aux_get(x)) == NULL)
113e71b7053SJung-uk Kim         goto err;
114e71b7053SJung-uk Kim     if (aux->trust == NULL
115e71b7053SJung-uk Kim         && (aux->trust = sk_ASN1_OBJECT_new_null()) == NULL)
116e71b7053SJung-uk Kim         goto err;
117e71b7053SJung-uk Kim     if (!objtmp || sk_ASN1_OBJECT_push(aux->trust, objtmp))
118e71b7053SJung-uk Kim         return 1;
119e71b7053SJung-uk Kim  err:
120e71b7053SJung-uk Kim     ASN1_OBJECT_free(objtmp);
121e71b7053SJung-uk Kim     return 0;
122e71b7053SJung-uk Kim }
123e71b7053SJung-uk Kim 
X509_add1_reject_object(X509 * x,const ASN1_OBJECT * obj)124e71b7053SJung-uk Kim int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj)
125e71b7053SJung-uk Kim {
126e71b7053SJung-uk Kim     X509_CERT_AUX *aux;
127e71b7053SJung-uk Kim     ASN1_OBJECT *objtmp;
128*b077aed3SPierre Pronchery     int res = 0;
129*b077aed3SPierre Pronchery 
130e71b7053SJung-uk Kim     if ((objtmp = OBJ_dup(obj)) == NULL)
131e71b7053SJung-uk Kim         return 0;
132e71b7053SJung-uk Kim     if ((aux = aux_get(x)) == NULL)
133e71b7053SJung-uk Kim         goto err;
134e71b7053SJung-uk Kim     if (aux->reject == NULL
135e71b7053SJung-uk Kim         && (aux->reject = sk_ASN1_OBJECT_new_null()) == NULL)
136e71b7053SJung-uk Kim         goto err;
137*b077aed3SPierre Pronchery     if (sk_ASN1_OBJECT_push(aux->reject, objtmp) > 0)
138*b077aed3SPierre Pronchery         res = 1;
139*b077aed3SPierre Pronchery 
140e71b7053SJung-uk Kim  err:
141*b077aed3SPierre Pronchery     if (!res)
142e71b7053SJung-uk Kim         ASN1_OBJECT_free(objtmp);
143*b077aed3SPierre Pronchery     return res;
144e71b7053SJung-uk Kim }
145e71b7053SJung-uk Kim 
X509_trust_clear(X509 * x)146e71b7053SJung-uk Kim void X509_trust_clear(X509 *x)
147e71b7053SJung-uk Kim {
148e71b7053SJung-uk Kim     if (x->aux) {
149e71b7053SJung-uk Kim         sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
150e71b7053SJung-uk Kim         x->aux->trust = NULL;
151e71b7053SJung-uk Kim     }
152e71b7053SJung-uk Kim }
153e71b7053SJung-uk Kim 
X509_reject_clear(X509 * x)154e71b7053SJung-uk Kim void X509_reject_clear(X509 *x)
155e71b7053SJung-uk Kim {
156e71b7053SJung-uk Kim     if (x->aux) {
157e71b7053SJung-uk Kim         sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
158e71b7053SJung-uk Kim         x->aux->reject = NULL;
159e71b7053SJung-uk Kim     }
160e71b7053SJung-uk Kim }
161e71b7053SJung-uk Kim 
STACK_OF(ASN1_OBJECT)162e71b7053SJung-uk Kim STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x)
163e71b7053SJung-uk Kim {
164e71b7053SJung-uk Kim     if (x->aux != NULL)
165e71b7053SJung-uk Kim         return x->aux->trust;
166e71b7053SJung-uk Kim     return NULL;
167e71b7053SJung-uk Kim }
168e71b7053SJung-uk Kim 
STACK_OF(ASN1_OBJECT)169e71b7053SJung-uk Kim STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x)
170e71b7053SJung-uk Kim {
171e71b7053SJung-uk Kim     if (x->aux != NULL)
172e71b7053SJung-uk Kim         return x->aux->reject;
173e71b7053SJung-uk Kim     return NULL;
174e71b7053SJung-uk Kim }
175