OpenCoverage

x_crl.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/x_crl.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: x_crl.c,v 1.33 2018/08/24 19:55:58 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60-
61#include <openssl/opensslconf.h>-
62-
63#include <openssl/asn1t.h>-
64#include <openssl/err.h>-
65#include <openssl/x509.h>-
66#include <openssl/x509v3.h>-
67-
68#include "asn1_locl.h"-
69-
70static int X509_REVOKED_cmp(const X509_REVOKED * const *a,-
71 const X509_REVOKED * const *b);-
72static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp);-
73-
74static const ASN1_TEMPLATE X509_REVOKED_seq_tt[] = {-
75 {-
76 .offset = offsetof(X509_REVOKED, serialNumber),-
77 .field_name = "serialNumber",-
78 .item = &ASN1_INTEGER_it,-
79 },-
80 {-
81 .offset = offsetof(X509_REVOKED, revocationDate),-
82 .field_name = "revocationDate",-
83 .item = &ASN1_TIME_it,-
84 },-
85 {-
86 .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,-
87 .offset = offsetof(X509_REVOKED, extensions),-
88 .field_name = "extensions",-
89 .item = &X509_EXTENSION_it,-
90 },-
91};-
92-
93const ASN1_ITEM X509_REVOKED_it = {-
94 .itype = ASN1_ITYPE_SEQUENCE,-
95 .utype = V_ASN1_SEQUENCE,-
96 .templates = X509_REVOKED_seq_tt,-
97 .tcount = sizeof(X509_REVOKED_seq_tt) / sizeof(ASN1_TEMPLATE),-
98 .size = sizeof(X509_REVOKED),-
99 .sname = "X509_REVOKED",-
100};-
101-
102static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r);-
103static int def_crl_lookup(X509_CRL *crl, X509_REVOKED **ret,-
104 ASN1_INTEGER *serial, X509_NAME *issuer);-
105-
106static X509_CRL_METHOD int_crl_meth = {-
107 .crl_lookup = def_crl_lookup,-
108 .crl_verify = def_crl_verify-
109};-
110-
111static const X509_CRL_METHOD *default_crl_method = &int_crl_meth;-
112-
113/* The X509_CRL_INFO structure needs a bit of customisation.-
114 * Since we cache the original encoding the signature wont be affected by-
115 * reordering of the revoked field.-
116 */-
117static int-
118crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)-
119{-
120 X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;-
121-
122 if (!a || !a->revoked)
!aDescription
TRUEnever evaluated
FALSEnever evaluated
!a->revokedDescription
TRUEnever evaluated
FALSEnever evaluated
0
123 return 1;
never executed: return 1;
0
124 switch (operation) {-
125 /* Just set cmp function here. We don't sort because that-
126 * would affect the output of X509_CRL_print().-
127 */-
128 case ASN1_OP_D2I_POST:
never executed: case 5:
0
129 (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);-
130 break;
never executed: break;
0
131 }-
132 return 1;
never executed: return 1;
0
133}-
134-
135-
136static const ASN1_AUX X509_CRL_INFO_aux = {-
137 .flags = ASN1_AFLG_ENCODING,-
138 .asn1_cb = crl_inf_cb,-
139 .enc_offset = offsetof(X509_CRL_INFO, enc),-
140};-
141static const ASN1_TEMPLATE X509_CRL_INFO_seq_tt[] = {-
142 {-
143 .flags = ASN1_TFLG_OPTIONAL,-
144 .offset = offsetof(X509_CRL_INFO, version),-
145 .field_name = "version",-
146 .item = &ASN1_INTEGER_it,-
147 },-
148 {-
149 .offset = offsetof(X509_CRL_INFO, sig_alg),-
150 .field_name = "sig_alg",-
151 .item = &X509_ALGOR_it,-
152 },-
153 {-
154 .offset = offsetof(X509_CRL_INFO, issuer),-
155 .field_name = "issuer",-
156 .item = &X509_NAME_it,-
157 },-
158 {-
159 .offset = offsetof(X509_CRL_INFO, lastUpdate),-
160 .field_name = "lastUpdate",-
161 .item = &ASN1_TIME_it,-
162 },-
163 {-
164 .flags = ASN1_TFLG_OPTIONAL,-
165 .offset = offsetof(X509_CRL_INFO, nextUpdate),-
166 .field_name = "nextUpdate",-
167 .item = &ASN1_TIME_it,-
168 },-
169 {-
170 .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,-
171 .offset = offsetof(X509_CRL_INFO, revoked),-
172 .field_name = "revoked",-
173 .item = &X509_REVOKED_it,-
174 },-
175 {-
176 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,-
177 .offset = offsetof(X509_CRL_INFO, extensions),-
178 .field_name = "extensions",-
179 .item = &X509_EXTENSION_it,-
180 },-
181};-
182-
183const ASN1_ITEM X509_CRL_INFO_it = {-
184 .itype = ASN1_ITYPE_SEQUENCE,-
185 .utype = V_ASN1_SEQUENCE,-
186 .templates = X509_CRL_INFO_seq_tt,-
187 .tcount = sizeof(X509_CRL_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),-
188 .funcs = &X509_CRL_INFO_aux,-
189 .size = sizeof(X509_CRL_INFO),-
190 .sname = "X509_CRL_INFO",-
191};-
192-
193/* Set CRL entry issuer according to CRL certificate issuer extension.-
194 * Check for unhandled critical CRL entry extensions.-
195 */-
196-
197static int-
198crl_set_issuers(X509_CRL *crl)-
199{-
200 int i, j;-
201 GENERAL_NAMES *gens, *gtmp;-
202 STACK_OF(X509_REVOKED) *revoked;-
203-
204 revoked = X509_CRL_get_REVOKED(crl);-
205-
206 gens = NULL;-
207 for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
i < sk_num(((_..._REVOKED*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
208 X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i);-
209 STACK_OF(X509_EXTENSION) *exts;-
210 ASN1_ENUMERATED *reason;-
211 X509_EXTENSION *ext;-
212 gtmp = X509_REVOKED_get_ext_d2i(rev, NID_certificate_issuer,-
213 &j, NULL);-
214 if (!gtmp && (j != -1)) {
!gtmpDescription
TRUEnever evaluated
FALSEnever evaluated
(j != -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
215 crl->flags |= EXFLAG_INVALID;-
216 return 1;
never executed: return 1;
0
217 }-
218-
219 if (gtmp) {
gtmpDescription
TRUEnever evaluated
FALSEnever evaluated
0
220 gens = gtmp;-
221 if (!crl->issuers) {
!crl->issuersDescription
TRUEnever evaluated
FALSEnever evaluated
0
222 crl->issuers = sk_GENERAL_NAMES_new_null();-
223 if (!crl->issuers)
!crl->issuersDescription
TRUEnever evaluated
FALSEnever evaluated
0
224 return 0;
never executed: return 0;
0
225 }
never executed: end of block
0
226 if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
!sk_push(((_ST...AL_NAMES*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
227 return 0;
never executed: return 0;
0
228 }
never executed: end of block
0
229 rev->issuer = gens;-
230-
231 reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason,-
232 &j, NULL);-
233 if (!reason && (j != -1)) {
!reasonDescription
TRUEnever evaluated
FALSEnever evaluated
(j != -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
234 crl->flags |= EXFLAG_INVALID;-
235 return 1;
never executed: return 1;
0
236 }-
237-
238 if (reason) {
reasonDescription
TRUEnever evaluated
FALSEnever evaluated
0
239 rev->reason = ASN1_ENUMERATED_get(reason);-
240 ASN1_ENUMERATED_free(reason);-
241 } else
never executed: end of block
0
242 rev->reason = CRL_REASON_NONE;
never executed: rev->reason = -1;
0
243-
244 /* Check for critical CRL entry extensions */-
245-
246 exts = rev->extensions;-
247-
248 for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) {
j < sk_num(((_...XTENSION*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
249 ext = sk_X509_EXTENSION_value(exts, j);-
250 if (ext->critical > 0) {
ext->critical > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
251 if (OBJ_obj2nid(ext->object) ==
OBJ_obj2nid(ex...object) == 771Description
TRUEnever evaluated
FALSEnever evaluated
0
252 NID_certificate_issuer)
OBJ_obj2nid(ex...object) == 771Description
TRUEnever evaluated
FALSEnever evaluated
0
253 continue;
never executed: continue;
0
254 crl->flags |= EXFLAG_CRITICAL;-
255 break;
never executed: break;
0
256 }-
257 }
never executed: end of block
0
258 }
never executed: end of block
0
259-
260 return 1;
never executed: return 1;
0
261}-
262-
263/* The X509_CRL structure needs a bit of customisation. Cache some extensions-
264 * and hash of the whole CRL.-
265 */-
266static int-
267crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)-
268{-
269 X509_CRL *crl = (X509_CRL *)*pval;-
270 STACK_OF(X509_EXTENSION) *exts;-
271 X509_EXTENSION *ext;-
272 int idx;-
273 int rc = 1;-
274-
275 switch (operation) {-
276 case ASN1_OP_NEW_POST:
never executed: case 1:
0
277 crl->idp = NULL;-
278 crl->akid = NULL;-
279 crl->flags = 0;-
280 crl->idp_flags = 0;-
281 crl->idp_reasons = CRLDP_ALL_REASONS;-
282 crl->meth = default_crl_method;-
283 crl->meth_data = NULL;-
284 crl->issuers = NULL;-
285 crl->crl_number = NULL;-
286 crl->base_crl_number = NULL;-
287 break;
never executed: break;
0
288-
289 case ASN1_OP_D2I_POST:
never executed: case 5:
0
290#ifndef OPENSSL_NO_SHA-
291 X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL);-
292#endif-
293 crl->idp = X509_CRL_get_ext_d2i(crl,-
294 NID_issuing_distribution_point, NULL, NULL);-
295 if (crl->idp)
crl->idpDescription
TRUEnever evaluated
FALSEnever evaluated
0
296 setup_idp(crl, crl->idp);
never executed: setup_idp(crl, crl->idp);
0
297-
298 crl->akid = X509_CRL_get_ext_d2i(crl,-
299 NID_authority_key_identifier, NULL, NULL);-
300-
301 crl->crl_number = X509_CRL_get_ext_d2i(crl,-
302 NID_crl_number, NULL, NULL);-
303-
304 crl->base_crl_number = X509_CRL_get_ext_d2i(crl,-
305 NID_delta_crl, NULL, NULL);-
306 /* Delta CRLs must have CRL number */-
307 if (crl->base_crl_number && !crl->crl_number)
crl->base_crl_numberDescription
TRUEnever evaluated
FALSEnever evaluated
!crl->crl_numberDescription
TRUEnever evaluated
FALSEnever evaluated
0
308 crl->flags |= EXFLAG_INVALID;
never executed: crl->flags |= 0x0080;
0
309-
310 /* See if we have any unhandled critical CRL extensions and-
311 * indicate this in a flag. We only currently handle IDP,-
312 * AKID and deltas, so anything else critical sets the flag.-
313 *-
314 * This code accesses the X509_CRL structure directly:-
315 * applications shouldn't do this.-
316 */-
317-
318 exts = crl->crl->extensions;-
319-
320 for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
idx < sk_num((...XTENSION*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
321 int nid;-
322 ext = sk_X509_EXTENSION_value(exts, idx);-
323 nid = OBJ_obj2nid(ext->object);-
324 if (nid == NID_freshest_crl)
nid == 857Description
TRUEnever evaluated
FALSEnever evaluated
0
325 crl->flags |= EXFLAG_FRESHEST;
never executed: crl->flags |= 0x1000;
0
326 if (ext->critical > 0) {
ext->critical > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
327 /* We handle IDP, AKID and deltas */-
328 if (nid == NID_issuing_distribution_point ||
nid == 770Description
TRUEnever evaluated
FALSEnever evaluated
0
329 nid == NID_authority_key_identifier ||
nid == 90Description
TRUEnever evaluated
FALSEnever evaluated
0
330 nid == NID_delta_crl)
nid == 140Description
TRUEnever evaluated
FALSEnever evaluated
0
331 break;
never executed: break;
0
332 crl->flags |= EXFLAG_CRITICAL;-
333 break;
never executed: break;
0
334 }-
335 }
never executed: end of block
0
336-
337 if (!crl_set_issuers(crl))
!crl_set_issuers(crl)Description
TRUEnever evaluated
FALSEnever evaluated
0
338 return 0;
never executed: return 0;
0
339-
340 if (crl->meth->crl_init) {
crl->meth->crl_initDescription
TRUEnever evaluated
FALSEnever evaluated
0
341 if (crl->meth->crl_init(crl) == 0)
crl->meth->crl_init(crl) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
342 return 0;
never executed: return 0;
0
343 }
never executed: end of block
0
344 break;
never executed: break;
0
345-
346 case ASN1_OP_FREE_POST:
never executed: case 3:
0
347 if (crl->meth->crl_free) {
crl->meth->crl_freeDescription
TRUEnever evaluated
FALSEnever evaluated
0
348 if (!crl->meth->crl_free(crl))
!crl->meth->crl_free(crl)Description
TRUEnever evaluated
FALSEnever evaluated
0
349 rc = 0;
never executed: rc = 0;
0
350 }
never executed: end of block
0
351 if (crl->akid)
crl->akidDescription
TRUEnever evaluated
FALSEnever evaluated
0
352 AUTHORITY_KEYID_free(crl->akid);
never executed: AUTHORITY_KEYID_free(crl->akid);
0
353 if (crl->idp)
crl->idpDescription
TRUEnever evaluated
FALSEnever evaluated
0
354 ISSUING_DIST_POINT_free(crl->idp);
never executed: ISSUING_DIST_POINT_free(crl->idp);
0
355 ASN1_INTEGER_free(crl->crl_number);-
356 ASN1_INTEGER_free(crl->base_crl_number);-
357 sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);-
358 break;
never executed: break;
0
359 }-
360 return rc;
never executed: return rc;
0
361}-
362-
363/* Convert IDP into a more convenient form */-
364-
365static void-
366setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)-
367{-
368 int idp_only = 0;-
369-
370 /* Set various flags according to IDP */-
371 crl->idp_flags |= IDP_PRESENT;-
372 if (idp->onlyuser > 0) {
idp->onlyuser > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
373 idp_only++;-
374 crl->idp_flags |= IDP_ONLYUSER;-
375 }
never executed: end of block
0
376 if (idp->onlyCA > 0) {
idp->onlyCA > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
377 idp_only++;-
378 crl->idp_flags |= IDP_ONLYCA;-
379 }
never executed: end of block
0
380 if (idp->onlyattr > 0) {
idp->onlyattr > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
381 idp_only++;-
382 crl->idp_flags |= IDP_ONLYATTR;-
383 }
never executed: end of block
0
384-
385 if (idp_only > 1)
idp_only > 1Description
TRUEnever evaluated
FALSEnever evaluated
0
386 crl->idp_flags |= IDP_INVALID;
never executed: crl->idp_flags |= 0x2;
0
387-
388 if (idp->indirectCRL > 0)
idp->indirectCRL > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
389 crl->idp_flags |= IDP_INDIRECT;
never executed: crl->idp_flags |= 0x20;
0
390-
391 if (idp->onlysomereasons) {
idp->onlysomereasonsDescription
TRUEnever evaluated
FALSEnever evaluated
0
392 crl->idp_flags |= IDP_REASONS;-
393 if (idp->onlysomereasons->length > 0)
idp->onlysomer...ns->length > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
394 crl->idp_reasons = idp->onlysomereasons->data[0];
never executed: crl->idp_reasons = idp->onlysomereasons->data[0];
0
395 if (idp->onlysomereasons->length > 1)
idp->onlysomer...ns->length > 1Description
TRUEnever evaluated
FALSEnever evaluated
0
396 crl->idp_reasons |=
never executed: crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
0
397 (idp->onlysomereasons->data[1] << 8);
never executed: crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
0
398 crl->idp_reasons &= CRLDP_ALL_REASONS;-
399 }
never executed: end of block
0
400-
401 DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));-
402}
never executed: end of block
0
403-
404static const ASN1_AUX X509_CRL_aux = {-
405 .app_data = NULL,-
406 .flags = ASN1_AFLG_REFCOUNT,-
407 .ref_offset = offsetof(X509_CRL, references),-
408 .ref_lock = CRYPTO_LOCK_X509_CRL,-
409 .asn1_cb = crl_cb,-
410};-
411static const ASN1_TEMPLATE X509_CRL_seq_tt[] = {-
412 {-
413 .offset = offsetof(X509_CRL, crl),-
414 .field_name = "crl",-
415 .item = &X509_CRL_INFO_it,-
416 },-
417 {-
418 .offset = offsetof(X509_CRL, sig_alg),-
419 .field_name = "sig_alg",-
420 .item = &X509_ALGOR_it,-
421 },-
422 {-
423 .offset = offsetof(X509_CRL, signature),-
424 .field_name = "signature",-
425 .item = &ASN1_BIT_STRING_it,-
426 },-
427};-
428-
429const ASN1_ITEM X509_CRL_it = {-
430 .itype = ASN1_ITYPE_SEQUENCE,-
431 .utype = V_ASN1_SEQUENCE,-
432 .templates = X509_CRL_seq_tt,-
433 .tcount = sizeof(X509_CRL_seq_tt) / sizeof(ASN1_TEMPLATE),-
434 .funcs = &X509_CRL_aux,-
435 .size = sizeof(X509_CRL),-
436 .sname = "X509_CRL",-
437};-
438-
439-
440X509_REVOKED *-
441d2i_X509_REVOKED(X509_REVOKED **a, const unsigned char **in, long len)-
442{-
443 return (X509_REVOKED *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
never executed: return (X509_REVOKED *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_REVOKED_it);
0
444 &X509_REVOKED_it);
never executed: return (X509_REVOKED *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_REVOKED_it);
0
445}-
446-
447int-
448i2d_X509_REVOKED(X509_REVOKED *a, unsigned char **out)-
449{-
450 return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_REVOKED_it);
never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_REVOKED_it);
0
451}-
452-
453X509_REVOKED *-
454X509_REVOKED_new(void)-
455{-
456 return (X509_REVOKED *)ASN1_item_new(&X509_REVOKED_it);
never executed: return (X509_REVOKED *)ASN1_item_new(&X509_REVOKED_it);
0
457}-
458-
459void-
460X509_REVOKED_free(X509_REVOKED *a)-
461{-
462 ASN1_item_free((ASN1_VALUE *)a, &X509_REVOKED_it);-
463}
executed 1 time by 1 test: end of block
Executed by:
  • freenull
