Coverage Report

Created: 2026-09-13 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/x509/v3_addr.c
Line
Count
Source
1
/*
2
 * Copyright 2006-2026 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (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
/*
11
 * Implementation of RFC 3779 section 2.2.
12
 */
13
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <assert.h>
17
#include <string.h>
18
19
#include <openssl/conf.h>
20
#include <openssl/asn1.h>
21
#include <openssl/asn1t.h>
22
#include <openssl/buffer.h>
23
#include <openssl/x509v3.h>
24
#include "internal/cryptlib.h"
25
#include "crypto/asn1.h"
26
#include "crypto/x509.h"
27
#include "ext_dat.h"
28
#include "x509_local.h"
29
30
#ifndef OPENSSL_NO_RFC3779
31
32
/*
33
 * OpenSSL ASN.1 template translation of RFC 3779 2.2.3.
34
 */
35
36
ASN1_SEQUENCE(IPAddressRange) = {
37
    ASN1_SIMPLE(IPAddressRange, min, ASN1_BIT_STRING),
38
    ASN1_SIMPLE(IPAddressRange, max, ASN1_BIT_STRING)
39
0
} ASN1_SEQUENCE_END(IPAddressRange)
40
0
41
0
ASN1_CHOICE(IPAddressOrRange) = {
42
0
    ASN1_SIMPLE(IPAddressOrRange, u.addressPrefix, ASN1_BIT_STRING),
43
0
    ASN1_SIMPLE(IPAddressOrRange, u.addressRange, IPAddressRange)
44
0
} ASN1_CHOICE_END(IPAddressOrRange)
45
0
46
0
ASN1_CHOICE(IPAddressChoice) = {
47
0
    ASN1_SIMPLE(IPAddressChoice, u.inherit, ASN1_NULL),
48
0
    ASN1_SEQUENCE_OF(IPAddressChoice, u.addressesOrRanges, IPAddressOrRange)
49
0
} ASN1_CHOICE_END(IPAddressChoice)
50
0
51
0
ASN1_SEQUENCE(IPAddressFamily) = {
52
0
    ASN1_SIMPLE(IPAddressFamily, addressFamily, ASN1_OCTET_STRING),
53
0
    ASN1_SIMPLE(IPAddressFamily, ipAddressChoice, IPAddressChoice)
54
0
} ASN1_SEQUENCE_END(IPAddressFamily)
55
0
56
0
ASN1_ITEM_TEMPLATE(IPAddrBlocks) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
57
0
    IPAddrBlocks, IPAddressFamily)
58
0
ASN1_ITEM_TEMPLATE_END(IPAddrBlocks)
59
60
IMPLEMENT_ASN1_FUNCTIONS_fname(IPAddrBlocks, IPAddrBlocks, IPAddrBlocks)
61
62
IMPLEMENT_ASN1_FUNCTIONS(IPAddressRange)
63
IMPLEMENT_ASN1_FUNCTIONS(IPAddressOrRange)
64
IMPLEMENT_ASN1_FUNCTIONS(IPAddressChoice)
65
IMPLEMENT_ASN1_FUNCTIONS(IPAddressFamily)
66
67
/*
68
 * How much buffer space do we need for a raw address?
69
 */
70
#define ADDR_RAW_BUF_LEN 16
71
72
/*
73
 * What's the address length associated with this AFI?
74
 */
75
static int length_from_afi(const unsigned afi)
76
0
{
77
0
    switch (afi) {
78
0
    case IANA_AFI_IPV4:
79
0
        return 4;
80
0
    case IANA_AFI_IPV6:
81
0
        return 16;
82
0
    default:
83
0
        return 0;
84
0
    }
85
0
}
86
87
/*
88
 * Extract the AFI from an IPAddressFamily.
89
 */
90
unsigned int X509v3_addr_get_afi(const IPAddressFamily *f)
91
0
{
92
0
    if (f == NULL
93
0
        || f->addressFamily == NULL
94
0
        || f->addressFamily->data == NULL
95
0
        || f->addressFamily->length < 2)
96
0
        return 0;
97
0
    return (f->addressFamily->data[0] << 8) | f->addressFamily->data[1];
98
0
}
99
100
/*
101
 * Expand the bitstring form of an address into a raw byte array.
102
 * At the moment this is coded for simplicity, not speed.
103
 */
104
static int addr_expand(unsigned char *addr,
105
    const ASN1_BIT_STRING *bs,
106
    const int length, const unsigned char fill)
107
0
{
108
0
    if (bs->length < 0 || bs->length > length)
109
0
        return 0;
110
0
    if (bs->length > 0) {
111
0
        memcpy(addr, bs->data, bs->length);
112
0
        if ((bs->flags & 7) != 0) {
113
0
            unsigned char mask = 0xFF >> (8 - (bs->flags & 7));
114
115
0
            if (fill == 0)
116
0
                addr[bs->length - 1] &= ~mask;
117
0
            else
118
0
                addr[bs->length - 1] |= mask;
119
0
        }
120
0
    }
121
0
    memset(addr + bs->length, fill, length - bs->length);
122
0
    return 1;
123
0
}
124
125
/*
126
 * Extract the prefix length from a bitstring.
127
 */
128
0
#define addr_prefixlen(bs) ((int)((bs)->length * 8 - ((bs)->flags & 7)))
129
130
/*
131
 * i2r handler for one address bitstring.
132
 */
133
static int i2r_address(BIO *out,
134
    const unsigned afi,
135
    const unsigned char fill, const ASN1_BIT_STRING *bs)
