Coverage Report

Created: 2024-01-20 12:33

/src/mbedtls/library/oid.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * \file oid.c
3
 *
4
 * \brief Object Identifier (OID) database
5
 *
6
 *  Copyright The Mbed TLS Contributors
7
 *  SPDX-License-Identifier: Apache-2.0
8
 *
9
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
10
 *  not use this file except in compliance with the License.
11
 *  You may obtain a copy of the License at
12
 *
13
 *  http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 *  Unless required by applicable law or agreed to in writing, software
16
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 *  See the License for the specific language governing permissions and
19
 *  limitations under the License.
20
 */
21
22
#include "common.h"
23
24
#if defined(MBEDTLS_OID_C)
25
26
#include "mbedtls/oid.h"
27
#include "mbedtls/rsa.h"
28
#include "mbedtls/error.h"
29
30
#include "mbedtls/legacy_or_psa.h"
31
32
#include <stdio.h>
33
#include <string.h>
34
35
#include "mbedtls/platform.h"
36
37
/*
38
 * Macro to automatically add the size of #define'd OIDs
39
 */
40
#define ADD_LEN(s)      s, MBEDTLS_OID_SIZE(s)
41
42
/*
43
 * Macro to generate mbedtls_oid_descriptor_t
44
 */
45
#if !defined(MBEDTLS_X509_REMOVE_INFO)
46
#define OID_DESCRIPTOR(s, name, description)  { ADD_LEN(s), name, description }
47
#define NULL_OID_DESCRIPTOR                   { NULL, 0, NULL, NULL }
48
#else
49
#define OID_DESCRIPTOR(s, name, description)  { ADD_LEN(s) }
50
#define NULL_OID_DESCRIPTOR                   { NULL, 0 }
51
#endif
52
53
/*
54
 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
55
 * the other functions)
56
 */
57
#define FN_OID_TYPED_FROM_ASN1(TYPE_T, NAME, LIST)                    \
58
    static const TYPE_T *oid_ ## NAME ## _from_asn1(                   \
59
        const mbedtls_asn1_buf *oid)     \
60
144k
    {                                                                   \
61
144k
        const TYPE_T *p = (LIST);                                       \
62
144k
        const mbedtls_oid_descriptor_t *cur =                           \
63
144k
            (const mbedtls_oid_descriptor_t *) p;                       \
64
144k
        if (p == NULL || oid == NULL) return NULL;                  \
65
688k
        while (cur->asn1 != NULL) {                                    \
66
630k
            if (cur->asn1_len == oid->len &&                            \
67
630k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
86.8k
                return p;                                            \
69
86.8k
            }                                                           \
70
630k
            p++;                                                        \
71
543k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
543k
        }                                                               \
73
144k
        return NULL;                                                 \
74
144k
    }
oid.c:oid_x520_attr_from_asn1
Line
Count
Source
60
302
    {                                                                   \
61
302
        const TYPE_T *p = (LIST);                                       \
62
302
        const mbedtls_oid_descriptor_t *cur =                           \
63
302
            (const mbedtls_oid_descriptor_t *) p;                       \
64
302
        if (p == NULL || oid == NULL) return NULL;                  \
65
3.07k
        while (cur->asn1 != NULL) {                                    \
66
3.00k
            if (cur->asn1_len == oid->len &&                            \
67
3.00k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
234
                return p;                                            \
69
234
            }                                                           \
70
3.00k
            p++;                                                        \
71
2.77k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
2.77k
        }                                                               \
73
302
        return NULL;                                                 \
74
302
    }
oid.c:oid_x509_ext_from_asn1
Line
Count
Source
60
72.3k
    {                                                                   \
61
72.3k
        const TYPE_T *p = (LIST);                                       \
62
72.3k
        const mbedtls_oid_descriptor_t *cur =                           \
63
72.3k
            (const mbedtls_oid_descriptor_t *) p;                       \
64
72.3k
        if (p == NULL || oid == NULL) return NULL;                  \
65
364k
        while (cur->asn1 != NULL) {                                    \
66
315k
            if (cur->asn1_len == oid->len &&                            \
67
315k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
24.0k
                return p;                                            \
69
24.0k
            }                                                           \
70
315k
            p++;                                                        \
71
291k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
291k
        }                                                               \
73
72.3k
        return NULL;                                                 \
74
72.3k
    }
Unexecuted instantiation: oid.c:oid_ext_key_usage_from_asn1
Unexecuted instantiation: oid.c:oid_certificate_policies_from_asn1
oid.c:oid_sig_alg_from_asn1
Line
Count
Source
60
38.5k
    {                                                                   \
61
38.5k
        const TYPE_T *p = (LIST);                                       \
62
38.5k
        const mbedtls_oid_descriptor_t *cur =                           \
63
38.5k
            (const mbedtls_oid_descriptor_t *) p;                       \
64
38.5k
        if (p == NULL || oid == NULL) return NULL;                  \
65
261k
        while (cur->asn1 != NULL) {                                    \
66
251k
            if (cur->asn1_len == oid->len &&                            \
67
251k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
28.9k
                return p;                                            \
69
28.9k
            }                                                           \
70
251k
            p++;                                                        \
71
222k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
222k
        }                                                               \
73
38.5k
        return NULL;                                                 \
74
38.5k
    }
