diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_crl.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/x_crl.c | 79 |
1 files changed, 28 insertions, 51 deletions
diff --git a/src/lib/libcrypto/asn1/x_crl.c b/src/lib/libcrypto/asn1/x_crl.c index b3a6355795..ea94f026b2 100644 --- a/src/lib/libcrypto/asn1/x_crl.c +++ b/src/lib/libcrypto/asn1/x_crl.c | |||
| @@ -101,10 +101,10 @@ static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | |||
| 101 | /* Just set cmp function here. We don't sort because that | 101 | /* Just set cmp function here. We don't sort because that |
| 102 | * would affect the output of X509_CRL_print(). | 102 | * would affect the output of X509_CRL_print(). |
| 103 | */ | 103 | */ |
| 104 | case ASN1_OP_D2I_POST: | 104 | case ASN1_OP_D2I_POST: |
| 105 | (void)sk_X509_REVOKED_set_cmp_func(a->revoked,X509_REVOKED_cmp); | 105 | (void)sk_X509_REVOKED_set_cmp_func(a->revoked,X509_REVOKED_cmp); |
| 106 | break; | 106 | break; |
| 107 | } | 107 | } |
| 108 | return 1; | 108 | return 1; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| @@ -133,8 +133,7 @@ static int crl_set_issuers(X509_CRL *crl) | |||
| 133 | revoked = X509_CRL_get_REVOKED(crl); | 133 | revoked = X509_CRL_get_REVOKED(crl); |
| 134 | 134 | ||
| 135 | gens = NULL; | 135 | gens = NULL; |
| 136 | for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) | 136 | for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) { |
| 137 | { | ||
| 138 | X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i); | 137 | X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i); |
| 139 | STACK_OF(X509_EXTENSION) *exts; | 138 | STACK_OF(X509_EXTENSION) *exts; |
| 140 | ASN1_ENUMERATED *reason; | 139 | ASN1_ENUMERATED *reason; |
| @@ -142,17 +141,14 @@ static int crl_set_issuers(X509_CRL *crl) | |||
| 142 | gtmp = X509_REVOKED_get_ext_d2i(rev, | 141 | gtmp = X509_REVOKED_get_ext_d2i(rev, |
| 143 | NID_certificate_issuer, | 142 | NID_certificate_issuer, |
| 144 | &j, NULL); | 143 | &j, NULL); |
| 145 | if (!gtmp && (j != -1)) | 144 | if (!gtmp && (j != -1)) { |
| 146 | { | ||
| 147 | crl->flags |= EXFLAG_INVALID; | 145 | crl->flags |= EXFLAG_INVALID; |
| 148 | return 1; | 146 | return 1; |
| 149 | } | 147 | } |
| 150 | 148 | ||
| 151 | if (gtmp) | 149 | if (gtmp) { |
| 152 | { | ||
| 153 | gens = gtmp; | 150 | gens = gtmp; |
| 154 | if (!crl->issuers) | 151 | if (!crl->issuers) { |
| 155 | { | ||
| 156 | crl->issuers = sk_GENERAL_NAMES_new_null(); | 152 | crl->issuers = sk_GENERAL_NAMES_new_null(); |
| 157 | if (!crl->issuers) | 153 | if (!crl->issuers) |
| 158 | return 0; | 154 | return 0; |
| @@ -164,29 +160,24 @@ static int crl_set_issuers(X509_CRL *crl) | |||
| 164 | 160 | ||
| 165 | reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, | 161 | reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, |
| 166 | &j, NULL); | 162 | &j, NULL); |
| 167 | if (!reason && (j != -1)) | 163 | if (!reason && (j != -1)) { |
| 168 | { | ||
| 169 | crl->flags |= EXFLAG_INVALID; | 164 | crl->flags |= EXFLAG_INVALID; |
| 170 | return 1; | 165 | return 1; |
| 171 | } | 166 | } |
| 172 | 167 | ||
| 173 | if (reason) | 168 | if (reason) { |
| 174 | { | ||
| 175 | rev->reason = ASN1_ENUMERATED_get(reason); | 169 | rev->reason = ASN1_ENUMERATED_get(reason); |
| 176 | ASN1_ENUMERATED_free(reason); | 170 | ASN1_ENUMERATED_free(reason); |
| 177 | } | 171 | } else |
| 178 | else | ||
| 179 | rev->reason = CRL_REASON_NONE; | 172 | rev->reason = CRL_REASON_NONE; |
| 180 | 173 | ||
| 181 | /* Check for critical CRL entry extensions */ | 174 | /* Check for critical CRL entry extensions */ |
| 182 | 175 | ||
| 183 | exts = rev->extensions; | 176 | exts = rev->extensions; |
| 184 | 177 | ||
| 185 | for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) | 178 | for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) { |
| 186 | { | ||
| 187 | ext = sk_X509_EXTENSION_value(exts, j); | 179 | ext = sk_X509_EXTENSION_value(exts, j); |
| 188 | if (ext->critical > 0) | 180 | if (ext->critical > 0) { |
| 189 | { | ||
| 190 | if (OBJ_obj2nid(ext->object) == | 181 | if (OBJ_obj2nid(ext->object) == |
| 191 | NID_certificate_issuer) | 182 | NID_certificate_issuer) |
| 192 | continue; | 183 | continue; |
| @@ -213,9 +204,8 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | |||
| 213 | X509_EXTENSION *ext; | 204 | X509_EXTENSION *ext; |
| 214 | int idx; | 205 | int idx; |
| 215 | 206 | ||
| 216 | switch(operation) | 207 | switch(operation) { |
| 217 | { | 208 | case ASN1_OP_NEW_POST: |
| 218 | case ASN1_OP_NEW_POST: | ||
| 219 | crl->idp = NULL; | 209 | crl->idp = NULL; |
| 220 | crl->akid = NULL; | 210 | crl->akid = NULL; |
| 221 | crl->flags = 0; | 211 | crl->flags = 0; |
| @@ -228,7 +218,7 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | |||
| 228 | crl->base_crl_number = NULL; | 218 | crl->base_crl_number = NULL; |
| 229 | break; | 219 | break; |
| 230 | 220 | ||
| 231 | case ASN1_OP_D2I_POST: | 221 | case ASN1_OP_D2I_POST: |
| 232 | #ifndef OPENSSL_NO_SHA | 222 | #ifndef OPENSSL_NO_SHA |
| 233 | X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL); | 223 | X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL); |
| 234 | #endif | 224 | #endif |
| @@ -259,15 +249,13 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | |||
| 259 | 249 | ||
| 260 | exts = crl->crl->extensions; | 250 | exts = crl->crl->extensions; |
| 261 | 251 | ||
| 262 | for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) | 252 | for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) { |
| 263 | { | ||
| 264 | int nid; | 253 | int nid; |
| 265 | ext = sk_X509_EXTENSION_value(exts, idx); | 254 | ext = sk_X509_EXTENSION_value(exts, idx); |
| 266 | nid = OBJ_obj2nid(ext->object); | 255 | nid = OBJ_obj2nid(ext->object); |
| 267 | if (nid == NID_freshest_crl) | 256 | if (nid == NID_freshest_crl) |
| 268 | crl->flags |= EXFLAG_FRESHEST; | 257 | crl->flags |= EXFLAG_FRESHEST; |
| 269 | if (ext->critical > 0) | 258 | if (ext->critical > 0) { |
| 270 | { | ||
| 271 | /* We handle IDP and deltas */ | 259 | /* We handle IDP and deltas */ |
| 272 | if ((nid == NID_issuing_distribution_point) | 260 | if ((nid == NID_issuing_distribution_point) |
| 273 | || (nid == NID_delta_crl)) | 261 | || (nid == NID_delta_crl)) |
| @@ -281,16 +269,14 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | |||
| 281 | if (!crl_set_issuers(crl)) | 269 | if (!crl_set_issuers(crl)) |
| 282 | return 0; | 270 | return 0; |
| 283 | 271 | ||
| 284 | if (crl->meth->crl_init) | 272 | if (crl->meth->crl_init) { |
| 285 | { | ||
| 286 | if (crl->meth->crl_init(crl) == 0) | 273 | if (crl->meth->crl_init(crl) == 0) |
| 287 | return 0; | 274 | return 0; |
| 288 | } | 275 | } |
| 289 | break; | 276 | break; |
| 290 | 277 | ||
| 291 | case ASN1_OP_FREE_POST: | 278 | case ASN1_OP_FREE_POST: |
| 292 | if (crl->meth->crl_free) | 279 | if (crl->meth->crl_free) { |
| 293 | { | ||
| 294 | if (!crl->meth->crl_free(crl)) | 280 | if (!crl->meth->crl_free(crl)) |
| 295 | return 0; | 281 | return 0; |
| 296 | } | 282 | } |
| @@ -313,18 +299,15 @@ static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp) | |||
| 313 | int idp_only = 0; | 299 | int idp_only = 0; |
| 314 | /* Set various flags according to IDP */ | 300 | /* Set various flags according to IDP */ |
| 315 | crl->idp_flags |= IDP_PRESENT; | 301 | crl->idp_flags |= IDP_PRESENT; |
| 316 | if (idp->onlyuser > 0) | 302 | if (idp->onlyuser > 0) { |
| 317 | { | ||
| 318 | idp_only++; | 303 | idp_only++; |
| 319 | crl->idp_flags |= IDP_ONLYUSER; | 304 | crl->idp_flags |= IDP_ONLYUSER; |
| 320 | } | 305 | } |
| 321 | if (idp->onlyCA > 0) | 306 | if (idp->onlyCA > 0) { |
| 322 | { | ||
| 323 | idp_only++; | 307 | idp_only++; |
| 324 | crl->idp_flags |= IDP_ONLYCA; | 308 | crl->idp_flags |= IDP_ONLYCA; |
| 325 | } | 309 | } |
| 326 | if (idp->onlyattr > 0) | 310 | if (idp->onlyattr > 0) { |
| 327 | { | ||
| 328 | idp_only++; | 311 | idp_only++; |
| 329 | crl->idp_flags |= IDP_ONLYATTR; | 312 | crl->idp_flags |= IDP_ONLYATTR; |
| 330 | } | 313 | } |
| @@ -335,8 +318,7 @@ static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp) | |||
| 335 | if (idp->indirectCRL > 0) | 318 | if (idp->indirectCRL > 0) |
| 336 | crl->idp_flags |= IDP_INDIRECT; | 319 | crl->idp_flags |= IDP_INDIRECT; |
| 337 | 320 | ||
| 338 | if (idp->onlysomereasons) | 321 | if (idp->onlysomereasons) { |
| 339 | { | ||
| 340 | crl->idp_flags |= IDP_REASONS; | 322 | crl->idp_flags |= IDP_REASONS; |
| 341 | if (idp->onlysomereasons->length > 0) | 323 | if (idp->onlysomereasons->length > 0) |
| 342 | crl->idp_reasons = idp->onlysomereasons->data[0]; | 324 | crl->idp_reasons = idp->onlysomereasons->data[0]; |
| @@ -417,8 +399,7 @@ static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm, | |||
| 417 | { | 399 | { |
| 418 | int i; | 400 | int i; |
| 419 | 401 | ||
| 420 | if (!rev->issuer) | 402 | if (!rev->issuer) { |
| 421 | { | ||
| 422 | if (!nm) | 403 | if (!nm) |
| 423 | return 1; | 404 | return 1; |
| 424 | if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl))) | 405 | if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl))) |
| @@ -429,8 +410,7 @@ static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm, | |||
| 429 | if (!nm) | 410 | if (!nm) |
| 430 | nm = X509_CRL_get_issuer(crl); | 411 | nm = X509_CRL_get_issuer(crl); |
| 431 | 412 | ||
| 432 | for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) | 413 | for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) { |
| 433 | { | ||
| 434 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i); | 414 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i); |
| 435 | if (gen->type != GEN_DIRNAME) | 415 | if (gen->type != GEN_DIRNAME) |
| 436 | continue; | 416 | continue; |
| @@ -450,8 +430,7 @@ static int def_crl_lookup(X509_CRL *crl, | |||
| 450 | /* Sort revoked into serial number order if not already sorted. | 430 | /* Sort revoked into serial number order if not already sorted. |
| 451 | * Do this under a lock to avoid race condition. | 431 | * Do this under a lock to avoid race condition. |
| 452 | */ | 432 | */ |
| 453 | if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) | 433 | if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) { |
| 454 | { | ||
| 455 | CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL); | 434 | CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL); |
| 456 | sk_X509_REVOKED_sort(crl->crl->revoked); | 435 | sk_X509_REVOKED_sort(crl->crl->revoked); |
| 457 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL); | 436 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL); |
| @@ -460,13 +439,11 @@ static int def_crl_lookup(X509_CRL *crl, | |||
| 460 | if(idx < 0) | 439 | if(idx < 0) |
| 461 | return 0; | 440 | return 0; |
| 462 | /* Need to look for matching name */ | 441 | /* Need to look for matching name */ |
| 463 | for(;idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) | 442 | for(;idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) { |
| 464 | { | ||
| 465 | rev = sk_X509_REVOKED_value(crl->crl->revoked, idx); | 443 | rev = sk_X509_REVOKED_value(crl->crl->revoked, idx); |
| 466 | if (ASN1_INTEGER_cmp(rev->serialNumber, serial)) | 444 | if (ASN1_INTEGER_cmp(rev->serialNumber, serial)) |
| 467 | return 0; | 445 | return 0; |
| 468 | if (crl_revoked_issuer_match(crl, issuer, rev)) | 446 | if (crl_revoked_issuer_match(crl, issuer, rev)) { |
| 469 | { | ||
| 470 | if (ret) | 447 | if (ret) |
| 471 | *ret = rev; | 448 | *ret = rev; |
| 472 | if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) | 449 | if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) |
