blob: 63b3df38800957f4786d840e4aff8ae5fddfe8cc [file] [log] [blame]
Jens Wiklander817466c2018-05-22 13:49:31 +02001/**
2 * \file oid.c
3 *
4 * \brief Object Identifier (OID) database
5 *
Jerome Forissier79013242021-07-28 10:24:04 +02006 * Copyright The Mbed TLS Contributors
7 * SPDX-License-Identifier: Apache-2.0
Jens Wiklander817466c2018-05-22 13:49:31 +02008 *
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.
Jens Wiklander817466c2018-05-22 13:49:31 +020020 */
21
Jerome Forissier79013242021-07-28 10:24:04 +020022#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020023
24#if defined(MBEDTLS_OID_C)
25
26#include "mbedtls/oid.h"
27#include "mbedtls/rsa.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020028#include "mbedtls/error.h"
Jens Wiklander32b31802023-10-06 16:59:46 +020029#include "mbedtls/pk.h"
30
31#include "mbedtls/legacy_or_psa.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020032
33#include <stdio.h>
34#include <string.h>
35
Jens Wiklander817466c2018-05-22 13:49:31 +020036#include "mbedtls/platform.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020037
Jens Wiklander817466c2018-05-22 13:49:31 +020038/*
39 * Macro to automatically add the size of #define'd OIDs
40 */
41#define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s)
42
43/*
Jens Wiklander32b31802023-10-06 16:59:46 +020044 * Macro to generate mbedtls_oid_descriptor_t
45 */
46#if !defined(MBEDTLS_X509_REMOVE_INFO)
47#define OID_DESCRIPTOR(s, name, description) { ADD_LEN(s), name, description }
48#define NULL_OID_DESCRIPTOR { NULL, 0, NULL, NULL }
49#else
50#define OID_DESCRIPTOR(s, name, description) { ADD_LEN(s) }
51#define NULL_OID_DESCRIPTOR { NULL, 0 }
52#endif
53
54/*
Jens Wiklander817466c2018-05-22 13:49:31 +020055 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
56 * the other functions)
57 */
Jens Wiklander32b31802023-10-06 16:59:46 +020058#define FN_OID_TYPED_FROM_ASN1(TYPE_T, NAME, LIST) \
59 static const TYPE_T *oid_ ## NAME ## _from_asn1( \
60 const mbedtls_asn1_buf *oid) \
Jerome Forissier5b25c762020-04-07 11:18:49 +020061 { \
62 const TYPE_T *p = (LIST); \
63 const mbedtls_oid_descriptor_t *cur = \
64 (const mbedtls_oid_descriptor_t *) p; \
Jens Wiklander32b31802023-10-06 16:59:46 +020065 if (p == NULL || oid == NULL) return NULL; \
66 while (cur->asn1 != NULL) { \
67 if (cur->asn1_len == oid->len && \
68 memcmp(cur->asn1, oid->p, oid->len) == 0) { \
69 return p; \
Jerome Forissier5b25c762020-04-07 11:18:49 +020070 } \
71 p++; \
72 cur = (const mbedtls_oid_descriptor_t *) p; \
73 } \
Jens Wiklander32b31802023-10-06 16:59:46 +020074 return NULL; \
Jerome Forissier5b25c762020-04-07 11:18:49 +020075 }
Jens Wiklander817466c2018-05-22 13:49:31 +020076
Jens Wiklander32b31802023-10-06 16:59:46 +020077#if !defined(MBEDTLS_X509_REMOVE_INFO)
Jens Wiklander817466c2018-05-22 13:49:31 +020078/*
79 * Macro to generate a function for retrieving a single attribute from the
80 * descriptor of an mbedtls_oid_descriptor_t wrapper.
81 */
82#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Jens Wiklander32b31802023-10-06 16:59:46 +020083 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \
84 { \
85 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
86 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
87 *ATTR1 = data->descriptor.ATTR1; \
88 return 0; \
89 }
90#endif /* MBEDTLS_X509_REMOVE_INFO */
Jens Wiklander817466c2018-05-22 13:49:31 +020091
92/*
93 * Macro to generate a function for retrieving a single attribute from an
94 * mbedtls_oid_descriptor_t wrapper.
95 */
96#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Jens Wiklander32b31802023-10-06 16:59:46 +020097 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \
98 { \
99 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
100 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
101 *ATTR1 = data->ATTR1; \
102 return 0; \
103 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200104
105/*
106 * Macro to generate a function for retrieving two attributes from an
107 * mbedtls_oid_descriptor_t wrapper.
108 */
109#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
110 ATTR2_TYPE, ATTR2) \
Jens Wiklander32b31802023-10-06 16:59:46 +0200111 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, \
112 ATTR2_TYPE * ATTR2) \
113 { \
114 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
115 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
116 *(ATTR1) = data->ATTR1; \
117 *(ATTR2) = data->ATTR2; \
118 return 0; \
119 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200120
121/*
122 * Macro to generate a function for retrieving the OID based on a single
123 * attribute from a mbedtls_oid_descriptor_t wrapper.
124 */
125#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
Jens Wiklander32b31802023-10-06 16:59:46 +0200126 int FN_NAME(ATTR1_TYPE ATTR1, const char **oid, size_t *olen) \
127 { \
128 const TYPE_T *cur = (LIST); \
129 while (cur->descriptor.asn1 != NULL) { \
130 if (cur->ATTR1 == (ATTR1)) { \
131 *oid = cur->descriptor.asn1; \
132 *olen = cur->descriptor.asn1_len; \
133 return 0; \
134 } \
135 cur++; \
136 } \
137 return MBEDTLS_ERR_OID_NOT_FOUND; \
138 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200139
140/*
141 * Macro to generate a function for retrieving the OID based on two
142 * attributes from a mbedtls_oid_descriptor_t wrapper.
143 */
144#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
145 ATTR2_TYPE, ATTR2) \
Jens Wiklander32b31802023-10-06 16:59:46 +0200146 int FN_NAME(ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid, \
147 size_t *olen) \
148 { \
149 const TYPE_T *cur = (LIST); \
150 while (cur->descriptor.asn1 != NULL) { \
151 if (cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2)) { \
152 *oid = cur->descriptor.asn1; \
153 *olen = cur->descriptor.asn1_len; \
154 return 0; \
155 } \
156 cur++; \
157 } \
158 return MBEDTLS_ERR_OID_NOT_FOUND; \
159 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200160
Jens Wiklander817466c2018-05-22 13:49:31 +0200161/*
162 * For X520 attribute types
163 */
164typedef struct {
165 mbedtls_oid_descriptor_t descriptor;
166 const char *short_name;
167} oid_x520_attr_t;
168
169static const oid_x520_attr_t oid_x520_attr_type[] =
170{
171 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200172 OID_DESCRIPTOR(MBEDTLS_OID_AT_CN, "id-at-commonName", "Common Name"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200173 "CN",
174 },
175 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200176 OID_DESCRIPTOR(MBEDTLS_OID_AT_COUNTRY, "id-at-countryName", "Country"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200177 "C",
178 },
179 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200180 OID_DESCRIPTOR(MBEDTLS_OID_AT_LOCALITY, "id-at-locality", "Locality"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200181 "L",
182 },
183 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200184 OID_DESCRIPTOR(MBEDTLS_OID_AT_STATE, "id-at-state", "State"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200185 "ST",
186 },
187 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200188 OID_DESCRIPTOR(MBEDTLS_OID_AT_ORGANIZATION, "id-at-organizationName",
189 "Organization"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200190 "O",
191 },
192 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200193 OID_DESCRIPTOR(MBEDTLS_OID_AT_ORG_UNIT, "id-at-organizationalUnitName", "Org Unit"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200194 "OU",
195 },
196 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200197 OID_DESCRIPTOR(MBEDTLS_OID_PKCS9_EMAIL,
198 "emailAddress",
199 "E-mail address"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200200 "emailAddress",
201 },
202 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200203 OID_DESCRIPTOR(MBEDTLS_OID_AT_SERIAL_NUMBER,
204 "id-at-serialNumber",
205 "Serial number"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200206 "serialNumber",
207 },
208 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200209 OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_ADDRESS,
210 "id-at-postalAddress",
211 "Postal address"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200212 "postalAddress",
213 },
214 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200215 OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_CODE, "id-at-postalCode", "Postal code"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200216 "postalCode",
217 },
218 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200219 OID_DESCRIPTOR(MBEDTLS_OID_AT_SUR_NAME, "id-at-surName", "Surname"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200220 "SN",
221 },
222 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200223 OID_DESCRIPTOR(MBEDTLS_OID_AT_GIVEN_NAME, "id-at-givenName", "Given name"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200224 "GN",
225 },
226 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200227 OID_DESCRIPTOR(MBEDTLS_OID_AT_INITIALS, "id-at-initials", "Initials"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200228 "initials",
229 },
230 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200231 OID_DESCRIPTOR(MBEDTLS_OID_AT_GENERATION_QUALIFIER,
232 "id-at-generationQualifier",
233 "Generation qualifier"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200234 "generationQualifier",
235 },
236 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200237 OID_DESCRIPTOR(MBEDTLS_OID_AT_TITLE, "id-at-title", "Title"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200238 "title",
239 },
240 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200241 OID_DESCRIPTOR(MBEDTLS_OID_AT_DN_QUALIFIER,
242 "id-at-dnQualifier",
243 "Distinguished Name qualifier"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200244 "dnQualifier",
245 },
246 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200247 OID_DESCRIPTOR(MBEDTLS_OID_AT_PSEUDONYM, "id-at-pseudonym", "Pseudonym"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200248 "pseudonym",
249 },
250 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200251 OID_DESCRIPTOR(MBEDTLS_OID_UID, "id-uid", "User Id"),
252 "uid",
253 },
254 {
255 OID_DESCRIPTOR(MBEDTLS_OID_DOMAIN_COMPONENT,
256 "id-domainComponent",
257 "Domain component"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200258 "DC",
259 },
260 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200261 OID_DESCRIPTOR(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER,
262 "id-at-uniqueIdentifier",
263 "Unique Identifier"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200264 "uniqueIdentifier",
265 },
266 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200267 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200268 NULL,
269 }
270};
271
272FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
Jens Wiklander32b31802023-10-06 16:59:46 +0200273FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name,
274 oid_x520_attr_t,
275 x520_attr,
276 const char *,
277 short_name)
Jens Wiklander817466c2018-05-22 13:49:31 +0200278
279/*
280 * For X509 extensions
281 */
282typedef struct {
283 mbedtls_oid_descriptor_t descriptor;
284 int ext_type;
285} oid_x509_ext_t;
286
287static const oid_x509_ext_t oid_x509_ext[] =
288{
289 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200290 OID_DESCRIPTOR(MBEDTLS_OID_BASIC_CONSTRAINTS,
291 "id-ce-basicConstraints",
292 "Basic Constraints"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200293 MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS,
Jens Wiklander817466c2018-05-22 13:49:31 +0200294 },
295 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200296 OID_DESCRIPTOR(MBEDTLS_OID_KEY_USAGE, "id-ce-keyUsage", "Key Usage"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200297 MBEDTLS_OID_X509_EXT_KEY_USAGE,
Jens Wiklander817466c2018-05-22 13:49:31 +0200298 },
299 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200300 OID_DESCRIPTOR(MBEDTLS_OID_EXTENDED_KEY_USAGE,
301 "id-ce-extKeyUsage",
302 "Extended Key Usage"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200303 MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE,
Jens Wiklander817466c2018-05-22 13:49:31 +0200304 },
305 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200306 OID_DESCRIPTOR(MBEDTLS_OID_SUBJECT_ALT_NAME,
307 "id-ce-subjectAltName",
308 "Subject Alt Name"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200309 MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME,
Jens Wiklander817466c2018-05-22 13:49:31 +0200310 },
311 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200312 OID_DESCRIPTOR(MBEDTLS_OID_NS_CERT_TYPE,
313 "id-netscape-certtype",
314 "Netscape Certificate Type"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200315 MBEDTLS_OID_X509_EXT_NS_CERT_TYPE,
316 },
317 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200318 OID_DESCRIPTOR(MBEDTLS_OID_CERTIFICATE_POLICIES,
319 "id-ce-certificatePolicies",
320 "Certificate Policies"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200321 MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES,
Jens Wiklander817466c2018-05-22 13:49:31 +0200322 },
323 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200324 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200325 0,
326 },
327};
328
329FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
330FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)
331
Jens Wiklander32b31802023-10-06 16:59:46 +0200332#if !defined(MBEDTLS_X509_REMOVE_INFO)
Jens Wiklander817466c2018-05-22 13:49:31 +0200333static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
334{
Jens Wiklander32b31802023-10-06 16:59:46 +0200335 OID_DESCRIPTOR(MBEDTLS_OID_SERVER_AUTH,
336 "id-kp-serverAuth",
337 "TLS Web Server Authentication"),
338 OID_DESCRIPTOR(MBEDTLS_OID_CLIENT_AUTH,
339 "id-kp-clientAuth",
340 "TLS Web Client Authentication"),
341 OID_DESCRIPTOR(MBEDTLS_OID_CODE_SIGNING, "id-kp-codeSigning", "Code Signing"),
342 OID_DESCRIPTOR(MBEDTLS_OID_EMAIL_PROTECTION, "id-kp-emailProtection", "E-mail Protection"),
343 OID_DESCRIPTOR(MBEDTLS_OID_TIME_STAMPING, "id-kp-timeStamping", "Time Stamping"),
344 OID_DESCRIPTOR(MBEDTLS_OID_OCSP_SIGNING, "id-kp-OCSPSigning", "OCSP Signing"),
345 OID_DESCRIPTOR(MBEDTLS_OID_WISUN_FAN,
346 "id-kp-wisun-fan-device",
347 "Wi-SUN Alliance Field Area Network (FAN)"),
348 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200349};
350
351FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
Jens Wiklander32b31802023-10-06 16:59:46 +0200352FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage,
353 mbedtls_oid_descriptor_t,
354 ext_key_usage,
355 const char *,
356 description)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200357
358static const mbedtls_oid_descriptor_t oid_certificate_policies[] =
359{
Jens Wiklander32b31802023-10-06 16:59:46 +0200360 OID_DESCRIPTOR(MBEDTLS_OID_ANY_POLICY, "anyPolicy", "Any Policy"),
361 NULL_OID_DESCRIPTOR,
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200362};
363
364FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies)
Jens Wiklander32b31802023-10-06 16:59:46 +0200365FN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies,
366 mbedtls_oid_descriptor_t,
367 certificate_policies,
368 const char *,
369 description)
370#endif /* MBEDTLS_X509_REMOVE_INFO */
Jens Wiklander817466c2018-05-22 13:49:31 +0200371
Jens Wiklander817466c2018-05-22 13:49:31 +0200372/*
373 * For SignatureAlgorithmIdentifier
374 */
375typedef struct {
376 mbedtls_oid_descriptor_t descriptor;
377 mbedtls_md_type_t md_alg;
378 mbedtls_pk_type_t pk_alg;
379} oid_sig_alg_t;
380
381static const oid_sig_alg_t oid_sig_alg[] =
382{
383#if defined(MBEDTLS_RSA_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200384#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200385 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200386 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_MD5, "md5WithRSAEncryption", "RSA with MD5"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200387 MBEDTLS_MD_MD5, MBEDTLS_PK_RSA,
388 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200389#endif /* MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA */
390#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200391 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200392 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA1, "sha-1WithRSAEncryption", "RSA with SHA1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200393 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
394 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200395#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
396#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200397 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200398 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA224, "sha224WithRSAEncryption",
399 "RSA with SHA-224"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200400 MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA,
401 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200402#endif /* MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA */
403#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200404 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200405 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA256, "sha256WithRSAEncryption",
406 "RSA with SHA-256"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200407 MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA,
408 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200409#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
410#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200411 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200412 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA384, "sha384WithRSAEncryption",
413 "RSA with SHA-384"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200414 MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA,
415 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200416#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
417#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200418 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200419 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA512, "sha512WithRSAEncryption",
420 "RSA with SHA-512"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200421 MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA,
422 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200423#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
424#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200425 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200426 OID_DESCRIPTOR(MBEDTLS_OID_RSA_SHA_OBS, "sha-1WithRSAEncryption", "RSA with SHA1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200427 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
428 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200429#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
Jens Wiklander817466c2018-05-22 13:49:31 +0200430#endif /* MBEDTLS_RSA_C */
Jens Wiklander32b31802023-10-06 16:59:46 +0200431#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
432#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200433 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200434 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA1, "ecdsa-with-SHA1", "ECDSA with SHA1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200435 MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA,
436 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200437#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
438#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200439 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200440 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA224, "ecdsa-with-SHA224", "ECDSA with SHA224"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200441 MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA,
442 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200443#endif
444#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200445 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200446 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA256, "ecdsa-with-SHA256", "ECDSA with SHA256"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200447 MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA,
448 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200449#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
450#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200451 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200452 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA384, "ecdsa-with-SHA384", "ECDSA with SHA384"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200453 MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA,
454 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200455#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
456#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200457 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200458 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA512, "ecdsa-with-SHA512", "ECDSA with SHA512"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200459 MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA,
460 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200461#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
462#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
Jens Wiklander817466c2018-05-22 13:49:31 +0200463#if defined(MBEDTLS_RSA_C)
464 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200465 OID_DESCRIPTOR(MBEDTLS_OID_RSASSA_PSS, "RSASSA-PSS", "RSASSA-PSS"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200466 MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS,
467 },
468#endif /* MBEDTLS_RSA_C */
469 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200470 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200471 MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
472 },
473};
474
475FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
Jens Wiklander32b31802023-10-06 16:59:46 +0200476
477#if !defined(MBEDTLS_X509_REMOVE_INFO)
478FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc,
479 oid_sig_alg_t,
480 sig_alg,
481 const char *,
482 description)
483#endif
484
485FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg,
486 oid_sig_alg_t,
487 sig_alg,
488 mbedtls_md_type_t,
489 md_alg,
490 mbedtls_pk_type_t,
491 pk_alg)
492FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg,
493 oid_sig_alg_t,
494 oid_sig_alg,
495 mbedtls_pk_type_t,
496 pk_alg,
497 mbedtls_md_type_t,
498 md_alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200499
500/*
501 * For PublicKeyInfo (PKCS1, RFC 5480)
502 */
503typedef struct {
504 mbedtls_oid_descriptor_t descriptor;
505 mbedtls_pk_type_t pk_alg;
506} oid_pk_alg_t;
507
508static const oid_pk_alg_t oid_pk_alg[] =
509{
510 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200511 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_RSA, "rsaEncryption", "RSA"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200512 MBEDTLS_PK_RSA,
513 },
514 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200515 OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_UNRESTRICTED, "id-ecPublicKey", "Generic EC key"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200516 MBEDTLS_PK_ECKEY,
517 },
518 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200519 OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_ECDH, "id-ecDH", "EC key for ECDH"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200520 MBEDTLS_PK_ECKEY_DH,
521 },
522 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200523 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200524 MBEDTLS_PK_NONE,
525 },
526};
527
528FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)
529FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
Jens Wiklander32b31802023-10-06 16:59:46 +0200530FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg,
531 oid_pk_alg_t,
532 oid_pk_alg,
533 mbedtls_pk_type_t,
534 pk_alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200535
536#if defined(MBEDTLS_ECP_C)
537/*
538 * For namedCurve (RFC 5480)
539 */
540typedef struct {
541 mbedtls_oid_descriptor_t descriptor;
542 mbedtls_ecp_group_id grp_id;
543} oid_ecp_grp_t;
544
545static const oid_ecp_grp_t oid_ecp_grp[] =
546{
547#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
548 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200549 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192R1, "secp192r1", "secp192r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200550 MBEDTLS_ECP_DP_SECP192R1,
551 },
552#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
553#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
554 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200555 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224R1, "secp224r1", "secp224r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200556 MBEDTLS_ECP_DP_SECP224R1,
557 },
558#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
559#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
560 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200561 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256R1, "secp256r1", "secp256r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200562 MBEDTLS_ECP_DP_SECP256R1,
563 },
564#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
565#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
566 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200567 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP384R1, "secp384r1", "secp384r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200568 MBEDTLS_ECP_DP_SECP384R1,
569 },
570#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
571#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
572 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200573 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP521R1, "secp521r1", "secp521r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200574 MBEDTLS_ECP_DP_SECP521R1,
575 },
576#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
577#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
578 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200579 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192K1, "secp192k1", "secp192k1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200580 MBEDTLS_ECP_DP_SECP192K1,
581 },
582#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
583#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
584 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200585 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224K1, "secp224k1", "secp224k1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200586 MBEDTLS_ECP_DP_SECP224K1,
587 },
588#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
589#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
590 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200591 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256K1, "secp256k1", "secp256k1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200592 MBEDTLS_ECP_DP_SECP256K1,
593 },
594#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
595#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
596 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200597 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP256R1, "brainpoolP256r1", "brainpool256r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200598 MBEDTLS_ECP_DP_BP256R1,
599 },
600#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
601#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
602 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200603 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP384R1, "brainpoolP384r1", "brainpool384r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200604 MBEDTLS_ECP_DP_BP384R1,
605 },
606#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
607#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
608 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200609 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP512R1, "brainpoolP512r1", "brainpool512r1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200610 MBEDTLS_ECP_DP_BP512R1,
611 },
612#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
613 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200614 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200615 MBEDTLS_ECP_DP_NONE,
616 },
617};
618
619FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
620FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
Jens Wiklander32b31802023-10-06 16:59:46 +0200621FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp,
622 oid_ecp_grp_t,
623 oid_ecp_grp,
624 mbedtls_ecp_group_id,
625 grp_id)
Jens Wiklander817466c2018-05-22 13:49:31 +0200626#endif /* MBEDTLS_ECP_C */
627
628#if defined(MBEDTLS_CIPHER_C)
629/*
630 * For PKCS#5 PBES2 encryption algorithm
631 */
632typedef struct {
633 mbedtls_oid_descriptor_t descriptor;
634 mbedtls_cipher_type_t cipher_alg;
635} oid_cipher_alg_t;
636
637static const oid_cipher_alg_t oid_cipher_alg[] =
638{
639 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200640 OID_DESCRIPTOR(MBEDTLS_OID_DES_CBC, "desCBC", "DES-CBC"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200641 MBEDTLS_CIPHER_DES_CBC,
642 },
643 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200644 OID_DESCRIPTOR(MBEDTLS_OID_DES_EDE3_CBC, "des-ede3-cbc", "DES-EDE3-CBC"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200645 MBEDTLS_CIPHER_DES_EDE3_CBC,
646 },
647 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200648 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200649 MBEDTLS_CIPHER_NONE,
650 },
651};
652
653FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
Jens Wiklander32b31802023-10-06 16:59:46 +0200654FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg,
655 oid_cipher_alg_t,
656 cipher_alg,
657 mbedtls_cipher_type_t,
658 cipher_alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200659#endif /* MBEDTLS_CIPHER_C */
660
Jens Wiklander817466c2018-05-22 13:49:31 +0200661/*
662 * For digestAlgorithm
663 */
664typedef struct {
665 mbedtls_oid_descriptor_t descriptor;
666 mbedtls_md_type_t md_alg;
667} oid_md_alg_t;
668
669static const oid_md_alg_t oid_md_alg[] =
670{
Jens Wiklander32b31802023-10-06 16:59:46 +0200671#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200672 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200673 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_MD5, "id-md5", "MD5"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200674 MBEDTLS_MD_MD5,
675 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200676#endif
677#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200678 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200679 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA1, "id-sha1", "SHA-1"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200680 MBEDTLS_MD_SHA1,
681 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200682#endif
683#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200684 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200685 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA224, "id-sha224", "SHA-224"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200686 MBEDTLS_MD_SHA224,
687 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200688#endif
689#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200690 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200691 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA256, "id-sha256", "SHA-256"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200692 MBEDTLS_MD_SHA256,
693 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200694#endif
695#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200696 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200697 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA384, "id-sha384", "SHA-384"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200698 MBEDTLS_MD_SHA384,
699 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200700#endif
701#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander817466c2018-05-22 13:49:31 +0200702 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200703 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA512, "id-sha512", "SHA-512"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200704 MBEDTLS_MD_SHA512,
705 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200706#endif
707#if defined(MBEDTLS_HAS_ALG_RIPEMD160_VIA_LOWLEVEL_OR_PSA)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200708 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200709 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_RIPEMD160, "id-ripemd160", "RIPEMD-160"),
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200710 MBEDTLS_MD_RIPEMD160,
711 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200712#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200713 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200714 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200715 MBEDTLS_MD_NONE,
716 },
717};
718
719FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
720FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
Jens Wiklander32b31802023-10-06 16:59:46 +0200721FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md,
722 oid_md_alg_t,
723 oid_md_alg,
724 mbedtls_md_type_t,
725 md_alg)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100726
727/*
728 * For HMAC digestAlgorithm
729 */
730typedef struct {
731 mbedtls_oid_descriptor_t descriptor;
732 mbedtls_md_type_t md_hmac;
733} oid_md_hmac_t;
734
735static const oid_md_hmac_t oid_md_hmac[] =
736{
Jens Wiklander32b31802023-10-06 16:59:46 +0200737#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100738 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200739 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA1, "hmacSHA1", "HMAC-SHA-1"),
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100740 MBEDTLS_MD_SHA1,
741 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200742#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
743#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100744 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200745 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA224, "hmacSHA224", "HMAC-SHA-224"),
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100746 MBEDTLS_MD_SHA224,
747 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200748#endif
749#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100750 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200751 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA256, "hmacSHA256", "HMAC-SHA-256"),
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100752 MBEDTLS_MD_SHA256,
753 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200754#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
755#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100756 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200757 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA384, "hmacSHA384", "HMAC-SHA-384"),
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100758 MBEDTLS_MD_SHA384,
759 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200760#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
761#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100762 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200763 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA512, "hmacSHA512", "HMAC-SHA-512"),
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100764 MBEDTLS_MD_SHA512,
765 },
Jens Wiklander32b31802023-10-06 16:59:46 +0200766#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100767 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200768 NULL_OID_DESCRIPTOR,
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100769 MBEDTLS_MD_NONE,
770 },
771};
772
773FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac)
774FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac)
Jens Wiklander817466c2018-05-22 13:49:31 +0200775
776#if defined(MBEDTLS_PKCS12_C)
777/*
778 * For PKCS#12 PBEs
779 */
780typedef struct {
781 mbedtls_oid_descriptor_t descriptor;
782 mbedtls_md_type_t md_alg;
783 mbedtls_cipher_type_t cipher_alg;
784} oid_pkcs12_pbe_alg_t;
785
786static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
787{
788 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200789 OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC,
790 "pbeWithSHAAnd3-KeyTripleDES-CBC",
791 "PBE with SHA1 and 3-Key 3DES"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200792 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC,
793 },
794 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200795 OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC,
796 "pbeWithSHAAnd2-KeyTripleDES-CBC",
797 "PBE with SHA1 and 2-Key 3DES"),
Jens Wiklander817466c2018-05-22 13:49:31 +0200798 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC,
799 },
800 {
Jens Wiklander32b31802023-10-06 16:59:46 +0200801 NULL_OID_DESCRIPTOR,
Jens Wiklander817466c2018-05-22 13:49:31 +0200802 MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
803 },
804};
805
806FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
Jens Wiklander32b31802023-10-06 16:59:46 +0200807FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg,
808 oid_pkcs12_pbe_alg_t,
809 pkcs12_pbe_alg,
810 mbedtls_md_type_t,
811 md_alg,
812 mbedtls_cipher_type_t,
813 cipher_alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200814#endif /* MBEDTLS_PKCS12_C */
815
Jens Wiklander817466c2018-05-22 13:49:31 +0200816/* Return the x.y.z.... style numeric string for the given OID */
Jens Wiklander32b31802023-10-06 16:59:46 +0200817int mbedtls_oid_get_numeric_string(char *buf, size_t size,
818 const mbedtls_asn1_buf *oid)
Jens Wiklander817466c2018-05-22 13:49:31 +0200819{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200820 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander32b31802023-10-06 16:59:46 +0200821 char *p = buf;
822 size_t n = size;
823 unsigned int value = 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200824
Jens Wiklander32b31802023-10-06 16:59:46 +0200825 if (size > INT_MAX) {
826 /* Avoid overflow computing return value */
827 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
Jens Wiklander817466c2018-05-22 13:49:31 +0200828 }
829
Jens Wiklander32b31802023-10-06 16:59:46 +0200830 if (oid->len <= 0) {
831 /* OID must not be empty */
832 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
833 }
834
835 for (size_t i = 0; i < oid->len; i++) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200836 /* Prevent overflow in value. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200837 if (value > (UINT_MAX >> 7)) {
838 return MBEDTLS_ERR_ASN1_INVALID_DATA;
839 }
840 if ((value == 0) && ((oid->p[i]) == 0x80)) {
841 /* Overlong encoding is not allowed */
842 return MBEDTLS_ERR_ASN1_INVALID_DATA;
843 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200844
845 value <<= 7;
Jens Wiklander32b31802023-10-06 16:59:46 +0200846 value |= oid->p[i] & 0x7F;
Jens Wiklander817466c2018-05-22 13:49:31 +0200847
Jens Wiklander32b31802023-10-06 16:59:46 +0200848 if (!(oid->p[i] & 0x80)) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200849 /* Last byte */
Jens Wiklander32b31802023-10-06 16:59:46 +0200850 if (n == size) {
851 int component1;
852 unsigned int component2;
853 /* First subidentifier contains first two OID components */
854 if (value >= 80) {
855 component1 = '2';
856 component2 = value - 80;
857 } else if (value >= 40) {
858 component1 = '1';
859 component2 = value - 40;
860 } else {
861 component1 = '0';
862 component2 = value;
863 }
864 ret = mbedtls_snprintf(p, n, "%c.%u", component1, component2);
865 } else {
866 ret = mbedtls_snprintf(p, n, ".%u", value);
867 }
868 if (ret < 2 || (size_t) ret >= n) {
869 return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
870 }
871 n -= (size_t) ret;
872 p += ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200873 value = 0;
874 }
875 }
876
Jens Wiklander32b31802023-10-06 16:59:46 +0200877 if (value != 0) {
878 /* Unterminated subidentifier */
879 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
880 }
881
882 return (int) (size - n);
Jens Wiklander817466c2018-05-22 13:49:31 +0200883}
884
885#endif /* MBEDTLS_OID_C */