oid.c:oid_pk_alg_from_asn1
Line
Count
Source
60
27.2k
    {                                                                   \
61
27.2k
        const TYPE_T *p = (LIST);                                       \
62
27.2k
        const mbedtls_oid_descriptor_t *cur =                           \
63
27.2k
            (const mbedtls_oid_descriptor_t *) p;                       \
64
27.2k
        if (p == NULL || oid == NULL) return NULL;                  \
65
33.9k
        while (cur->asn1 != NULL) {                                    \
66
33.9k
            if (cur->asn1_len == oid->len &&                            \
67
33.9k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
27.2k
                return p;                                            \
69
27.2k
            }                                                           \
70
33.9k
            p++;                                                        \
71
6.69k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
6.69k
        }                                                               \
73
27.2k
        return NULL;                                                 \
74
27.2k
    }
oid.c:oid_grp_id_from_asn1
Line
Count
Source
60
6.39k
    {                                                                   \
61
6.39k
        const TYPE_T *p = (LIST);                                       \
62
6.39k
        const mbedtls_oid_descriptor_t *cur =                           \
63
6.39k
            (const mbedtls_oid_descriptor_t *) p;                       \
64
6.39k
        if (p == NULL || oid == NULL) return NULL;                  \
65
25.8k
        while (cur->asn1 != NULL) {                                    \
66
25.8k
            if (cur->asn1_len == oid->len &&                            \
67
25.8k
                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
68
6.37k
                return p;                                            \
69
6.37k
            }                                                           \
70
25.8k
            p++;                                                        \
71
19.4k
            cur = (const mbedtls_oid_descriptor_t *) p;                 \
72
19.4k
        }                                                               \
73
6.39k
        return NULL;                                                 \
74
6.39k
    }
Unexecuted instantiation: oid.c:oid_cipher_alg_from_asn1
Unexecuted instantiation: oid.c:oid_md_alg_from_asn1
Unexecuted instantiation: oid.c:oid_md_hmac_from_asn1
Unexecuted instantiation: oid.c:oid_pkcs12_pbe_alg_from_asn1
75
76
#if !defined(MBEDTLS_X509_REMOVE_INFO)
77
/*
78
 * Macro to generate a function for retrieving a single attribute from the
79
 * descriptor of an mbedtls_oid_descriptor_t wrapper.
80
 */
81
#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
82
    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1)                  \
83
0
    {                                                                       \
84
0
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
85
0
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
86
0
        *ATTR1 = data->descriptor.ATTR1;                                    \
87
0
        return 0;                                                        \
88
0
    }
89
#endif /* MBEDTLS_X509_REMOVE_INFO */
90
91
/*
92
 * Macro to generate a function for retrieving a single attribute from an
93
 * mbedtls_oid_descriptor_t wrapper.
94
 */
95
#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
96
    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1)                  \
97
106k
    {                                                                       \
98
106k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
99
106k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
100
106k
        *ATTR1 = data->ATTR1;                                               \
101
57.8k
        return 0;                                                        \
102
106k
    }
mbedtls_oid_get_attr_short_name
Line
Count
Source
97
302
    {                                                                       \
98
302
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
99
302
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
100
302
        *ATTR1 = data->ATTR1;                                               \
101
234
        return 0;                                                        \
102
302
    }
mbedtls_oid_get_x509_ext_type
Line
Count
Source
97
72.3k
    {                                                                       \
98
72.3k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
99
72.3k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
100
72.3k
        *ATTR1 = data->ATTR1;                                               \
101
24.0k
        return 0;                                                        \
102
72.3k
    }
Unexecuted instantiation: mbedtls_oid_get_extended_key_usage
Unexecuted instantiation: mbedtls_oid_get_certificate_policies
mbedtls_oid_get_pk_alg
Line
Count
Source
97
27.2k
    {                                                                       \
98
27.2k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
99
27.2k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
100
27.2k
        *ATTR1 = data->ATTR1;                                               \
101
27.2k
        return 0;                                                        \
102
27.2k
    }
mbedtls_oid_get_ec_grp
Line
Count
Source
97
6.39k
    {                                                                       \
98
6.39k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
99
6.39k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
100
6.39k
        *ATTR1 = data->ATTR1;                                               \
101
6.37k
        return 0;                                                        \
102
6.39k
    }
