Coverage Report

Created: 2022-11-30 06:20

/src/openssl/crypto/asn1/x_crl.c
Line
Count
Source (jump to first uncovered line)
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
static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
96
                      void *exarg)
97
0
{
98
0
    X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
99
100
0
    if (!a || !a->revoked)
101
0
        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
0
    case ASN1_OP_D2I_POST:
108
0
        (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
109
0
        break;
110
0
    }
111
0
    return 1;
112
0
}
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
static int crl_set_issuers(X509_CRL *crl)
131
0
{
132
133
0
    int i, j;
134
0
    GENERAL_NAMES *gens, *gtmp;
135
0
    STACK_OF(X509_REVOKED) *revoked;
136
137
0
    revoked = X509_CRL_get_REVOKED(crl);
138
139
0
    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
0
        STACK_OF(X509_EXTENSION) *exts;
143
0
        ASN1_ENUMERATED *reason;
144
0
        X509_EXTENSION *ext;
145
0
        gtmp = X509_REVOKED_get_ext_d2i(rev,
146
0
                                        NID_certificate_issuer, &j, NULL);
147
0
        if (!gtmp && (j != -1)) {
148
0
            crl->flags |= EXFLAG_INVALID;
149
0
            return 1;
150
0
        }
151
152
0
        if (gtmp) {
153
0
            gens = gtmp;
154
0
            if (!crl->issuers) {
155
0
                crl->issuers = sk_GENERAL_NAMES_new_null();
156
0
                if (!crl->issuers)
157
0
                    return 0;
158
0
            }
159
0
            if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
160
0
                return 0;
161
0
        }
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
0
        }
169
170
0
        if (reason) {
171
0
            rev->reason = ASN1_ENUMERATED_get(reason);
172
0
            ASN1_ENUMERATED_free(reason);
173
0
        } 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
0
            }
188
0
        }
189
190
0
    }
191
192
0
    return 1;
193
194
0
}
195
196
/*
197
 * The X509_CRL structure needs a bit of customisation. Cache some extensions
198
 * and hash of the whole CRL.
199
 */
200
static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
201
                  void *exarg)
202
0
{
203
0
    X509_CRL *crl = (X509_CRL *)*pval;
204
0
    STACK_OF(X509_EXTENSION) *exts;
205
0
    X509_EXTENSION *ext;
206
0
    int idx;
207
208
0
    switch (operation) {
209
0
    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
0
    case ASN1_OP_D2I_POST:
223
0
#ifndef OPENSSL_NO_SHA
224
0
        X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL);
225
0
#endif
226
0
        crl->idp = X509_CRL_get_ext_d2i(crl,
227
0
                                        NID_issuing_distribution_point, NULL,
228
0
                                        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
0
                                         NID_authority_key_identifier, NULL,
234
0
                                         NULL);
235
236
0
        crl->crl_number = X509_CRL_get_ext_d2i(crl,
237
0
                                               NID_crl_number, NULL, NULL);
238
239
0
        crl->base_crl_number = X509_CRL_get_ext_d2i(crl,
240
0
                                                    NID_delta_crl, NULL,
241
0
                                                    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
0
            int nid;
257
258
0
            ext = sk_X509_EXTENSION_value(exts, idx);
259
0
            nid = OBJ_obj2nid(ext->object);
260
0
            if (nid == NID_freshest_crl)
261
0
                crl->flags |= EXFLAG_FRESHEST;
262
0
            if (ext->critical > 0) {
263
                /* We handle IDP and deltas */
264
0
                if ((nid == NID_issuing_distribution_point)
265
0
                    || (nid == NID_authority_key_identifier)
266
0
                    || (nid == NID_delta_crl))
267
0
                    continue;
268
0
                crl->flags |= EXFLAG_CRITICAL;
269
0
                break;
270
0
            }
271
0
        }
272
273
0
        if (!crl_set_issuers(crl))
274
0
            return 0;
275
276
0
        if (crl->meth->crl_init) {
277
0
            if (crl->meth->crl_init(crl) == 0)
278
0
                return 0;
279
0
        }
280
0
        break;
281
282
0
    case ASN1_OP_FREE_POST:
283
0
        if (crl->meth->crl_free) {
284
0
            if (!crl->meth->crl_free(crl))
285
0
                return 0;
286
0
        }
287
0
        if (crl->akid)
288
0
            AUTHORITY_KEYID_free(crl->akid);
289
0
        if (crl->idp)
290
0
            ISSUING_DIST_POINT_free(crl->idp);
291
0
        ASN1_INTEGER_free(crl->crl_number);
292
0
        ASN1_INTEGER_free(crl->base_crl_number);
293
0
        sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);
