LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/asn1 - x_crl.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 186 0.0 %
Date: 2015-10-10 Functions: 0 31 0.0 %

          Line data    Source code
       1             : /* crypto/asn1/x_crl.c */
       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             : #include "cryptlib.h"
      61             : #include <openssl/asn1t.h>
      62             : #include "asn1_locl.h"
      63             : #include <openssl/x509.h>
      64             : #include <openssl/x509v3.h>
      65             : 
      66             : static int X509_REVOKED_cmp(const X509_REVOKED *const *a,
      67             :                             const X509_REVOKED *const *b);
      68             : static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp);
      69             : 
      70             : ASN1_SEQUENCE(X509_REVOKED) = {
      71             :         ASN1_SIMPLE(X509_REVOKED,serialNumber, ASN1_INTEGER),
      72             :         ASN1_SIMPLE(X509_REVOKED,revocationDate, ASN1_TIME),
      73             :         ASN1_SEQUENCE_OF_OPT(X509_REVOKED,extensions, X509_EXTENSION)
      74             : } ASN1_SEQUENCE_END(X509_REVOKED)
      75             : 
      76             : static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r);
      77             : static int def_crl_lookup(X509_CRL *crl,
      78             :                           X509_REVOKED **ret, ASN1_INTEGER *serial,
      79             :                           X509_NAME *issuer);
      80             : 
      81             : static X509_CRL_METHOD int_crl_meth = {
      82             :     0,
      83             :     0, 0,
      84             :     def_crl_lookup,
      85             :     def_crl_verify
      86             : };
      87             : 
      88             : static const X509_CRL_METHOD *default_crl_method = &int_crl_meth;
      89             : 
      90             : /*
      91             :  * The X509_CRL_INFO structure needs a bit of customisation. Since we cache
      92             :  * the original encoding the signature wont be affected by reordering of the
      93             :  * revoked field.
      94             :  */
      95           0 : static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
      96             :                       void *exarg)
      97             : {
      98           0 :     X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
      99             : 
     100           0 :     if (!a || !a->revoked)
     101             :         return 1;
     102           0 :     switch (operation) {
     103             :         /*
     104             :          * Just set cmp function here. We don't sort because that would
     105             :          * affect the output of X509_CRL_print().
     106             :          */
     107             :     case ASN1_OP_D2I_POST:
     108           0 :         (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
     109           0 :         break;
     110             :     }
     111             :     return 1;
     112             : }
     113             : 
     114             : 
     115             : ASN1_SEQUENCE_enc(X509_CRL_INFO, enc, crl_inf_cb) = {
     116             :         ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER),
     117             :         ASN1_SIMPLE(X509_CRL_INFO, sig_alg, X509_ALGOR),
     118             :         ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME),
     119             :         ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME),
     120             :         ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME),
     121             :         ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED),
     122             :         ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0)
     123             : } ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO)
     124             : 
     125             : /*
     126             :  * Set CRL entry issuer according to CRL certificate issuer extension. Check
     127             :  * for unhandled critical CRL entry extensions.
     128             :  */
     129             : 
     130           0 : static int crl_set_issuers(X509_CRL *crl)
     131             : {
     132             : 
     133             :     int i, j;
     134             :     GENERAL_NAMES *gens, *gtmp;
     135             :     STACK_OF(X509_REVOKED) *revoked;
     136             : 
     137           0 :     revoked = X509_CRL_get_REVOKED(crl);
     138             : 
     139             :     gens = NULL;
     140           0 :     for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
     141           0 :         X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i);
     142             :         STACK_OF(X509_EXTENSION) *exts;
     143             :         ASN1_ENUMERATED *reason;
     144             :         X509_EXTENSION *ext;
     145           0 :         gtmp = X509_REVOKED_get_ext_d2i(rev,
     146             :                                         NID_certificate_issuer, &j, NULL);
     147           0 :         if (!gtmp && (j != -1)) {
     148           0 :             crl->flags |= EXFLAG_INVALID;
     149           0 :             return 1;
     150             :         }
     151             : 
     152           0 :         if (gtmp) {
     153             :             gens = gtmp;
     154           0 :             if (!crl->issuers) {
     155           0 :                 crl->issuers = sk_GENERAL_NAMES_new_null();
     156           0 :                 if (!crl->issuers)
     157             :                     return 0;
     158             :             }
     159           0 :             if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
     160             :                 return 0;
     161             :         }
     162           0 :         rev->issuer = gens;
     163             : 
     164           0 :         reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL);
     165           0 :         if (!reason && (j != -1)) {
     166           0 :             crl->flags |= EXFLAG_INVALID;
     167           0 :             return 1;
     168             :         }
     169             : 
     170           0 :         if (reason) {
     171           0 :             rev->reason = ASN1_ENUMERATED_get(reason);
     172           0 :             ASN1_ENUMERATED_free(reason);
     173             :         } else
     174           0 :             rev->reason = CRL_REASON_NONE;
     175             : 
     176             :         /* Check for critical CRL entry extensions */
     177             : 
     178           0 :         exts = rev->extensions;
     179             : 
     180           0 :         for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) {
     181           0 :             ext = sk_X509_EXTENSION_value(exts, j);
     182           0 :             if (ext->critical > 0) {
     183           0 :                 if (OBJ_obj2nid(ext->object) == NID_certificate_issuer)
     184           0 :                     continue;
     185           0 :                 crl->flags |= EXFLAG_CRITICAL;
     186           0 :                 break;
     187             :             }
     188             :         }
     189             : 
     190             :     }
     191             : 
     192             :     return 1;
     193             : 
     194             : }
     195             : 
     196             : /*
     197             :  * The X509_CRL structure needs a bit of customisation. Cache some extensions
     198             :  * and hash of the whole CRL.
     199             :  */
     200           0 : static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
     201             :                   void *exarg)
     202             : {
     203           0 :     X509_CRL *crl = (X509_CRL *)*pval;
     204             :     STACK_OF(X509_EXTENSION) *exts;
     205             :     X509_EXTENSION *ext;
     206             :     int idx;
     207             : 
     208           0 :     switch (operation) {
     209             :     case ASN1_OP_NEW_POST:
     210           0 :         crl->idp = NULL;
     211           0 :         crl->akid = NULL;
     212           0 :         crl->flags = 0;
     213           0 :         crl->idp_flags = 0;
     214           0 :         crl->idp_reasons = CRLDP_ALL_REASONS;
     215           0 :         crl->meth = default_crl_method;
     216           0 :         crl->meth_data = NULL;
     217           0 :         crl->issuers = NULL;
     218           0 :         crl->crl_number = NULL;
     219           0 :         crl->base_crl_number = NULL;
     220           0 :         break;
     221             : 
     222             :     case ASN1_OP_D2I_POST:
     223             : #ifndef OPENSSL_NO_SHA
     224           0 :         X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL);
     225             : #endif
     226           0 :         crl->idp = X509_CRL_get_ext_d2i(crl,
     227             :                                         NID_issuing_distribution_point, NULL,
     228             :                                         NULL);
     229           0 :         if (crl->idp)
     230           0 :             setup_idp(crl, crl->idp);
     231             : 
     232           0 :         crl->akid = X509_CRL_get_ext_d2i(crl,
     233             :                                          NID_authority_key_identifier, NULL,
     234             :                                          NULL);
     235             : 
     236           0 :         crl->crl_number = X509_CRL_get_ext_d2i(crl,
     237             :                                                NID_crl_number, NULL, NULL);
     238             : 
     239           0 :         crl->base_crl_number = X509_CRL_get_ext_d2i(crl,
     240             :                                                     NID_delta_crl, NULL,
     241             :                                                     NULL);
     242             :         /* Delta CRLs must have CRL number */
     243           0 :         if (crl->base_crl_number && !crl->crl_number)
     244           0 :             crl->flags |= EXFLAG_INVALID;
     245             : 
     246             :         /*
     247             :          * See if we have any unhandled critical CRL extensions and indicate
     248             :          * this in a flag. We only currently handle IDP so anything else
     249             :          * critical sets the flag. This code accesses the X509_CRL structure
     250             :          * directly: applications shouldn't do this.
     251             :          */
     252             : 
     253           0 :         exts = crl->crl->extensions;
     254             : 
     255           0 :         for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
     256             :             int nid;
     257           0 :             ext = sk_X509_EXTENSION_value(exts, idx);
     258           0 :             nid = OBJ_obj2nid(ext->object);
     259           0 :             if (nid == NID_freshest_crl)
     260           0 :                 crl->flags |= EXFLAG_FRESHEST;
     261           0 :             if (ext->critical > 0) {
     262             :                 /* We handle IDP and deltas */
     263           0 :                 if ((nid == NID_issuing_distribution_point)
     264           0 :                     || (nid == NID_authority_key_identifier)
     265           0 :                     || (nid == NID_delta_crl))
     266             :                     break;;
     267           0 :                 crl->flags |= EXFLAG_CRITICAL;
     268           0 :                 break;
     269             :             }
     270             :         }
     271             : 
     272           0 :         if (!crl_set_issuers(crl))
     273             :             return 0;
     274             : 
     275           0 :         if (crl->meth->crl_init) {
     276           0 :             if (crl->meth->crl_init(crl) == 0)
     277             :                 return 0;
     278             :         }
     279             :         break;
     280             : 
     281             :     case ASN1_OP_FREE_POST:
     282           0 :         if (crl->meth->crl_free) {
     283           0 :             if (!crl->meth->crl_free(crl))
     284             :                 return 0;
     285             :         }
     286           0 :         if (crl->akid)
     287           0 :             AUTHORITY_KEYID_free(crl->akid);
     288           0 :         if (crl->idp)
     289           0 :             ISSUING_DIST_POINT_free(crl->idp);
     290           0 :         ASN1_INTEGER_free(crl->crl_number);
     291           0 :         ASN1_INTEGER_free(crl->base_crl_number);
     292           0 :         sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);
     293           0 :         break;
     294             :     }
     295             :     return 1;
     296             : }
     297             : 
     298             : /* Convert IDP into a more convenient form */
     299             : 
     300           0 : static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)
     301             : {
     302             :     int idp_only = 0;
     303             :     /* Set various flags according to IDP */
     304           0 :     crl->idp_flags |= IDP_PRESENT;
     305           0 :     if (idp->onlyuser > 0) {
     306             :         idp_only++;
     307           0 :         crl->idp_flags |= IDP_ONLYUSER;
     308             :     }
     309           0 :     if (idp->onlyCA > 0) {
     310           0 :         idp_only++;
     311           0 :         crl->idp_flags |= IDP_ONLYCA;
     312             :     }
     313           0 :     if (idp->onlyattr > 0) {
     314           0 :         idp_only++;
     315           0 :         crl->idp_flags |= IDP_ONLYATTR;
     316             :     }
     317             : 
     318           0 :     if (idp_only > 1)
     319           0 :         crl->idp_flags |= IDP_INVALID;
     320             : 
     321           0 :     if (idp->indirectCRL > 0)
     322           0 :         crl->idp_flags |= IDP_INDIRECT;
     323             : 
     324           0 :     if (idp->onlysomereasons) {
     325           0 :         crl->idp_flags |= IDP_REASONS;
     326           0 :         if (idp->onlysomereasons->length > 0)
     327           0 :             crl->idp_reasons = idp->onlysomereasons->data[0];
     328           0 :         if (idp->onlysomereasons->length > 1)
     329           0 :             crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
     330           0 :         crl->idp_reasons &= CRLDP_ALL_REASONS;
     331             :     }
     332             : 
     333           0 :     DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));
     334           0 : }
     335             : 
     336             : ASN1_SEQUENCE_ref(X509_CRL, crl_cb, CRYPTO_LOCK_X509_CRL) = {
     337             :         ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO),
     338             :         ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR),
     339             :         ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING)
     340             : } ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL)
     341             : 
     342           0 : IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED)
     343             : 
     344           0 : IMPLEMENT_ASN1_DUP_FUNCTION(X509_REVOKED)
     345             : 
     346           0 : IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO)
     347             : 
     348           0 : IMPLEMENT_ASN1_FUNCTIONS(X509_CRL)
     349             : 
     350           0 : IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL)
     351             : 
     352           0 : static int X509_REVOKED_cmp(const X509_REVOKED *const *a,
     353             :                             const X509_REVOKED *const *b)
     354             : {
     355           0 :     return (ASN1_STRING_cmp((ASN1_STRING *)(*a)->serialNumber,
     356           0 :                             (ASN1_STRING *)(*b)->serialNumber));
     357             : }
     358             : 
     359           0 : int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
     360             : {
     361             :     X509_CRL_INFO *inf;
     362           0 :     inf = crl->crl;
     363           0 :     if (!inf->revoked)
     364           0 :         inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
     365           0 :     if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
     366           0 :         ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE);
     367           0 :         return 0;
     368             :     }
     369           0 :     inf->enc.modified = 1;
     370           0 :     return 1;
     371             : }
     372             : 
     373           0 : int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *r)
     374             : {
     375           0 :     if (crl->meth->crl_verify)
     376           0 :         return crl->meth->crl_verify(crl, r);
     377             :     return 0;
     378             : }
     379             : 
     380           0 : int X509_CRL_get0_by_serial(X509_CRL *crl,
     381             :                             X509_REVOKED **ret, ASN1_INTEGER *serial)
     382             : {
     383           0 :     if (crl->meth->crl_lookup)
     384           0 :         return crl->meth->crl_lookup(crl, ret, serial, NULL);
     385             :     return 0;
     386             : }
     387             : 
     388           0 : int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x)
     389             : {
     390           0 :     if (crl->meth->crl_lookup)
     391           0 :         return crl->meth->crl_lookup(crl, ret,
     392             :                                      X509_get_serialNumber(x),
     393             :                                      X509_get_issuer_name(x));
     394             :     return 0;
     395             : }
     396             : 
     397           0 : static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r)
     398             : {
     399           0 :     return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO),
     400           0 :                              crl->sig_alg, crl->signature, crl->crl, r));
     401             : }
     402             : 
     403           0 : static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm,
     404             :                                     X509_REVOKED *rev)
     405             : {
     406             :     int i;
     407             : 
     408           0 :     if (!rev->issuer) {
     409           0 :         if (!nm)
     410             :             return 1;
     411           0 :         if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
     412             :             return 1;
     413             :         return 0;
     414             :     }
     415             : 
     416           0 :     if (!nm)
     417           0 :         nm = X509_CRL_get_issuer(crl);
     418             : 
     419           0 :     for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
     420           0 :         GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);
     421           0 :         if (gen->type != GEN_DIRNAME)
     422           0 :             continue;
     423           0 :         if (!X509_NAME_cmp(nm, gen->d.directoryName))
     424             :             return 1;
     425             :     }
     426             :     return 0;
     427             : 
     428             : }
     429             : 
     430           0 : static int def_crl_lookup(X509_CRL *crl,
     431             :                           X509_REVOKED **ret, ASN1_INTEGER *serial,
     432             :                           X509_NAME *issuer)
     433             : {
     434             :     X509_REVOKED rtmp, *rev;
     435             :     int idx;
     436           0 :     rtmp.serialNumber = serial;
     437             :     /*
     438             :      * Sort revoked into serial number order if not already sorted. Do this
     439             :      * under a lock to avoid race condition.
     440             :      */
     441           0 :     if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) {
     442           0 :         CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL);
     443           0 :         sk_X509_REVOKED_sort(crl->crl->revoked);
     444           0 :         CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL);
     445             :     }
     446           0 :     idx = sk_X509_REVOKED_find(crl->crl->revoked, &rtmp);
     447           0 :     if (idx < 0)
     448             :         return 0;
     449             :     /* Need to look for matching name */
     450           0 :     for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
     451           0 :         rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);
     452           0 :         if (ASN1_INTEGER_cmp(rev->serialNumber, serial))
     453             :             return 0;
     454           0 :         if (crl_revoked_issuer_match(crl, issuer, rev)) {
     455           0 :             if (ret)
     456           0 :                 *ret = rev;
     457           0 :             if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
     458             :                 return 2;
     459           0 :             return 1;
     460             :         }
     461             :     }
     462             :     return 0;
     463             : }
     464             : 
     465           0 : void X509_CRL_set_default_method(const X509_CRL_METHOD *meth)
     466             : {
     467           0 :     if (meth == NULL)
     468           0 :         default_crl_method = &int_crl_meth;
     469             :     else
     470           0 :         default_crl_method = meth;
     471           0 : }
     472             : 
     473           0 : X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl),
     474             :                                      int (*crl_free) (X509_CRL *crl),
     475             :                                      int (*crl_lookup) (X509_CRL *crl,
     476             :                                                         X509_REVOKED **ret,
     477             :                                                         ASN1_INTEGER *ser,
     478             :                                                         X509_NAME *issuer),
     479             :                                      int (*crl_verify) (X509_CRL *crl,
     480             :                                                         EVP_PKEY *pk))
     481             : {
     482             :     X509_CRL_METHOD *m;
     483           0 :     m = OPENSSL_malloc(sizeof(X509_CRL_METHOD));
     484           0 :     if (!m)
     485             :         return NULL;
     486           0 :     m->crl_init = crl_init;
     487           0 :     m->crl_free = crl_free;
     488           0 :     m->crl_lookup = crl_lookup;
     489           0 :     m->crl_verify = crl_verify;
     490           0 :     m->flags = X509_CRL_METHOD_DYNAMIC;
     491           0 :     return m;
     492             : }
     493             : 
     494           0 : void X509_CRL_METHOD_free(X509_CRL_METHOD *m)
     495             : {
     496           0 :     if (!(m->flags & X509_CRL_METHOD_DYNAMIC))
     497           0 :         return;
     498           0 :     OPENSSL_free(m);
     499             : }
     500             : 
     501           0 : void X509_CRL_set_meth_data(X509_CRL *crl, void *dat)
     502             : {
     503           0 :     crl->meth_data = dat;
     504           0 : }
     505             : 
     506           0 : void *X509_CRL_get_meth_data(X509_CRL *crl)
     507             : {
     508           0 :     return crl->meth_data;
     509             : }
     510             : 
     511             : IMPLEMENT_STACK_OF(X509_REVOKED)
     512             : 
     513             : IMPLEMENT_ASN1_SET_OF(X509_REVOKED)
     514             : 
     515             : IMPLEMENT_STACK_OF(X509_CRL)
     516             : 
     517             : IMPLEMENT_ASN1_SET_OF(X509_CRL)

Generated by: LCOV version 1.10