Unexecuted instantiation: mbedtls_oid_get_cipher_alg
Unexecuted instantiation: mbedtls_oid_get_md_alg
Unexecuted instantiation: mbedtls_oid_get_md_hmac
103
104
/*
105
 * Macro to generate a function for retrieving two attributes from an
106
 * mbedtls_oid_descriptor_t wrapper.
107
 */
108
#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1,     \
109
                         ATTR2_TYPE, ATTR2)                                 \
110
    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1,               \
111
                ATTR2_TYPE * ATTR2)              \
112
38.5k
    {                                                                           \
113
38.5k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);            \
114
38.5k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;                 \
115
38.5k
        *(ATTR1) = data->ATTR1;                                                 \
116
28.9k
        *(ATTR2) = data->ATTR2;                                                 \
117
28.9k
        return 0;                                                            \
118
38.5k
    }
mbedtls_oid_get_sig_alg
Line
Count
Source
112
38.5k
    {                                                                           \
113
38.5k
        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);            \
114
38.5k
        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;                 \
115
38.5k
        *(ATTR1) = data->ATTR1;                                                 \
116
28.9k
        *(ATTR2) = data->ATTR2;                                                 \
117
28.9k
        return 0;                                                            \
118
38.5k
    }
Unexecuted instantiation: mbedtls_oid_get_pkcs12_pbe_alg
119
120
/*
121
 * Macro to generate a function for retrieving the OID based on a single
122
 * attribute from a mbedtls_oid_descriptor_t wrapper.
123
 */
124
#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1)   \
125
    int FN_NAME(ATTR1_TYPE ATTR1, const char **oid, size_t *olen)             \
126
2.50k
    {                                                                           \
127
2.50k
        const TYPE_T *cur = (LIST);                                             \
128
11.9k
        while (cur->descriptor.asn1 != NULL) {                                 \
129
11.9k
            if (cur->ATTR1 == (ATTR1)) {                                       \
130
2.50k
                *oid = cur->descriptor.asn1;                                    \
131
2.50k
                *olen = cur->descriptor.asn1_len;                               \
132
2.50k
                return 0;                                                    \
133
2.50k
            }                                                                   \
134
11.9k
            cur++;                                                              \
135
9.46k
        }                                                                       \
136
2.50k
        return MBEDTLS_ERR_OID_NOT_FOUND;                                    \
137
2.50k
    }
Unexecuted instantiation: mbedtls_oid_get_oid_by_pk_alg
Unexecuted instantiation: mbedtls_oid_get_oid_by_ec_grp
mbedtls_oid_get_oid_by_md
Line
Count
Source
126
2.50k
    {                                                                           \
127
2.50k
        const TYPE_T *cur = (LIST);                                             \
128
11.9k
        while (cur->descriptor.asn1 != NULL) {                                 \
129
11.9k
            if (cur->ATTR1 == (ATTR1)) {                                       \
130
2.50k
                *oid = cur->descriptor.asn1;                                    \
131
2.50k
                *olen = cur->descriptor.asn1_len;                               \
132
2.50k
                return 0;                                                    \
133
2.50k
            }                                                                   \
134
11.9k
            cur++;                                                              \
135
9.46k
        }                                                                       \
136
2.50k
        return MBEDTLS_ERR_OID_NOT_FOUND;                                    \
137
2.50k
    }
138
139
/*
140
 * Macro to generate a function for retrieving the OID based on two
141
 * attributes from a mbedtls_oid_descriptor_t wrapper.
142
 */
143
#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1,   \
144
                                ATTR2_TYPE, ATTR2)                          \
145
    int FN_NAME(ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid,         \
146
                size_t *olen)                                                 \
147
0
    {                                                                           \
148
0
        const TYPE_T *cur = (LIST);                                             \
149
0
        while (cur->descriptor.asn1 != NULL) {                                 \
150
0
            if (cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2)) {              \
151
0
                *oid = cur->descriptor.asn1;                                    \
152
0
                *olen = cur->descriptor.asn1_len;                               \
153
0
                return 0;                                                    \
154
0
            }                                                                   \
155
0
            cur++;                                                              \
156
0
        }                                                                       \
157
0
        return MBEDTLS_ERR_OID_NOT_FOUND;                                   \
158
0
    }
159
160
/*
161
 * For X520 attribute types
162
 */