136
0
{
137
0
    unsigned char addr[ADDR_RAW_BUF_LEN];
138
0
    int i, n;
139
140
0
    if (bs->length < 0)
141
0
        return 0;
142
0
    switch (afi) {
143
0
    case IANA_AFI_IPV4:
144
0
        if (!addr_expand(addr, bs, 4, fill))
145
0
            return 0;
146
0
        BIO_printf(out, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
147
0
        break;
148
0
    case IANA_AFI_IPV6:
149
0
        if (!addr_expand(addr, bs, 16, fill))
150
0
            return 0;
151
0
        for (n = 16; n > 1 && addr[n - 1] == 0x00 && addr[n - 2] == 0x00;
152
0
            n -= 2)
153
0
            ;
154
0
        for (i = 0; i < n; i += 2)
155
0
            BIO_printf(out, "%x%s", (addr[i] << 8) | addr[i + 1],
156
0
                (i < 14 ? ":" : ""));
157
0
        if (i < 16)
158
0
            BIO_puts(out, ":");
159
0
        if (i == 0)
160
0
            BIO_puts(out, ":");
161
0
        break;
162
0
    default:
163
0
        for (i = 0; i < bs->length; i++)
164
0
            BIO_printf(out, "%s%02x", (i > 0 ? ":" : ""), bs->data[i]);
165
0
        BIO_printf(out, "[%d]", (int)(bs->flags & 7));
166
0
        break;
167
0
    }
168
0
    return 1;
169
0
}
170
171
/*
172
 * i2r handler for a sequence of addresses and ranges.
173
 */
174
static int i2r_IPAddressOrRanges(BIO *out,
175
    const int indent,
176
    const IPAddressOrRanges *aors,
177
    const unsigned afi)
178
0
{
179
0
    int i;
180
181
0
    for (i = 0; i < sk_IPAddressOrRange_num(aors); i++) {
182
0
        const IPAddressOrRange *aor = sk_IPAddressOrRange_value(aors, i);
183
184
0
        BIO_printf(out, "%*s", indent, "");
185
0
        switch (aor->type) {
186
0
        case IPAddressOrRange_addressPrefix:
187
0
            if (!i2r_address(out, afi, 0x00, aor->u.addressPrefix))
188
0
                return 0;
189
0
            BIO_printf(out, "/%d\n", addr_prefixlen(aor->u.addressPrefix));
190
0
            continue;
191
0
        case IPAddressOrRange_addressRange:
192
0
            if (!i2r_address(out, afi, 0x00, aor->u.addressRange->min))
193
0
                return 0;
194
0
            BIO_puts(out, "-");
195
0
            if (!i2r_address(out, afi, 0xFF, aor->u.addressRange->max))
196
0
                return 0;
197
0
            BIO_puts(out, "\n");
198
0
            continue;
199
0
        }
200
0
    }
201
0
    return 1;
202
0
}
203
204
/*
205
 * i2r handler for an IPAddrBlocks extension.
206
 */
207
static int i2r_IPAddrBlocks(const X509V3_EXT_METHOD *method,
208
    void *ext, BIO *out, int indent)
209
0
{
210
0
    const IPAddrBlocks *addr = ext;
211
0
    int i;
212
213
0
    for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
214
0
        IPAddressFamily *f = sk_IPAddressFamily_value(addr, i);
215
0
        const unsigned int afi = X509v3_addr_get_afi(f);
216
217
0
        switch (afi) {
218
0
        case IANA_AFI_IPV4:
219
0
            BIO_printf(out, "%*sIPv4", indent, "");
220
0
            break;
221
0
        case IANA_AFI_IPV6:
222
0
            BIO_printf(out, "%*sIPv6", indent, "");
223
0
            break;
224
0
        default:
225
0
            BIO_printf(out, "%*sUnknown AFI %u", indent, "", afi);
226
0
            break;
227
0
        }
228
0
        if (f->addressFamily->length > 2) {
229
0
            switch (f->addressFamily->data[2]) {
230
0
            case 1:
231
0
                BIO_puts(out, " (Unicast)");
232
0
                break;
233
0
            case 2:
234
0
                BIO_puts(out, " (Multicast)");
235
0
                break;
236
0
            case 3:
237
0
                BIO_puts(out, " (Unicast/Multicast)");
238
0
                break;
239
0
            case 4:
240
0
                BIO_puts(out, " (MPLS)");
241
0
                break;
242
0
            case 64:
243
0
                BIO_puts(out, " (Tunnel)");
244
0
                break;
245
0
            case 65:
246
0
                BIO_puts(out, " (VPLS)");
247
0
                break;
248
0
            case 66:
249
0
                BIO_puts(out, " (BGP MDT)");
250
0
                break;
251
0
            case 128:
252
0
                BIO_puts(out, " (MPLS-labeled VPN)");
253
0
                break;
254
0
            default:
255
0
                BIO_printf(out, " (Unknown SAFI %u)",
256
0
                    (unsigned)f->addressFamily->data[2]);
257
0
                break;
258
0
            }
259
0
        }
260
0
        switch (f->ipAddressChoice->type) {
261
0
        case IPAddressChoice_inherit:
262
0
            BIO_puts(out, ": inherit\n");
263
0
            break;
264
0
        case IPAddressChoice_addressesOrRanges:
265
0
            BIO_puts(out, ":\n");
266
0
            if (!i2r_IPAddressOrRanges(out,
267
0
                    indent + 2,
268
0
                    f->ipAddressChoice->u.addressesOrRanges, afi))
269
0
                return 0;
270
0
            break;
271
0
        }
272
0
    }
273
0
    return 1;
274
0
}
275
276
/*
277
 * Sort comparison function for a sequence of IPAddressOrRange
278
 * elements.
279
 *
280
 * There's no sane answer we can give if addr_expand() fails, and an
281
 * assertion failure on externally supplied data is seriously uncool,
282
 * so we just arbitrarily declare that if given invalid inputs this
283
 * function returns -1.  If this messes up your preferred sort order
284
 * for garbage input, tough noogies.
285
 */
286
static int IPAddressOrRange_cmp(const IPAddressOrRange *a,
287
    const IPAddressOrRange *b, const int length)
288
0
{
289
0
    unsigned char addr_a[ADDR_RAW_BUF_LEN], addr_b[ADDR_RAW_BUF_LEN];
290
0
    int prefixlen_a = 0, prefixlen_b = 0;
291
0
    int r;
292
293
0
    switch (a->type) {
294
0
    case IPAddressOrRange_addressPrefix:
295
0
        if (!addr_expand(addr_a, a->u.addressPrefix, length, 0x00))
296
0
            return -1;
297
0
        prefixlen_a = addr_prefixlen(a->u.addressPrefix);
298
0
        break;
299
0
    case IPAddressOrRange_addressRange:
300
0
        if (!addr_expand(addr_a, a->u.addressRange->min, length, 0x00))
301
0
            return -1;
302
0
        prefixlen_a = length * 8;
303
0
        break;
304
0
    default:
305
0
        return -1;
306
0
    }
307
308
0
    switch (b->type) {
309
0
    case IPAddressOrRange_addressPrefix:
310
0
        if (!addr_expand(addr_b, b->u.addressPrefix, length, 0x00))
311
0
            return -1;
312
0
        prefixlen_b = addr_prefixlen(b->u.addressPrefix);
313
0
        break;
314
0
    case IPAddressOrRange_addressRange:
315
0
        if (!addr_expand(addr_b, b->u.addressRange->min, length, 0x00))
316
0
            return -1;
317
0
        prefixlen_b = length * 8;
318
0
        break;
319
0
    default:
320
0
        return -1;
321
0
    }
322
323
0
    if ((r = memcmp(addr_a, addr_b, length)) != 0)
324
0
        return r;
325
0
    else
326
0
        return prefixlen_a - prefixlen_b;
327
0
}
328
329
/*
330
 * IPv4-specific closure over IPAddressOrRange_cmp, since sk_sort()
331
 * comparison routines are only allowed two arguments.
332
 */
333
static int v4IPAddressOrRange_cmp(const IPAddressOrRange *const *a,
334
    const IPAddressOrRange *const *b)
335
0
{
336
0
    return IPAddressOrRange_cmp(*a, *b, 4);
337
0
}
338
339
/*
340
 * IPv6-specific closure over IPAddressOrRange_cmp, since sk_sort()
341
 * comparison routines are only allowed two arguments.
342
 */
343
static int v6IPAddressOrRange_cmp(const IPAddressOrRange *const *a,
344
    const IPAddressOrRange *const *b)
345
0
{
346
0
    return IPAddressOrRange_cmp(*a, *b, 16);
347
0
}
348
349
/*
350
 * Calculate whether a range collapses to a prefix.
351
 * See last paragraph of RFC 3779 2.2.3.7.
352
 */
353
static int range_should_be_prefix(const unsigned char *min,
354
    const unsigned char *max, const int length)
