| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/x509/x_crl.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||||||||
| 2 | * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. | - | ||||||||||||
| 3 | * | - | ||||||||||||
| 4 | * Licensed under the OpenSSL license (the "License"). You may not use | - | ||||||||||||
| 5 | * this file except in compliance with the License. You can obtain a copy | - | ||||||||||||
| 6 | * in the file LICENSE in the source distribution or at | - | ||||||||||||
| 7 | * https://www.openssl.org/source/license.html | - | ||||||||||||
| 8 | */ | - | ||||||||||||
| 9 | - | |||||||||||||
| 10 | #include <stdio.h> | - | ||||||||||||
| 11 | #include "internal/cryptlib.h" | - | ||||||||||||
| 12 | #include <openssl/asn1t.h> | - | ||||||||||||
| 13 | #include <openssl/x509.h> | - | ||||||||||||
| 14 | #include "internal/x509_int.h" | - | ||||||||||||
| 15 | #include <openssl/x509v3.h> | - | ||||||||||||
| 16 | #include "x509_lcl.h" | - | ||||||||||||
| 17 | - | |||||||||||||
| 18 | static int X509_REVOKED_cmp(const X509_REVOKED *const *a, | - | ||||||||||||
| 19 | const X509_REVOKED *const *b); | - | ||||||||||||
| 20 | static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp); | - | ||||||||||||
| 21 | - | |||||||||||||
| 22 | ASN1_SEQUENCE(X509_REVOKED) = { | - | ||||||||||||
| 23 | ASN1_EMBED(X509_REVOKED,serialNumber, ASN1_INTEGER), | - | ||||||||||||
| 24 | ASN1_SIMPLE(X509_REVOKED,revocationDate, ASN1_TIME), | - | ||||||||||||
| 25 | ASN1_SEQUENCE_OF_OPT(X509_REVOKED,extensions, X509_EXTENSION) | - | ||||||||||||
| 26 | } ASN1_SEQUENCE_END(X509_REVOKED) | - | ||||||||||||
| 27 | - | |||||||||||||
| 28 | static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r); | - | ||||||||||||
| 29 | static int def_crl_lookup(X509_CRL *crl, | - | ||||||||||||
| 30 | X509_REVOKED **ret, ASN1_INTEGER *serial, | - | ||||||||||||
| 31 | X509_NAME *issuer); | - | ||||||||||||
| 32 | - | |||||||||||||
| 33 | static X509_CRL_METHOD int_crl_meth = { | - | ||||||||||||
| 34 | 0, | - | ||||||||||||
| 35 | 0, 0, | - | ||||||||||||
| 36 | def_crl_lookup, | - | ||||||||||||
| 37 | def_crl_verify | - | ||||||||||||
| 38 | }; | - | ||||||||||||
| 39 | - | |||||||||||||
| 40 | static const X509_CRL_METHOD *default_crl_method = &int_crl_meth; | - | ||||||||||||
| 41 | - | |||||||||||||
| 42 | /* | - | ||||||||||||
| 43 | * The X509_CRL_INFO structure needs a bit of customisation. Since we cache | - | ||||||||||||
| 44 | * the original encoding the signature won't be affected by reordering of the | - | ||||||||||||
| 45 | * revoked field. | - | ||||||||||||
| 46 | */ | - | ||||||||||||
| 47 | static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | - | ||||||||||||
| 48 | void *exarg) | - | ||||||||||||
| 49 | { | - | ||||||||||||
| 50 | X509_CRL_INFO *a = (X509_CRL_INFO *)*pval; | - | ||||||||||||
| 51 | - | |||||||||||||
| 52 | if (!a || !a->revoked)
| 2962-233918 | ||||||||||||
| 53 | return 1; executed 231300 times by 1 test: return 1;Executed by:
| 231300 | ||||||||||||
| 54 | switch (operation) { | - | ||||||||||||
| 55 | /* | - | ||||||||||||
| 56 | * Just set cmp function here. We don't sort because that would | - | ||||||||||||
| 57 | * affect the output of X509_CRL_print(). | - | ||||||||||||
| 58 | */ | - | ||||||||||||
| 59 | case ASN1_OP_D2I_POST: executed 2745 times by 1 test: case 5:Executed by:
| 2745 | ||||||||||||
| 60 | (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp); | - | ||||||||||||
| 61 | break; executed 2745 times by 1 test: break;Executed by:
| 2745 | ||||||||||||
| 62 | } | - | ||||||||||||
| 63 | return 1; executed 5580 times by 1 test: return 1;Executed by:
| 5580 | ||||||||||||
| 64 | } | - | ||||||||||||
| 65 | - | |||||||||||||
| 66 | - | |||||||||||||
| 67 | ASN1_SEQUENCE_enc(X509_CRL_INFO, enc, crl_inf_cb) = { | - | ||||||||||||
| 68 | ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER), | - | ||||||||||||
| 69 | ASN1_EMBED(X509_CRL_INFO, sig_alg, X509_ALGOR), | - | ||||||||||||
| 70 | ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME), | - | ||||||||||||
| 71 | ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME), | - | ||||||||||||
| 72 | ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME), | - | ||||||||||||
| 73 | ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED), | - | ||||||||||||
| 74 | ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0) | - | ||||||||||||
| 75 | } ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO) | - | ||||||||||||
| 76 | - | |||||||||||||
| 77 | /* | - | ||||||||||||
| 78 | * Set CRL entry issuer according to CRL certificate issuer extension. Check | - | ||||||||||||
| 79 | * for unhandled critical CRL entry extensions. | - | ||||||||||||
| 80 | */ | - | ||||||||||||
| 81 | - | |||||||||||||
| 82 | static int crl_set_issuers(X509_CRL *crl) | - | ||||||||||||
| 83 | { | - | ||||||||||||
| 84 | - | |||||||||||||
| 85 | int i, j; | - | ||||||||||||
| 86 | GENERAL_NAMES *gens, *gtmp; | - | ||||||||||||
| 87 | STACK_OF(X509_REVOKED) *revoked; | - | ||||||||||||
| 88 | - | |||||||||||||
| 89 | revoked = X509_CRL_get_REVOKED(crl); | - | ||||||||||||
| 90 | - | |||||||||||||
| 91 | gens = NULL; | - | ||||||||||||
| 92 | for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
| 14717-32581 | ||||||||||||
| 93 | X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i); | - | ||||||||||||
| 94 | STACK_OF(X509_EXTENSION) *exts; | - | ||||||||||||
| 95 | ASN1_ENUMERATED *reason; | - | ||||||||||||
| 96 | X509_EXTENSION *ext; | - | ||||||||||||
| 97 | gtmp = X509_REVOKED_get_ext_d2i(rev, | - | ||||||||||||
| 98 | NID_certificate_issuer, &j, NULL); | - | ||||||||||||
| 99 | if (!gtmp && (j != -1)) {
| 977-13740 | ||||||||||||
| 100 | crl->flags |= EXFLAG_INVALID; | - | ||||||||||||
| 101 | return 1; executed 1281 times by 1 test: return 1;Executed by:
| 1281 | ||||||||||||
| 102 | } | - | ||||||||||||
| 103 | - | |||||||||||||
| 104 | if (gtmp) {
| 977-12459 | ||||||||||||
| 105 | gens = gtmp; | - | ||||||||||||
| 106 | if (!crl->issuers) {
| 163-814 | ||||||||||||
| 107 | crl->issuers = sk_GENERAL_NAMES_new_null(); | - | ||||||||||||
| 108 | if (!crl->issuers)
| 0-163 | ||||||||||||
| 109 | return 0; never executed: return 0; | 0 | ||||||||||||
| 110 | } executed 163 times by 1 test: end of blockExecuted by:
| 163 | ||||||||||||
| 111 | if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
| 0-977 | ||||||||||||
| 112 | return 0; never executed: return 0; | 0 | ||||||||||||
| 113 | } executed 977 times by 1 test: end of blockExecuted by:
| 977 | ||||||||||||
| 114 | rev->issuer = gens; | - | ||||||||||||
| 115 | - | |||||||||||||
| 116 | reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL); | - | ||||||||||||
| 117 | if (!reason && (j != -1)) {
| 492-10059 | ||||||||||||
| 118 | crl->flags |= EXFLAG_INVALID; | - | ||||||||||||
| 119 | return 1; executed 492 times by 1 test: return 1;Executed by:
| 492 | ||||||||||||
| 120 | } | - | ||||||||||||
| 121 | - | |||||||||||||
| 122 | if (reason) {
| 3377-9567 | ||||||||||||
| 123 | rev->reason = ASN1_ENUMERATED_get(reason); | - | ||||||||||||
| 124 | ASN1_ENUMERATED_free(reason); | - | ||||||||||||
| 125 | } else executed 3377 times by 1 test: end of blockExecuted by:
| 3377 | ||||||||||||
| 126 | rev->reason = CRL_REASON_NONE; executed 9567 times by 1 test: rev->reason = -1;Executed by:
| 9567 | ||||||||||||
| 127 | - | |||||||||||||
| 128 | /* Check for critical CRL entry extensions */ | - | ||||||||||||
| 129 | - | |||||||||||||
| 130 | exts = rev->extensions; | - | ||||||||||||
| 131 | - | |||||||||||||
| 132 | for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) {
| 5909-10689 | ||||||||||||
| 133 | ext = sk_X509_EXTENSION_value(exts, j); | - | ||||||||||||
| 134 | if (X509_EXTENSION_get_critical(ext)) {
| 2949-2960 | ||||||||||||
| 135 | if (OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_certificate_issuer)
| 694-2255 | ||||||||||||
| 136 | continue; executed 694 times by 1 test: continue;Executed by:
| 694 | ||||||||||||
| 137 | crl->flags |= EXFLAG_CRITICAL; | - | ||||||||||||
| 138 | break; executed 2255 times by 1 test: break;Executed by:
| 2255 | ||||||||||||
| 139 | } | - | ||||||||||||
| 140 | } executed 2960 times by 1 test: end of blockExecuted by:
| 2960 | ||||||||||||
| 141 | - | |||||||||||||
| 142 | } executed 12944 times by 1 test: end of blockExecuted by:
| 12944 | ||||||||||||
| 143 | - | |||||||||||||
| 144 | return 1; executed 32581 times by 1 test: return 1;Executed by:
| 32581 | ||||||||||||
| 145 | - | |||||||||||||
| 146 | } | - | ||||||||||||
| 147 | - | |||||||||||||
| 148 | /* | - | ||||||||||||
| 149 | * The X509_CRL structure needs a bit of customisation. Cache some extensions | - | ||||||||||||
| 150 | * and hash of the whole CRL. | - | ||||||||||||
| 151 | */ | - | ||||||||||||
| 152 | static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | - | ||||||||||||
| 153 | void *exarg) | - | ||||||||||||
| 154 | { | - | ||||||||||||
| 155 | X509_CRL *crl = (X509_CRL *)*pval; | - | ||||||||||||
| 156 | STACK_OF(X509_EXTENSION) *exts; | - | ||||||||||||
| 157 | X509_EXTENSION *ext; | - | ||||||||||||
| 158 | int idx; | - | ||||||||||||
| 159 | - | |||||||||||||
| 160 | switch (operation) { | - | ||||||||||||
| 161 | case ASN1_OP_NEW_POST: executed 38050 times by 1 test: case 1:Executed by:
| 38050 | ||||||||||||
| 162 | crl->idp = NULL; | - | ||||||||||||
| 163 | crl->akid = NULL; | - | ||||||||||||
| 164 | crl->flags = 0; | - | ||||||||||||
| 165 | crl->idp_flags = 0; | - | ||||||||||||
| 166 | crl->idp_reasons = CRLDP_ALL_REASONS; | - | ||||||||||||
| 167 | crl->meth = default_crl_method; | - | ||||||||||||
| 168 | crl->meth_data = NULL; | - | ||||||||||||
| 169 | crl->issuers = NULL; | - | ||||||||||||
| 170 | crl->crl_number = NULL; | - | ||||||||||||
| 171 | crl->base_crl_number = NULL; | - | ||||||||||||
| 172 | break; executed 38050 times by 1 test: break;Executed by:
| 38050 | ||||||||||||
| 173 | - | |||||||||||||
| 174 | case ASN1_OP_D2I_POST: executed 34354 times by 1 test: case 5:Executed by:
| 34354 | ||||||||||||
| 175 | X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL); | - | ||||||||||||
| 176 | crl->idp = X509_CRL_get_ext_d2i(crl, | - | ||||||||||||
| 177 | NID_issuing_distribution_point, NULL, | - | ||||||||||||
| 178 | NULL); | - | ||||||||||||
| 179 | if (crl->idp)
| 9609-24745 | ||||||||||||
| 180 | setup_idp(crl, crl->idp); executed 9609 times by 1 test: setup_idp(crl, crl->idp);Executed by:
| 9609 | ||||||||||||
| 181 | - | |||||||||||||
| 182 | crl->akid = X509_CRL_get_ext_d2i(crl, | - | ||||||||||||
| 183 | NID_authority_key_identifier, NULL, | - | ||||||||||||
| 184 | NULL); | - | ||||||||||||
| 185 | - | |||||||||||||
| 186 | crl->crl_number = X509_CRL_get_ext_d2i(crl, | - | ||||||||||||
| 187 | NID_crl_number, NULL, NULL); | - | ||||||||||||
| 188 | - | |||||||||||||
| 189 | crl->base_crl_number = X509_CRL_get_ext_d2i(crl, | - | ||||||||||||
| 190 | NID_delta_crl, NULL, | - | ||||||||||||
| 191 | NULL); | - | ||||||||||||
| 192 | /* Delta CRLs must have CRL number */ | - | ||||||||||||
| 193 | if (crl->base_crl_number && !crl->crl_number)
| 398-33471 | ||||||||||||
| 194 | crl->flags |= EXFLAG_INVALID; executed 398 times by 1 test: crl->flags |= 0x80;Executed by:
| 398 | ||||||||||||
| 195 | - | |||||||||||||
| 196 | /* | - | ||||||||||||
| 197 | * See if we have any unhandled critical CRL extensions and indicate | - | ||||||||||||
| 198 | * this in a flag. We only currently handle IDP so anything else | - | ||||||||||||
| 199 | * critical sets the flag. This code accesses the X509_CRL structure | - | ||||||||||||
| 200 | * directly: applications shouldn't do this. | - | ||||||||||||
| 201 | */ | - | ||||||||||||
| 202 | - | |||||||||||||
| 203 | exts = crl->crl.extensions; | - | ||||||||||||
| 204 | - | |||||||||||||
| 205 | for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
| 33868-69211 | ||||||||||||
| 206 | int nid; | - | ||||||||||||
| 207 | ext = sk_X509_EXTENSION_value(exts, idx); | - | ||||||||||||
| 208 | nid = OBJ_obj2nid(X509_EXTENSION_get_object(ext)); | - | ||||||||||||
| 209 | if (nid == NID_freshest_crl)
| 2728-66483 | ||||||||||||
| 210 | crl->flags |= EXFLAG_FRESHEST; executed 2728 times by 1 test: crl->flags |= 0x1000;Executed by:
| 2728 | ||||||||||||
| 211 | if (X509_EXTENSION_get_critical(ext)) {
| 3094-66117 | ||||||||||||
| 212 | /* We handle IDP and deltas */ | - | ||||||||||||
| 213 | if ((nid == NID_issuing_distribution_point)
| 1190-1904 | ||||||||||||
| 214 | || (nid == NID_authority_key_identifier)
| 836-1068 | ||||||||||||
| 215 | || (nid == NID_delta_crl))
| 486-582 | ||||||||||||
| 216 | continue; executed 2608 times by 1 test: continue;Executed by:
| 2608 | ||||||||||||
| 217 | crl->flags |= EXFLAG_CRITICAL; | - | ||||||||||||
| 218 | break; executed 486 times by 1 test: break;Executed by:
| 486 | ||||||||||||
| 219 | } | - | ||||||||||||
| 220 | } executed 66117 times by 1 test: end of blockExecuted by:
| 66117 | ||||||||||||
| 221 | - | |||||||||||||
| 222 | if (!crl_set_issuers(crl))
| 0-34354 | ||||||||||||
| 223 | return 0; never executed: return 0; | 0 | ||||||||||||
| 224 | - | |||||||||||||
| 225 | if (crl->meth->crl_init) {
| 0-34354 | ||||||||||||
| 226 | if (crl->meth->crl_init(crl) == 0)
| 0 | ||||||||||||
| 227 | return 0; never executed: return 0; | 0 | ||||||||||||
| 228 | } never executed: end of block | 0 | ||||||||||||
| 229 | - | |||||||||||||
| 230 | crl->flags |= EXFLAG_SET; | - | ||||||||||||
| 231 | break; executed 34354 times by 1 test: break;Executed by:
| 34354 | ||||||||||||
| 232 | - | |||||||||||||
| 233 | case ASN1_OP_FREE_POST: executed 38050 times by 1 test: case 3:Executed by:
| 38050 | ||||||||||||
| 234 | if (crl->meth->crl_free) {
| 0-38050 | ||||||||||||
| 235 | if (!crl->meth->crl_free(crl))
| 0 | ||||||||||||
| 236 | return 0; never executed: return 0; | 0 | ||||||||||||
| 237 | } never executed: end of block | 0 | ||||||||||||
| 238 | AUTHORITY_KEYID_free(crl->akid); | - | ||||||||||||
| 239 | ISSUING_DIST_POINT_free(crl->idp); | - | ||||||||||||
| 240 | ASN1_INTEGER_free(crl->crl_number); | - | ||||||||||||
| 241 | ASN1_INTEGER_free(crl->base_crl_number); | - | ||||||||||||
| 242 | sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free); | - | ||||||||||||
| 243 | break; executed 38050 times by 1 test: break;Executed by:
| 38050 | ||||||||||||
| 244 | } | - | ||||||||||||
| 245 | return 1; executed 333946 times by 1 test: return 1;Executed by:
| 333946 | ||||||||||||
| 246 | } | - | ||||||||||||
| 247 | - | |||||||||||||
| 248 | /* Convert IDP into a more convenient form */ | - | ||||||||||||
| 249 | - | |||||||||||||
| 250 | static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp) | - | ||||||||||||
| 251 | { | - | ||||||||||||
| 252 | int idp_only = 0; | - | ||||||||||||
| 253 | /* Set various flags according to IDP */ | - | ||||||||||||
| 254 | crl->idp_flags |= IDP_PRESENT; | - | ||||||||||||
| 255 | if (idp->onlyuser > 0) {
| 398-9211 | ||||||||||||
| 256 | idp_only++; | - | ||||||||||||
| 257 | crl->idp_flags |= IDP_ONLYUSER; | - | ||||||||||||
| 258 | } executed 398 times by 1 test: end of blockExecuted by:
| 398 | ||||||||||||
| 259 | if (idp->onlyCA > 0) {
| 390-9219 | ||||||||||||
| 260 | idp_only++; | - | ||||||||||||
| 261 | crl->idp_flags |= IDP_ONLYCA; | - | ||||||||||||
| 262 | } executed 390 times by 1 test: end of blockExecuted by:
| 390 | ||||||||||||
| 263 | if (idp->onlyattr > 0) {
| 401-9208 | ||||||||||||
| 264 | idp_only++; | - | ||||||||||||
| 265 | crl->idp_flags |= IDP_ONLYATTR; | - | ||||||||||||
| 266 | } executed 401 times by 1 test: end of blockExecuted by:
| 401 | ||||||||||||
| 267 | - | |||||||||||||
| 268 | if (idp_only > 1)
| 398-9211 | ||||||||||||
| 269 | crl->idp_flags |= IDP_INVALID; executed 398 times by 1 test: crl->idp_flags |= 0x2;Executed by:
| 398 | ||||||||||||
| 270 | - | |||||||||||||
| 271 | if (idp->indirectCRL > 0)
| 399-9210 | ||||||||||||
| 272 | crl->idp_flags |= IDP_INDIRECT; executed 399 times by 1 test: crl->idp_flags |= 0x20;Executed by:
| 399 | ||||||||||||
| 273 | - | |||||||||||||
| 274 | if (idp->onlysomereasons) {
| 1042-8567 | ||||||||||||
| 275 | crl->idp_flags |= IDP_REASONS; | - | ||||||||||||
| 276 | if (idp->onlysomereasons->length > 0)
| 389-653 | ||||||||||||
| 277 | crl->idp_reasons = idp->onlysomereasons->data[0]; executed 653 times by 1 test: crl->idp_reasons = idp->onlysomereasons->data[0];Executed by:
| 653 | ||||||||||||
| 278 | if (idp->onlysomereasons->length > 1)
| 390-652 | ||||||||||||
| 279 | crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8); executed 390 times by 1 test: crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);Executed by:
| 390 | ||||||||||||
| 280 | crl->idp_reasons &= CRLDP_ALL_REASONS; | - | ||||||||||||
| 281 | } executed 1042 times by 1 test: end of blockExecuted by:
| 1042 | ||||||||||||
| 282 | - | |||||||||||||
| 283 | DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl)); | - | ||||||||||||
| 284 | } executed 9609 times by 1 test: end of blockExecuted by:
| 9609 | ||||||||||||
| 285 | - | |||||||||||||
| 286 | ASN1_SEQUENCE_ref(X509_CRL, crl_cb) = { | - | ||||||||||||
| 287 | ASN1_EMBED(X509_CRL, crl, X509_CRL_INFO), | - | ||||||||||||
| 288 | ASN1_EMBED(X509_CRL, sig_alg, X509_ALGOR), | - | ||||||||||||
| 289 | ASN1_EMBED(X509_CRL, signature, ASN1_BIT_STRING) | - | ||||||||||||
| 290 | } ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL) | - | ||||||||||||
| 291 | - | |||||||||||||
| 292 | IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED) never executed: end of blocknever executed: return (X509_REVOKED *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (&(X509_REVOKED_it)));never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, (&(X509_REVOKED_it)));never executed: return (X509_REVOKED *)ASN1_item_new((&(X509_REVOKED_it))); | 0 | ||||||||||||
| 293 | - | |||||||||||||
| 294 | IMPLEMENT_ASN1_DUP_FUNCTION(X509_REVOKED) never executed: return ASN1_item_dup((&(X509_REVOKED_it)), x); | 0 | ||||||||||||
| 295 | - | |||||||||||||
| 296 | IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO) never executed: end of blocknever executed: return (X509_CRL_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (&(X509_CRL_INFO_it)));never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, (&(X509_CRL_INFO_it)));never executed: return (X509_CRL_INFO *)ASN1_item_new((&(X509_CRL_INFO_it))); | 0 | ||||||||||||
| 297 | - | |||||||||||||
| 298 | IMPLEMENT_ASN1_FUNCTIONS(X509_CRL) executed 3617 times by 1 test: end of blockExecuted by:
executed 2076 times by 1 test: return (X509_CRL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (&(X509_CRL_it)));Executed by:
executed 1846 times by 1 test: return ASN1_item_i2d((ASN1_VALUE *)a, out, (&(X509_CRL_it)));Executed by:
never executed: return (X509_CRL *)ASN1_item_new((&(X509_CRL_it))); | 0-3617 | ||||||||||||
| 299 | - | |||||||||||||
| 300 | IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL) never executed: return ASN1_item_dup((&(X509_CRL_it)), x); | 0 | ||||||||||||
| 301 | - | |||||||||||||
| 302 | static int X509_REVOKED_cmp(const X509_REVOKED *const *a, | - | ||||||||||||
| 303 | const X509_REVOKED *const *b) | - | ||||||||||||
| 304 | { | - | ||||||||||||
| 305 | return (ASN1_STRING_cmp((ASN1_STRING *)&(*a)->serialNumber, executed 1 time by 1 test: return (ASN1_STRING_cmp((ASN1_STRING *)&(*a)->serialNumber, (ASN1_STRING *)&(*b)->serialNumber));Executed by:
| 1 | ||||||||||||
| 306 | (ASN1_STRING *)&(*b)->serialNumber)); executed 1 time by 1 test: return (ASN1_STRING_cmp((ASN1_STRING *)&(*a)->serialNumber, (ASN1_STRING *)&(*b)->serialNumber));Executed by:
| 1 | ||||||||||||
| 307 | } | - | ||||||||||||
| 308 | - | |||||||||||||
| 309 | int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev) | - | ||||||||||||
| 310 | { | - | ||||||||||||
| 311 | X509_CRL_INFO *inf; | - | ||||||||||||
| 312 | - | |||||||||||||
| 313 | inf = &crl->crl; | - | ||||||||||||
| 314 | if (inf->revoked == NULL)
| 0 | ||||||||||||
| 315 | inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp); never executed: inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp); | 0 | ||||||||||||
| 316 | if (inf->revoked == NULL || !sk_X509_REVOKED_push(inf->revoked, rev)) {
| 0 | ||||||||||||
| 317 | ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE); | - | ||||||||||||
| 318 | return 0; never executed: return 0; | 0 | ||||||||||||
| 319 | } | - | ||||||||||||
| 320 | inf->enc.modified = 1; | - | ||||||||||||
| 321 | return 1; never executed: return 1; | 0 | ||||||||||||
| 322 | } | - | ||||||||||||
| 323 | - | |||||||||||||
| 324 | int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *r) | - | ||||||||||||
| 325 | { | - | ||||||||||||
| 326 | if (crl->meth->crl_verify)
| 0-5 | ||||||||||||
| 327 | return crl->meth->crl_verify(crl, r); executed 5 times by 1 test: return crl->meth->crl_verify(crl, r);Executed by:
| 5 | ||||||||||||
| 328 | return 0; never executed: return 0; | 0 | ||||||||||||
| 329 | } | - | ||||||||||||
| 330 | - | |||||||||||||
| 331 | int X509_CRL_get0_by_serial(X509_CRL *crl, | - | ||||||||||||
| 332 | X509_REVOKED **ret, ASN1_INTEGER *serial) | - | ||||||||||||
| 333 | { | - | ||||||||||||
| 334 | if (crl->meth->crl_lookup)
| 0 | ||||||||||||
| 335 | return crl->meth->crl_lookup(crl, ret, serial, NULL); never executed: return crl->meth->crl_lookup(crl, ret, serial, ((void *)0) ); | 0 | ||||||||||||
| 336 | return 0; never executed: return 0; | 0 | ||||||||||||
| 337 | } | - | ||||||||||||
| 338 | - | |||||||||||||
| 339 | int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x) | - | ||||||||||||
| 340 | { | - | ||||||||||||
| 341 | if (crl->meth->crl_lookup)
| 0-3 | ||||||||||||
| 342 | return crl->meth->crl_lookup(crl, ret, executed 3 times by 1 test: return crl->meth->crl_lookup(crl, ret, X509_get_serialNumber(x), X509_get_issuer_name(x));Executed by:
| 3 | ||||||||||||
| 343 | X509_get_serialNumber(x), executed 3 times by 1 test: return crl->meth->crl_lookup(crl, ret, X509_get_serialNumber(x), X509_get_issuer_name(x));Executed by:
| 3 | ||||||||||||
| 344 | X509_get_issuer_name(x)); executed 3 times by 1 test: return crl->meth->crl_lookup(crl, ret, X509_get_serialNumber(x), X509_get_issuer_name(x));Executed by:
| 3 | ||||||||||||
| 345 | return 0; never executed: return 0; | 0 | ||||||||||||
| 346 | } | - | ||||||||||||
| 347 | - | |||||||||||||
| 348 | static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r) | - | ||||||||||||
| 349 | { | - | ||||||||||||
| 350 | return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO), executed 5 times by 1 test: return (ASN1_item_verify((&(X509_CRL_INFO_it)), &crl->sig_alg, &crl->signature, &crl->crl, r));Executed by:
| 5 | ||||||||||||
| 351 | &crl->sig_alg, &crl->signature, &crl->crl, r)); executed 5 times by 1 test: return (ASN1_item_verify((&(X509_CRL_INFO_it)), &crl->sig_alg, &crl->signature, &crl->crl, r));Executed by:
| 5 | ||||||||||||
| 352 | } | - | ||||||||||||
| 353 | - | |||||||||||||
| 354 | static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm, | - | ||||||||||||
| 355 | X509_REVOKED *rev) | - | ||||||||||||
| 356 | { | - | ||||||||||||
| 357 | int i; | - | ||||||||||||
| 358 | - | |||||||||||||
| 359 | if (!rev->issuer) {
| 0-1 | ||||||||||||
| 360 | if (!nm)
| 0-1 | ||||||||||||
| 361 | return 1; never executed: return 1; | 0 | ||||||||||||
| 362 | if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
| 0-1 | ||||||||||||
| 363 | return 1; executed 1 time by 1 test: return 1;Executed by:
| 1 | ||||||||||||
| 364 | return 0; never executed: return 0; | 0 | ||||||||||||
| 365 | } | - | ||||||||||||
| 366 | - | |||||||||||||
| 367 | if (!nm)
| 0 | ||||||||||||
| 368 | nm = X509_CRL_get_issuer(crl); never executed: nm = X509_CRL_get_issuer(crl); | 0 | ||||||||||||
| 369 | - | |||||||||||||
| 370 | for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
| 0 | ||||||||||||
| 371 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i); | - | ||||||||||||
| 372 | if (gen->type != GEN_DIRNAME)
| 0 | ||||||||||||
| 373 | continue; never executed: continue; | 0 | ||||||||||||
| 374 | if (!X509_NAME_cmp(nm, gen->d.directoryName))
| 0 | ||||||||||||
| 375 | return 1; never executed: return 1; | 0 | ||||||||||||
| 376 | } never executed: end of block | 0 | ||||||||||||
| 377 | return 0; never executed: return 0; | 0 | ||||||||||||
| 378 | - | |||||||||||||
| 379 | } | - | ||||||||||||
| 380 | - | |||||||||||||
| 381 | static int def_crl_lookup(X509_CRL *crl, | - | ||||||||||||
| 382 | X509_REVOKED **ret, ASN1_INTEGER *serial, | - | ||||||||||||
| 383 | X509_NAME *issuer) | - | ||||||||||||
| 384 | { | - | ||||||||||||
| 385 | X509_REVOKED rtmp, *rev; | - | ||||||||||||
| 386 | int idx, num; | - | ||||||||||||
| 387 | - | |||||||||||||
| 388 | if (crl->crl.revoked == NULL)
| 1-2 | ||||||||||||
| 389 | return 0; executed 2 times by 1 test: return 0;Executed by:
| 2 | ||||||||||||
| 390 | - | |||||||||||||
| 391 | /* | - | ||||||||||||
| 392 | * Sort revoked into serial number order if not already sorted. Do this | - | ||||||||||||
| 393 | * under a lock to avoid race condition. | - | ||||||||||||
| 394 | */ | - | ||||||||||||
| 395 | if (!sk_X509_REVOKED_is_sorted(crl->crl.revoked)) {
| 0-1 | ||||||||||||
| 396 | CRYPTO_THREAD_write_lock(crl->lock); | - | ||||||||||||
| 397 | sk_X509_REVOKED_sort(crl->crl.revoked); | - | ||||||||||||
| 398 | CRYPTO_THREAD_unlock(crl->lock); | - | ||||||||||||
| 399 | } executed 1 time by 1 test: end of blockExecuted by:
| 1 | ||||||||||||
| 400 | rtmp.serialNumber = *serial; | - | ||||||||||||
| 401 | idx = sk_X509_REVOKED_find(crl->crl.revoked, &rtmp); | - | ||||||||||||
| 402 | if (idx < 0)
| 0-1 | ||||||||||||
| 403 | return 0; never executed: return 0; | 0 | ||||||||||||
| 404 | /* Need to look for matching name */ | - | ||||||||||||
| 405 | for (num = sk_X509_REVOKED_num(crl->crl.revoked); idx < num; idx++) {
| 0-1 | ||||||||||||
| 406 | rev = sk_X509_REVOKED_value(crl->crl.revoked, idx); | - | ||||||||||||
| 407 | if (ASN1_INTEGER_cmp(&rev->serialNumber, serial))
| 0-1 | ||||||||||||
| 408 | return 0; never executed: return 0; | 0 | ||||||||||||
| 409 | if (crl_revoked_issuer_match(crl, issuer, rev)) {
| 0-1 | ||||||||||||
| 410 | if (ret)
| 0-1 | ||||||||||||
| 411 | *ret = rev; executed 1 time by 1 test: *ret = rev;Executed by:
| 1 | ||||||||||||
| 412 | if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
| 0-1 | ||||||||||||
| 413 | return 2; never executed: return 2; | 0 | ||||||||||||
| 414 | return 1; executed 1 time by 1 test: return 1;Executed by:
| 1 | ||||||||||||
| 415 | } | - | ||||||||||||
| 416 | } never executed: end of block | 0 | ||||||||||||
| 417 | return 0; never executed: return 0; | 0 | ||||||||||||
| 418 | } | - | ||||||||||||
| 419 | - | |||||||||||||
| 420 | void X509_CRL_set_default_method(const X509_CRL_METHOD *meth) | - | ||||||||||||
| 421 | { | - | ||||||||||||
| 422 | if (meth == NULL)
| 0 | ||||||||||||
| 423 | default_crl_method = &int_crl_meth; never executed: default_crl_method = &int_crl_meth; | 0 | ||||||||||||
| 424 | else | - | ||||||||||||
| 425 | default_crl_method = meth; never executed: default_crl_method = meth; | 0 | ||||||||||||
| 426 | } | - | ||||||||||||
| 427 | - | |||||||||||||
| 428 | X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), | - | ||||||||||||
| 429 | int (*crl_free) (X509_CRL *crl), | - | ||||||||||||
| 430 | int (*crl_lookup) (X509_CRL *crl, | - | ||||||||||||
| 431 | X509_REVOKED **ret, | - | ||||||||||||
| 432 | ASN1_INTEGER *ser, | - | ||||||||||||
| 433 | X509_NAME *issuer), | - | ||||||||||||
| 434 | int (*crl_verify) (X509_CRL *crl, | - | ||||||||||||
| 435 | EVP_PKEY *pk)) | - | ||||||||||||
| 436 | { | - | ||||||||||||
| 437 | X509_CRL_METHOD *m = OPENSSL_malloc(sizeof(*m)); | - | ||||||||||||
| 438 | - | |||||||||||||
| 439 | if (m == NULL) {
| 0 | ||||||||||||
| 440 | X509err(X509_F_X509_CRL_METHOD_NEW, ERR_R_MALLOC_FAILURE); | - | ||||||||||||
| 441 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
| 442 | } | - | ||||||||||||
| 443 | m->crl_init = crl_init; | - | ||||||||||||
| 444 | m->crl_free = crl_free; | - | ||||||||||||
| 445 | m->crl_lookup = crl_lookup; | - | ||||||||||||
| 446 | m->crl_verify = crl_verify; | - | ||||||||||||
| 447 | m->flags = X509_CRL_METHOD_DYNAMIC; | - | ||||||||||||
| 448 | return m; never executed: return m; | 0 | ||||||||||||
| 449 | } | - | ||||||||||||
| 450 | - | |||||||||||||
| 451 | void X509_CRL_METHOD_free(X509_CRL_METHOD *m) | - | ||||||||||||
| 452 | { | - | ||||||||||||
| 453 | if (m == NULL || !(m->flags & X509_CRL_METHOD_DYNAMIC))
| 0 | ||||||||||||
| 454 | return; never executed: return; | 0 | ||||||||||||
| 455 | OPENSSL_free(m); | - | ||||||||||||
| 456 | } never executed: end of block | 0 | ||||||||||||
| 457 | - | |||||||||||||
| 458 | void X509_CRL_set_meth_data(X509_CRL *crl, void *dat) | - | ||||||||||||
| 459 | { | - | ||||||||||||
| 460 | crl->meth_data = dat; | - | ||||||||||||
| 461 | } never executed: end of block | 0 | ||||||||||||
| 462 | - | |||||||||||||
| 463 | void *X509_CRL_get_meth_data(X509_CRL *crl) | - | ||||||||||||
| 464 | { | - | ||||||||||||
| 465 | return crl->meth_data; never executed: return crl->meth_data; | 0 | ||||||||||||
| 466 | } | - | ||||||||||||
| Source code | Switch to Preprocessed file |