1a8e1175bSopenharmony_ci/**
2a8e1175bSopenharmony_ci * \file oid.c
3a8e1175bSopenharmony_ci *
4a8e1175bSopenharmony_ci * \brief Object Identifier (OID) database
5a8e1175bSopenharmony_ci *
6a8e1175bSopenharmony_ci *  Copyright The Mbed TLS Contributors
7a8e1175bSopenharmony_ci *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
8a8e1175bSopenharmony_ci */
9a8e1175bSopenharmony_ci
10a8e1175bSopenharmony_ci#include "common.h"
11a8e1175bSopenharmony_ci
12a8e1175bSopenharmony_ci#if defined(MBEDTLS_OID_C)
13a8e1175bSopenharmony_ci
14a8e1175bSopenharmony_ci#include "mbedtls/oid.h"
15a8e1175bSopenharmony_ci#include "mbedtls/rsa.h"
16a8e1175bSopenharmony_ci#include "mbedtls/error.h"
17a8e1175bSopenharmony_ci#include "mbedtls/pk.h"
18a8e1175bSopenharmony_ci
19a8e1175bSopenharmony_ci#include <stdio.h>
20a8e1175bSopenharmony_ci#include <string.h>
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ci#include "mbedtls/platform.h"
23a8e1175bSopenharmony_ci
24a8e1175bSopenharmony_ci/*
25a8e1175bSopenharmony_ci * Macro to automatically add the size of #define'd OIDs
26a8e1175bSopenharmony_ci */
27a8e1175bSopenharmony_ci#define ADD_LEN(s)      s, MBEDTLS_OID_SIZE(s)
28a8e1175bSopenharmony_ci
29a8e1175bSopenharmony_ci/*
30a8e1175bSopenharmony_ci * Macro to generate mbedtls_oid_descriptor_t
31a8e1175bSopenharmony_ci */
32a8e1175bSopenharmony_ci#if !defined(MBEDTLS_X509_REMOVE_INFO)
33a8e1175bSopenharmony_ci#define OID_DESCRIPTOR(s, name, description)  { ADD_LEN(s), name, description }
34a8e1175bSopenharmony_ci#define NULL_OID_DESCRIPTOR                   { NULL, 0, NULL, NULL }
35a8e1175bSopenharmony_ci#else
36a8e1175bSopenharmony_ci#define OID_DESCRIPTOR(s, name, description)  { ADD_LEN(s) }
37a8e1175bSopenharmony_ci#define NULL_OID_DESCRIPTOR                   { NULL, 0 }
38a8e1175bSopenharmony_ci#endif
39a8e1175bSopenharmony_ci
40a8e1175bSopenharmony_ci/*
41a8e1175bSopenharmony_ci * Macro to generate an internal function for oid_XXX_from_asn1() (used by
42a8e1175bSopenharmony_ci * the other functions)
43a8e1175bSopenharmony_ci */
44a8e1175bSopenharmony_ci#define FN_OID_TYPED_FROM_ASN1(TYPE_T, NAME, LIST)                    \
45a8e1175bSopenharmony_ci    static const TYPE_T *oid_ ## NAME ## _from_asn1(                   \
46a8e1175bSopenharmony_ci        const mbedtls_asn1_buf *oid)     \
47a8e1175bSopenharmony_ci    {                                                                   \
48a8e1175bSopenharmony_ci        const TYPE_T *p = (LIST);                                       \
49a8e1175bSopenharmony_ci        const mbedtls_oid_descriptor_t *cur =                           \
50a8e1175bSopenharmony_ci            (const mbedtls_oid_descriptor_t *) p;                       \
51a8e1175bSopenharmony_ci        if (p == NULL || oid == NULL) return NULL;                  \
52a8e1175bSopenharmony_ci        while (cur->asn1 != NULL) {                                    \
53a8e1175bSopenharmony_ci            if (cur->asn1_len == oid->len &&                            \
54a8e1175bSopenharmony_ci                memcmp(cur->asn1, oid->p, oid->len) == 0) {          \
55a8e1175bSopenharmony_ci                return p;                                            \
56a8e1175bSopenharmony_ci            }                                                           \
57a8e1175bSopenharmony_ci            p++;                                                        \
58a8e1175bSopenharmony_ci            cur = (const mbedtls_oid_descriptor_t *) p;                 \
59a8e1175bSopenharmony_ci        }                                                               \
60a8e1175bSopenharmony_ci        return NULL;                                                 \
61a8e1175bSopenharmony_ci    }
62a8e1175bSopenharmony_ci
63a8e1175bSopenharmony_ci#if !defined(MBEDTLS_X509_REMOVE_INFO)
64a8e1175bSopenharmony_ci/*
65a8e1175bSopenharmony_ci * Macro to generate a function for retrieving a single attribute from the
66a8e1175bSopenharmony_ci * descriptor of an mbedtls_oid_descriptor_t wrapper.
67a8e1175bSopenharmony_ci */
68a8e1175bSopenharmony_ci#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
69a8e1175bSopenharmony_ci    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1)                  \
70a8e1175bSopenharmony_ci    {                                                                       \
71a8e1175bSopenharmony_ci        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
72a8e1175bSopenharmony_ci        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
73a8e1175bSopenharmony_ci        *ATTR1 = data->descriptor.ATTR1;                                    \
74a8e1175bSopenharmony_ci        return 0;                                                        \
75a8e1175bSopenharmony_ci    }
76a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_REMOVE_INFO */
77a8e1175bSopenharmony_ci
78a8e1175bSopenharmony_ci/*
79a8e1175bSopenharmony_ci * Macro to generate a function for retrieving a single attribute from an
80a8e1175bSopenharmony_ci * mbedtls_oid_descriptor_t wrapper.
81a8e1175bSopenharmony_ci */
82a8e1175bSopenharmony_ci#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
83a8e1175bSopenharmony_ci    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1)                  \
84a8e1175bSopenharmony_ci    {                                                                       \
85a8e1175bSopenharmony_ci        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);        \
86a8e1175bSopenharmony_ci        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;            \
87a8e1175bSopenharmony_ci        *ATTR1 = data->ATTR1;                                               \
88a8e1175bSopenharmony_ci        return 0;                                                        \
89a8e1175bSopenharmony_ci    }
90a8e1175bSopenharmony_ci
91a8e1175bSopenharmony_ci/*
92a8e1175bSopenharmony_ci * Macro to generate a function for retrieving two attributes from an
93a8e1175bSopenharmony_ci * mbedtls_oid_descriptor_t wrapper.
94a8e1175bSopenharmony_ci */
95a8e1175bSopenharmony_ci#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1,     \
96a8e1175bSopenharmony_ci                         ATTR2_TYPE, ATTR2)                                 \
97a8e1175bSopenharmony_ci    int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1,               \
98a8e1175bSopenharmony_ci                ATTR2_TYPE * ATTR2)              \
99a8e1175bSopenharmony_ci    {                                                                           \
100a8e1175bSopenharmony_ci        const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid);            \
101a8e1175bSopenharmony_ci        if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND;                 \
102a8e1175bSopenharmony_ci        *(ATTR1) = data->ATTR1;                                                 \
103a8e1175bSopenharmony_ci        *(ATTR2) = data->ATTR2;                                                 \
104a8e1175bSopenharmony_ci        return 0;                                                            \
105a8e1175bSopenharmony_ci    }
106a8e1175bSopenharmony_ci
107a8e1175bSopenharmony_ci/*
108a8e1175bSopenharmony_ci * Macro to generate a function for retrieving the OID based on a single
109a8e1175bSopenharmony_ci * attribute from a mbedtls_oid_descriptor_t wrapper.
110a8e1175bSopenharmony_ci */
111a8e1175bSopenharmony_ci#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1)   \
112a8e1175bSopenharmony_ci    int FN_NAME(ATTR1_TYPE ATTR1, const char **oid, size_t *olen)             \
113a8e1175bSopenharmony_ci    {                                                                           \
114a8e1175bSopenharmony_ci        const TYPE_T *cur = (LIST);                                             \
115a8e1175bSopenharmony_ci        while (cur->descriptor.asn1 != NULL) {                                 \
116a8e1175bSopenharmony_ci            if (cur->ATTR1 == (ATTR1)) {                                       \
117a8e1175bSopenharmony_ci                *oid = cur->descriptor.asn1;                                    \
118a8e1175bSopenharmony_ci                *olen = cur->descriptor.asn1_len;                               \
119a8e1175bSopenharmony_ci                return 0;                                                    \
120a8e1175bSopenharmony_ci            }                                                                   \
121a8e1175bSopenharmony_ci            cur++;                                                              \
122a8e1175bSopenharmony_ci        }                                                                       \
123a8e1175bSopenharmony_ci        return MBEDTLS_ERR_OID_NOT_FOUND;                                    \
124a8e1175bSopenharmony_ci    }
125a8e1175bSopenharmony_ci
126a8e1175bSopenharmony_ci/*
127a8e1175bSopenharmony_ci * Macro to generate a function for retrieving the OID based on two
128a8e1175bSopenharmony_ci * attributes from a mbedtls_oid_descriptor_t wrapper.
129a8e1175bSopenharmony_ci */
130a8e1175bSopenharmony_ci#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1,   \
131a8e1175bSopenharmony_ci                                ATTR2_TYPE, ATTR2)                          \
132a8e1175bSopenharmony_ci    int FN_NAME(ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid,         \
133a8e1175bSopenharmony_ci                size_t *olen)                                                 \
134a8e1175bSopenharmony_ci    {                                                                           \
135a8e1175bSopenharmony_ci        const TYPE_T *cur = (LIST);                                             \
136a8e1175bSopenharmony_ci        while (cur->descriptor.asn1 != NULL) {                                 \
137a8e1175bSopenharmony_ci            if (cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2)) {              \
138a8e1175bSopenharmony_ci                *oid = cur->descriptor.asn1;                                    \
139a8e1175bSopenharmony_ci                *olen = cur->descriptor.asn1_len;                               \
140a8e1175bSopenharmony_ci                return 0;                                                    \
141a8e1175bSopenharmony_ci            }                                                                   \
142a8e1175bSopenharmony_ci            cur++;                                                              \
143a8e1175bSopenharmony_ci        }                                                                       \
144a8e1175bSopenharmony_ci        return MBEDTLS_ERR_OID_NOT_FOUND;                                   \
145a8e1175bSopenharmony_ci    }
146a8e1175bSopenharmony_ci
147a8e1175bSopenharmony_ci/*
148a8e1175bSopenharmony_ci * For X520 attribute types
149a8e1175bSopenharmony_ci */
150a8e1175bSopenharmony_citypedef struct {
151a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
152a8e1175bSopenharmony_ci    const char          *short_name;
153a8e1175bSopenharmony_ci} oid_x520_attr_t;
154a8e1175bSopenharmony_ci
155a8e1175bSopenharmony_cistatic const oid_x520_attr_t oid_x520_attr_type[] =
156a8e1175bSopenharmony_ci{
157a8e1175bSopenharmony_ci    {
158a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_CN,          "id-at-commonName",               "Common Name"),
159a8e1175bSopenharmony_ci        "CN",
160a8e1175bSopenharmony_ci    },
161a8e1175bSopenharmony_ci    {
162a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_COUNTRY,     "id-at-countryName",              "Country"),
163a8e1175bSopenharmony_ci        "C",
164a8e1175bSopenharmony_ci    },
165a8e1175bSopenharmony_ci    {
166a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_LOCALITY,    "id-at-locality",                 "Locality"),
167a8e1175bSopenharmony_ci        "L",
168a8e1175bSopenharmony_ci    },
169a8e1175bSopenharmony_ci    {
170a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_STATE,       "id-at-state",                    "State"),
171a8e1175bSopenharmony_ci        "ST",
172a8e1175bSopenharmony_ci    },
173a8e1175bSopenharmony_ci    {
174a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_ORGANIZATION, "id-at-organizationName",
175a8e1175bSopenharmony_ci                       "Organization"),
176a8e1175bSopenharmony_ci        "O",
177a8e1175bSopenharmony_ci    },
178a8e1175bSopenharmony_ci    {
179a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_ORG_UNIT,    "id-at-organizationalUnitName",   "Org Unit"),
180a8e1175bSopenharmony_ci        "OU",
181a8e1175bSopenharmony_ci    },
182a8e1175bSopenharmony_ci    {
183a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS9_EMAIL,
184a8e1175bSopenharmony_ci                       "emailAddress",
185a8e1175bSopenharmony_ci                       "E-mail address"),
186a8e1175bSopenharmony_ci        "emailAddress",
187a8e1175bSopenharmony_ci    },
188a8e1175bSopenharmony_ci    {
189a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_SERIAL_NUMBER,
190a8e1175bSopenharmony_ci                       "id-at-serialNumber",
191a8e1175bSopenharmony_ci                       "Serial number"),
192a8e1175bSopenharmony_ci        "serialNumber",
193a8e1175bSopenharmony_ci    },
194a8e1175bSopenharmony_ci    {
195a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_ADDRESS,
196a8e1175bSopenharmony_ci                       "id-at-postalAddress",
197a8e1175bSopenharmony_ci                       "Postal address"),
198a8e1175bSopenharmony_ci        "postalAddress",
199a8e1175bSopenharmony_ci    },
200a8e1175bSopenharmony_ci    {
201a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_CODE, "id-at-postalCode",               "Postal code"),
202a8e1175bSopenharmony_ci        "postalCode",
203a8e1175bSopenharmony_ci    },
204a8e1175bSopenharmony_ci    {
205a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_SUR_NAME,    "id-at-surName",                  "Surname"),
206a8e1175bSopenharmony_ci        "SN",
207a8e1175bSopenharmony_ci    },
208a8e1175bSopenharmony_ci    {
209a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_GIVEN_NAME,  "id-at-givenName",                "Given name"),
210a8e1175bSopenharmony_ci        "GN",
211a8e1175bSopenharmony_ci    },
212a8e1175bSopenharmony_ci    {
213a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_INITIALS,    "id-at-initials",                 "Initials"),
214a8e1175bSopenharmony_ci        "initials",
215a8e1175bSopenharmony_ci    },
216a8e1175bSopenharmony_ci    {
217a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_GENERATION_QUALIFIER,
218a8e1175bSopenharmony_ci                       "id-at-generationQualifier",
219a8e1175bSopenharmony_ci                       "Generation qualifier"),
220a8e1175bSopenharmony_ci        "generationQualifier",
221a8e1175bSopenharmony_ci    },
222a8e1175bSopenharmony_ci    {
223a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_TITLE,       "id-at-title",                    "Title"),
224a8e1175bSopenharmony_ci        "title",
225a8e1175bSopenharmony_ci    },
226a8e1175bSopenharmony_ci    {
227a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_DN_QUALIFIER,
228a8e1175bSopenharmony_ci                       "id-at-dnQualifier",
229a8e1175bSopenharmony_ci                       "Distinguished Name qualifier"),
230a8e1175bSopenharmony_ci        "dnQualifier",
231a8e1175bSopenharmony_ci    },
232a8e1175bSopenharmony_ci    {
233a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_PSEUDONYM,   "id-at-pseudonym",                "Pseudonym"),
234a8e1175bSopenharmony_ci        "pseudonym",
235a8e1175bSopenharmony_ci    },
236a8e1175bSopenharmony_ci    {
237a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_UID,            "id-uid",                         "User Id"),
238a8e1175bSopenharmony_ci        "uid",
239a8e1175bSopenharmony_ci    },
240a8e1175bSopenharmony_ci    {
241a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DOMAIN_COMPONENT,
242a8e1175bSopenharmony_ci                       "id-domainComponent",
243a8e1175bSopenharmony_ci                       "Domain component"),
244a8e1175bSopenharmony_ci        "DC",
245a8e1175bSopenharmony_ci    },
246a8e1175bSopenharmony_ci    {
247a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER,
248a8e1175bSopenharmony_ci                       "id-at-uniqueIdentifier",
249a8e1175bSopenharmony_ci                       "Unique Identifier"),
250a8e1175bSopenharmony_ci        "uniqueIdentifier",
251a8e1175bSopenharmony_ci    },
252a8e1175bSopenharmony_ci    {
253a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
254a8e1175bSopenharmony_ci        NULL,
255a8e1175bSopenharmony_ci    }
256a8e1175bSopenharmony_ci};
257a8e1175bSopenharmony_ci
258a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
259a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name,
260a8e1175bSopenharmony_ci                 oid_x520_attr_t,
261a8e1175bSopenharmony_ci                 x520_attr,
262a8e1175bSopenharmony_ci                 const char *,
263a8e1175bSopenharmony_ci                 short_name)
264a8e1175bSopenharmony_ci
265a8e1175bSopenharmony_ci/*
266a8e1175bSopenharmony_ci * For X509 extensions
267a8e1175bSopenharmony_ci */
268a8e1175bSopenharmony_citypedef struct {
269a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
270a8e1175bSopenharmony_ci    int                 ext_type;
271a8e1175bSopenharmony_ci} oid_x509_ext_t;
272a8e1175bSopenharmony_ci
273a8e1175bSopenharmony_cistatic const oid_x509_ext_t oid_x509_ext[] =
274a8e1175bSopenharmony_ci{
275a8e1175bSopenharmony_ci    {
276a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_BASIC_CONSTRAINTS,
277a8e1175bSopenharmony_ci                       "id-ce-basicConstraints",
278a8e1175bSopenharmony_ci                       "Basic Constraints"),
279a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS,
280a8e1175bSopenharmony_ci    },
281a8e1175bSopenharmony_ci    {
282a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_KEY_USAGE,            "id-ce-keyUsage",            "Key Usage"),
283a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_KEY_USAGE,
284a8e1175bSopenharmony_ci    },
285a8e1175bSopenharmony_ci    {
286a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EXTENDED_KEY_USAGE,
287a8e1175bSopenharmony_ci                       "id-ce-extKeyUsage",
288a8e1175bSopenharmony_ci                       "Extended Key Usage"),
289a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE,
290a8e1175bSopenharmony_ci    },
291a8e1175bSopenharmony_ci    {
292a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_SUBJECT_ALT_NAME,
293a8e1175bSopenharmony_ci                       "id-ce-subjectAltName",
294a8e1175bSopenharmony_ci                       "Subject Alt Name"),
295a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME,
296a8e1175bSopenharmony_ci    },
297a8e1175bSopenharmony_ci    {
298a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_NS_CERT_TYPE,
299a8e1175bSopenharmony_ci                       "id-netscape-certtype",
300a8e1175bSopenharmony_ci                       "Netscape Certificate Type"),
301a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_NS_CERT_TYPE,
302a8e1175bSopenharmony_ci    },
303a8e1175bSopenharmony_ci    {
304a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_CERTIFICATE_POLICIES,
305a8e1175bSopenharmony_ci                       "id-ce-certificatePolicies",
306a8e1175bSopenharmony_ci                       "Certificate Policies"),
307a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES,
308a8e1175bSopenharmony_ci    },
309a8e1175bSopenharmony_ci    {
310a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER,
311a8e1175bSopenharmony_ci                       "id-ce-subjectKeyIdentifier",
312a8e1175bSopenharmony_ci                       "Subject Key Identifier"),
313a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_SUBJECT_KEY_IDENTIFIER,
314a8e1175bSopenharmony_ci    },
315a8e1175bSopenharmony_ci    {
316a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER,
317a8e1175bSopenharmony_ci                       "id-ce-authorityKeyIdentifier",
318a8e1175bSopenharmony_ci                       "Authority Key Identifier"),
319a8e1175bSopenharmony_ci        MBEDTLS_OID_X509_EXT_AUTHORITY_KEY_IDENTIFIER,
320a8e1175bSopenharmony_ci    },
321a8e1175bSopenharmony_ci    {
322a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
323a8e1175bSopenharmony_ci        0,
324a8e1175bSopenharmony_ci    },
325a8e1175bSopenharmony_ci};
326a8e1175bSopenharmony_ci
327a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
328a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)
329a8e1175bSopenharmony_ci
330a8e1175bSopenharmony_ci#if !defined(MBEDTLS_X509_REMOVE_INFO)
331a8e1175bSopenharmony_cistatic const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
332a8e1175bSopenharmony_ci{
333a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_SERVER_AUTH,
334a8e1175bSopenharmony_ci                   "id-kp-serverAuth",
335a8e1175bSopenharmony_ci                   "TLS Web Server Authentication"),
336a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_CLIENT_AUTH,
337a8e1175bSopenharmony_ci                   "id-kp-clientAuth",
338a8e1175bSopenharmony_ci                   "TLS Web Client Authentication"),
339a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_CODE_SIGNING,     "id-kp-codeSigning",     "Code Signing"),
340a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_EMAIL_PROTECTION, "id-kp-emailProtection", "E-mail Protection"),
341a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_TIME_STAMPING,    "id-kp-timeStamping",    "Time Stamping"),
342a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_OCSP_SIGNING,     "id-kp-OCSPSigning",     "OCSP Signing"),
343a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_WISUN_FAN,
344a8e1175bSopenharmony_ci                   "id-kp-wisun-fan-device",
345a8e1175bSopenharmony_ci                   "Wi-SUN Alliance Field Area Network (FAN)"),
346a8e1175bSopenharmony_ci    NULL_OID_DESCRIPTOR,
347a8e1175bSopenharmony_ci};
348a8e1175bSopenharmony_ci
349a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
350a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage,
351a8e1175bSopenharmony_ci                 mbedtls_oid_descriptor_t,
352a8e1175bSopenharmony_ci                 ext_key_usage,
353a8e1175bSopenharmony_ci                 const char *,
354a8e1175bSopenharmony_ci                 description)
355a8e1175bSopenharmony_ci
356a8e1175bSopenharmony_cistatic const mbedtls_oid_descriptor_t oid_certificate_policies[] =
357a8e1175bSopenharmony_ci{
358a8e1175bSopenharmony_ci    OID_DESCRIPTOR(MBEDTLS_OID_ANY_POLICY,      "anyPolicy",       "Any Policy"),
359a8e1175bSopenharmony_ci    NULL_OID_DESCRIPTOR,
360a8e1175bSopenharmony_ci};
361a8e1175bSopenharmony_ci
362a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies)
363a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies,
364a8e1175bSopenharmony_ci                 mbedtls_oid_descriptor_t,
365a8e1175bSopenharmony_ci                 certificate_policies,
366a8e1175bSopenharmony_ci                 const char *,
367a8e1175bSopenharmony_ci                 description)
368a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_REMOVE_INFO */
369a8e1175bSopenharmony_ci
370a8e1175bSopenharmony_ci/*
371a8e1175bSopenharmony_ci * For SignatureAlgorithmIdentifier
372a8e1175bSopenharmony_ci */
373a8e1175bSopenharmony_citypedef struct {
374a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
375a8e1175bSopenharmony_ci    mbedtls_md_type_t           md_alg;
376a8e1175bSopenharmony_ci    mbedtls_pk_type_t           pk_alg;
377a8e1175bSopenharmony_ci} oid_sig_alg_t;
378a8e1175bSopenharmony_ci
379a8e1175bSopenharmony_cistatic const oid_sig_alg_t oid_sig_alg[] =
380a8e1175bSopenharmony_ci{
381a8e1175bSopenharmony_ci#if defined(MBEDTLS_RSA_C)
382a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
383a8e1175bSopenharmony_ci    {
384a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_MD5,        "md5WithRSAEncryption",     "RSA with MD5"),
385a8e1175bSopenharmony_ci        MBEDTLS_MD_MD5,      MBEDTLS_PK_RSA,
386a8e1175bSopenharmony_ci    },
387a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_MD5 */
388a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
389a8e1175bSopenharmony_ci    {
390a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA1,       "sha-1WithRSAEncryption",   "RSA with SHA1"),
391a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,
392a8e1175bSopenharmony_ci    },
393a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA1 */
394a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
395a8e1175bSopenharmony_ci    {
396a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA224,     "sha224WithRSAEncryption",
397a8e1175bSopenharmony_ci                       "RSA with SHA-224"),
398a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA224,   MBEDTLS_PK_RSA,
399a8e1175bSopenharmony_ci    },
400a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA224 */
401a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
402a8e1175bSopenharmony_ci    {
403a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA256,     "sha256WithRSAEncryption",
404a8e1175bSopenharmony_ci                       "RSA with SHA-256"),
405a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA256,   MBEDTLS_PK_RSA,
406a8e1175bSopenharmony_ci    },
407a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA256 */
408a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
409a8e1175bSopenharmony_ci    {
410a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA384,     "sha384WithRSAEncryption",
411a8e1175bSopenharmony_ci                       "RSA with SHA-384"),
412a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA384,   MBEDTLS_PK_RSA,
413a8e1175bSopenharmony_ci    },
414a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA384 */
415a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
416a8e1175bSopenharmony_ci    {
417a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA512,     "sha512WithRSAEncryption",
418a8e1175bSopenharmony_ci                       "RSA with SHA-512"),
419a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA512,   MBEDTLS_PK_RSA,
420a8e1175bSopenharmony_ci    },
421a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA512 */
422a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
423a8e1175bSopenharmony_ci    {
424a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_RSA_SHA_OBS,      "sha-1WithRSAEncryption",   "RSA with SHA1"),
425a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,
426a8e1175bSopenharmony_ci    },
427a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA1 */
428a8e1175bSopenharmony_ci#endif /* MBEDTLS_RSA_C */
429a8e1175bSopenharmony_ci#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
430a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
431a8e1175bSopenharmony_ci    {
432a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA1,       "ecdsa-with-SHA1",      "ECDSA with SHA1"),
433a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,     MBEDTLS_PK_ECDSA,
434a8e1175bSopenharmony_ci    },
435a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA1 */
436a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
437a8e1175bSopenharmony_ci    {
438a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA224,     "ecdsa-with-SHA224",    "ECDSA with SHA224"),
439a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA224,   MBEDTLS_PK_ECDSA,
440a8e1175bSopenharmony_ci    },
441a8e1175bSopenharmony_ci#endif
442a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
443a8e1175bSopenharmony_ci    {
444a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA256,     "ecdsa-with-SHA256",    "ECDSA with SHA256"),
445a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA256,   MBEDTLS_PK_ECDSA,
446a8e1175bSopenharmony_ci    },
447a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA256 */
448a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
449a8e1175bSopenharmony_ci    {
450a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA384,     "ecdsa-with-SHA384",    "ECDSA with SHA384"),
451a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA384,   MBEDTLS_PK_ECDSA,
452a8e1175bSopenharmony_ci    },
453a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA384 */
454a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
455a8e1175bSopenharmony_ci    {
456a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA512,     "ecdsa-with-SHA512",    "ECDSA with SHA512"),
457a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA512,   MBEDTLS_PK_ECDSA,
458a8e1175bSopenharmony_ci    },
459a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA512 */
460a8e1175bSopenharmony_ci#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
461a8e1175bSopenharmony_ci#if defined(MBEDTLS_RSA_C)
462a8e1175bSopenharmony_ci    {
463a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_RSASSA_PSS,        "RSASSA-PSS",           "RSASSA-PSS"),
464a8e1175bSopenharmony_ci        MBEDTLS_MD_NONE,     MBEDTLS_PK_RSASSA_PSS,
465a8e1175bSopenharmony_ci    },
466a8e1175bSopenharmony_ci#endif /* MBEDTLS_RSA_C */
467a8e1175bSopenharmony_ci    {
468a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
469a8e1175bSopenharmony_ci        MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
470a8e1175bSopenharmony_ci    },
471a8e1175bSopenharmony_ci};
472a8e1175bSopenharmony_ci
473a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
474a8e1175bSopenharmony_ci
475a8e1175bSopenharmony_ci#if !defined(MBEDTLS_X509_REMOVE_INFO)
476a8e1175bSopenharmony_ciFN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc,
477a8e1175bSopenharmony_ci                            oid_sig_alg_t,
478a8e1175bSopenharmony_ci                            sig_alg,
479a8e1175bSopenharmony_ci                            const char *,
480a8e1175bSopenharmony_ci                            description)
481a8e1175bSopenharmony_ci#endif
482a8e1175bSopenharmony_ci
483a8e1175bSopenharmony_ciFN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg,
484a8e1175bSopenharmony_ci                 oid_sig_alg_t,
485a8e1175bSopenharmony_ci                 sig_alg,
486a8e1175bSopenharmony_ci                 mbedtls_md_type_t,
487a8e1175bSopenharmony_ci                 md_alg,
488a8e1175bSopenharmony_ci                 mbedtls_pk_type_t,
489a8e1175bSopenharmony_ci                 pk_alg)
490a8e1175bSopenharmony_ciFN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg,
491a8e1175bSopenharmony_ci                        oid_sig_alg_t,
492a8e1175bSopenharmony_ci                        oid_sig_alg,
493a8e1175bSopenharmony_ci                        mbedtls_pk_type_t,
494a8e1175bSopenharmony_ci                        pk_alg,
495a8e1175bSopenharmony_ci                        mbedtls_md_type_t,
496a8e1175bSopenharmony_ci                        md_alg)
497a8e1175bSopenharmony_ci
498a8e1175bSopenharmony_ci/*
499a8e1175bSopenharmony_ci * For PublicKeyInfo (PKCS1, RFC 5480)
500a8e1175bSopenharmony_ci */
501a8e1175bSopenharmony_citypedef struct {
502a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
503a8e1175bSopenharmony_ci    mbedtls_pk_type_t           pk_alg;
504a8e1175bSopenharmony_ci} oid_pk_alg_t;
505a8e1175bSopenharmony_ci
506a8e1175bSopenharmony_cistatic const oid_pk_alg_t oid_pk_alg[] =
507a8e1175bSopenharmony_ci{
508a8e1175bSopenharmony_ci    {
509a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_RSA,           "rsaEncryption",    "RSA"),
510a8e1175bSopenharmony_ci        MBEDTLS_PK_RSA,
511a8e1175bSopenharmony_ci    },
512a8e1175bSopenharmony_ci    {
513a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_UNRESTRICTED, "id-ecPublicKey",   "Generic EC key"),
514a8e1175bSopenharmony_ci        MBEDTLS_PK_ECKEY,
515a8e1175bSopenharmony_ci    },
516a8e1175bSopenharmony_ci    {
517a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_ECDH,         "id-ecDH",          "EC key for ECDH"),
518a8e1175bSopenharmony_ci        MBEDTLS_PK_ECKEY_DH,
519a8e1175bSopenharmony_ci    },
520a8e1175bSopenharmony_ci    {
521a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
522a8e1175bSopenharmony_ci        MBEDTLS_PK_NONE,
523a8e1175bSopenharmony_ci    },
524a8e1175bSopenharmony_ci};
525a8e1175bSopenharmony_ci
526a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)
527a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
528a8e1175bSopenharmony_ciFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg,
529a8e1175bSopenharmony_ci                        oid_pk_alg_t,
530a8e1175bSopenharmony_ci                        oid_pk_alg,
531a8e1175bSopenharmony_ci                        mbedtls_pk_type_t,
532a8e1175bSopenharmony_ci                        pk_alg)
533a8e1175bSopenharmony_ci
534a8e1175bSopenharmony_ci#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
535a8e1175bSopenharmony_ci/*
536a8e1175bSopenharmony_ci * For elliptic curves that use namedCurve inside ECParams (RFC 5480)
537a8e1175bSopenharmony_ci */
538a8e1175bSopenharmony_citypedef struct {
539a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
540a8e1175bSopenharmony_ci    mbedtls_ecp_group_id        grp_id;
541a8e1175bSopenharmony_ci} oid_ecp_grp_t;
542a8e1175bSopenharmony_ci
543a8e1175bSopenharmony_cistatic const oid_ecp_grp_t oid_ecp_grp[] =
544a8e1175bSopenharmony_ci{
545a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP192R1)
546a8e1175bSopenharmony_ci    {
547a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192R1, "secp192r1",    "secp192r1"),
548a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP192R1,
549a8e1175bSopenharmony_ci    },
550a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP192R1 */
551a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP224R1)
552a8e1175bSopenharmony_ci    {
553a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224R1, "secp224r1",    "secp224r1"),
554a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP224R1,
555a8e1175bSopenharmony_ci    },
556a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP224R1 */
557a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP256R1)
558a8e1175bSopenharmony_ci    {
559a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256R1, "secp256r1",    "secp256r1"),
560a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP256R1,
561a8e1175bSopenharmony_ci    },
562a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP256R1 */
563a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP384R1)
564a8e1175bSopenharmony_ci    {
565a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP384R1, "secp384r1",    "secp384r1"),
566a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP384R1,
567a8e1175bSopenharmony_ci    },
568a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP384R1 */
569a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP521R1)
570a8e1175bSopenharmony_ci    {
571a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP521R1, "secp521r1",    "secp521r1"),
572a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP521R1,
573a8e1175bSopenharmony_ci    },
574a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP521R1 */
575a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP192K1)
576a8e1175bSopenharmony_ci    {
577a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192K1, "secp192k1",    "secp192k1"),
578a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP192K1,
579a8e1175bSopenharmony_ci    },
580a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP192K1 */
581a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP224K1)
582a8e1175bSopenharmony_ci    {
583a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224K1, "secp224k1",    "secp224k1"),
584a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP224K1,
585a8e1175bSopenharmony_ci    },
586a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP224K1 */
587a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP256K1)
588a8e1175bSopenharmony_ci    {
589a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256K1, "secp256k1",    "secp256k1"),
590a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_SECP256K1,
591a8e1175bSopenharmony_ci    },
592a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_SECP256K1 */
593a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP256R1)
594a8e1175bSopenharmony_ci    {
595a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP256R1,   "brainpoolP256r1", "brainpool256r1"),
596a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_BP256R1,
597a8e1175bSopenharmony_ci    },
598a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_BP256R1 */
599a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP384R1)
600a8e1175bSopenharmony_ci    {
601a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP384R1,   "brainpoolP384r1", "brainpool384r1"),
602a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_BP384R1,
603a8e1175bSopenharmony_ci    },
604a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_BP384R1 */
605a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP512R1)
606a8e1175bSopenharmony_ci    {
607a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP512R1,   "brainpoolP512r1", "brainpool512r1"),
608a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_BP512R1,
609a8e1175bSopenharmony_ci    },
610a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_BP512R1 */
611a8e1175bSopenharmony_ci    {
612a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
613a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_NONE,
614a8e1175bSopenharmony_ci    },
615a8e1175bSopenharmony_ci};
616a8e1175bSopenharmony_ci
617a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
618a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
619a8e1175bSopenharmony_ciFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp,
620a8e1175bSopenharmony_ci                        oid_ecp_grp_t,
621a8e1175bSopenharmony_ci                        oid_ecp_grp,
622a8e1175bSopenharmony_ci                        mbedtls_ecp_group_id,
623a8e1175bSopenharmony_ci                        grp_id)
624a8e1175bSopenharmony_ci
625a8e1175bSopenharmony_ci/*
626a8e1175bSopenharmony_ci * For Elliptic Curve algorithms that are directly
627a8e1175bSopenharmony_ci * encoded in the AlgorithmIdentifier (RFC 8410)
628a8e1175bSopenharmony_ci */
629a8e1175bSopenharmony_citypedef struct {
630a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
631a8e1175bSopenharmony_ci    mbedtls_ecp_group_id        grp_id;
632a8e1175bSopenharmony_ci} oid_ecp_grp_algid_t;
633a8e1175bSopenharmony_ci
634a8e1175bSopenharmony_cistatic const oid_ecp_grp_algid_t oid_ecp_grp_algid[] =
635a8e1175bSopenharmony_ci{
636a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_CURVE25519)
637a8e1175bSopenharmony_ci    {
638a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_X25519,               "X25519",       "X25519"),
639a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_CURVE25519,
640a8e1175bSopenharmony_ci    },
641a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_CURVE25519 */
642a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_CURVE448)
643a8e1175bSopenharmony_ci    {
644a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_X448,                 "X448",         "X448"),
645a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_CURVE448,
646a8e1175bSopenharmony_ci    },
647a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_HAVE_CURVE448 */
648a8e1175bSopenharmony_ci    {
649a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
650a8e1175bSopenharmony_ci        MBEDTLS_ECP_DP_NONE,
651a8e1175bSopenharmony_ci    },
652a8e1175bSopenharmony_ci};
653a8e1175bSopenharmony_ci
654a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_ecp_grp_algid_t, grp_id_algid, oid_ecp_grp_algid)
655a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp_algid,
656a8e1175bSopenharmony_ci                 oid_ecp_grp_algid_t,
657a8e1175bSopenharmony_ci                 grp_id_algid,
658a8e1175bSopenharmony_ci                 mbedtls_ecp_group_id,
659a8e1175bSopenharmony_ci                 grp_id)
660a8e1175bSopenharmony_ciFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp_algid,
661a8e1175bSopenharmony_ci                        oid_ecp_grp_algid_t,
662a8e1175bSopenharmony_ci                        oid_ecp_grp_algid,
663a8e1175bSopenharmony_ci                        mbedtls_ecp_group_id,
664a8e1175bSopenharmony_ci                        grp_id)
665a8e1175bSopenharmony_ci#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
666a8e1175bSopenharmony_ci
667a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_C)
668a8e1175bSopenharmony_ci/*
669a8e1175bSopenharmony_ci * For PKCS#5 PBES2 encryption algorithm
670a8e1175bSopenharmony_ci */
671a8e1175bSopenharmony_citypedef struct {
672a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
673a8e1175bSopenharmony_ci    mbedtls_cipher_type_t       cipher_alg;
674a8e1175bSopenharmony_ci} oid_cipher_alg_t;
675a8e1175bSopenharmony_ci
676a8e1175bSopenharmony_cistatic const oid_cipher_alg_t oid_cipher_alg[] =
677a8e1175bSopenharmony_ci{
678a8e1175bSopenharmony_ci    {
679a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DES_CBC,              "desCBC",       "DES-CBC"),
680a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_DES_CBC,
681a8e1175bSopenharmony_ci    },
682a8e1175bSopenharmony_ci    {
683a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DES_EDE3_CBC,         "des-ede3-cbc", "DES-EDE3-CBC"),
684a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_DES_EDE3_CBC,
685a8e1175bSopenharmony_ci    },
686a8e1175bSopenharmony_ci    {
687a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AES_128_CBC,          "aes128-cbc", "AES128-CBC"),
688a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_AES_128_CBC,
689a8e1175bSopenharmony_ci    },
690a8e1175bSopenharmony_ci    {
691a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AES_192_CBC,          "aes192-cbc", "AES192-CBC"),
692a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_AES_192_CBC,
693a8e1175bSopenharmony_ci    },
694a8e1175bSopenharmony_ci    {
695a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_AES_256_CBC,          "aes256-cbc", "AES256-CBC"),
696a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_AES_256_CBC,
697a8e1175bSopenharmony_ci    },
698a8e1175bSopenharmony_ci    {
699a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
700a8e1175bSopenharmony_ci        MBEDTLS_CIPHER_NONE,
701a8e1175bSopenharmony_ci    },
702a8e1175bSopenharmony_ci};
703a8e1175bSopenharmony_ci
704a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
705a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg,
706a8e1175bSopenharmony_ci                 oid_cipher_alg_t,
707a8e1175bSopenharmony_ci                 cipher_alg,
708a8e1175bSopenharmony_ci                 mbedtls_cipher_type_t,
709a8e1175bSopenharmony_ci                 cipher_alg)
710a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_C */
711a8e1175bSopenharmony_ci
712a8e1175bSopenharmony_ci/*
713a8e1175bSopenharmony_ci * For digestAlgorithm
714a8e1175bSopenharmony_ci */
715a8e1175bSopenharmony_citypedef struct {
716a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
717a8e1175bSopenharmony_ci    mbedtls_md_type_t           md_alg;
718a8e1175bSopenharmony_ci} oid_md_alg_t;
719a8e1175bSopenharmony_ci
720a8e1175bSopenharmony_cistatic const oid_md_alg_t oid_md_alg[] =
721a8e1175bSopenharmony_ci{
722a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
723a8e1175bSopenharmony_ci    {
724a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_MD5,       "id-md5",       "MD5"),
725a8e1175bSopenharmony_ci        MBEDTLS_MD_MD5,
726a8e1175bSopenharmony_ci    },
727a8e1175bSopenharmony_ci#endif
728a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
729a8e1175bSopenharmony_ci    {
730a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA1,      "id-sha1",      "SHA-1"),
731a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,
732a8e1175bSopenharmony_ci    },
733a8e1175bSopenharmony_ci#endif
734a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
735a8e1175bSopenharmony_ci    {
736a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA224,    "id-sha224",    "SHA-224"),
737a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA224,
738a8e1175bSopenharmony_ci    },
739a8e1175bSopenharmony_ci#endif
740a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
741a8e1175bSopenharmony_ci    {
742a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA256,    "id-sha256",    "SHA-256"),
743a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA256,
744a8e1175bSopenharmony_ci    },
745a8e1175bSopenharmony_ci#endif
746a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
747a8e1175bSopenharmony_ci    {
748a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA384,    "id-sha384",    "SHA-384"),
749a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA384,
750a8e1175bSopenharmony_ci    },
751a8e1175bSopenharmony_ci#endif
752a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
753a8e1175bSopenharmony_ci    {
754a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA512,    "id-sha512",    "SHA-512"),
755a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA512,
756a8e1175bSopenharmony_ci    },
757a8e1175bSopenharmony_ci#endif
758a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
759a8e1175bSopenharmony_ci    {
760a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_RIPEMD160, "id-ripemd160", "RIPEMD-160"),
761a8e1175bSopenharmony_ci        MBEDTLS_MD_RIPEMD160,
762a8e1175bSopenharmony_ci    },
763a8e1175bSopenharmony_ci#endif
764a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
765a8e1175bSopenharmony_ci    {
766a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA3_224,    "id-sha3-224",    "SHA-3-224"),
767a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_224,
768a8e1175bSopenharmony_ci    },
769a8e1175bSopenharmony_ci#endif
770a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
771a8e1175bSopenharmony_ci    {
772a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA3_256,    "id-sha3-256",    "SHA-3-256"),
773a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_256,
774a8e1175bSopenharmony_ci    },
775a8e1175bSopenharmony_ci#endif
776a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
777a8e1175bSopenharmony_ci    {
778a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA3_384,    "id-sha3-384",    "SHA-3-384"),
779a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_384,
780a8e1175bSopenharmony_ci    },
781a8e1175bSopenharmony_ci#endif
782a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
783a8e1175bSopenharmony_ci    {
784a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA3_512,    "id-sha3-512",    "SHA-3-512"),
785a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_512,
786a8e1175bSopenharmony_ci    },
787a8e1175bSopenharmony_ci#endif
788a8e1175bSopenharmony_ci    {
789a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
790a8e1175bSopenharmony_ci        MBEDTLS_MD_NONE,
791a8e1175bSopenharmony_ci    },
792a8e1175bSopenharmony_ci};
793a8e1175bSopenharmony_ci
794a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
795a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
796a8e1175bSopenharmony_ciFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md,
797a8e1175bSopenharmony_ci                        oid_md_alg_t,
798a8e1175bSopenharmony_ci                        oid_md_alg,
799a8e1175bSopenharmony_ci                        mbedtls_md_type_t,
800a8e1175bSopenharmony_ci                        md_alg)
801a8e1175bSopenharmony_ci
802a8e1175bSopenharmony_ci/*
803a8e1175bSopenharmony_ci * For HMAC digestAlgorithm
804a8e1175bSopenharmony_ci */
805a8e1175bSopenharmony_citypedef struct {
806a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
807a8e1175bSopenharmony_ci    mbedtls_md_type_t           md_hmac;
808a8e1175bSopenharmony_ci} oid_md_hmac_t;
809a8e1175bSopenharmony_ci
810a8e1175bSopenharmony_cistatic const oid_md_hmac_t oid_md_hmac[] =
811a8e1175bSopenharmony_ci{
812a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
813a8e1175bSopenharmony_ci    {
814a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA1,      "hmacSHA1",      "HMAC-SHA-1"),
815a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,
816a8e1175bSopenharmony_ci    },
817a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA1 */
818a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
819a8e1175bSopenharmony_ci    {
820a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA224,    "hmacSHA224",    "HMAC-SHA-224"),
821a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA224,
822a8e1175bSopenharmony_ci    },
823a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA224 */
824a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
825a8e1175bSopenharmony_ci    {
826a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA256,    "hmacSHA256",    "HMAC-SHA-256"),
827a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA256,
828a8e1175bSopenharmony_ci    },
829a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA256 */
830a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
831a8e1175bSopenharmony_ci    {
832a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA384,    "hmacSHA384",    "HMAC-SHA-384"),
833a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA384,
834a8e1175bSopenharmony_ci    },
835a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA384 */
836a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
837a8e1175bSopenharmony_ci    {
838a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA512,    "hmacSHA512",    "HMAC-SHA-512"),
839a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA512,
840a8e1175bSopenharmony_ci    },
841a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA512 */
842a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
843a8e1175bSopenharmony_ci    {
844a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA3_224,    "hmacSHA3-224",    "HMAC-SHA3-224"),
845a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_224,
846a8e1175bSopenharmony_ci    },
847a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA3_224 */
848a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
849a8e1175bSopenharmony_ci    {
850a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA3_256,    "hmacSHA3-256",    "HMAC-SHA3-256"),
851a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_256,
852a8e1175bSopenharmony_ci    },
853a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA3_256 */
854a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
855a8e1175bSopenharmony_ci    {
856a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA3_384,    "hmacSHA3-384",    "HMAC-SHA3-384"),
857a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_384,
858a8e1175bSopenharmony_ci    },
859a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA3_384 */
860a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
861a8e1175bSopenharmony_ci    {
862a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA3_512,    "hmacSHA3-512",    "HMAC-SHA3-512"),
863a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA3_512,
864a8e1175bSopenharmony_ci    },
865a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_SHA3_512 */
866a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
867a8e1175bSopenharmony_ci    {
868a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_HMAC_RIPEMD160,    "hmacRIPEMD160",    "HMAC-RIPEMD160"),
869a8e1175bSopenharmony_ci        MBEDTLS_MD_RIPEMD160,
870a8e1175bSopenharmony_ci    },
871a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_CAN_RIPEMD160 */
872a8e1175bSopenharmony_ci    {
873a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
874a8e1175bSopenharmony_ci        MBEDTLS_MD_NONE,
875a8e1175bSopenharmony_ci    },
876a8e1175bSopenharmony_ci};
877a8e1175bSopenharmony_ci
878a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac)
879a8e1175bSopenharmony_ciFN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac)
880a8e1175bSopenharmony_ci
881a8e1175bSopenharmony_ci#if defined(MBEDTLS_PKCS12_C) && defined(MBEDTLS_CIPHER_C)
882a8e1175bSopenharmony_ci/*
883a8e1175bSopenharmony_ci * For PKCS#12 PBEs
884a8e1175bSopenharmony_ci */
885a8e1175bSopenharmony_citypedef struct {
886a8e1175bSopenharmony_ci    mbedtls_oid_descriptor_t    descriptor;
887a8e1175bSopenharmony_ci    mbedtls_md_type_t           md_alg;
888a8e1175bSopenharmony_ci    mbedtls_cipher_type_t       cipher_alg;
889a8e1175bSopenharmony_ci} oid_pkcs12_pbe_alg_t;
890a8e1175bSopenharmony_ci
891a8e1175bSopenharmony_cistatic const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
892a8e1175bSopenharmony_ci{
893a8e1175bSopenharmony_ci    {
894a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC,
895a8e1175bSopenharmony_ci                       "pbeWithSHAAnd3-KeyTripleDES-CBC",
896a8e1175bSopenharmony_ci                       "PBE with SHA1 and 3-Key 3DES"),
897a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE3_CBC,
898a8e1175bSopenharmony_ci    },
899a8e1175bSopenharmony_ci    {
900a8e1175bSopenharmony_ci        OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC,
901a8e1175bSopenharmony_ci                       "pbeWithSHAAnd2-KeyTripleDES-CBC",
902a8e1175bSopenharmony_ci                       "PBE with SHA1 and 2-Key 3DES"),
903a8e1175bSopenharmony_ci        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE_CBC,
904a8e1175bSopenharmony_ci    },
905a8e1175bSopenharmony_ci    {
906a8e1175bSopenharmony_ci        NULL_OID_DESCRIPTOR,
907a8e1175bSopenharmony_ci        MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
908a8e1175bSopenharmony_ci    },
909a8e1175bSopenharmony_ci};
910a8e1175bSopenharmony_ci
911a8e1175bSopenharmony_ciFN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
912a8e1175bSopenharmony_ciFN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg,
913a8e1175bSopenharmony_ci                 oid_pkcs12_pbe_alg_t,
914a8e1175bSopenharmony_ci                 pkcs12_pbe_alg,
915a8e1175bSopenharmony_ci                 mbedtls_md_type_t,
916a8e1175bSopenharmony_ci                 md_alg,
917a8e1175bSopenharmony_ci                 mbedtls_cipher_type_t,
918a8e1175bSopenharmony_ci                 cipher_alg)
919a8e1175bSopenharmony_ci#endif /* MBEDTLS_PKCS12_C && MBEDTLS_CIPHER_C */
920a8e1175bSopenharmony_ci
921a8e1175bSopenharmony_ci/* Return the x.y.z.... style numeric string for the given OID */
922a8e1175bSopenharmony_ciint mbedtls_oid_get_numeric_string(char *buf, size_t size,
923a8e1175bSopenharmony_ci                                   const mbedtls_asn1_buf *oid)
924a8e1175bSopenharmony_ci{
925a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
926a8e1175bSopenharmony_ci    char *p = buf;
927a8e1175bSopenharmony_ci    size_t n = size;
928a8e1175bSopenharmony_ci    unsigned int value = 0;
929a8e1175bSopenharmony_ci
930a8e1175bSopenharmony_ci    if (size > INT_MAX) {
931a8e1175bSopenharmony_ci        /* Avoid overflow computing return value */
932a8e1175bSopenharmony_ci        return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
933a8e1175bSopenharmony_ci    }
934a8e1175bSopenharmony_ci
935a8e1175bSopenharmony_ci    if (oid->len <= 0) {
936a8e1175bSopenharmony_ci        /* OID must not be empty */
937a8e1175bSopenharmony_ci        return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
938a8e1175bSopenharmony_ci    }
939a8e1175bSopenharmony_ci
940a8e1175bSopenharmony_ci    for (size_t i = 0; i < oid->len; i++) {
941a8e1175bSopenharmony_ci        /* Prevent overflow in value. */
942a8e1175bSopenharmony_ci        if (value > (UINT_MAX >> 7)) {
943a8e1175bSopenharmony_ci            return MBEDTLS_ERR_ASN1_INVALID_DATA;
944a8e1175bSopenharmony_ci        }
945a8e1175bSopenharmony_ci        if ((value == 0) && ((oid->p[i]) == 0x80)) {
946a8e1175bSopenharmony_ci            /* Overlong encoding is not allowed */
947a8e1175bSopenharmony_ci            return MBEDTLS_ERR_ASN1_INVALID_DATA;
948a8e1175bSopenharmony_ci        }
949a8e1175bSopenharmony_ci
950a8e1175bSopenharmony_ci        value <<= 7;
951a8e1175bSopenharmony_ci        value |= oid->p[i] & 0x7F;
952a8e1175bSopenharmony_ci
953a8e1175bSopenharmony_ci        if (!(oid->p[i] & 0x80)) {
954a8e1175bSopenharmony_ci            /* Last byte */
955a8e1175bSopenharmony_ci            if (n == size) {
956a8e1175bSopenharmony_ci                int component1;
957a8e1175bSopenharmony_ci                unsigned int component2;
958a8e1175bSopenharmony_ci                /* First subidentifier contains first two OID components */
959a8e1175bSopenharmony_ci                if (value >= 80) {
960a8e1175bSopenharmony_ci                    component1 = '2';
961a8e1175bSopenharmony_ci                    component2 = value - 80;
962a8e1175bSopenharmony_ci                } else if (value >= 40) {
963a8e1175bSopenharmony_ci                    component1 = '1';
964a8e1175bSopenharmony_ci                    component2 = value - 40;
965a8e1175bSopenharmony_ci                } else {
966a8e1175bSopenharmony_ci                    component1 = '0';
967a8e1175bSopenharmony_ci                    component2 = value;
968a8e1175bSopenharmony_ci                }
969a8e1175bSopenharmony_ci                ret = mbedtls_snprintf(p, n, "%c.%u", component1, component2);
970a8e1175bSopenharmony_ci            } else {
971a8e1175bSopenharmony_ci                ret = mbedtls_snprintf(p, n, ".%u", value);
972a8e1175bSopenharmony_ci            }
973a8e1175bSopenharmony_ci            if (ret < 2 || (size_t) ret >= n) {
974a8e1175bSopenharmony_ci                return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
975a8e1175bSopenharmony_ci            }
976a8e1175bSopenharmony_ci            n -= (size_t) ret;
977a8e1175bSopenharmony_ci            p += ret;
978a8e1175bSopenharmony_ci            value = 0;
979a8e1175bSopenharmony_ci        }
980a8e1175bSopenharmony_ci    }
981a8e1175bSopenharmony_ci
982a8e1175bSopenharmony_ci    if (value != 0) {
983a8e1175bSopenharmony_ci        /* Unterminated subidentifier */
984a8e1175bSopenharmony_ci        return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
985a8e1175bSopenharmony_ci    }
986a8e1175bSopenharmony_ci
987a8e1175bSopenharmony_ci    return (int) (size - n);
988a8e1175bSopenharmony_ci}
989a8e1175bSopenharmony_ci
990a8e1175bSopenharmony_cistatic int oid_parse_number(unsigned int *num, const char **p, const char *bound)
991a8e1175bSopenharmony_ci{
992a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
993a8e1175bSopenharmony_ci
994a8e1175bSopenharmony_ci    *num = 0;
995a8e1175bSopenharmony_ci
996a8e1175bSopenharmony_ci    while (*p < bound && **p >= '0' && **p <= '9') {
997a8e1175bSopenharmony_ci        ret = 0;
998a8e1175bSopenharmony_ci        if (*num > (UINT_MAX / 10)) {
999a8e1175bSopenharmony_ci            return MBEDTLS_ERR_ASN1_INVALID_DATA;
1000a8e1175bSopenharmony_ci        }
1001a8e1175bSopenharmony_ci        *num *= 10;
1002a8e1175bSopenharmony_ci        *num += **p - '0';
1003a8e1175bSopenharmony_ci        (*p)++;
1004a8e1175bSopenharmony_ci    }
1005a8e1175bSopenharmony_ci    return ret;
1006a8e1175bSopenharmony_ci}
1007a8e1175bSopenharmony_ci
1008a8e1175bSopenharmony_cistatic size_t oid_subidentifier_num_bytes(unsigned int value)
1009a8e1175bSopenharmony_ci{
1010a8e1175bSopenharmony_ci    size_t num_bytes = 0;
1011a8e1175bSopenharmony_ci
1012a8e1175bSopenharmony_ci    do {
1013a8e1175bSopenharmony_ci        value >>= 7;
1014a8e1175bSopenharmony_ci        num_bytes++;
1015a8e1175bSopenharmony_ci    } while (value != 0);
1016a8e1175bSopenharmony_ci
1017a8e1175bSopenharmony_ci    return num_bytes;
1018a8e1175bSopenharmony_ci}
1019a8e1175bSopenharmony_ci
1020a8e1175bSopenharmony_cistatic int oid_subidentifier_encode_into(unsigned char **p,
1021a8e1175bSopenharmony_ci                                         unsigned char *bound,
1022a8e1175bSopenharmony_ci                                         unsigned int value)
1023a8e1175bSopenharmony_ci{
1024a8e1175bSopenharmony_ci    size_t num_bytes = oid_subidentifier_num_bytes(value);
1025a8e1175bSopenharmony_ci
1026a8e1175bSopenharmony_ci    if ((size_t) (bound - *p) < num_bytes) {
1027a8e1175bSopenharmony_ci        return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
1028a8e1175bSopenharmony_ci    }
1029a8e1175bSopenharmony_ci    (*p)[num_bytes - 1] = (unsigned char) (value & 0x7f);
1030a8e1175bSopenharmony_ci    value >>= 7;
1031a8e1175bSopenharmony_ci
1032a8e1175bSopenharmony_ci    for (size_t i = 2; i <= num_bytes; i++) {
1033a8e1175bSopenharmony_ci        (*p)[num_bytes - i] = 0x80 | (unsigned char) (value & 0x7f);
1034a8e1175bSopenharmony_ci        value >>= 7;
1035a8e1175bSopenharmony_ci    }
1036a8e1175bSopenharmony_ci    *p += num_bytes;
1037a8e1175bSopenharmony_ci
1038a8e1175bSopenharmony_ci    return 0;
1039a8e1175bSopenharmony_ci}
1040a8e1175bSopenharmony_ci
1041a8e1175bSopenharmony_ci/* Return the OID for the given x.y.z.... style numeric string  */
1042a8e1175bSopenharmony_ciint mbedtls_oid_from_numeric_string(mbedtls_asn1_buf *oid,
1043a8e1175bSopenharmony_ci                                    const char *oid_str, size_t size)
1044a8e1175bSopenharmony_ci{
1045a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1046a8e1175bSopenharmony_ci    const char *str_ptr = oid_str;
1047a8e1175bSopenharmony_ci    const char *str_bound = oid_str + size;
1048a8e1175bSopenharmony_ci    unsigned int val = 0;
1049a8e1175bSopenharmony_ci    unsigned int component1, component2;
1050a8e1175bSopenharmony_ci    size_t encoded_len;
1051a8e1175bSopenharmony_ci    unsigned char *resized_mem;
1052a8e1175bSopenharmony_ci
1053a8e1175bSopenharmony_ci    /* Count the number of dots to get a worst-case allocation size. */
1054a8e1175bSopenharmony_ci    size_t num_dots = 0;
1055a8e1175bSopenharmony_ci    for (size_t i = 0; i < size; i++) {
1056a8e1175bSopenharmony_ci        if (oid_str[i] == '.') {
1057a8e1175bSopenharmony_ci            num_dots++;
1058a8e1175bSopenharmony_ci        }
1059a8e1175bSopenharmony_ci    }
1060a8e1175bSopenharmony_ci    /* Allocate maximum possible required memory:
1061a8e1175bSopenharmony_ci     * There are (num_dots + 1) integer components, but the first 2 share the
1062a8e1175bSopenharmony_ci     * same subidentifier, so we only need num_dots subidentifiers maximum. */
1063a8e1175bSopenharmony_ci    if (num_dots == 0 || (num_dots > MBEDTLS_OID_MAX_COMPONENTS - 1)) {
1064a8e1175bSopenharmony_ci        return MBEDTLS_ERR_ASN1_INVALID_DATA;
1065a8e1175bSopenharmony_ci    }
1066a8e1175bSopenharmony_ci    /* Each byte can store 7 bits, calculate number of bytes for a
1067a8e1175bSopenharmony_ci     * subidentifier:
1068a8e1175bSopenharmony_ci     *
1069a8e1175bSopenharmony_ci     * bytes = ceil(subidentifer_size * 8 / 7)
1070a8e1175bSopenharmony_ci     */
1071a8e1175bSopenharmony_ci    size_t bytes_per_subidentifier = (((sizeof(unsigned int) * 8) - 1) / 7)
1072a8e1175bSopenharmony_ci                                     + 1;
1073a8e1175bSopenharmony_ci    size_t max_possible_bytes = num_dots * bytes_per_subidentifier;
1074a8e1175bSopenharmony_ci    oid->p = mbedtls_calloc(max_possible_bytes, 1);
1075a8e1175bSopenharmony_ci    if (oid->p == NULL) {
1076a8e1175bSopenharmony_ci        return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
1077a8e1175bSopenharmony_ci    }
1078a8e1175bSopenharmony_ci    unsigned char *out_ptr = oid->p;
1079a8e1175bSopenharmony_ci    unsigned char *out_bound = oid->p + max_possible_bytes;
1080a8e1175bSopenharmony_ci
1081a8e1175bSopenharmony_ci    ret = oid_parse_number(&component1, &str_ptr, str_bound);
1082a8e1175bSopenharmony_ci    if (ret != 0) {
1083a8e1175bSopenharmony_ci        goto error;
1084a8e1175bSopenharmony_ci    }
1085a8e1175bSopenharmony_ci    if (component1 > 2) {
1086a8e1175bSopenharmony_ci        /* First component can't be > 2 */
1087a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1088a8e1175bSopenharmony_ci        goto error;
1089a8e1175bSopenharmony_ci    }
1090a8e1175bSopenharmony_ci    if (str_ptr >= str_bound || *str_ptr != '.') {
1091a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1092a8e1175bSopenharmony_ci        goto error;
1093a8e1175bSopenharmony_ci    }
1094a8e1175bSopenharmony_ci    str_ptr++;
1095a8e1175bSopenharmony_ci
1096a8e1175bSopenharmony_ci    ret = oid_parse_number(&component2, &str_ptr, str_bound);
1097a8e1175bSopenharmony_ci    if (ret != 0) {
1098a8e1175bSopenharmony_ci        goto error;
1099a8e1175bSopenharmony_ci    }
1100a8e1175bSopenharmony_ci    if ((component1 < 2) && (component2 > 39)) {
1101a8e1175bSopenharmony_ci        /* Root nodes 0 and 1 may have up to 40 children, numbered 0-39 */
1102a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1103a8e1175bSopenharmony_ci        goto error;
1104a8e1175bSopenharmony_ci    }
1105a8e1175bSopenharmony_ci    if (str_ptr < str_bound) {
1106a8e1175bSopenharmony_ci        if (*str_ptr == '.') {
1107a8e1175bSopenharmony_ci            str_ptr++;
1108a8e1175bSopenharmony_ci        } else {
1109a8e1175bSopenharmony_ci            ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1110a8e1175bSopenharmony_ci            goto error;
1111a8e1175bSopenharmony_ci        }
1112a8e1175bSopenharmony_ci    }
1113a8e1175bSopenharmony_ci
1114a8e1175bSopenharmony_ci    if (component2 > (UINT_MAX - (component1 * 40))) {
1115a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1116a8e1175bSopenharmony_ci        goto error;
1117a8e1175bSopenharmony_ci    }
1118a8e1175bSopenharmony_ci    ret = oid_subidentifier_encode_into(&out_ptr, out_bound,
1119a8e1175bSopenharmony_ci                                        (component1 * 40) + component2);
1120a8e1175bSopenharmony_ci    if (ret != 0) {
1121a8e1175bSopenharmony_ci        goto error;
1122a8e1175bSopenharmony_ci    }
1123a8e1175bSopenharmony_ci
1124a8e1175bSopenharmony_ci    while (str_ptr < str_bound) {
1125a8e1175bSopenharmony_ci        ret = oid_parse_number(&val, &str_ptr, str_bound);
1126a8e1175bSopenharmony_ci        if (ret != 0) {
1127a8e1175bSopenharmony_ci            goto error;
1128a8e1175bSopenharmony_ci        }
1129a8e1175bSopenharmony_ci        if (str_ptr < str_bound) {
1130a8e1175bSopenharmony_ci            if (*str_ptr == '.') {
1131a8e1175bSopenharmony_ci                str_ptr++;
1132a8e1175bSopenharmony_ci            } else {
1133a8e1175bSopenharmony_ci                ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1134a8e1175bSopenharmony_ci                goto error;
1135a8e1175bSopenharmony_ci            }
1136a8e1175bSopenharmony_ci        }
1137a8e1175bSopenharmony_ci
1138a8e1175bSopenharmony_ci        ret = oid_subidentifier_encode_into(&out_ptr, out_bound, val);
1139a8e1175bSopenharmony_ci        if (ret != 0) {
1140a8e1175bSopenharmony_ci            goto error;
1141a8e1175bSopenharmony_ci        }
1142a8e1175bSopenharmony_ci    }
1143a8e1175bSopenharmony_ci
1144a8e1175bSopenharmony_ci    encoded_len = (size_t) (out_ptr - oid->p);
1145a8e1175bSopenharmony_ci    resized_mem = mbedtls_calloc(encoded_len, 1);
1146a8e1175bSopenharmony_ci    if (resized_mem == NULL) {
1147a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_ASN1_ALLOC_FAILED;
1148a8e1175bSopenharmony_ci        goto error;
1149a8e1175bSopenharmony_ci    }
1150a8e1175bSopenharmony_ci    memcpy(resized_mem, oid->p, encoded_len);
1151a8e1175bSopenharmony_ci    mbedtls_free(oid->p);
1152a8e1175bSopenharmony_ci    oid->p = resized_mem;
1153a8e1175bSopenharmony_ci    oid->len = encoded_len;
1154a8e1175bSopenharmony_ci
1155a8e1175bSopenharmony_ci    oid->tag = MBEDTLS_ASN1_OID;
1156a8e1175bSopenharmony_ci
1157a8e1175bSopenharmony_ci    return 0;
1158a8e1175bSopenharmony_ci
1159a8e1175bSopenharmony_cierror:
1160a8e1175bSopenharmony_ci    mbedtls_free(oid->p);
1161a8e1175bSopenharmony_ci    oid->p = NULL;
1162a8e1175bSopenharmony_ci    oid->len = 0;
1163a8e1175bSopenharmony_ci    return ret;
1164a8e1175bSopenharmony_ci}
1165a8e1175bSopenharmony_ci
1166a8e1175bSopenharmony_ci#endif /* MBEDTLS_OID_C */
1167