294
0
        break;
295
0
    }
296
0
    return 1;
297
0
}
298
299
/* Convert IDP into a more convenient form */
300
301
static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)
302
0
{
303
0
    int idp_only = 0;
304
    /* Set various flags according to IDP */
305
0
    crl->idp_flags |= IDP_PRESENT;
306
0
    if (idp->onlyuser > 0) {
307
0
        idp_only++;
308
0
        crl->idp_flags |= IDP_ONLYUSER;
309
0
    }
310
0
    if (idp->onlyCA > 0) {
311
0
        idp_only++;
312
0
        crl->idp_flags |= IDP_ONLYCA;
313
0
    }
314
0
    if (idp->onlyattr > 0) {
315
0
        idp_only++;
316
0
        crl->idp_flags |= IDP_ONLYATTR;
317
0
    }
318
319
0
    if (idp_only > 1)
320
0
        crl->idp_flags |= IDP_INVALID;
321
322
0
    if (idp->indirectCRL > 0)
323
0
        crl->idp_flags |= IDP_INDIRECT;
324
325
0
    if (idp->onlysomereasons) {
326
0
        crl->idp_flags |= IDP_REASONS;
327
0
        if (idp->onlysomereasons->length > 0)
328
0
            crl->idp_reasons = idp->onlysomereasons->data[0];
329
0
        if (idp->onlysomereasons->length > 1)
330
0
            crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
331
0
        crl->idp_reasons &= CRLDP_ALL_REASONS;
332
0
    }
333
334
0
    DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));
335
0
}
336
337
ASN1_SEQUENCE_ref(X509_CRL, crl_cb, CRYPTO_LOCK_X509_CRL) = {
338
        ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO),
339
        ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR),
340
        ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING)
341
} ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL)
342
343
IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED)
344
345
IMPLEMENT_ASN1_DUP_FUNCTION(X509_REVOKED)
346
347
IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO)
348
349
IMPLEMENT_ASN1_FUNCTIONS(X509_CRL)
350
351
IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL)
352
353
static int X509_REVOKED_cmp(const X509_REVOKED *const *a,
354
                            const X509_REVOKED *const *b)
355
0
{
356
0
    return (ASN1_STRING_cmp((ASN1_STRING *)(*a)->serialNumber,
357
0
                            (ASN1_STRING *)(*b)->serialNumber));
358
0
}
359
360
int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
361
0
{
362
0
    X509_CRL_INFO *inf;
363
0
    inf = crl->crl;
364
0
    if (!inf->revoked)
365
0
        inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
366
0
    if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
367
0
        ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE);
368
0
        return 0;
369
0
    }
370
0
    inf->enc.modified = 1;
371
0
    return 1;
372
0
}
373
374
int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *r)
375
0
{
376
0
    if (crl->meth->crl_verify)
377
0
        return crl->meth->crl_verify(crl, r);
378
0
    return 0;
379
0
}
380
381
int X509_CRL_get0_by_serial(X509_CRL *crl,
382
                            X509_REVOKED **ret, ASN1_INTEGER *serial)
383
0
{
384
0
    if (crl->meth->crl_lookup)
385
0
        return crl->meth->crl_lookup(crl, ret, serial, NULL);
386
0
    return 0;
387
0
}
388
389
int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x)
390
0
{
391
0
    if (crl->meth->crl_lookup)
392
0
        return crl->meth->crl_lookup(crl, ret,
393
0
                                     X509_get_serialNumber(x),
394
0
                                     X509_get_issuer_name(x));
395
0
    return 0;
396
0
}
397
398
static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r)
399
0
{
400
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO),
401
0
                             crl->sig_alg, crl->signature, crl->crl, r));