163
typedef struct {
164
    mbedtls_oid_descriptor_t    descriptor;
165
    const char          *short_name;
166
} oid_x520_attr_t;
167
168
static const oid_x520_attr_t oid_x520_attr_type[] =
169
{
170
    {
171
        OID_DESCRIPTOR(MBEDTLS_OID_AT_CN,          "id-at-commonName",               "Common Name"),
172
        "CN",
173
    },
174
    {
175
        OID_DESCRIPTOR(MBEDTLS_OID_AT_COUNTRY,     "id-at-countryName",              "Country"),
176
        "C",
177
    },
178
    {
179
        OID_DESCRIPTOR(MBEDTLS_OID_AT_LOCALITY,    "id-at-locality",                 "Locality"),
180
        "L",
181
    },
182
    {
183
        OID_DESCRIPTOR(MBEDTLS_OID_AT_STATE,       "id-at-state",                    "State"),
184
        "ST",
185
    },
186
    {
187
        OID_DESCRIPTOR(MBEDTLS_OID_AT_ORGANIZATION, "id-at-organizationName",
188
                       "Organization"),
189
        "O",
190
    },
191
    {
192
        OID_DESCRIPTOR(MBEDTLS_OID_AT_ORG_UNIT,    "id-at-organizationalUnitName",   "Org Unit"),
193
        "OU",
194
    },
195
    {
196
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS9_EMAIL,
197
                       "emailAddress",
198
                       "E-mail address"),
199
        "emailAddress",
200
    },
201
    {
202
        OID_DESCRIPTOR(MBEDTLS_OID_AT_SERIAL_NUMBER,
203
                       "id-at-serialNumber",
204
                       "Serial number"),
205
        "serialNumber",
206
    },
207
    {
208
        OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_ADDRESS,
209
                       "id-at-postalAddress",
210
                       "Postal address"),
211
        "postalAddress",
212
    },
213
    {
214
        OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_CODE, "id-at-postalCode",               "Postal code"),
215
        "postalCode",
216
    },
217
    {
218
        OID_DESCRIPTOR(MBEDTLS_OID_AT_SUR_NAME,    "id-at-surName",                  "Surname"),
219
        "SN",
220
    },
221
    {
222
        OID_DESCRIPTOR(MBEDTLS_OID_AT_GIVEN_NAME,  "id-at-givenName",                "Given name"),
223
        "GN",
224
    },
225
    {
226
        OID_DESCRIPTOR(MBEDTLS_OID_AT_INITIALS,    "id-at-initials",                 "Initials"),
227
        "initials",
228
    },
229
    {
230
        OID_DESCRIPTOR(MBEDTLS_OID_AT_GENERATION_QUALIFIER,
231
                       "id-at-generationQualifier",
232
                       "Generation qualifier"),
233
        "generationQualifier",
234
    },
235
    {
236
        OID_DESCRIPTOR(MBEDTLS_OID_AT_TITLE,       "id-at-title",                    "Title"),
237
        "title",
238
    },
239
    {
240
        OID_DESCRIPTOR(MBEDTLS_OID_AT_DN_QUALIFIER,
241
                       "id-at-dnQualifier",
242
                       "Distinguished Name qualifier"),
243
        "dnQualifier",
244
    },
245
    {
246
        OID_DESCRIPTOR(MBEDTLS_OID_AT_PSEUDONYM,   "id-at-pseudonym",                "Pseudonym"),
247
        "pseudonym",
248
    },
249
    {
250
        OID_DESCRIPTOR(MBEDTLS_OID_UID,            "id-uid",                         "User Id"),
251
        "uid",
252
    },
253
    {
254
        OID_DESCRIPTOR(MBEDTLS_OID_DOMAIN_COMPONENT,
255
                       "id-domainComponent",
256
                       "Domain component"),
257
        "DC",
258
    },
259
    {
260
        OID_DESCRIPTOR(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER,
261
                       "id-at-uniqueIdentifier",
262
                       "Unique Identifier"),
263
        "uniqueIdentifier",
264
    },
265
    {
266
        NULL_OID_DESCRIPTOR,
267
        NULL,
268
    }
269
};
270
271
FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
272
FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name,
273
                 oid_x520_attr_t,
274
                 x520_attr,
275
                 const char *,
276
                 short_name)
277
278
/*
279
 * For X509 extensions
280
 */