1
464-
465X509_REVOKED *-
466X509_REVOKED_dup(X509_REVOKED *a)-
467{-
468 return ASN1_item_dup(&X509_REVOKED_it, a);
never executed: return ASN1_item_dup(&X509_REVOKED_it, a);
0
469}-
470-
471X509_CRL_INFO *-
472d2i_X509_CRL_INFO(X509_CRL_INFO **a, const unsigned char **in, long len)-
473{-
474 return (X509_CRL_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
never executed: return (X509_CRL_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_CRL_INFO_it);
0
475 &X509_CRL_INFO_it);
never executed: return (X509_CRL_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_CRL_INFO_it);
0
476}-
477-
478int-
479i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **out)-
480{-
481 return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_CRL_INFO_it);
never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_CRL_INFO_it);
0
482}-
483-
484X509_CRL_INFO *-
485X509_CRL_INFO_new(void)-
486{-
487 return (X509_CRL_INFO *)ASN1_item_new(&X509_CRL_INFO_it);
never executed: return (X509_CRL_INFO *)ASN1_item_new(&X509_CRL_INFO_it);
0
488}-
489-
490void-
491X509_CRL_INFO_free(X509_CRL_INFO *a)-
492{-
493 ASN1_item_free((ASN1_VALUE *)a, &X509_CRL_INFO_it);-
494}
executed 1 time by 1 test: end of block
Executed by:
  • freenull
