Coverage Report

Created: 2018-08-29 13:53

/src/openssl/crypto/x509v3/v3_extku.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the OpenSSL license (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
#include <stdio.h>
11
#include "internal/cryptlib.h"
12
#include <openssl/asn1t.h>
13
#include <openssl/conf.h>
14
#include <openssl/x509v3.h>
15
#include "ext_dat.h"
16
17
static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
18
                                    X509V3_CTX *ctx,
19
                                    STACK_OF(CONF_VALUE) *nval);
20
static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
21
                                                    *method, void *eku, STACK_OF(CONF_VALUE)
22
                                                    *extlist);
23
24
const X509V3_EXT_METHOD v3_ext_ku = {
25
    NID_ext_key_usage, 0,
26
    ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
27
    0, 0, 0, 0,
28
    0, 0,
29
    i2v_EXTENDED_KEY_USAGE,
30
    v2i_EXTENDED_KEY_USAGE,
31
    0, 0,
32
    NULL
33
};
34
35
/* NB OCSP acceptable responses also is a SEQUENCE OF OBJECT */
36
const X509V3_EXT_METHOD v3_ocsp_accresp = {
37
    NID_id_pkix_OCSP_acceptableResponses, 0,
38
    ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
39
    0, 0, 0, 0,
40
    0, 0,
41
    i2v_EXTENDED_KEY_USAGE,
42
    v2i_EXTENDED_KEY_USAGE,
43
    0, 0,
44
    NULL
45
};
46
47
ASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) =
48
        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, EXTENDED_KEY_USAGE, ASN1_OBJECT)
49
ASN1_ITEM_TEMPLATE_END(EXTENDED_KEY_USAGE)
50
51
IMPLEMENT_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
52
53
static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
54
                                                    *method, void *a, STACK_OF(CONF_VALUE)
55
                                                    *ext_list)
56
0
{
57
0
    EXTENDED_KEY_USAGE *eku = a;
58
0
    int i;
59
0
    ASN1_OBJECT *obj;
60
0
    char obj_tmp[80];
61
0
    for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
62
0
        obj = sk_ASN1_OBJECT_value(eku, i);
63
0
        i2t_ASN1_OBJECT(obj_tmp, 80, obj);
64
0
        X509V3_add_value(NULL, obj_tmp, &ext_list);
65
0
    }
66
0
    return ext_list;
67
0
}
68
69
static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
70
                                    X509V3_CTX *ctx,
71
                                    STACK_OF(CONF_VALUE) *nval)
72
0
{
73
0
    EXTENDED_KEY_USAGE *extku;
74
0
    char *extval;
75
0
    ASN1_OBJECT *objtmp;
76
0
    CONF_VALUE *val;
77
0
    const int num = sk_CONF_VALUE_num(nval);
78
0
    int i;
79
0
80
0
    extku = sk_ASN1_OBJECT_new_reserve(NULL, num);
81
0
    if (extku == NULL) {
82
0
        X509V3err(X509V3_F_V2I_EXTENDED_KEY_USAGE, ERR_R_MALLOC_FAILURE);
83
0
        sk_ASN1_OBJECT_free(extku);
84
0
        return NULL;
85
0
    }
86
0
87
0
    for (i = 0; i < num; i++) {
88
0
        val = sk_CONF_VALUE_value(nval, i);
89
0
        if (val->value)
90
0
            extval = val->value;
91
0
        else
92
0
            extval = val->name;
93
0
        if ((objtmp = OBJ_txt2obj(extval, 0)) == NULL) {
94
0
            sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free);
95
0
            X509V3err(X509V3_F_V2I_EXTENDED_KEY_USAGE,
96
0
                      X509V3_R_INVALID_OBJECT_IDENTIFIER);
97
0
            X509V3_conf_err(val);
98
0
            return NULL;
99
0
        }
100
0
        sk_ASN1_OBJECT_push(extku, objtmp);  /* no failure as it was reserved */
101
0
    }
102
0
    return extku;
103
0
}