281
typedef struct {
282
    mbedtls_oid_descriptor_t    descriptor;
283
    int                 ext_type;
284
} oid_x509_ext_t;
285
286
static const oid_x509_ext_t oid_x509_ext[] =
287
{
288
    {
289
        OID_DESCRIPTOR(MBEDTLS_OID_BASIC_CONSTRAINTS,
290
                       "id-ce-basicConstraints",
291
                       "Basic Constraints"),
292
        MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS,
293
    },
294
    {
295
        OID_DESCRIPTOR(MBEDTLS_OID_KEY_USAGE,            "id-ce-keyUsage",            "Key Usage"),
296
        MBEDTLS_OID_X509_EXT_KEY_USAGE,
297
    },
298
    {
299
        OID_DESCRIPTOR(MBEDTLS_OID_EXTENDED_KEY_USAGE,
300
                       "id-ce-extKeyUsage",
301
                       "Extended Key Usage"),
302
        MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE,
303
    },
304
    {
305
        OID_DESCRIPTOR(MBEDTLS_OID_SUBJECT_ALT_NAME,
306
                       "id-ce-subjectAltName",
307
                       "Subject Alt Name"),
308
        MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME,
309
    },
310
    {
311
        OID_DESCRIPTOR(MBEDTLS_OID_NS_CERT_TYPE,
312
                       "id-netscape-certtype",
313
                       "Netscape Certificate Type"),
314
        MBEDTLS_OID_X509_EXT_NS_CERT_TYPE,
315
    },
316
    {
317
        OID_DESCRIPTOR(MBEDTLS_OID_CERTIFICATE_POLICIES,
318
                       "id-ce-certificatePolicies",
319
                       "Certificate Policies"),
320
        MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES,
321
    },
322
    {
323
        NULL_OID_DESCRIPTOR,
324
        0,
325
    },
326
};
327
328
FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
329
FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)
330
331
#if !defined(MBEDTLS_X509_REMOVE_INFO)
332
static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
333
{
334
    OID_DESCRIPTOR(MBEDTLS_OID_SERVER_AUTH,
335
                   "id-kp-serverAuth",
336
                   "TLS Web Server Authentication"),
337
    OID_DESCRIPTOR(MBEDTLS_OID_CLIENT_AUTH,
338
                   "id-kp-clientAuth",
339
                   "TLS Web Client Authentication"),
340
    OID_DESCRIPTOR(MBEDTLS_OID_CODE_SIGNING,     "id-kp-codeSigning",     "Code Signing"),
341
    OID_DESCRIPTOR(MBEDTLS_OID_EMAIL_PROTECTION, "id-kp-emailProtection", "E-mail Protection"),
342
    OID_DESCRIPTOR(MBEDTLS_OID_TIME_STAMPING,    "id-kp-timeStamping",    "Time Stamping"),
343
    OID_DESCRIPTOR(MBEDTLS_OID_OCSP_SIGNING,     "id-kp-OCSPSigning",     "OCSP Signing"),
344
    OID_DESCRIPTOR(MBEDTLS_OID_WISUN_FAN,
345
                   "id-kp-wisun-fan-device",
346
                   "Wi-SUN Alliance Field Area Network (FAN)"),
347
    NULL_OID_DESCRIPTOR,
348
};
349
350
FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
351
FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage,
352
                 mbedtls_oid_descriptor_t,
353
                 ext_key_usage,
354
                 const char *,
355
                 description)
356
357
static const mbedtls_oid_descriptor_t oid_certificate_policies[] =
358
{
359
    OID_DESCRIPTOR(MBEDTLS_OID_ANY_POLICY,      "anyPolicy",       "Any Policy"),
360
    NULL_OID_DESCRIPTOR,
361
};
362
363
FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies)
364
FN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies,
365
                 mbedtls_oid_descriptor_t,
366
                 certificate_policies,
367
                 const char *,
368
                 description)
369
#endif /* MBEDTLS_X509_REMOVE_INFO */
370
371
/*
372
 * For SignatureAlgorithmIdentifier
373
 */
374
typedef struct {
375
    mbedtls_oid_descriptor_t    descriptor;
376
    mbedtls_md_type_t           md_alg;
377
    mbedtls_pk_type_t           pk_alg;
378
} oid_sig_alg_t;
379
380
static const oid_sig_alg_t oid_sig_alg[] =
381
{
382
#if defined(MBEDTLS_RSA_C)
383
#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
384
    {
385
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_MD5,        "md5WithRSAEncryption",     "RSA with MD5"),
386
        MBEDTLS_MD_MD5,      MBEDTLS_PK_RSA,
387
    },
388
#endif /* MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA */
389
#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
390
    {
391
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA1,       "sha-1WithRSAEncryption",   "RSA with SHA1"),
392
        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,
393
    },
394
#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
395
#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
396
    {
397
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA224,     "sha224WithRSAEncryption",
398
                       "RSA with SHA-224"),
399
        MBEDTLS_MD_SHA224,   MBEDTLS_PK_RSA,
400
    },
401
#endif /* MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA */
402
#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
403
    {
404
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA256,     "sha256WithRSAEncryption",
405
                       "RSA with SHA-256"),
406
        MBEDTLS_MD_SHA256,   MBEDTLS_PK_RSA,
407
    },
408
#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
409
#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
410
    {
411
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA384,     "sha384WithRSAEncryption",
412
                       "RSA with SHA-384"),
413
        MBEDTLS_MD_SHA384,   MBEDTLS_PK_RSA,
414
    },
415
#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
416
#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
417
    {
418
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA512,     "sha512WithRSAEncryption",
419
                       "RSA with SHA-512"),
420
        MBEDTLS_MD_SHA512,   MBEDTLS_PK_RSA,
421
    },