355
0
{
356
0
    unsigned char mask;
357
0
    int i, j;
358
359
    /*
360
     * It is the responsibility of the caller to confirm min <= max. We don't
361
     * use ossl_assert() here since we have no way of signalling an error from
362
     * this function - so we just use a plain assert instead.
363
     */
364
0
    assert(memcmp(min, max, length) <= 0);
365
366
0
    for (i = 0; i < length && min[i] == max[i]; i++)
367
0
        ;
368
0
    for (j = length - 1; j >= 0 && min[j] == 0x00 && max[j] == 0xFF; j--)
369
0
        ;
370
0
    if (i < j)
371
0
        return -1;
372
0
    if (i > j)
373
0
        return i * 8;
374
0
    mask = min[i] ^ max[i];
375
0
    switch (mask) {
376
0
    case 0x01:
377
0
        j = 7;
378
0
        break;
379
0
    case 0x03:
380
0
        j = 6;
381
0
        break;
382
0
    case 0x07:
383
0
        j = 5;
384
0
        break;
385
0
    case 0x0F:
386
0
        j = 4;
387
0
        break;
388
0
    case 0x1F:
389
0
        j = 3;
390
0
        break;
391
0
    case 0x3F:
392
0
        j = 2;
393
0
        break;
394
0
    case 0x7F:
395
0
        j = 1;
396
0
        break;
397
0
    default:
398
0
        return -1;
399
0
    }
400
0
    if ((min[i] & mask) != 0 || (max[i] & mask) != mask)
401
0
        return -1;
402
0
    else
403
0
        return i * 8 + j;
404
0
}
405
406
/*
407
 * Construct a prefix.
408
 */
409
static int make_addressPrefix(IPAddressOrRange **result, unsigned char *addr,
410
    const int prefixlen, const int afilen)
411
0
{
412
0
    int bytelen = (prefixlen + 7) / 8, bitlen = prefixlen % 8;
413
0
    IPAddressOrRange *aor;
414
0
    unsigned char *prefix = NULL;
415
0
    uint8_t unused_bits = 0;
416
417
0
    if (bitlen > 0)
418
0
        unused_bits = 8 - bitlen;
419
420
0
    if (prefixlen < 0 || prefixlen > (afilen * 8))
421
0
        return 0;
422
0
    if ((aor = IPAddressOrRange_new()) == NULL)
423
0
        return 0;
424
0
    aor->type = IPAddressOrRange_addressPrefix;
425
0
    if (aor->u.addressPrefix == NULL && (aor->u.addressPrefix = ASN1_BIT_STRING_new()) == NULL)
426
0
        goto err;
427
0
    if (bytelen > 0) {
428
0
        prefix = OPENSSL_malloc(bytelen);
429
0
        if (prefix == NULL)
430
0
            goto err;
431
0
        memcpy(prefix, addr, bytelen);
432
0
        if (unused_bits)
433
0
            prefix[bytelen - 1] &= ~(0xFF >> bitlen);
434
0
    }
435
0
    if (!ASN1_BIT_STRING_set1(aor->u.addressPrefix, prefix, bytelen, unused_bits))
436
0
        goto err;
437
0
    *result = aor;
438
439
0
    OPENSSL_free(prefix);
440
0
    return 1;
441
442
0
err:
443
0
    OPENSSL_free(prefix);
444
0
    IPAddressOrRange_free(aor);
445
0
    return 0;
446
0
}
447
448
/*
449
 * Construct a range.  If it can be expressed as a prefix,
450
 * return a prefix instead.  Doing this here simplifies
451
 * the rest of the code considerably.
452
 */
453
static int make_addressRange(IPAddressOrRange **result,
454
    unsigned char *min,
455
    unsigned char *max, const int length)
456
0
{
457
0
    IPAddressOrRange *aor;
458
0
    int i, prefixlen;
459
460
0
    if (memcmp(min, max, length) > 0)
461
0
        return 0;
462
463
0
    if ((prefixlen = range_should_be_prefix(min, max, length)) >= 0)
464
0
        return make_addressPrefix(result, min, prefixlen, length);
465
466
0
    if ((aor = IPAddressOrRange_new()) == NULL)
467
0
        return 0;
468
0
    aor->type = IPAddressOrRange_addressRange;
469
0
    if ((aor->u.addressRange = IPAddressRange_new()) == NULL)
470
0
        goto err;
471
0
    if (aor->u.addressRange->min == NULL && (aor->u.addressRange->min = ASN1_BIT_STRING_new()) == NULL)
472
0
        goto err;
473
0
    if (aor->u.addressRange->max == NULL && (aor->u.addressRange->max = ASN1_BIT_STRING_new()) == NULL)
474
0
        goto err;
475
476
0
    for (i = length; i > 0 && min[i - 1] == 0x00; --i)
477
0
        ;
478
0
    if (!ASN1_BIT_STRING_set1(aor->u.addressRange->min, min, i, 0))
479
0
        goto err;
480
0
    if (i > 0) {
481
0
        unsigned char b = min[i - 1];
482
0
        int j = 1;
483
484
0
        while ((b & (0xFFU >> j)) != 0)
485
0
            ++j;
486
0
        aor->u.addressRange->min->flags |= 8 - j;
487
0
    }
488
489
0
    for (i = length; i > 0 && max[i - 1] == 0xFF; --i)
490
0
        ;
491
0
    if (!ASN1_BIT_STRING_set1(aor->u.addressRange->max, max, i, 0))
492
0
        goto err;
493
0
    if (i > 0) {
494
0
        unsigned char b = max[i - 1];
495
0
        int j = 1;
496
497
0
        while ((b & (0xFFU >> j)) != (0xFFU >> j))
498
0
            ++j;
499
0
        aor->u.addressRange->max->flags |= 8 - j;
500
0
    }
501
502
0
    *result = aor;
503
0
    return 1;
504
505
0
err:
506
0
    IPAddressOrRange_free(aor);
507
0
    return 0;
508
0
}
509
510
/*
511
 * Construct a new address family or find an existing one.
512
 */
513
static IPAddressFamily *make_IPAddressFamily(IPAddrBlocks *addr,
514
    const unsigned afi,
515
    const unsigned *safi)
516
0
{
517
0
    IPAddressFamily *f;
518
0
    unsigned char key[3];
519
0
    int keylen;
520
0
    int i;
521
522
0
    key[0] = (afi >> 8) & 0xFF;
523
0
    key[1] = afi & 0xFF;
524
0
    if (safi != NULL) {
525
0
        key[2] = *safi & 0xFF;
526
0
        keylen = 3;
527
0
    } else {
528
0
        keylen = 2;
529
0
    }
530
531
0
    for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
532
0
        f = sk_IPAddressFamily_value(addr, i);
533
0
        if (f->addressFamily->length == keylen && !memcmp(f->addressFamily->data, key, keylen))
534
0
            return f;
535
0
    }
536
537
0
    if ((f = IPAddressFamily_new()) == NULL)
538
0
        goto err;
539
0
    if (f->ipAddressChoice == NULL && (f->ipAddressChoice = IPAddressChoice_new()) == NULL)
540
0
        goto err;
541
0
    if (f->addressFamily == NULL && (f->addressFamily = ASN1_OCTET_STRING_new()) == NULL)
542
0
        goto err;
543
0
    if (!ASN1_OCTET_STRING_set(f->addressFamily, key, keylen))
544
0
        goto err;
545
0
    if (!sk_IPAddressFamily_push(addr, f))
546
0
        goto err;
547
548
0
    return f;
549
550
0
err:
551
0
    IPAddressFamily_free(f);
552
0
    return NULL;
553
0
}
554
555
/*
556
 * Add an inheritance element.
557
 */
558
int X509v3_addr_add_inherit(IPAddrBlocks *addr,
559
    unsigned afi, const unsigned *safi)
560
0
{
561
0
    IPAddressFamily *f = make_IPAddressFamily(addr, afi, safi);
562
563
0
    if (f == NULL || f->ipAddressChoice == NULL || (f->ipAddressChoice->type == IPAddressChoice_addressesOrRanges && f->ipAddressChoice->u.addressesOrRanges != NULL))
564
0
        return 0;
565
0
    if (f->ipAddressChoice->type == IPAddressChoice_inherit && f->ipAddressChoice->u.inherit != NULL)
566
0
        return 1;
567
0
    if (f->ipAddressChoice->u.inherit == NULL && (f->ipAddressChoice->u.inherit = ASN1_NULL_new()) == NULL)
568
0
        return 0;
569
0
    f->ipAddressChoice->type = IPAddressChoice_inherit;
570
0
    return 1;
571
0
}
572
573
/*
574
 * Construct an IPAddressOrRange sequence, or return an existing one.
575
 */