1
495-
496X509_CRL *-
497d2i_X509_CRL(X509_CRL **a, const unsigned char **in, long len)-
498{-
499 return (X509_CRL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
never executed: return (X509_CRL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_CRL_it);
0
500 &X509_CRL_it);
never executed: return (X509_CRL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &X509_CRL_it);
0
501}-
502-
503int-
504i2d_X509_CRL(X509_CRL *a, unsigned char **out)-
505{-
506 return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_CRL_it);
never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_CRL_it);
0
507}-
508-
509X509_CRL *-
510X509_CRL_new(void)-
511{-
512 return (X509_CRL *)ASN1_item_new(&X509_CRL_it);
never executed: return (X509_CRL *)ASN1_item_new(&X509_CRL_it);
0
513}-
514-
515void-
516X509_CRL_free(X509_CRL *a)-
517{-
518 ASN1_item_free((ASN1_VALUE *)a, &X509_CRL_it);-
519}
executed 1 time by 1 test: end of block
Executed by:
  • freenull
1
520-
521X509_CRL *-
522X509_CRL_dup(X509_CRL *x)-
523{-
524 return ASN1_item_dup(&X509_CRL_it, x);
never executed: return ASN1_item_dup(&X509_CRL_it, x);
0
525}-
526-
527static int-
528X509_REVOKED_cmp(const X509_REVOKED * const *a, const X509_REVOKED * const *b)-
529{-
530 return(ASN1_STRING_cmp(
never executed: return(ASN1_STRING_cmp( (ASN1_STRING *)(*a)->serialNumber, (ASN1_STRING *)(*b)->serialNumber));
0
531 (ASN1_STRING *)(*a)->serialNumber,
never executed: return(ASN1_STRING_cmp( (ASN1_STRING *)(*a)->serialNumber, (ASN1_STRING *)(*b)->serialNumber));
0
532 (ASN1_STRING *)(*b)->serialNumber));
never executed: return(ASN1_STRING_cmp( (ASN1_STRING *)(*a)->serialNumber, (ASN1_STRING *)(*b)->serialNumber));
0
533}-
534-
535int-
536X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)-
537{-
538 X509_CRL_INFO *inf;-
539-
540 inf = crl->crl;-
541 if (!inf->revoked)
!inf->revokedDescription
TRUEnever evaluated
FALSEnever evaluated
0
542 inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
never executed: inf->revoked = ((struct stack_st_X509_REVOKED *)sk_new(((int (*)(const void *, const void *)) ((1 ? (X509_REVOKED_cmp) : (int (*)(const X509_REVOKED * const *, const X509_REVOKED * const *))0)))));
0
543 if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
!inf->revokedDescription
TRUEnever evaluated
FALSEnever evaluated
!sk_push(((_ST..._REVOKED*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
544 ASN1error(ERR_R_MALLOC_FAILURE);-
545 return 0;
never executed: return 0;
0
546 }-
547 inf->enc.modified = 1;-
548 return 1;
never executed: return 1;
0
549}-
550-
551int-
552X509_CRL_verify(X509_CRL *crl, EVP_PKEY *r)-
553{-
554 if (crl->meth->crl_verify)
crl->meth->crl_verifyDescription
TRUEnever evaluated
FALSEnever evaluated
0
555 return crl->meth->crl_verify(crl, r);
never executed: return crl->meth->crl_verify(crl, r);
0
556 return 0;
never executed: return 0;
0
557}-
558-
559int-
560X509_CRL_get0_by_serial(X509_CRL *crl, X509_REVOKED **ret,-
561 ASN1_INTEGER *serial)-
562{-
563 if (crl->meth->crl_lookup)
crl->meth->crl_lookupDescription
TRUEnever evaluated
FALSEnever evaluated
0
564 return crl->meth->crl_lookup(crl, ret, serial, NULL);
never executed: return crl->meth->crl_lookup(crl, ret, serial, ((void *)0) );
0
565 return 0;
never executed: return 0;
0
566}-
567-
568int-
569X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x)-
570{-
571 if (crl->meth->crl_lookup)
crl->meth->crl_lookupDescription
TRUEnever evaluated
FALSEnever evaluated
0
572 return crl->meth->crl_lookup(crl, ret,
never executed: return crl->meth->crl_lookup(crl, ret, X509_get_serialNumber(x), X509_get_issuer_name(x));
0
573 X509_get_serialNumber(x), X509_get_issuer_name(x));
never executed: return crl->meth->crl_lookup(crl, ret, X509_get_serialNumber(x), X509_get_issuer_name(x));
0
574 return 0;
never executed: return 0;
0
575}-
576-
577static int-
578def_crl_verify(X509_CRL *crl, EVP_PKEY *r)-
579{-
580 return(ASN1_item_verify(&X509_CRL_INFO_it,
never executed: return(ASN1_item_verify(&X509_CRL_INFO_it, crl->sig_alg, crl->signature, crl->crl, r));
0
581 crl->sig_alg, crl->signature, crl->crl, r));
never executed: return(ASN1_item_verify(&X509_CRL_INFO_it, crl->sig_alg, crl->signature, crl->crl, r));
0
582}-
583-
584static int-
585crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm, X509_REVOKED *rev)-
586{-
587 int i;-
588-
589 if (!rev->issuer) {
!rev->issuerDescription
TRUEnever evaluated
FALSEnever evaluated
0
590 if (!nm)
!nmDescription
TRUEnever evaluated
FALSEnever evaluated
0
591 return 1;
never executed: return 1;
0
592 if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
!X509_NAME_cmp...t_issuer(crl))Description
TRUEnever evaluated
FALSEnever evaluated
0
593 return 1;
never executed: return 1;
0
594 return 0;
never executed: return 0;
0
595 }-
596-
597 if (!nm)
!nmDescription
TRUEnever evaluated
FALSEnever evaluated
0
598 nm = X509_CRL_get_issuer(crl);
never executed: nm = X509_CRL_get_issuer(crl);
0
599-
600 for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
i < sk_num(((_...RAL_NAME*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
601 GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);-
602 if (gen->type != GEN_DIRNAME)
gen->type != 4Description
TRUEnever evaluated
FALSEnever evaluated
0
603 continue;
never executed: continue;
0
604 if (!X509_NAME_cmp(nm, gen->d.directoryName))
!X509_NAME_cmp...directoryName)Description
TRUEnever evaluated
FALSEnever evaluated
0
605 return 1;
never executed: return 1;
0
606 }
never executed: end of block
0
607 return 0;
never executed: return 0;
0
608-
609}-
610-
611static int-
612def_crl_lookup(X509_CRL *crl, X509_REVOKED **ret, ASN1_INTEGER *serial,-
613 X509_NAME *issuer)-
614{-
615 X509_REVOKED rtmp, *rev;-
616 int idx;-
617-
618 rtmp.serialNumber = serial;-
619 /* Sort revoked into serial number order if not already sorted.-
620 * Do this under a lock to avoid race condition.-
621 */-
622 if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) {
!sk_is_sorted(..._REVOKED*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
623 CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL);-
624 sk_X509_REVOKED_sort(crl->crl->revoked);-
625 CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL);-
626 }
never executed: end of block
0
627 idx = sk_X509_REVOKED_find(crl->crl->revoked, &rtmp);-
628 if (idx < 0)
idx < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
629 return 0;
never executed: return 0;
0
630 /* Need to look for matching name */-
631 for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
idx < sk_num((..._REVOKED*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
632 rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);-
633 if (ASN1_INTEGER_cmp(rev->serialNumber, serial))
ASN1_INTEGER_c...umber, serial)Description
TRUEnever evaluated
FALSEnever evaluated
0
634 return 0;
never executed: return 0;
0
635 if (crl_revoked_issuer_match(crl, issuer, rev)) {
crl_revoked_is..., issuer, rev)Description
TRUEnever evaluated
FALSEnever evaluated
0
636 if (ret)
retDescription
TRUEnever evaluated
FALSEnever evaluated
0
637 *ret = rev;
never executed: *ret = rev;
0
638 if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
rev->reason == 8Description
TRUEnever evaluated
FALSEnever evaluated
0
639 return 2;
never executed: return 2;
0
640 return 1;
never executed: return 1;
0
641 }-
642 }
never executed: end of block
0
643 return 0;
never executed: return 0;
0
644}-
645-
646void-
647X509_CRL_set_default_method(const X509_CRL_METHOD *meth)-
648{-
649 if (meth == NULL)
meth == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
650 default_crl_method = &int_crl_meth;
never executed: default_crl_method = &int_crl_meth;
0
651 else-
652 default_crl_method = meth;
never executed: default_crl_method = meth;
0
653}-
654-
655X509_CRL_METHOD *-
656X509_CRL_METHOD_new(int (*crl_init)(X509_CRL *crl),-
657 int (*crl_free)(X509_CRL *crl),-
658 int (*crl_lookup)(X509_CRL *crl, X509_REVOKED **ret,-
659 ASN1_INTEGER *ser, X509_NAME *issuer),-
660 int (*crl_verify)(X509_CRL *crl, EVP_PKEY *pk))-
661{-
662 X509_CRL_METHOD *m;-
663-
664 m = malloc(sizeof(X509_CRL_METHOD));-
665 if (!m)
!mDescription
TRUEnever evaluated
FALSEnever evaluated
0
666 return NULL;
never executed: return ((void *)0) ;
0
667 m->crl_init = crl_init;-
668 m->crl_free = crl_free;-
669 m->crl_lookup = crl_lookup;-
670 m->crl_verify = crl_verify;-
671 m->flags = X509_CRL_METHOD_DYNAMIC;-
672 return m;
never executed: return m;
0
673}-
674-
675void-
676X509_CRL_METHOD_free(X509_CRL_METHOD *m)-
677{-
678 if (m == NULL)
m == ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • freenull
FALSEnever evaluated
0-1
679 return;
executed 1 time by 1 test: return;
Executed by:
  • freenull
1
680 if (!(m->flags & X509_CRL_METHOD_DYNAMIC))
!(m->flags & 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
681 return;
never executed: return;
0
682 free(m);-
683}
never executed: end of block
0
684-
685void-
686X509_CRL_set_meth_data(X509_CRL *crl, void *dat)-
687{-
688 crl->meth_data = dat;-
689}
never executed: end of block
0
690-
691void *-
692X509_CRL_get_meth_data(X509_CRL *crl)-
693{-
694 return crl->meth_data;
never executed: return crl->meth_data;
0
695}-
696-
697int-
698X509_CRL_get_signature_nid(const X509_CRL *crl)-
699{-
700 return OBJ_obj2nid(crl->sig_alg->algorithm);
never executed: return OBJ_obj2nid(crl->sig_alg->algorithm);
0
701}-
702-
703const STACK_OF(X509_EXTENSION) *-
704X509_CRL_get0_extensions(const X509_CRL *crl)-
705{-
706 return crl->crl->extensions;
never executed: return crl->crl->extensions;
0
707}-
708-
709long-
710X509_CRL_get_version(const X509_CRL *crl)-
711{-
712 return ASN1_INTEGER_get(crl->crl->version);
never executed: return ASN1_INTEGER_get(crl->crl->version);
0
713}-
714-
715const ASN1_TIME *-
716X509_CRL_get0_lastUpdate(const X509_CRL *crl)-
717{-
718 return crl->crl->lastUpdate;
never executed: return crl->crl->lastUpdate;
0
719}-
720-
721ASN1_TIME *-
722X509_CRL_get_lastUpdate(X509_CRL *crl)-
723{-
724 return crl->crl->lastUpdate;
never executed: return crl->crl->lastUpdate;
0
725}-
726-
727const ASN1_TIME *-
728X509_CRL_get0_nextUpdate(const X509_CRL *crl)-
729{-
730 return crl->crl->nextUpdate;
never executed: return crl->crl->nextUpdate;
0
731}-
732-
733ASN1_TIME *-
734X509_CRL_get_nextUpdate(X509_CRL *crl)-
735{-
736 return crl->crl->nextUpdate;
never executed: return crl->crl->nextUpdate;
0
737}-
738-
739X509_NAME *-
740X509_CRL_get_issuer(const X509_CRL *crl)-
741{-
742 return crl->crl->issuer;
never executed: return crl->crl->issuer;
0
743}-
744-
745STACK_OF(X509_REVOKED) *-
746X509_CRL_get_REVOKED(X509_CRL *crl)-
747{-
748 return crl->crl->revoked;
never executed: return crl->crl->revoked;
0
749}-
750-
751void-
752X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig,-
753 const X509_ALGOR **palg)-
754{-
755 if (psig != NULL)
psig != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
756 *psig = crl->signature;
never executed: *psig = crl->signature;
0
757 if (palg != NULL)
palg != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
758 *palg = crl->sig_alg;
never executed: *palg = crl->sig_alg;
0
759}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2