422
#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
423
#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
424
    {
425
        OID_DESCRIPTOR(MBEDTLS_OID_RSA_SHA_OBS,      "sha-1WithRSAEncryption",   "RSA with SHA1"),
426
        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,
427
    },
428
#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
429
#endif /* MBEDTLS_RSA_C */
430
#if defined(MBEDTLS_ECDSA_C)
431
#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
432
    {
433
        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA1,       "ecdsa-with-SHA1",      "ECDSA with SHA1"),
434
        MBEDTLS_MD_SHA1,     MBEDTLS_PK_ECDSA,
435
    },
436
#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
437
#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
438
    {
439
        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA224,     "ecdsa-with-SHA224",    "ECDSA with SHA224"),
440
        MBEDTLS_MD_SHA224,   MBEDTLS_PK_ECDSA,
441
    },
442
#endif
443
#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
444
    {
445
        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA256,     "ecdsa-with-SHA256",    "ECDSA with SHA256"),
446
        MBEDTLS_MD_SHA256,   MBEDTLS_PK_ECDSA,
447
    },
448
#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
449
#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
450
    {
451
        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA384,     "ecdsa-with-SHA384",    "ECDSA with SHA384"),
452
        MBEDTLS_MD_SHA384,   MBEDTLS_PK_ECDSA,
453
    },
454
#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
455
#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
456
    {
457
        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA512,     "ecdsa-with-SHA512",    "ECDSA with SHA512"),
458
        MBEDTLS_MD_SHA512,   MBEDTLS_PK_ECDSA,
459
    },
460
#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
461
#endif /* MBEDTLS_ECDSA_C */
462
#if defined(MBEDTLS_RSA_C)
463
    {
464
        OID_DESCRIPTOR(MBEDTLS_OID_RSASSA_PSS,        "RSASSA-PSS",           "RSASSA-PSS"),
465
        MBEDTLS_MD_NONE,     MBEDTLS_PK_RSASSA_PSS,
466
    },
467
#endif /* MBEDTLS_RSA_C */
468
    {
469
        NULL_OID_DESCRIPTOR,
470
        MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
471
    },
472
};
473
474
FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
475
476
#if !defined(MBEDTLS_X509_REMOVE_INFO)
477
FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc,
478
                            oid_sig_alg_t,
479
                            sig_alg,
480
                            const char *,
481
                            description)
482
#endif
483
484
FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg,
485
                 oid_sig_alg_t,
486
                 sig_alg,
487
                 mbedtls_md_type_t,
488
                 md_alg,
489
                 mbedtls_pk_type_t,
490
                 pk_alg)
491
FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg,
492
                        oid_sig_alg_t,
493
                        oid_sig_alg,
494
                        mbedtls_pk_type_t,
495
                        pk_alg,
496
                        mbedtls_md_type_t,
497
                        md_alg)
498
499
/*
500
 * For PublicKeyInfo (PKCS1, RFC 5480)
501
 */
502
typedef struct {
503
    mbedtls_oid_descriptor_t    descriptor;
504
    mbedtls_pk_type_t           pk_alg;
505
} oid_pk_alg_t;
506
507
static const oid_pk_alg_t oid_pk_alg[] =
508
{
509
    {
510
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_RSA,           "rsaEncryption",    "RSA"),
511
        MBEDTLS_PK_RSA,
512
    },
513
    {
514
        OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_UNRESTRICTED, "id-ecPublicKey",   "Generic EC key"),
515
        MBEDTLS_PK_ECKEY,
516
    },
517
    {
518
        OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_ECDH,         "id-ecDH",          "EC key for ECDH"),
519
        MBEDTLS_PK_ECKEY_DH,
520
    },
521
    {
522
        NULL_OID_DESCRIPTOR,
523
        MBEDTLS_PK_NONE,
524
    },
525
};
526
527
FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)
528
FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
529
FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg,
530
                        oid_pk_alg_t,
531
                        oid_pk_alg,
532
                        mbedtls_pk_type_t,
533
                        pk_alg)
534
535
#if defined(MBEDTLS_ECP_C)
536
/*
537
 * For namedCurve (RFC 5480)
538
 */
539
typedef struct {
540
    mbedtls_oid_descriptor_t    descriptor;
541
    mbedtls_ecp_group_id        grp_id;
542
} oid_ecp_grp_t;
543
544
static const oid_ecp_grp_t oid_ecp_grp[] =
545
{
546
#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
547
    {
548
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192R1, "secp192r1",    "secp192r1"),
549
        MBEDTLS_ECP_DP_SECP192R1,
550
    },
551
#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
552
#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
553
    {
554
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224R1, "secp224r1",    "secp224r1"),
555
        MBEDTLS_ECP_DP_SECP224R1,
556
    },
557
#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
558
#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
559
    {
560
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256R1, "secp256r1",    "secp256r1"),
561
        MBEDTLS_ECP_DP_SECP256R1,