576
static IPAddressOrRanges *make_prefix_or_range(IPAddrBlocks *addr,
577
    const unsigned afi,
578
    const unsigned *safi)
579
0
{
580
0
    IPAddressFamily *f = make_IPAddressFamily(addr, afi, safi);
581
0
    IPAddressOrRanges *aors = NULL;
582
583
0
    if (f == NULL || f->ipAddressChoice == NULL || (f->ipAddressChoice->type == IPAddressChoice_inherit && f->ipAddressChoice->u.inherit != NULL))
584
0
        return NULL;
585
0
    if (f->ipAddressChoice->type == IPAddressChoice_addressesOrRanges)
586
0
        aors = f->ipAddressChoice->u.addressesOrRanges;
587
0
    if (aors != NULL)
588
0
        return aors;
589
0
    if ((aors = sk_IPAddressOrRange_new_null()) == NULL)
590
0
        return NULL;
591
0
    switch (afi) {
592
0
    case IANA_AFI_IPV4:
593
0
        (void)sk_IPAddressOrRange_set_cmp_func(aors, v4IPAddressOrRange_cmp);
594
0
        break;
595
0
    case IANA_AFI_IPV6:
596
0
        (void)sk_IPAddressOrRange_set_cmp_func(aors, v6IPAddressOrRange_cmp);
597
0
        break;
598
0
    }
599
0
    f->ipAddressChoice->type = IPAddressChoice_addressesOrRanges;
600
0
    f->ipAddressChoice->u.addressesOrRanges = aors;
601
0
    return aors;
602
0
}
603
604
/*
605
 * Add a prefix.
606
 */
607
int X509v3_addr_add_prefix(IPAddrBlocks *addr,
608
    const unsigned afi,
609
    const unsigned *safi,
610
    unsigned char *a, int prefixlen)
611
0
{
612
0
    IPAddressOrRanges *aors = make_prefix_or_range(addr, afi, safi);
613
0
    IPAddressOrRange *aor;
614
615
0
    if (aors == NULL
616
0
        || !make_addressPrefix(&aor, a, prefixlen, length_from_afi(afi)))
617
0
        return 0;
618
0
    if (sk_IPAddressOrRange_push(aors, aor))
619
0
        return 1;
620
0
    IPAddressOrRange_free(aor);
621
0
    return 0;
622
0
}
623
624
/*
625
 * Add a range.
626
 */
627
int X509v3_addr_add_range(IPAddrBlocks *addr,
628
    unsigned afi,
629
    const unsigned *safi,
630
    unsigned char *min, unsigned char *max)
631
0
{
632
0
    IPAddressOrRanges *aors = make_prefix_or_range(addr, afi, safi);
633
0
    IPAddressOrRange *aor;
634
0
    int length = length_from_afi(afi);
635
636
0
    if (aors == NULL)
637
0
        return 0;
638
0
    if (!make_addressRange(&aor, min, max, length))
639
0
        return 0;
640
0
    if (sk_IPAddressOrRange_push(aors, aor))
641
0
        return 1;
642
0
    IPAddressOrRange_free(aor);
643
0
    return 0;
644
0
}
645
646
/*
647
 * Extract min and max values from an IPAddressOrRange.
648
 */
649
static int extract_min_max(IPAddressOrRange *aor,
650
    unsigned char *min, unsigned char *max, int length)
651
0
{
652
0
    if (aor == NULL || min == NULL || max == NULL)
653
0
        return 0;
654
0
    switch (aor->type) {
655
0
    case IPAddressOrRange_addressPrefix:
656
0
        return (addr_expand(min, aor->u.addressPrefix, length, 0x00) && addr_expand(max, aor->u.addressPrefix, length, 0xFF));
657
0
    case IPAddressOrRange_addressRange:
658
0
        return (addr_expand(min, aor->u.addressRange->min, length, 0x00) && addr_expand(max, aor->u.addressRange->max, length, 0xFF));
659
0
    }
660
0
    return 0;
661
0
}
662
663
/*
664
 * Public wrapper for extract_min_max().
665
 */
666
int X509v3_addr_get_range(IPAddressOrRange *aor,
667
    unsigned afi,
668
    unsigned char *min,
669
    unsigned char *max, int length)
670
0
{
671
0
    int afi_length = length_from_afi(afi);
672
673
0
    if (aor == NULL || min == NULL || max == NULL || afi_length == 0 || length < afi_length || (aor->type != IPAddressOrRange_addressPrefix && aor->type != IPAddressOrRange_addressRange) || !extract_min_max(aor, min, max, afi_length))
674
0
        return 0;
675
676
0
    return afi_length;
677
0
}
678
679
/*
680
 * Sort comparison function for a sequence of IPAddressFamily.
681
 *
682
 * The last paragraph of RFC 3779 2.2.3.3 is slightly ambiguous about
683
 * the ordering: I can read it as meaning that IPv6 without a SAFI
684
 * comes before IPv4 with a SAFI, which seems pretty weird.  The
685
 * examples in appendix B suggest that the author intended the
686
 * null-SAFI rule to apply only within a single AFI, which is what I
687
 * would have expected and is what the following code implements.
688
 */
689
static int IPAddressFamily_cmp(const IPAddressFamily *const *a_,
690
    const IPAddressFamily *const *b_)
691
0
{
692
0
    const ASN1_OCTET_STRING *a = (*a_)->addressFamily;
693
0
    const ASN1_OCTET_STRING *b = (*b_)->addressFamily;
694
0
    int cmp, len = (a->length <= b->length) ? a->length : b->length;
695
696
0
    if (len > 0) {
697
0
        cmp = memcmp(a->data, b->data, len);
698
0
        if (cmp != 0)
699
0
            return cmp;
700
0
    }
701
702
0
    return a->length - b->length;
703
0
}
704
705
static int IPAddressFamily_check_len(const IPAddressFamily *f)
706
0
{
707
0
    if (f->addressFamily->length < 2 || f->addressFamily->length > 3)
708
0
        return 0;
709
0
    else
710
0
        return 1;
711
0
}
712
713
/*
714
 * Check whether an IPAddrBLocks is in canonical form.
715
 */
