xref: /aosp_15_r20/external/boringssl/src/crypto/x509/x509cset.c (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /*
2*8fb009dcSAndroid Build Coastguard Worker  * Written by Dr Stephen N Henson ([email protected]) for the OpenSSL project
3*8fb009dcSAndroid Build Coastguard Worker  * 2001.
4*8fb009dcSAndroid Build Coastguard Worker  */
5*8fb009dcSAndroid Build Coastguard Worker /* ====================================================================
6*8fb009dcSAndroid Build Coastguard Worker  * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
7*8fb009dcSAndroid Build Coastguard Worker  *
8*8fb009dcSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*8fb009dcSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*8fb009dcSAndroid Build Coastguard Worker  * are met:
11*8fb009dcSAndroid Build Coastguard Worker  *
12*8fb009dcSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
13*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
14*8fb009dcSAndroid Build Coastguard Worker  *
15*8fb009dcSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
16*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
17*8fb009dcSAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
18*8fb009dcSAndroid Build Coastguard Worker  *    distribution.
19*8fb009dcSAndroid Build Coastguard Worker  *
20*8fb009dcSAndroid Build Coastguard Worker  * 3. All advertising materials mentioning features or use of this
21*8fb009dcSAndroid Build Coastguard Worker  *    software must display the following acknowledgment:
22*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
23*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24*8fb009dcSAndroid Build Coastguard Worker  *
25*8fb009dcSAndroid Build Coastguard Worker  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26*8fb009dcSAndroid Build Coastguard Worker  *    endorse or promote products derived from this software without
27*8fb009dcSAndroid Build Coastguard Worker  *    prior written permission. For written permission, please contact
28*8fb009dcSAndroid Build Coastguard Worker  *    [email protected].
29*8fb009dcSAndroid Build Coastguard Worker  *
30*8fb009dcSAndroid Build Coastguard Worker  * 5. Products derived from this software may not be called "OpenSSL"
31*8fb009dcSAndroid Build Coastguard Worker  *    nor may "OpenSSL" appear in their names without prior written
32*8fb009dcSAndroid Build Coastguard Worker  *    permission of the OpenSSL Project.
33*8fb009dcSAndroid Build Coastguard Worker  *
34*8fb009dcSAndroid Build Coastguard Worker  * 6. Redistributions of any form whatsoever must retain the following
35*8fb009dcSAndroid Build Coastguard Worker  *    acknowledgment:
36*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
37*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38*8fb009dcSAndroid Build Coastguard Worker  *
39*8fb009dcSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40*8fb009dcSAndroid Build Coastguard Worker  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41*8fb009dcSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42*8fb009dcSAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43*8fb009dcSAndroid Build Coastguard Worker  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45*8fb009dcSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46*8fb009dcSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47*8fb009dcSAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48*8fb009dcSAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49*8fb009dcSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50*8fb009dcSAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
51*8fb009dcSAndroid Build Coastguard Worker  * ====================================================================
52*8fb009dcSAndroid Build Coastguard Worker  *
53*8fb009dcSAndroid Build Coastguard Worker  * This product includes cryptographic software written by Eric Young
54*8fb009dcSAndroid Build Coastguard Worker  * ([email protected]).  This product includes software written by Tim
55*8fb009dcSAndroid Build Coastguard Worker  * Hudson ([email protected]). */
56*8fb009dcSAndroid Build Coastguard Worker 
57*8fb009dcSAndroid Build Coastguard Worker #include <openssl/asn1.h>
58*8fb009dcSAndroid Build Coastguard Worker #include <openssl/evp.h>
59*8fb009dcSAndroid Build Coastguard Worker #include <openssl/obj.h>
60*8fb009dcSAndroid Build Coastguard Worker #include <openssl/x509.h>
61*8fb009dcSAndroid Build Coastguard Worker 
62*8fb009dcSAndroid Build Coastguard Worker #include "../asn1/internal.h"
63*8fb009dcSAndroid Build Coastguard Worker #include "../internal.h"
64*8fb009dcSAndroid Build Coastguard Worker #include "internal.h"
65*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set_version(X509_CRL * x,long version)66*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set_version(X509_CRL *x, long version) {
67*8fb009dcSAndroid Build Coastguard Worker   if (x == NULL) {
68*8fb009dcSAndroid Build Coastguard Worker     return 0;
69*8fb009dcSAndroid Build Coastguard Worker   }
70*8fb009dcSAndroid Build Coastguard Worker 
71*8fb009dcSAndroid Build Coastguard Worker   if (version < X509_CRL_VERSION_1 || version > X509_CRL_VERSION_2) {
72*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
73*8fb009dcSAndroid Build Coastguard Worker     return 0;
74*8fb009dcSAndroid Build Coastguard Worker   }
75*8fb009dcSAndroid Build Coastguard Worker 
76*8fb009dcSAndroid Build Coastguard Worker   // v1(0) is default and is represented by omitting the version.
77*8fb009dcSAndroid Build Coastguard Worker   if (version == X509_CRL_VERSION_1) {
78*8fb009dcSAndroid Build Coastguard Worker     ASN1_INTEGER_free(x->crl->version);
79*8fb009dcSAndroid Build Coastguard Worker     x->crl->version = NULL;
80*8fb009dcSAndroid Build Coastguard Worker     return 1;
81*8fb009dcSAndroid Build Coastguard Worker   }
82*8fb009dcSAndroid Build Coastguard Worker 
83*8fb009dcSAndroid Build Coastguard Worker   if (x->crl->version == NULL) {
84*8fb009dcSAndroid Build Coastguard Worker     x->crl->version = ASN1_INTEGER_new();
85*8fb009dcSAndroid Build Coastguard Worker     if (x->crl->version == NULL) {
86*8fb009dcSAndroid Build Coastguard Worker       return 0;
87*8fb009dcSAndroid Build Coastguard Worker     }
88*8fb009dcSAndroid Build Coastguard Worker   }
89*8fb009dcSAndroid Build Coastguard Worker   return ASN1_INTEGER_set_int64(x->crl->version, version);
90*8fb009dcSAndroid Build Coastguard Worker }
91*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set_issuer_name(X509_CRL * x,X509_NAME * name)92*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) {
93*8fb009dcSAndroid Build Coastguard Worker   if ((x == NULL) || (x->crl == NULL)) {
94*8fb009dcSAndroid Build Coastguard Worker     return 0;
95*8fb009dcSAndroid Build Coastguard Worker   }
96*8fb009dcSAndroid Build Coastguard Worker   return (X509_NAME_set(&x->crl->issuer, name));
97*8fb009dcSAndroid Build Coastguard Worker }
98*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set1_lastUpdate(X509_CRL * x,const ASN1_TIME * tm)99*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) {
100*8fb009dcSAndroid Build Coastguard Worker   ASN1_TIME *in;
101*8fb009dcSAndroid Build Coastguard Worker 
102*8fb009dcSAndroid Build Coastguard Worker   if (x == NULL) {
103*8fb009dcSAndroid Build Coastguard Worker     return 0;
104*8fb009dcSAndroid Build Coastguard Worker   }
105*8fb009dcSAndroid Build Coastguard Worker   in = x->crl->lastUpdate;
106*8fb009dcSAndroid Build Coastguard Worker   if (in != tm) {
107*8fb009dcSAndroid Build Coastguard Worker     in = ASN1_STRING_dup(tm);
108*8fb009dcSAndroid Build Coastguard Worker     if (in != NULL) {
109*8fb009dcSAndroid Build Coastguard Worker       ASN1_TIME_free(x->crl->lastUpdate);
110*8fb009dcSAndroid Build Coastguard Worker       x->crl->lastUpdate = in;
111*8fb009dcSAndroid Build Coastguard Worker     }
112*8fb009dcSAndroid Build Coastguard Worker   }
113*8fb009dcSAndroid Build Coastguard Worker   return in != NULL;
114*8fb009dcSAndroid Build Coastguard Worker }
115*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set1_nextUpdate(X509_CRL * x,const ASN1_TIME * tm)116*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) {
117*8fb009dcSAndroid Build Coastguard Worker   ASN1_TIME *in;
118*8fb009dcSAndroid Build Coastguard Worker 
119*8fb009dcSAndroid Build Coastguard Worker   if (x == NULL) {
120*8fb009dcSAndroid Build Coastguard Worker     return 0;
121*8fb009dcSAndroid Build Coastguard Worker   }
122*8fb009dcSAndroid Build Coastguard Worker   in = x->crl->nextUpdate;
123*8fb009dcSAndroid Build Coastguard Worker   if (in != tm) {
124*8fb009dcSAndroid Build Coastguard Worker     in = ASN1_STRING_dup(tm);
125*8fb009dcSAndroid Build Coastguard Worker     if (in != NULL) {
126*8fb009dcSAndroid Build Coastguard Worker       ASN1_TIME_free(x->crl->nextUpdate);
127*8fb009dcSAndroid Build Coastguard Worker       x->crl->nextUpdate = in;
128*8fb009dcSAndroid Build Coastguard Worker     }
129*8fb009dcSAndroid Build Coastguard Worker   }
130*8fb009dcSAndroid Build Coastguard Worker   return in != NULL;
131*8fb009dcSAndroid Build Coastguard Worker }
132*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_sort(X509_CRL * c)133*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_sort(X509_CRL *c) {
134*8fb009dcSAndroid Build Coastguard Worker   // Sort the data so it will be written in serial number order.
135*8fb009dcSAndroid Build Coastguard Worker   sk_X509_REVOKED_sort(c->crl->revoked);
136*8fb009dcSAndroid Build Coastguard Worker   asn1_encoding_clear(&c->crl->enc);
137*8fb009dcSAndroid Build Coastguard Worker   return 1;
138*8fb009dcSAndroid Build Coastguard Worker }
139*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_up_ref(X509_CRL * crl)140*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_up_ref(X509_CRL *crl) {
141*8fb009dcSAndroid Build Coastguard Worker   CRYPTO_refcount_inc(&crl->references);
142*8fb009dcSAndroid Build Coastguard Worker   return 1;
143*8fb009dcSAndroid Build Coastguard Worker }
144*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get_version(const X509_CRL * crl)145*8fb009dcSAndroid Build Coastguard Worker long X509_CRL_get_version(const X509_CRL *crl) {
146*8fb009dcSAndroid Build Coastguard Worker   return ASN1_INTEGER_get(crl->crl->version);
147*8fb009dcSAndroid Build Coastguard Worker }
148*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get0_lastUpdate(const X509_CRL * crl)149*8fb009dcSAndroid Build Coastguard Worker const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl) {
150*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->lastUpdate;
151*8fb009dcSAndroid Build Coastguard Worker }
152*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get0_nextUpdate(const X509_CRL * crl)153*8fb009dcSAndroid Build Coastguard Worker const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl) {
154*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->nextUpdate;
155*8fb009dcSAndroid Build Coastguard Worker }
156*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get_lastUpdate(X509_CRL * crl)157*8fb009dcSAndroid Build Coastguard Worker ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl) {
158*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->lastUpdate;
159*8fb009dcSAndroid Build Coastguard Worker }
160*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get_nextUpdate(X509_CRL * crl)161*8fb009dcSAndroid Build Coastguard Worker ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl) {
162*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->nextUpdate;
163*8fb009dcSAndroid Build Coastguard Worker }
164*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get_issuer(const X509_CRL * crl)165*8fb009dcSAndroid Build Coastguard Worker X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl) { return crl->crl->issuer; }
166*8fb009dcSAndroid Build Coastguard Worker 
STACK_OF(X509_REVOKED)167*8fb009dcSAndroid Build Coastguard Worker STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl) {
168*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->revoked;
169*8fb009dcSAndroid Build Coastguard Worker }
170*8fb009dcSAndroid Build Coastguard Worker 
STACK_OF(X509_EXTENSION)171*8fb009dcSAndroid Build Coastguard Worker const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl) {
172*8fb009dcSAndroid Build Coastguard Worker   return crl->crl->extensions;
173*8fb009dcSAndroid Build Coastguard Worker }
174*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get0_signature(const X509_CRL * crl,const ASN1_BIT_STRING ** psig,const X509_ALGOR ** palg)175*8fb009dcSAndroid Build Coastguard Worker void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig,
176*8fb009dcSAndroid Build Coastguard Worker                              const X509_ALGOR **palg) {
177*8fb009dcSAndroid Build Coastguard Worker   if (psig != NULL) {
178*8fb009dcSAndroid Build Coastguard Worker     *psig = crl->signature;
179*8fb009dcSAndroid Build Coastguard Worker   }
180*8fb009dcSAndroid Build Coastguard Worker   if (palg != NULL) {
181*8fb009dcSAndroid Build Coastguard Worker     *palg = crl->sig_alg;
182*8fb009dcSAndroid Build Coastguard Worker   }
183*8fb009dcSAndroid Build Coastguard Worker }
184*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_get_signature_nid(const X509_CRL * crl)185*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_get_signature_nid(const X509_CRL *crl) {
186*8fb009dcSAndroid Build Coastguard Worker   return OBJ_obj2nid(crl->sig_alg->algorithm);
187*8fb009dcSAndroid Build Coastguard Worker }
188*8fb009dcSAndroid Build Coastguard Worker 
X509_REVOKED_get0_revocationDate(const X509_REVOKED * revoked)189*8fb009dcSAndroid Build Coastguard Worker const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *revoked) {
190*8fb009dcSAndroid Build Coastguard Worker   return revoked->revocationDate;
191*8fb009dcSAndroid Build Coastguard Worker }
192*8fb009dcSAndroid Build Coastguard Worker 
X509_REVOKED_set_revocationDate(X509_REVOKED * revoked,const ASN1_TIME * tm)193*8fb009dcSAndroid Build Coastguard Worker int X509_REVOKED_set_revocationDate(X509_REVOKED *revoked,
194*8fb009dcSAndroid Build Coastguard Worker                                     const ASN1_TIME *tm) {
195*8fb009dcSAndroid Build Coastguard Worker   ASN1_TIME *in;
196*8fb009dcSAndroid Build Coastguard Worker 
197*8fb009dcSAndroid Build Coastguard Worker   if (revoked == NULL) {
198*8fb009dcSAndroid Build Coastguard Worker     return 0;
199*8fb009dcSAndroid Build Coastguard Worker   }
200*8fb009dcSAndroid Build Coastguard Worker   in = revoked->revocationDate;
201*8fb009dcSAndroid Build Coastguard Worker   if (in != tm) {
202*8fb009dcSAndroid Build Coastguard Worker     in = ASN1_STRING_dup(tm);
203*8fb009dcSAndroid Build Coastguard Worker     if (in != NULL) {
204*8fb009dcSAndroid Build Coastguard Worker       ASN1_TIME_free(revoked->revocationDate);
205*8fb009dcSAndroid Build Coastguard Worker       revoked->revocationDate = in;
206*8fb009dcSAndroid Build Coastguard Worker     }
207*8fb009dcSAndroid Build Coastguard Worker   }
208*8fb009dcSAndroid Build Coastguard Worker   return in != NULL;
209*8fb009dcSAndroid Build Coastguard Worker }
210*8fb009dcSAndroid Build Coastguard Worker 
X509_REVOKED_get0_serialNumber(const X509_REVOKED * revoked)211*8fb009dcSAndroid Build Coastguard Worker const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(
212*8fb009dcSAndroid Build Coastguard Worker     const X509_REVOKED *revoked) {
213*8fb009dcSAndroid Build Coastguard Worker   return revoked->serialNumber;
214*8fb009dcSAndroid Build Coastguard Worker }
215*8fb009dcSAndroid Build Coastguard Worker 
X509_REVOKED_set_serialNumber(X509_REVOKED * revoked,const ASN1_INTEGER * serial)216*8fb009dcSAndroid Build Coastguard Worker int X509_REVOKED_set_serialNumber(X509_REVOKED *revoked,
217*8fb009dcSAndroid Build Coastguard Worker                                   const ASN1_INTEGER *serial) {
218*8fb009dcSAndroid Build Coastguard Worker   ASN1_INTEGER *in;
219*8fb009dcSAndroid Build Coastguard Worker 
220*8fb009dcSAndroid Build Coastguard Worker   if (serial->type != V_ASN1_INTEGER && serial->type != V_ASN1_NEG_INTEGER) {
221*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
222*8fb009dcSAndroid Build Coastguard Worker     return 0;
223*8fb009dcSAndroid Build Coastguard Worker   }
224*8fb009dcSAndroid Build Coastguard Worker 
225*8fb009dcSAndroid Build Coastguard Worker   if (revoked == NULL) {
226*8fb009dcSAndroid Build Coastguard Worker     return 0;
227*8fb009dcSAndroid Build Coastguard Worker   }
228*8fb009dcSAndroid Build Coastguard Worker   in = revoked->serialNumber;
229*8fb009dcSAndroid Build Coastguard Worker   if (in != serial) {
230*8fb009dcSAndroid Build Coastguard Worker     in = ASN1_INTEGER_dup(serial);
231*8fb009dcSAndroid Build Coastguard Worker     if (in != NULL) {
232*8fb009dcSAndroid Build Coastguard Worker       ASN1_INTEGER_free(revoked->serialNumber);
233*8fb009dcSAndroid Build Coastguard Worker       revoked->serialNumber = in;
234*8fb009dcSAndroid Build Coastguard Worker     }
235*8fb009dcSAndroid Build Coastguard Worker   }
236*8fb009dcSAndroid Build Coastguard Worker   return in != NULL;
237*8fb009dcSAndroid Build Coastguard Worker }
238*8fb009dcSAndroid Build Coastguard Worker 
STACK_OF(X509_EXTENSION)239*8fb009dcSAndroid Build Coastguard Worker const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(
240*8fb009dcSAndroid Build Coastguard Worker     const X509_REVOKED *r) {
241*8fb009dcSAndroid Build Coastguard Worker   return r->extensions;
242*8fb009dcSAndroid Build Coastguard Worker }
243*8fb009dcSAndroid Build Coastguard Worker 
i2d_re_X509_CRL_tbs(X509_CRL * crl,unsigned char ** outp)244*8fb009dcSAndroid Build Coastguard Worker int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) {
245*8fb009dcSAndroid Build Coastguard Worker   asn1_encoding_clear(&crl->crl->enc);
246*8fb009dcSAndroid Build Coastguard Worker   return i2d_X509_CRL_INFO(crl->crl, outp);
247*8fb009dcSAndroid Build Coastguard Worker }
248*8fb009dcSAndroid Build Coastguard Worker 
i2d_X509_CRL_tbs(X509_CRL * crl,unsigned char ** outp)249*8fb009dcSAndroid Build Coastguard Worker int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) {
250*8fb009dcSAndroid Build Coastguard Worker   return i2d_X509_CRL_INFO(crl->crl, outp);
251*8fb009dcSAndroid Build Coastguard Worker }
252*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set1_signature_algo(X509_CRL * crl,const X509_ALGOR * algo)253*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo) {
254*8fb009dcSAndroid Build Coastguard Worker   X509_ALGOR *copy1 = X509_ALGOR_dup(algo);
255*8fb009dcSAndroid Build Coastguard Worker   X509_ALGOR *copy2 = X509_ALGOR_dup(algo);
256*8fb009dcSAndroid Build Coastguard Worker   if (copy1 == NULL || copy2 == NULL) {
257*8fb009dcSAndroid Build Coastguard Worker     X509_ALGOR_free(copy1);
258*8fb009dcSAndroid Build Coastguard Worker     X509_ALGOR_free(copy2);
259*8fb009dcSAndroid Build Coastguard Worker     return 0;
260*8fb009dcSAndroid Build Coastguard Worker   }
261*8fb009dcSAndroid Build Coastguard Worker 
262*8fb009dcSAndroid Build Coastguard Worker   X509_ALGOR_free(crl->sig_alg);
263*8fb009dcSAndroid Build Coastguard Worker   crl->sig_alg = copy1;
264*8fb009dcSAndroid Build Coastguard Worker   X509_ALGOR_free(crl->crl->sig_alg);
265*8fb009dcSAndroid Build Coastguard Worker   crl->crl->sig_alg = copy2;
266*8fb009dcSAndroid Build Coastguard Worker   return 1;
267*8fb009dcSAndroid Build Coastguard Worker }
268*8fb009dcSAndroid Build Coastguard Worker 
X509_CRL_set1_signature_value(X509_CRL * crl,const uint8_t * sig,size_t sig_len)269*8fb009dcSAndroid Build Coastguard Worker int X509_CRL_set1_signature_value(X509_CRL *crl, const uint8_t *sig,
270*8fb009dcSAndroid Build Coastguard Worker                                   size_t sig_len) {
271*8fb009dcSAndroid Build Coastguard Worker   if (!ASN1_STRING_set(crl->signature, sig, sig_len)) {
272*8fb009dcSAndroid Build Coastguard Worker     return 0;
273*8fb009dcSAndroid Build Coastguard Worker   }
274*8fb009dcSAndroid Build Coastguard Worker   crl->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
275*8fb009dcSAndroid Build Coastguard Worker   crl->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
276*8fb009dcSAndroid Build Coastguard Worker   return 1;
277*8fb009dcSAndroid Build Coastguard Worker }
278