562
    },
563
#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
564
#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
565
    {
566
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP384R1, "secp384r1",    "secp384r1"),
567
        MBEDTLS_ECP_DP_SECP384R1,
568
    },
569
#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
570
#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
571
    {
572
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP521R1, "secp521r1",    "secp521r1"),
573
        MBEDTLS_ECP_DP_SECP521R1,
574
    },
575
#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
576
#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
577
    {
578
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192K1, "secp192k1",    "secp192k1"),
579
        MBEDTLS_ECP_DP_SECP192K1,
580
    },
581
#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
582
#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
583
    {
584
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224K1, "secp224k1",    "secp224k1"),
585
        MBEDTLS_ECP_DP_SECP224K1,
586
    },
587
#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
588
#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
589
    {
590
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256K1, "secp256k1",    "secp256k1"),
591
        MBEDTLS_ECP_DP_SECP256K1,
592
    },
593
#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
594
#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
595
    {
596
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP256R1,   "brainpoolP256r1", "brainpool256r1"),
597
        MBEDTLS_ECP_DP_BP256R1,
598
    },
599
#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
600
#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
601
    {
602
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP384R1,   "brainpoolP384r1", "brainpool384r1"),
603
        MBEDTLS_ECP_DP_BP384R1,
604
    },
605
#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
606
#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
607
    {
608
        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP512R1,   "brainpoolP512r1", "brainpool512r1"),
609
        MBEDTLS_ECP_DP_BP512R1,
610
    },
611
#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
612
    {
613
        NULL_OID_DESCRIPTOR,
614
        MBEDTLS_ECP_DP_NONE,
615
    },
616
};
617
618
FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
619
FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
620
FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp,
621
                        oid_ecp_grp_t,
622
                        oid_ecp_grp,
623
                        mbedtls_ecp_group_id,
624
                        grp_id)
625
#endif /* MBEDTLS_ECP_C */
626
627
#if defined(MBEDTLS_CIPHER_C)
628
/*
629
 * For PKCS#5 PBES2 encryption algorithm
630
 */
631
typedef struct {
632
    mbedtls_oid_descriptor_t    descriptor;
633
    mbedtls_cipher_type_t       cipher_alg;
634
} oid_cipher_alg_t;
635
636
static const oid_cipher_alg_t oid_cipher_alg[] =
637
{
638
    {
639
        OID_DESCRIPTOR(MBEDTLS_OID_DES_CBC,              "desCBC",       "DES-CBC"),
640
        MBEDTLS_CIPHER_DES_CBC,
641
    },
642
    {
643
        OID_DESCRIPTOR(MBEDTLS_OID_DES_EDE3_CBC,         "des-ede3-cbc", "DES-EDE3-CBC"),
644
        MBEDTLS_CIPHER_DES_EDE3_CBC,
645
    },
646
    {
647
        NULL_OID_DESCRIPTOR,
648
        MBEDTLS_CIPHER_NONE,
649
    },
650
};
651
652
FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
653
FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg,
654
                 oid_cipher_alg_t,
655
                 cipher_alg,
656
                 mbedtls_cipher_type_t,
657
                 cipher_alg)
658
#endif /* MBEDTLS_CIPHER_C */
659
660
/*
661
 * For digestAlgorithm
662
 */
663
typedef struct {
664
    mbedtls_oid_descriptor_t    descriptor;
665
    mbedtls_md_type_t           md_alg;
666
} oid_md_alg_t;
667
668
static const oid_md_alg_t oid_md_alg[] =
669
{
670
#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
671
    {
672
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_MD5,       "id-md5",       "MD5"),
673
        MBEDTLS_MD_MD5,
674
    },
675
#endif
676
#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
677
    {
678
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA1,      "id-sha1",      "SHA-1"),
679
        MBEDTLS_MD_SHA1,
680
    },
681
#endif
682
#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
683
    {
684
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA224,    "id-sha224",    "SHA-224"),
685
        MBEDTLS_MD_SHA224,
686
    },
687
#endif
688
#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
689
    {
690
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA256,    "id-sha256",    "SHA-256"),
691
        MBEDTLS_MD_SHA256,
692
    },
693
#endif
694
#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
695
    {
696
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA384,    "id-sha384",    "SHA-384"),
697
        MBEDTLS_MD_SHA384,
698
    },
699
#endif
700
#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
701
    {
702
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA512,    "id-sha512",    "SHA-512"),
703
        MBEDTLS_MD_SHA512,
704
    },
705
#endif
706
#if defined(MBEDTLS_HAS_ALG_RIPEMD160_VIA_LOWLEVEL_OR_PSA)
707
    {
708
        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_RIPEMD160, "id-ripemd160", "RIPEMD-160"),
709
        MBEDTLS_MD_RIPEMD160,