716
int X509v3_addr_is_canonical(IPAddrBlocks *addr)
717
0
{
718
0
    unsigned char a_min[ADDR_RAW_BUF_LEN], a_max[ADDR_RAW_BUF_LEN];
719
0
    unsigned char b_min[ADDR_RAW_BUF_LEN], b_max[ADDR_RAW_BUF_LEN];
720
0
    IPAddressOrRanges *aors;
721
0
    int i, j, k;
722
723
    /*
724
     * Empty extension is canonical.
725
     */
726
0
    if (addr == NULL)
727
0
        return 1;
728
729
    /*
730
     * Check whether the top-level list is in order.
731
     */
732
0
    for (i = 0; i < sk_IPAddressFamily_num(addr) - 1; i++) {
733
0
        const IPAddressFamily *a = sk_IPAddressFamily_value(addr, i);
734
0
        const IPAddressFamily *b = sk_IPAddressFamily_value(addr, i + 1);
735
736
0
        if (!IPAddressFamily_check_len(a) || !IPAddressFamily_check_len(b))
737
0
            return 0;
738
739
0
        if (IPAddressFamily_cmp(&a, &b) >= 0)
740
0
            return 0;
741
0
    }
742
743
    /*
744
     * Top level's ok, now check each address family.
745
     */
746
0
    for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
747
0
        IPAddressFamily *f = sk_IPAddressFamily_value(addr, i);
748
0
        int length = length_from_afi(X509v3_addr_get_afi(f));
749
750
        /*
751
         * Inheritance is canonical.  Anything other than inheritance or
752
         * a SEQUENCE OF IPAddressOrRange is an ASN.1 error or something.
753
         */
754
0
        if (f == NULL || f->ipAddressChoice == NULL)
755
0
            return 0;
756
0
        switch (f->ipAddressChoice->type) {
757
0
        case IPAddressChoice_inherit:
758
0
            continue;
759
0
        case IPAddressChoice_addressesOrRanges:
760
0
            break;
761
0
        default:
762
0
            return 0;
763
0
        }
764
765
0
        if (!IPAddressFamily_check_len(f))
766
0
            return 0;
767
768
        /*
769
         * It's an IPAddressOrRanges sequence, check it.
770
         */
771
0
        aors = f->ipAddressChoice->u.addressesOrRanges;
772
0
        if (sk_IPAddressOrRange_num(aors) == 0)
773
0
            return 0;
774
775
0
        for (j = 0; j < sk_IPAddressOrRange_num(aors) - 1; j++) {
776
0
            IPAddressOrRange *a = sk_IPAddressOrRange_value(aors, j);
777
0
            IPAddressOrRange *b = sk_IPAddressOrRange_value(aors, j + 1);
778
779
0
            if (!extract_min_max(a, a_min, a_max, length) || !extract_min_max(b, b_min, b_max, length))
780
0
                return 0;
781
782
            /*
783
             * Punt misordered list, overlapping start, or inverted range.
784
             */
785
0
            if (memcmp(a_min, b_min, length) >= 0 || memcmp(a_min, a_max, length) > 0 || memcmp(b_min, b_max, length) > 0)
786
0
                return 0;
787
788
            /*
789
             * Punt if adjacent or overlapping.  Check for adjacency by
790
             * subtracting one from b_min first.
791
             */
792
0
            for (k = length - 1; k >= 0 && b_min[k]-- == 0x00; k--)
793
0
                ;
794
0
            if (memcmp(a_max, b_min, length) >= 0)
795
0
                return 0;
796
797
            /*
798
             * Check for range that should be expressed as a prefix.
799
             */
800
0
            if (a->type == IPAddressOrRange_addressRange && range_should_be_prefix(a_min, a_max, length) >= 0)
801
0
                return 0;
802
0
        }
803
804
        /*
805
         * Check range to see if it's inverted or should be a
806
         * prefix.
807
         */
808
0
        j = sk_IPAddressOrRange_num(aors) - 1;
809
0
        {
810
0
            IPAddressOrRange *a = sk_IPAddressOrRange_value(aors, j);
811
812
0
            if (a != NULL && a->type == IPAddressOrRange_addressRange) {
813
0
                if (!extract_min_max(a, a_min, a_max, length))
814
0
                    return 0;
815
0
                if (memcmp(a_min, a_max, length) > 0 || range_should_be_prefix(a_min, a_max, length) >= 0)
816
0
                    return 0;
817
0
            }
818
0
        }
819
0
    }
820
821
    /*
822
     * If we made it through all that, we're happy.
823
     */
824
0
    return 1;
825
0
}
826
827
/*
828
 * Whack an IPAddressOrRanges into canonical form.
829
 *
830
 * After the initial sort, the merge runs as a single linear sweep
831
 * over the list using a write index.  Adjacent entries are folded
832
 * into the previous output by replacing it with a freshly built
833
 * merged range; both old entries are then freed and the consumed
834
 * source slot is recorded as NULL.  Total cost is O(N log N) sort +
835
 * O(N) merge, with no stack deletes inside the loop.
836
 *
837
 * The NULL slots are closed up by a single compaction pass at the end,
838
 * which runs whether the sweep succeeded or failed.  This guarantees
839
 * the live stack is always left hole-free, with every occupied slot
840
 * non-NULL, so on error the caller may safely inspect, print, encode,
841
 * free, or retry canonize on the object.  The sort comparator
842
 * dereferences every slot with no NULL guard, so a retry (which
843
 * re-sorts) would crash on a hole.  is_canonical tolerates NULL by
844
 * returning non-canonical, but the object is still structurally
845
 * invalid.
846
 */
847
static int IPAddressOrRanges_canonize(IPAddressOrRanges *aors,
848
    const unsigned afi)
849
0
{
850
0
    int length = length_from_afi(afi);
851
0
    int read, write = 0, n;
852
0
    int ret = 0;
853
854
0
    sk_IPAddressOrRange_sort(aors);
855
0
    n = sk_IPAddressOrRange_num(aors);
856
857
0
    for (read = 0; read < n; read++) {
858
0
        IPAddressOrRange *cur = sk_IPAddressOrRange_value(aors, read);
859
0
        unsigned char c_min[ADDR_RAW_BUF_LEN], c_max[ADDR_RAW_BUF_LEN];
860
861
0
        if (!extract_min_max(cur, c_min, c_max, length))
862
0
            goto done;
863
864
        /*
865
         * Punt inverted range.
866
         */
867
0
        if (memcmp(c_min, c_max, length) > 0)
868
0
            goto done;
869
870
0
        if (write > 0) {
871
0
            IPAddressOrRange *prev = sk_IPAddressOrRange_value(aors,
872
0
                write - 1);
873
0
            unsigned char p_min[ADDR_RAW_BUF_LEN], p_max[ADDR_RAW_BUF_LEN];
874
0
            unsigned char c_min_minus_one[ADDR_RAW_BUF_LEN];
875
0
            int j;
876
877
0
            if (!extract_min_max(prev, p_min, p_max, length))
878
0
                goto done;
879
880
            /*
881
             * Reject overlap with the previous accepted entry.
882
             */
883
0
            if (memcmp(p_max, c_min, length) >= 0)
884
0
                goto done;
885
886
            /*
887
             * Adjacency test: does c_min - 1 equal p_max?  Work on a
888
             * scratch copy so the original c_min stays intact for use
889
             * as the lower bound if we end up keeping cur.
890
             */
891
0
            memcpy(c_min_minus_one, c_min, length);
892
0
            for (j = length - 1;
893
0
                j >= 0 && c_min_minus_one[j]-- == 0x00;
894
0
                j--)
895
0
                ;
896
0
            if (memcmp(p_max, c_min_minus_one, length) == 0) {
897
0
                IPAddressOrRange *merged;
898
899
0
                if (!make_addressRange(&merged, p_min, c_max, length))
900
0
                    goto done;
901
                /*
902
                 * Replace prev with merged, free the originals, and
903
                 * record the consumed source slot as NULL; the epilogue
904
                 * compacts NULLs out of the live stack so it is left
905
                 * hole-free whether we succeed or fail.
906
                 */
907
0
                (void)sk_IPAddressOrRange_set(aors, write - 1, merged);
908
0
                IPAddressOrRange_free(prev);
909
0
                IPAddressOrRange_free(cur);
910
0
                (void)sk_IPAddressOrRange_set(aors, read, NULL);
911
0
                continue;
912
0
            }
913
0
        }
914
915
        /*
916
         * Keep cur.  Slide it forward into the write slot if we have
917
         * fallen behind, and NULL the source slot to avoid duplicate
918
         * ownership.
919
         */
920
0
        if (write != read) {
921
0
            (void)sk_IPAddressOrRange_set(aors, write, cur);
922
0
            (void)sk_IPAddressOrRange_set(aors, read, NULL);
923
0
        }
924
0
        write++;
925
0
    }
926
927
0
    ret = 1;
928
929
0
done:
930
    /*
931
     * The sweep above NULLs source slots as it folds entries.  Whether
932
     * we succeeded or bailed out on an error, the stack must be left
933
     * hole-free, with every occupied slot non-NULL, so that the caller
934
     * may inspect, print, encode, free, or even retry canonize on the
935
     * object without dereferencing NULL.  Slide every non-NULL slot
936
     * forward to close the holes, then pop the vacated tail.  On success
937
     * this collapses [write..n-1] (all NULL) to length `write`; on error
938
     * it removes the possibly empty contiguous run of NULL slots in
939
     * [write, read), preserving the processed output in [0, write) and
940
     * the untouched original entries in [read, n).
941
     */
942
0
    {
943
0
        int w = 0, r;
944
945
0
        for (r = 0; r < sk_IPAddressOrRange_num(aors); r++) {
946
0
            IPAddressOrRange *v = sk_IPAddressOrRange_value(aors, r);
947
948
0
            if (v != NULL) {
949
0
                if (w != r)
950
0
                    (void)sk_IPAddressOrRange_set(aors, w, v);
951
0
                w++;
952
0
            }
953
0
        }
954
0
        while (sk_IPAddressOrRange_num(aors) > w)
955
0
            (void)sk_IPAddressOrRange_pop(aors);
956
0
    }
957
958
0
    return ret;
959
0
}
960
961
/*
962
 * Whack an IPAddrBlocks extension into canonical form.
963
 */