402
0
}
403
404
static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm,
405
                                    X509_REVOKED *rev)
406
0
{
407
0
    int i;
408
409
0
    if (!rev->issuer) {
410
0
        if (!nm)
411
0
            return 1;
412
0
        if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
413
0
            return 1;
414
0
        return 0;
415
0
    }
416
417
0
    if (!nm)
418
0
        nm = X509_CRL_get_issuer(crl);
419
420
0
    for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
421
0
        GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);
422
0
        if (gen->type != GEN_DIRNAME)
423
0
            continue;
424
0
        if (!X509_NAME_cmp(nm, gen->d.directoryName))
425
0
            return 1;
426
0
    }
427
0
    return 0;
428
429
0
}
430
431
static int def_crl_lookup(X509_CRL *crl,
432
                          X509_REVOKED **ret, ASN1_INTEGER *serial,
433
                          X509_NAME *issuer)
434
0
{
435
0
    X509_REVOKED rtmp, *rev;
436
0
    int idx;
437
0
    rtmp.serialNumber = serial;
438
    /*
439
     * Sort revoked into serial number order if not already sorted. Do this
440
     * under a lock to avoid race condition.
441
     */
442
0
    if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) {
443
0
        CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL);
444
0
        sk_X509_REVOKED_sort(crl->crl->revoked);
445
0
        CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL);
446
0
    }
447
0
    idx = sk_X509_REVOKED_find(crl->crl->revoked, &rtmp);
448
0
    if (idx < 0)
449
0
        return 0;
450
    /* Need to look for matching name */
451
0
    for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
452
0
        rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);
453
0
        if (ASN1_INTEGER_cmp(rev->serialNumber, serial))
454
0
            return 0;
455
0
        if (crl_revoked_issuer_match(crl, issuer, rev)) {
456
0
            if (ret)
457
0
                *ret = rev;
458
0
            if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
459
0
                return 2;
460
0
            return 1;
461
0
        }
462
0
    }
463
0
    return 0;
464
0
}
465
466
void X509_CRL_set_default_method(const X509_CRL_METHOD *meth)
467
0
{
468
0
    if (meth == NULL)
469
0
        default_crl_method = &int_crl_meth;
470
0
    else
471
0
        default_crl_method = meth;
472
0
}
473
474
X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl),
475
                                     int (*crl_free) (X509_CRL *crl),
476
                                     int (*crl_lookup) (X509_CRL *crl,
477
                                                        X509_REVOKED **ret,
478
                                                        ASN1_INTEGER *ser,
479
                                                        X509_NAME *issuer),
480
                                     int (*crl_verify) (X509_CRL *crl,
481
                                                        EVP_PKEY *pk))
482
0
{
483
0
    X509_CRL_METHOD *m;
484
0
    m = OPENSSL_malloc(sizeof(X509_CRL_METHOD));
485
0
    if (!m)
486
0
        return NULL;
487
0
    m->crl_init = crl_init;
488
0
    m->crl_free = crl_free;
489
0
    m->crl_lookup = crl_lookup;
490
0
    m->crl_verify = crl_verify;
491
0
    m->flags = X509_CRL_METHOD_DYNAMIC;
492
0
    return m;
493
0
}
494
495
void X509_CRL_METHOD_free(X509_CRL_METHOD *m)
496
0
{
497
0
    if (!(m->flags & X509_CRL_METHOD_DYNAMIC))
498
0
        return;
499
0
    OPENSSL_free(m);
500
0
}
501
502
void X509_CRL_set_meth_data(X509_CRL *crl, void *dat)
503
0
{
504
0
    crl->meth_data = dat;
505
0
}
506
507
void *X509_CRL_get_meth_data(X509_CRL *crl)
508
0
{
509
0
    return crl->meth_data;
510
0
}
511
512
IMPLEMENT_STACK_OF(X509_REVOKED)
513
514
IMPLEMENT_ASN1_SET_OF(X509_REVOKED)
515
516
IMPLEMENT_STACK_OF(X509_CRL)
517
518
IMPLEMENT_ASN1_SET_OF(X509_CRL)