710
    },
711
#endif
712
    {
713
        NULL_OID_DESCRIPTOR,
714
        MBEDTLS_MD_NONE,
715
    },
716
};
717
718
FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
719
FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
720
FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md,
721
                        oid_md_alg_t,
722
                        oid_md_alg,
723
                        mbedtls_md_type_t,
724
                        md_alg)
725
726
/*
727
 * For HMAC digestAlgorithm
728
 */
729
typedef struct {
730
    mbedtls_oid_descriptor_t    descriptor;
731
    mbedtls_md_type_t           md_hmac;
732
} oid_md_hmac_t;
733
734
static const oid_md_hmac_t oid_md_hmac[] =
735
{
736
#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
737
    {
738
        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA1,      "hmacSHA1",      "HMAC-SHA-1"),
739
        MBEDTLS_MD_SHA1,
740
    },
741
#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
742
#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
743
    {
744
        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA224,    "hmacSHA224",    "HMAC-SHA-224"),
745
        MBEDTLS_MD_SHA224,
746
    },
747
#endif
748
#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
749
    {
750
        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA256,    "hmacSHA256",    "HMAC-SHA-256"),
751
        MBEDTLS_MD_SHA256,
752
    },
753
#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
754
#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
755
    {
756
        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA384,    "hmacSHA384",    "HMAC-SHA-384"),
757
        MBEDTLS_MD_SHA384,
758
    },
759
#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
760
#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
761
    {
762
        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA512,    "hmacSHA512",    "HMAC-SHA-512"),
763
        MBEDTLS_MD_SHA512,
764
    },
765
#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
766
    {
767
        NULL_OID_DESCRIPTOR,
768
        MBEDTLS_MD_NONE,
769
    },
770
};
771
772
FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac)
773
FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac)
774
775
#if defined(MBEDTLS_PKCS12_C)
776
/*
777
 * For PKCS#12 PBEs
778
 */
779
typedef struct {
780
    mbedtls_oid_descriptor_t    descriptor;
781
    mbedtls_md_type_t           md_alg;
782
    mbedtls_cipher_type_t       cipher_alg;
783
} oid_pkcs12_pbe_alg_t;
784
785
static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
786
{
787
    {
788
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC,
789
                       "pbeWithSHAAnd3-KeyTripleDES-CBC",
790
                       "PBE with SHA1 and 3-Key 3DES"),
791
        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE3_CBC,
792
    },
793
    {
794
        OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC,
795
                       "pbeWithSHAAnd2-KeyTripleDES-CBC",
796
                       "PBE with SHA1 and 2-Key 3DES"),
797
        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE_CBC,
798
    },
799
    {
800
        NULL_OID_DESCRIPTOR,
801
        MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
802
    },
803
};
804
805
FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
806
FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg,
807
                 oid_pkcs12_pbe_alg_t,
808
                 pkcs12_pbe_alg,
809
                 mbedtls_md_type_t,
810
                 md_alg,
811
                 mbedtls_cipher_type_t,
812
                 cipher_alg)
813
#endif /* MBEDTLS_PKCS12_C */
814
815
#define OID_SAFE_SNPRINTF                               \
816
0
    do {                                                \
817
0
        if (ret < 0 || (size_t) ret >= n)              \
818
0
        return MBEDTLS_ERR_OID_BUF_TOO_SMALL;    \
819
0
                                                      \
820
0
        n -= (size_t) ret;                              \
821
0
        p += (size_t) ret;                              \
822
0
    } while (0)
823
824
/* Return the x.y.z.... style numeric string for the given OID */
825
int mbedtls_oid_get_numeric_string(char *buf, size_t size,
826
                                   const mbedtls_asn1_buf *oid)
827
0
{
828
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
829
0
    size_t i, n;
830
0
    unsigned int value;
831
0
    char *p;
832
833
0
    p = buf;
834
0
    n = size;
835
836
    /* First byte contains first two dots */
837
0
    if (oid->len > 0) {
838
0
        ret = mbedtls_snprintf(p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40);
839
0
        OID_SAFE_SNPRINTF;
840
0
    }
841
842
0
    value = 0;
843
0
    for (i = 1; i < oid->len; i++) {
844
        /* Prevent overflow in value. */
845
0
        if (((value << 7) >> 7) != value) {
846
0
            return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
847
0
        }
848
849
0
        value <<= 7;
850
0
        value += oid->p[i] & 0x7F;
851
852
0
        if (!(oid->p[i] & 0x80)) {
853
            /* Last byte */
854
0
            ret = mbedtls_snprintf(p, n, ".%u", value);
855
0
            OID_SAFE_SNPRINTF;
856
0
            value = 0;
857
0
        }
858
0
    }
859
860
0
    return (int) (size - n);
861
0
}
862
863
#endif /* MBEDTLS_OID_C */