964
int X509v3_addr_canonize(IPAddrBlocks *addr)
965
0
{
966
0
    int i;
967
968
0
    if (addr == NULL) {
969
0
        ERR_raise(ERR_LIB_X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
970
0
        return 0;
971
0
    }
972
973
0
    for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
974
0
        IPAddressFamily *f = sk_IPAddressFamily_value(addr, i);
975
976
0
        if (!IPAddressFamily_check_len(f))
977
0
            return 0;
978
979
0
        if (f->ipAddressChoice->type == IPAddressChoice_addressesOrRanges && !IPAddressOrRanges_canonize(f->ipAddressChoice->u.addressesOrRanges, X509v3_addr_get_afi(f)))
980
0
            return 0;
981
0
    }
982
0
    (void)sk_IPAddressFamily_set_cmp_func(addr, IPAddressFamily_cmp);
983
0
    sk_IPAddressFamily_sort(addr);
984
0
    if (!ossl_assert(X509v3_addr_is_canonical(addr)))
985
0
        return 0;
986
0
    return 1;
987
0
}
988
989
/*
990
 * v2i handler for the IPAddrBlocks extension.
991
 */
992
static void *v2i_IPAddrBlocks(const struct v3_ext_method *method,
993
    struct v3_ext_ctx *ctx,
994
    STACK_OF(CONF_VALUE) *values)
995
0
{
996
0
    static const char v4addr_chars[] = "0123456789.";
997
0
    static const char v6addr_chars[] = "0123456789.:abcdefABCDEF";
998
0
    IPAddrBlocks *addr = NULL;
999
0
    char *s = NULL, *t;
1000
0
    int i;
1001
1002
0
    if ((addr = sk_IPAddressFamily_new(IPAddressFamily_cmp)) == NULL) {
1003
0
        ERR_raise(ERR_LIB_X509V3, ERR_R_CRYPTO_LIB);
1004
0
        return NULL;
1005
0
    }
1006
1007
0
    for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
1008
0
        CONF_VALUE *val = sk_CONF_VALUE_value(values, i);
1009
0
        unsigned char min[ADDR_RAW_BUF_LEN], max[ADDR_RAW_BUF_LEN];
1010
0
        unsigned afi, *safi = NULL, safi_;
1011
0
        const char *addr_chars = NULL;
1012
0
        int prefixlen, i1, i2, delim, length;
1013
1014
0
        if (!ossl_v3_name_cmp(val->name, "IPv4")) {
1015
0
            afi = IANA_AFI_IPV4;
1016
0
        } else if (!ossl_v3_name_cmp(val->name, "IPv6")) {
1017
0
            afi = IANA_AFI_IPV6;
1018
0
        } else if (!ossl_v3_name_cmp(val->name, "IPv4-SAFI")) {
1019
0
            afi = IANA_AFI_IPV4;
1020
0
            safi = &safi_;
1021
0
        } else if (!ossl_v3_name_cmp(val->name, "IPv6-SAFI")) {
1022
0
            afi = IANA_AFI_IPV6;
1023
0
            safi = &safi_;
1024
0
        } else {
1025
0
            ERR_raise_data(ERR_LIB_X509V3, X509V3_R_EXTENSION_NAME_ERROR,
1026
0
                "%s", val->name);
1027
0
            goto err;
1028
0
        }
1029
1030
0
        switch (afi) {
1031
0
        case IANA_AFI_IPV4:
1032
0
            addr_chars = v4addr_chars;
1033
0
            break;
1034
0
        case IANA_AFI_IPV6:
1035
0
            addr_chars = v6addr_chars;
1036
0
            break;
1037
0
        }
1038
1039
0
        length = length_from_afi(afi);
1040
1041
        /*
1042
         * Handle SAFI, if any, and OPENSSL_strdup() so we can null-terminate
1043
         * the other input values.
1044
         */
1045
0
        if (safi != NULL) {
1046
0
            if (val->value == NULL) {
1047
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_MISSING_VALUE);
1048
0
                goto err;
1049
0
            }
1050
0
            *safi = strtoul(val->value, &t, 0);
1051
0
            t += strspn(t, " \t");
1052
0
            if (*safi > 0xFF || *t++ != ':') {
1053
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_INVALID_SAFI);
1054
0
                X509V3_conf_add_error_name_value(val);
1055
0
                goto err;
1056
0
            }
1057
0
            t += strspn(t, " \t");
1058
0
            s = OPENSSL_strdup(t);
1059
0
        } else {
1060
0
            s = OPENSSL_strdup(val->value);
1061
0
        }
1062
0
        if (s == NULL)
1063
0
            goto err;
1064
1065
        /*
1066
         * Check for inheritance.  Not worth additional complexity to
1067
         * optimize this (seldom-used) case.
1068
         */
1069
0
        if (strcmp(s, "inherit") == 0) {
1070
0
            if (!X509v3_addr_add_inherit(addr, afi, safi)) {
1071
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_INVALID_INHERITANCE);
1072
0
                X509V3_conf_add_error_name_value(val);
1073
0
                goto err;
1074
0
            }
1075
0
            OPENSSL_free(s);
1076
0
            s = NULL;
1077
0
            continue;
1078
0
        }
1079
1080
0
        i1 = (int)strspn(s, addr_chars);
1081
0
        i2 = i1 + (int)strspn(s + i1, " \t");
1082
0
        delim = s[i2++];
1083
0
        s[i1] = '\0';
1084
1085
0
        if (ossl_a2i_ipadd(min, s) != length) {
1086
0
            ERR_raise(ERR_LIB_X509V3, X509V3_R_INVALID_IPADDRESS);
1087
0
            X509V3_conf_add_error_name_value(val);
1088
0
            goto err;
1089
0
        }
1090
1091
0
        switch (delim) {
1092
0
        case '/':
1093
0
            prefixlen = (int)strtoul(s + i2, &t, 10);
1094
0
            if (t == s + i2
1095
0
                || *t != '\0'
1096
0
                || prefixlen > (length * 8)
1097
0
                || prefixlen < 0) {
1098
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
1099
0
                X509V3_conf_add_error_name_value(val);
1100
0
                goto err;
1101
0
            }
1102
0
            if (!X509v3_addr_add_prefix(addr, afi, safi, min, prefixlen)) {
1103
0
                ERR_raise(ERR_LIB_X509V3, ERR_R_X509V3_LIB);
1104
0
                goto err;
1105
0
            }
1106
0
            break;
1107
0
        case '-':
1108
0
            i1 = i2 + (int)strspn(s + i2, " \t");
1109
0
            i2 = i1 + (int)strspn(s + i1, addr_chars);
1110
0
            if (i1 == i2 || s[i2] != '\0') {
1111
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
1112
0
                X509V3_conf_add_error_name_value(val);
1113
0
                goto err;
1114
0
            }
1115
0
            if (ossl_a2i_ipadd(max, s + i1) != length) {
1116
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_INVALID_IPADDRESS);
1117
0
                X509V3_conf_add_error_name_value(val);
1118
0
                goto err;
1119
0
            }
1120
0
            if (memcmp(min, max, length_from_afi(afi)) > 0) {
1121
0
                ERR_raise(ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
1122
0
                X509V3_conf_add_error_name_value(val);
1123
0
                goto err;
1124
0
            }
1125
0
            if (!X509v3_addr_add_range(addr, afi, safi, min, max)) {
1126
0
                ERR_raise(ERR_LIB_X509V3, ERR_R_X509V3_LIB);
1127
0
                goto err;
1128
0
            }
1129
0
            break;
1130
0
        case '\0':
1131
0
            if (!X509v3_addr_add_prefix(addr, afi, safi, min, length * 8)) {
1132
0
                ERR_raise(ERR_LIB_X509V3, ERR_R_X509V3_LIB);
1133
0
                goto err;
1134
0
            }
1135
0
            break;
1136
0
        default:
1137
0
            ERR_raise(ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
1138
0
            X509V3_conf_add_error_name_value(val);
1139
0
            goto err;
1140
0
        }
1141
1142
0
        OPENSSL_free(s);
1143
0
        s = NULL;
1144
0
    }
1145
1146
    /*
1147
     * Canonize the result, then we're done.
1148
     */
1149
0
    if (!X509v3_addr_canonize(addr))
1150
0
        goto err;
1151
0
    return addr;
1152
1153
0
err:
1154
0
    OPENSSL_free(s);
1155
0
    sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
1156
0
    return NULL;
1157
0
}
1158
1159
/*
1160
 * OpenSSL dispatch
1161
 */
1162
const X509V3_EXT_METHOD ossl_v3_addr = {
1163
    NID_sbgp_ipAddrBlock, /* nid */
1164
    0, /* flags */
1165
    ASN1_ITEM_ref(IPAddrBlocks), /* template */
1166
    0, 0, 0, 0, /* old functions, ignored */
1167
    0, /* i2s */
1168
    0, /* s2i */
1169
    0, /* i2v */
1170
    v2i_IPAddrBlocks, /* v2i */
1171
    i2r_IPAddrBlocks, /* i2r */
1172
    0, /* r2i */
1173
    NULL /* extension-specific data */
1174
};
1175
1176
/*
1177
 * Figure out whether extension sues inheritance.
1178
 */
1179
int X509v3_addr_inherits(IPAddrBlocks *addr)
1180
0
{
1181
0
    int i;
1182
1183
0
    if (addr == NULL)
1184
0
        return 0;
1185
0
    for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
1186
0
        IPAddressFamily *f = sk_IPAddressFamily_value(addr, i);
1187
1188
0
        if (f->ipAddressChoice->type == IPAddressChoice_inherit)
1189
0
            return 1;
1190
0
    }
1191
0
    return 0;
1192
0
}
1193
1194
/*
1195
 * Figure out whether parent contains child.
1196
 */
1197
static int addr_contains(IPAddressOrRanges *parent,
1198
    IPAddressOrRanges *child, int length)
1199
0
{
1200
0
    unsigned char p_min[ADDR_RAW_BUF_LEN], p_max[ADDR_RAW_BUF_LEN];
1201
0
    unsigned char c_min[ADDR_RAW_BUF_LEN], c_max[ADDR_RAW_BUF_LEN];
1202
0
    int p, c;
1203
1204
0
    if (child == NULL || parent == child)
1205
0
        return 1;
1206
0
    if (parent == NULL)
1207
0
        return 0;
1208
1209
0
    p = 0;
1210
0
    for (c = 0; c < sk_IPAddressOrRange_num(child); c++) {
1211
0
        if (!extract_min_max(sk_IPAddressOrRange_value(child, c),
1212
0
                c_min, c_max, length))
1213
0
            return 0;
1214
0
        for (;; p++) {
1215
0
            if (p >= sk_IPAddressOrRange_num(parent))
1216
0
                return 0;
1217
0
            if (!extract_min_max(sk_IPAddressOrRange_value(parent, p),
1218
0
                    p_min, p_max, length))
1219
0
                return 0;
1220
0
            if (memcmp(p_max, c_max, length) < 0)
1221
0
                continue;
1222
0
            if (memcmp(p_min, c_min, length) > 0)
1223
0
                return 0;
1224
0
            break;
1225
0
        }
1226
0
    }
1227
1228
0
    return 1;
1229
0
}
1230
1231
/*
1232
 * Test whether a is a subset of b.
1233
 */
1234
int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b)
1235
0
{
1236
0
    int i;
1237
1238
0
    if (a == NULL || a == b)
1239
0
        return 1;
1240
0
    if (b == NULL || X509v3_addr_inherits(a) || X509v3_addr_inherits(b))
1241
0
        return 0;
1242
0
    (void)sk_IPAddressFamily_set_cmp_func(b, IPAddressFamily_cmp);
1243
0
    sk_IPAddressFamily_sort(b);
1244
    /* Could sort a here too and get O(|a|) running time instead of O(|a| ln |b|) */
1245
0
    for (i = 0; i < sk_IPAddressFamily_num(a); i++) {
1246
0
        IPAddressFamily *fa = sk_IPAddressFamily_value(a, i);
1247
0
        int j = sk_IPAddressFamily_find(b, fa);
1248
0
        IPAddressFamily *fb = sk_IPAddressFamily_value(b, j);
1249
1250
0
        if (fb == NULL)
1251
0
            return 0;
1252
0
        if (!IPAddressFamily_check_len(fa) || !IPAddressFamily_check_len(fb))
1253
0
            return 0;
1254
0
        if (!addr_contains(fb->ipAddressChoice->u.addressesOrRanges,
1255
0
                fa->ipAddressChoice->u.addressesOrRanges,
1256
0
                length_from_afi(X509v3_addr_get_afi(fb))))
1257
0
            return 0;
1258
0
    }
1259
0
    return 1;
1260
0
}
1261
1262
/*
1263
 * Validation error handling via callback.
1264
 */
1265
#define validation_err(_err_)            \
1266
0
    do {                                 \
1267
0
        if (ctx != NULL) {               \
1268
0
            ctx->error = _err_;          \
1269
0
            ctx->error_depth = i;        \
1270
0
            ctx->current_cert = x;       \
1271
0
            rv = ctx->verify_cb(0, ctx); \
1272
0
        } else {                         \
1273
0
            rv = 0;                      \
1274
0
        }                                \
1275
0
        if (rv == 0)                     \
1276
0
            goto done;                   \
1277
0
    } while (0)
1278
1279
/*
1280
 * Core code for RFC 3779 2.3 path validation.
1281
 *
1282
 * Returns 1 for success, 0 on error.
1283
 *
1284
 * When returning 0, ctx->error MUST be set to an appropriate value other than
1285
 * X509_V_OK.
1286
 */
1287
static int addr_validate_path_internal(X509_STORE_CTX *ctx,
1288
    const STACK_OF(X509) *chain,
1289
    IPAddrBlocks *ext)
1290
0
{
1291
0
    IPAddrBlocks *child = NULL;
1292
0
    int i, j, ret = 0, rv;
1293
0
    X509 *x;
1294
1295
0
    if (!ossl_assert(chain != NULL && sk_X509_num(chain) > 0)
1296
0
        || !ossl_assert(ctx != NULL || ext != NULL)
1297
0
        || !ossl_assert(ctx == NULL || ctx->verify_cb != NULL)) {
1298
0
        if (ctx != NULL)
1299
0
            ctx->error = X509_V_ERR_UNSPECIFIED;
1300
0
        return 0;
1301
0
    }
1302
1303
    /*
1304
     * Figure out where to start.  If we don't have an extension to
1305
     * check, we're done.  Otherwise, check canonical form and
1306
     * set up for walking up the chain.
1307
     */
1308
0
    if (ext != NULL) {
1309
0
        i = -1;
1310
0
        x = NULL;
1311
0
    } else {
1312
0
        i = 0;
1313
0
        x = sk_X509_value(chain, i);
1314
0
        if ((ext = x->rfc3779_addr) == NULL)
1315
0
            return 1; /* Return success */
1316
0
    }
1317
0
    if (!X509v3_addr_is_canonical(ext))
1318
0
        validation_err(X509_V_ERR_INVALID_EXTENSION);
1319
0
    (void)sk_IPAddressFamily_set_cmp_func(ext, IPAddressFamily_cmp);
1320
0
    if ((child = sk_IPAddressFamily_dup(ext)) == NULL) {
1321
0
        ERR_raise(ERR_LIB_X509V3, ERR_R_CRYPTO_LIB);
1322
0
        if (ctx != NULL)
1323
0
            ctx->error = X509_V_ERR_OUT_OF_MEM;
1324
0
        goto done;
1325
0
    }
1326
0
    sk_IPAddressFamily_sort(child);
1327
1328
    /*
1329
     * Now walk up the chain.  No cert may list resources that its
1330
     * parent doesn't list.
1331
     */
1332
0
    for (i++; i < sk_X509_num(chain); i++) {
1333
0
        x = sk_X509_value(chain, i);
1334
0
        if (!X509v3_addr_is_canonical(x->rfc3779_addr))
1335
0
            validation_err(X509_V_ERR_INVALID_EXTENSION);
1336
0
        if (x->rfc3779_addr == NULL) {
1337
0
            for (j = 0; j < sk_IPAddressFamily_num(child); j++) {
1338
0
                IPAddressFamily *fc = sk_IPAddressFamily_value(child, j);
1339
1340
0
                if (!IPAddressFamily_check_len(fc))
1341
0
                    goto done;
1342
1343
0
                if (fc->ipAddressChoice->type != IPAddressChoice_inherit) {
1344
0
                    validation_err(X509_V_ERR_UNNESTED_RESOURCE);
1345
0
                    break;
1346
0
                }
1347
0
            }
1348
0
            continue;
1349
0
        }
1350
0
        (void)sk_IPAddressFamily_set_cmp_func(x->rfc3779_addr,
1351
0
            IPAddressFamily_cmp);
1352
0
        sk_IPAddressFamily_sort(x->rfc3779_addr);
1353
0
        for (j = 0; j < sk_IPAddressFamily_num(child); j++) {
1354
0
            IPAddressFamily *fc = sk_IPAddressFamily_value(child, j);
1355
0
            int k = sk_IPAddressFamily_find(x->rfc3779_addr, fc);
1356
0
            IPAddressFamily *fp = sk_IPAddressFamily_value(x->rfc3779_addr, k);
1357
1358
0
            if (fp == NULL) {
1359
0
                if (fc->ipAddressChoice->type == IPAddressChoice_addressesOrRanges) {
1360
0
                    validation_err(X509_V_ERR_UNNESTED_RESOURCE);
1361
0
                    break;
1362
0
                }
1363
0
                continue;
1364
0
            }
1365
1366
0
            if (!IPAddressFamily_check_len(fc) || !IPAddressFamily_check_len(fp))
1367
0
                goto done;
1368
1369
0
            if (fp->ipAddressChoice->type == IPAddressChoice_addressesOrRanges) {
1370
0
                if (fc->ipAddressChoice->type == IPAddressChoice_inherit
1371
0
                    || addr_contains(fp->ipAddressChoice->u.addressesOrRanges,
1372
0
                        fc->ipAddressChoice->u.addressesOrRanges,
1373
0
                        length_from_afi(X509v3_addr_get_afi(fc))))
1374
0
                    (void)sk_IPAddressFamily_set(child, j, fp);
1375
0
                else
1376
0
                    validation_err(X509_V_ERR_UNNESTED_RESOURCE);
1377
0
            }
1378
0
        }
1379
0
    }
1380
1381
    /*
1382
     * Trust anchor can't inherit.
1383
     */
1384
0
    if (x->rfc3779_addr != NULL) {
1385
0
        for (j = 0; j < sk_IPAddressFamily_num(x->rfc3779_addr); j++) {
1386
0
            IPAddressFamily *fp = sk_IPAddressFamily_value(x->rfc3779_addr, j);
1387
1388
0
            if (!IPAddressFamily_check_len(fp))
1389
0
                goto done;
1390
1391
0
            if (fp->ipAddressChoice->type == IPAddressChoice_inherit
1392
0
                && sk_IPAddressFamily_find(child, fp) >= 0)
1393
0
                validation_err(X509_V_ERR_UNNESTED_RESOURCE);
1394
0
        }
1395
0
    }
1396
0
    ret = 1;
1397
0
done:
1398
0
    sk_IPAddressFamily_free(child);
1399
0
    return ret;
1400
0
}
1401
1402
#undef validation_err
1403
1404
/*
1405
 * RFC 3779 2.3 path validation -- called from X509_verify_cert().
1406
 */
1407
int X509v3_addr_validate_path(X509_STORE_CTX *ctx)
1408
0
{
1409
0
    if (ctx->chain == NULL
1410
0
        || sk_X509_num(ctx->chain) == 0
1411
0
        || ctx->verify_cb == NULL) {
1412
0
        ctx->error = X509_V_ERR_UNSPECIFIED;
1413
0
        return 0;
1414
0
    }
1415
0
    return addr_validate_path_internal(ctx, ctx->chain, NULL);
1416
0
}
1417
1418
/*
1419
 * RFC 3779 2.3 path validation of an extension.
1420
 * Test whether chain covers extension.
1421
 */
1422
int X509v3_addr_validate_resource_set(const STACK_OF(X509) *chain,
1423
    IPAddrBlocks *ext, int allow_inheritance)
1424
0
{
1425
0
    if (ext == NULL)
1426
0
        return 1;
1427
0
    if (chain == NULL || sk_X509_num(chain) == 0)
1428
0
        return 0;
1429
0
    if (!allow_inheritance && X509v3_addr_inherits(ext))
1430
0
        return 0;
1431
0
    return addr_validate_path_internal(NULL, chain, ext);
1432
0
}
1433
1434
#endif /* OPENSSL_NO_RFC3779 */