blob: 88165d3120c049d1a891e636f4585b8f1e4e2c48 [file] [log] [blame]
Paul Bakkerc70b9822013-04-07 22:00:46 +02001/**
2 * \file oid.c
3 *
4 * \brief Object Identifier (OID) database
5 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02006 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Paul Bakkerc70b9822013-04-07 22:00:46 +020020 */
21
Gilles Peskinedb09ef62020-06-03 01:43:33 +020022#include "common.h"
Paul Bakkerc70b9822013-04-07 22:00:46 +020023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024#if defined(MBEDTLS_OID_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +020025
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000026#include "mbedtls/oid.h"
27#include "mbedtls/rsa.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000028#include "mbedtls/error.h"
Valerio Setti178b5bd2023-02-13 10:04:28 +010029#include "mbedtls/pk.h"
Paul Bakkerc70b9822013-04-07 22:00:46 +020030
Manuel Pégourié-Gonnard07018f92022-09-15 11:29:35 +020031#include "mbedtls/legacy_or_psa.h"
Manuel Pégourié-Gonnardf88b1b52022-07-15 11:05:05 +020032
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <stdio.h>
34#include <string.h>
35
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000036#include "mbedtls/platform.h"
Rich Evans8f3a9432015-01-30 10:54:04 +000037
Paul Bakkerdd1150e2013-06-28 17:20:22 +020038/*
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +020039 * Macro to automatically add the size of #define'd OIDs
40 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s)
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +020042
43/*
Peter Kolbus9a969b62018-12-11 13:55:56 -060044 * Macro to generate mbedtls_oid_descriptor_t
45 */
Hanno Becker612a2f12020-10-09 09:19:39 +010046#if !defined(MBEDTLS_X509_REMOVE_INFO)
Peter Kolbus9a969b62018-12-11 13:55:56 -060047#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/*
Paul Bakkerdd1150e2013-06-28 17:20:22 +020055 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
56 * the other functions)
57 */
Gilles Peskine449bd832023-01-11 14:50:10 +010058#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) \
Hanno Becker1eeca412018-10-15 12:01:35 +010061 { \
62 const TYPE_T *p = (LIST); \
63 const mbedtls_oid_descriptor_t *cur = \
64 (const mbedtls_oid_descriptor_t *) p; \
Gilles Peskine449bd832023-01-11 14:50:10 +010065 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; \
Hanno Becker1eeca412018-10-15 12:01:35 +010070 } \
71 p++; \
72 cur = (const mbedtls_oid_descriptor_t *) p; \
73 } \
Gilles Peskine449bd832023-01-11 14:50:10 +010074 return NULL; \
Hanno Becker1eeca412018-10-15 12:01:35 +010075 }
Paul Bakkerbd51ad52013-06-28 16:51:52 +020076
Hanno Becker612a2f12020-10-09 09:19:39 +010077#if !defined(MBEDTLS_X509_REMOVE_INFO)
Paul Bakkerbd51ad52013-06-28 16:51:52 +020078/*
Paul Bakkerdd1150e2013-06-28 17:20:22 +020079 * Macro to generate a function for retrieving a single attribute from the
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 * descriptor of an mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +020081 */
82#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Gilles Peskine449bd832023-01-11 14:50:10 +010083 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 }
Hanno Becker612a2f12020-10-09 09:19:39 +010090#endif /* MBEDTLS_X509_REMOVE_INFO */
Paul Bakkerdd1150e2013-06-28 17:20:22 +020091
92/*
93 * Macro to generate a function for retrieving a single attribute from an
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094 * mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +020095 */
96#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Gilles Peskine449bd832023-01-11 14:50:10 +010097 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 }
Paul Bakkerdd1150e2013-06-28 17:20:22 +0200104
105/*
106 * Macro to generate a function for retrieving two attributes from an
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200107 * mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +0200108 */
109#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
110 ATTR2_TYPE, ATTR2) \
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 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 }
Paul Bakkerdd1150e2013-06-28 17:20:22 +0200120
121/*
Paul Bakkerce6ae232013-06-28 18:05:35 +0200122 * Macro to generate a function for retrieving the OID based on a single
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123 * attribute from a mbedtls_oid_descriptor_t wrapper.
Paul Bakkerce6ae232013-06-28 18:05:35 +0200124 */
125#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 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 }
Paul Bakkerce6ae232013-06-28 18:05:35 +0200139
140/*
141 * Macro to generate a function for retrieving the OID based on two
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200142 * attributes from a mbedtls_oid_descriptor_t wrapper.
Paul Bakkerce6ae232013-06-28 18:05:35 +0200143 */
144#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
145 ATTR2_TYPE, ATTR2) \
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 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 }
Paul Bakkerce6ae232013-06-28 18:05:35 +0200160
161/*
Paul Bakkerc70b9822013-04-07 22:00:46 +0200162 * For X520 attribute types
163 */
164typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200165 mbedtls_oid_descriptor_t descriptor;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200166 const char *short_name;
167} oid_x520_attr_t;
168
169static const oid_x520_attr_t oid_x520_attr_type[] =
170{
171 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100172 OID_DESCRIPTOR(MBEDTLS_OID_AT_CN, "id-at-commonName", "Common Name"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200173 "CN",
174 },
175 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 OID_DESCRIPTOR(MBEDTLS_OID_AT_COUNTRY, "id-at-countryName", "Country"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200177 "C",
178 },
179 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100180 OID_DESCRIPTOR(MBEDTLS_OID_AT_LOCALITY, "id-at-locality", "Locality"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200181 "L",
182 },
183 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 OID_DESCRIPTOR(MBEDTLS_OID_AT_STATE, "id-at-state", "State"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200185 "ST",
186 },
187 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 OID_DESCRIPTOR(MBEDTLS_OID_AT_ORGANIZATION, "id-at-organizationName",
189 "Organization"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200190 "O",
191 },
192 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 OID_DESCRIPTOR(MBEDTLS_OID_AT_ORG_UNIT, "id-at-organizationalUnitName", "Org Unit"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200194 "OU",
195 },
196 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 OID_DESCRIPTOR(MBEDTLS_OID_PKCS9_EMAIL,
198 "emailAddress",
199 "E-mail address"),
Paul Bakkerc70b9822013-04-07 22:00:46 +0200200 "emailAddress",
201 },
202 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100203 OID_DESCRIPTOR(MBEDTLS_OID_AT_SERIAL_NUMBER,
204 "id-at-serialNumber",
205 "Serial number"),
Paul Bakker7b0be682013-10-29 14:24:37 +0100206 "serialNumber",
207 },
208 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_ADDRESS,
210 "id-at-postalAddress",
211 "Postal address"),
Paul Bakker7b0be682013-10-29 14:24:37 +0100212 "postalAddress",
213 },
214 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 OID_DESCRIPTOR(MBEDTLS_OID_AT_POSTAL_CODE, "id-at-postalCode", "Postal code"),
Paul Bakker7b0be682013-10-29 14:24:37 +0100216 "postalCode",
217 },
218 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 OID_DESCRIPTOR(MBEDTLS_OID_AT_SUR_NAME, "id-at-surName", "Surname"),
Paul Bakker63844402014-04-30 15:34:12 +0200220 "SN",
221 },
222 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 OID_DESCRIPTOR(MBEDTLS_OID_AT_GIVEN_NAME, "id-at-givenName", "Given name"),
Paul Bakker63844402014-04-30 15:34:12 +0200224 "GN",
225 },
226 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 OID_DESCRIPTOR(MBEDTLS_OID_AT_INITIALS, "id-at-initials", "Initials"),
Paul Bakker63844402014-04-30 15:34:12 +0200228 "initials",
229 },
230 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 OID_DESCRIPTOR(MBEDTLS_OID_AT_GENERATION_QUALIFIER,
232 "id-at-generationQualifier",
233 "Generation qualifier"),
Paul Bakker63844402014-04-30 15:34:12 +0200234 "generationQualifier",
235 },
236 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 OID_DESCRIPTOR(MBEDTLS_OID_AT_TITLE, "id-at-title", "Title"),
Paul Bakker63844402014-04-30 15:34:12 +0200238 "title",
239 },
240 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 OID_DESCRIPTOR(MBEDTLS_OID_AT_DN_QUALIFIER,
242 "id-at-dnQualifier",
243 "Distinguished Name qualifier"),
Paul Bakker63844402014-04-30 15:34:12 +0200244 "dnQualifier",
245 },
246 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 OID_DESCRIPTOR(MBEDTLS_OID_AT_PSEUDONYM, "id-at-pseudonym", "Pseudonym"),
Paul Bakker63844402014-04-30 15:34:12 +0200248 "pseudonym",
249 },
250 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 OID_DESCRIPTOR(MBEDTLS_OID_UID, "id-uid", "User Id"),
Micah N Gorrell21d4bdb2021-05-12 17:41:24 -0600252 "uid",
253 },
254 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 OID_DESCRIPTOR(MBEDTLS_OID_DOMAIN_COMPONENT,
256 "id-domainComponent",
257 "Domain component"),
Paul Bakker63844402014-04-30 15:34:12 +0200258 "DC",
259 },
260 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 OID_DESCRIPTOR(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER,
262 "id-at-uniqueIdentifier",
263 "Unique Identifier"),
Manuel Pégourié-Gonnard9409e0c2015-03-27 13:03:54 +0100264 "uniqueIdentifier",
265 },
266 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600267 NULL_OID_DESCRIPTOR,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200268 NULL,
269 }
270};
271
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200272FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
Gilles Peskine449bd832023-01-11 14:50:10 +0100273FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name,
274 oid_x520_attr_t,
275 x520_attr,
276 const char *,
277 short_name)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200278
Paul Bakkerc70b9822013-04-07 22:00:46 +0200279/*
280 * For X509 extensions
281 */
282typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 mbedtls_oid_descriptor_t descriptor;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200284 int ext_type;
285} oid_x509_ext_t;
286
287static const oid_x509_ext_t oid_x509_ext[] =
288{
289 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 OID_DESCRIPTOR(MBEDTLS_OID_BASIC_CONSTRAINTS,
291 "id-ce-basicConstraints",
292 "Basic Constraints"),
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100293 MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200294 },
295 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 OID_DESCRIPTOR(MBEDTLS_OID_KEY_USAGE, "id-ce-keyUsage", "Key Usage"),
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100297 MBEDTLS_OID_X509_EXT_KEY_USAGE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200298 },
299 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 OID_DESCRIPTOR(MBEDTLS_OID_EXTENDED_KEY_USAGE,
301 "id-ce-extKeyUsage",
302 "Extended Key Usage"),
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100303 MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200304 },
305 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 OID_DESCRIPTOR(MBEDTLS_OID_SUBJECT_ALT_NAME,
307 "id-ce-subjectAltName",
308 "Subject Alt Name"),
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100309 MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200310 },
311 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 OID_DESCRIPTOR(MBEDTLS_OID_NS_CERT_TYPE,
313 "id-netscape-certtype",
314 "Netscape Certificate Type"),
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100315 MBEDTLS_OID_X509_EXT_NS_CERT_TYPE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200316 },
317 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 OID_DESCRIPTOR(MBEDTLS_OID_CERTIFICATE_POLICIES,
319 "id-ce-certificatePolicies",
320 "Certificate Policies"),
Ron Eldore8234162019-04-03 09:45:07 +0300321 MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES,
322 },
323 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600324 NULL_OID_DESCRIPTOR,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200325 0,
326 },
327};
328
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200329FN_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)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200331
Hanno Becker612a2f12020-10-09 09:19:39 +0100332#if !defined(MBEDTLS_X509_REMOVE_INFO)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
Paul Bakkerc70b9822013-04-07 22:00:46 +0200334{
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 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)"),
Peter Kolbus9a969b62018-12-11 13:55:56 -0600348 NULL_OID_DESCRIPTOR,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200349};
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200350
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200351FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
Gilles Peskine449bd832023-01-11 14:50:10 +0100352FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage,
353 mbedtls_oid_descriptor_t,
354 ext_key_usage,
355 const char *,
356 description)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200357
Ron Eldor11ee0712019-03-25 18:22:52 +0200358static const mbedtls_oid_descriptor_t oid_certificate_policies[] =
359{
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 OID_DESCRIPTOR(MBEDTLS_OID_ANY_POLICY, "anyPolicy", "Any Policy"),
Peter Kolbus9a969b62018-12-11 13:55:56 -0600361 NULL_OID_DESCRIPTOR,
Ron Eldor11ee0712019-03-25 18:22:52 +0200362};
363
364FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies)
Gilles Peskine449bd832023-01-11 14:50:10 +0100365FN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies,
366 mbedtls_oid_descriptor_t,
367 certificate_policies,
368 const char *,
369 description)
Hanno Becker612a2f12020-10-09 09:19:39 +0100370#endif /* MBEDTLS_X509_REMOVE_INFO */
Ron Eldor11ee0712019-03-25 18:22:52 +0200371
Paul Bakkerc70b9822013-04-07 22:00:46 +0200372/*
373 * For SignatureAlgorithmIdentifier
374 */
375typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 mbedtls_oid_descriptor_t descriptor;
377 mbedtls_md_type_t md_alg;
378 mbedtls_pk_type_t pk_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200379} oid_sig_alg_t;
380
381static const oid_sig_alg_t oid_sig_alg[] =
382{
palaviv06f18282016-08-06 23:00:38 +0300383#if defined(MBEDTLS_RSA_C)
Przemek Stekielbf01c642022-08-18 13:41:18 +0200384#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200385 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_MD5, "md5WithRSAEncryption", "RSA with MD5"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387 MBEDTLS_MD_MD5, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200388 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200389#endif /* MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielde810282022-08-02 23:28:04 +0200390#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200391 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA1, "sha-1WithRSAEncryption", "RSA with SHA1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200394 },
Przemek Stekielde810282022-08-02 23:28:04 +0200395#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
396#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200397 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA224, "sha224WithRSAEncryption",
399 "RSA with SHA-224"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200400 MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200401 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200402#endif /* MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielde810282022-08-02 23:28:04 +0200403#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200404 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100405 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA256, "sha256WithRSAEncryption",
406 "RSA with SHA-256"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200408 },
Przemek Stekielde810282022-08-02 23:28:04 +0200409#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielbf01c642022-08-18 13:41:18 +0200410#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200411 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA384, "sha384WithRSAEncryption",
413 "RSA with SHA-384"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200415 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200416#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
417#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200418 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_SHA512, "sha512WithRSAEncryption",
420 "RSA with SHA-512"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200422 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200423#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielde810282022-08-02 23:28:04 +0200424#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200425 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 OID_DESCRIPTOR(MBEDTLS_OID_RSA_SHA_OBS, "sha-1WithRSAEncryption", "RSA with SHA1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200428 },
Przemek Stekielde810282022-08-02 23:28:04 +0200429#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
palaviv06f18282016-08-06 23:00:38 +0300430#endif /* MBEDTLS_RSA_C */
Valerio Settif972ce82023-01-31 14:29:55 +0100431#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Przemek Stekielde810282022-08-02 23:28:04 +0200432#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200433 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA1, "ecdsa-with-SHA1", "ECDSA with SHA1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200436 },
Przemek Stekielde810282022-08-02 23:28:04 +0200437#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
438#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200439 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA224, "ecdsa-with-SHA224", "ECDSA with SHA224"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200442 },
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200443#endif
Przemek Stekielde810282022-08-02 23:28:04 +0200444#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200445 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100446 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA256, "ecdsa-with-SHA256", "ECDSA with SHA256"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447 MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200448 },
Przemek Stekielde810282022-08-02 23:28:04 +0200449#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielbf01c642022-08-18 13:41:18 +0200450#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200451 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100452 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA384, "ecdsa-with-SHA384", "ECDSA with SHA384"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200454 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200455#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
456#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200457 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100458 OID_DESCRIPTOR(MBEDTLS_OID_ECDSA_SHA512, "ecdsa-with-SHA512", "ECDSA with SHA512"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200460 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200461#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
Valerio Settice0caa32023-02-02 14:18:52 +0100462#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
palaviv06f18282016-08-06 23:00:38 +0300463#if defined(MBEDTLS_RSA_C)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200464 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100465 OID_DESCRIPTOR(MBEDTLS_OID_RSASSA_PSS, "RSASSA-PSS", "RSASSA-PSS"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS,
Manuel Pégourié-Gonnard59a75d52014-01-22 10:12:57 +0100467 },
palaviv06f18282016-08-06 23:00:38 +0300468#endif /* MBEDTLS_RSA_C */
Manuel Pégourié-Gonnard59a75d52014-01-22 10:12:57 +0100469 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600470 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471 MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200472 },
473};
474
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200475FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
Peter Kolbus9a969b62018-12-11 13:55:56 -0600476
Hanno Becker612a2f12020-10-09 09:19:39 +0100477#if !defined(MBEDTLS_X509_REMOVE_INFO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100478FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc,
479 oid_sig_alg_t,
480 sig_alg,
481 const char *,
482 description)
Peter Kolbus9a969b62018-12-11 13:55:56 -0600483#endif
484
Gilles Peskine449bd832023-01-11 14:50:10 +0100485FN_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)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200499
Paul Bakkerc70b9822013-04-07 22:00:46 +0200500/*
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200501 * For PublicKeyInfo (PKCS1, RFC 5480)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200502 */
503typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200504 mbedtls_oid_descriptor_t descriptor;
505 mbedtls_pk_type_t pk_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200506} oid_pk_alg_t;
507
508static const oid_pk_alg_t oid_pk_alg[] =
509{
510 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 OID_DESCRIPTOR(MBEDTLS_OID_PKCS1_RSA, "rsaEncryption", "RSA"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200512 MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200513 },
514 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100515 OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_UNRESTRICTED, "id-ecPublicKey", "Generic EC key"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 MBEDTLS_PK_ECKEY,
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200517 },
518 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 OID_DESCRIPTOR(MBEDTLS_OID_EC_ALG_ECDH, "id-ecDH", "EC key for ECDH"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520 MBEDTLS_PK_ECKEY_DH,
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200521 },
522 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600523 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 MBEDTLS_PK_NONE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200525 },
526};
527
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200528FN_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)
Gilles Peskine449bd832023-01-11 14:50:10 +0100530FN_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)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200536#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200537/*
538 * For namedCurve (RFC 5480)
539 */
540typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200541 mbedtls_oid_descriptor_t descriptor;
542 mbedtls_ecp_group_id grp_id;
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200543} oid_ecp_grp_t;
544
545static const oid_ecp_grp_t oid_ecp_grp[] =
546{
palaviva9f90f02016-08-06 23:10:49 +0300547#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200548 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192R1, "secp192r1", "secp192r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550 MBEDTLS_ECP_DP_SECP192R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200551 },
palaviva9f90f02016-08-06 23:10:49 +0300552#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
553#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200554 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224R1, "secp224r1", "secp224r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200556 MBEDTLS_ECP_DP_SECP224R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200557 },
palaviva9f90f02016-08-06 23:10:49 +0300558#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
559#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200560 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100561 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256R1, "secp256r1", "secp256r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 MBEDTLS_ECP_DP_SECP256R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200563 },
palaviva9f90f02016-08-06 23:10:49 +0300564#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
565#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200566 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP384R1, "secp384r1", "secp384r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 MBEDTLS_ECP_DP_SECP384R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200569 },
palaviva9f90f02016-08-06 23:10:49 +0300570#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
571#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200572 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100573 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP521R1, "secp521r1", "secp521r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 MBEDTLS_ECP_DP_SECP521R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200575 },
palaviva9f90f02016-08-06 23:10:49 +0300576#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
577#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200578 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100579 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP192K1, "secp192k1", "secp192k1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 MBEDTLS_ECP_DP_SECP192K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100581 },
palaviva9f90f02016-08-06 23:10:49 +0300582#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
583#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100584 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP224K1, "secp224k1", "secp224k1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586 MBEDTLS_ECP_DP_SECP224K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100587 },
palaviva9f90f02016-08-06 23:10:49 +0300588#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
589#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100590 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_SECP256K1, "secp256k1", "secp256k1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 MBEDTLS_ECP_DP_SECP256K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100593 },
palaviva9f90f02016-08-06 23:10:49 +0300594#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
595#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100596 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP256R1, "brainpoolP256r1", "brainpool256r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598 MBEDTLS_ECP_DP_BP256R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200599 },
palaviva9f90f02016-08-06 23:10:49 +0300600#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
601#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200602 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP384R1, "brainpoolP384r1", "brainpool384r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604 MBEDTLS_ECP_DP_BP384R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200605 },
palaviva9f90f02016-08-06 23:10:49 +0300606#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
607#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200608 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 OID_DESCRIPTOR(MBEDTLS_OID_EC_GRP_BP512R1, "brainpoolP512r1", "brainpool512r1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200610 MBEDTLS_ECP_DP_BP512R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200611 },
palaviva9f90f02016-08-06 23:10:49 +0300612#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200613 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600614 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615 MBEDTLS_ECP_DP_NONE,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200616 },
617};
618
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200619FN_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)
Gilles Peskine449bd832023-01-11 14:50:10 +0100621FN_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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_CIPHER_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200629/*
Paul Bakker9b5e8852013-06-28 16:12:50 +0200630 * For PKCS#5 PBES2 encryption algorithm
631 */
632typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633 mbedtls_oid_descriptor_t descriptor;
634 mbedtls_cipher_type_t cipher_alg;
Paul Bakker9b5e8852013-06-28 16:12:50 +0200635} oid_cipher_alg_t;
636
637static const oid_cipher_alg_t oid_cipher_alg[] =
638{
639 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 OID_DESCRIPTOR(MBEDTLS_OID_DES_CBC, "desCBC", "DES-CBC"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641 MBEDTLS_CIPHER_DES_CBC,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200642 },
643 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 OID_DESCRIPTOR(MBEDTLS_OID_DES_EDE3_CBC, "des-ede3-cbc", "DES-EDE3-CBC"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645 MBEDTLS_CIPHER_DES_EDE3_CBC,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200646 },
647 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600648 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649 MBEDTLS_CIPHER_NONE,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200650 },
651};
652
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200653FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
Gilles Peskine449bd832023-01-11 14:50:10 +0100654FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg,
655 oid_cipher_alg_t,
656 cipher_alg,
657 mbedtls_cipher_type_t,
658 cipher_alg)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200659#endif /* MBEDTLS_CIPHER_C */
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200660
Paul Bakker9b5e8852013-06-28 16:12:50 +0200661/*
Paul Bakkerc70b9822013-04-07 22:00:46 +0200662 * For digestAlgorithm
663 */
664typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 mbedtls_oid_descriptor_t descriptor;
666 mbedtls_md_type_t md_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200667} oid_md_alg_t;
668
669static const oid_md_alg_t oid_md_alg[] =
670{
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200671#if defined(MBEDTLS_HAS_ALG_MD5_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200672 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_MD5, "id-md5", "MD5"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674 MBEDTLS_MD_MD5,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200675 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200676#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200677#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200678 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA1, "id-sha1", "SHA-1"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680 MBEDTLS_MD_SHA1,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200681 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200682#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200683#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200684 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA224, "id-sha224", "SHA-224"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 MBEDTLS_MD_SHA224,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200687 },
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200688#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200689#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200690 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA256, "id-sha256", "SHA-256"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692 MBEDTLS_MD_SHA256,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200693 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200694#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200695#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200696 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100697 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA384, "id-sha384", "SHA-384"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698 MBEDTLS_MD_SHA384,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200699 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200700#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200701#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200702 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_SHA512, "id-sha512", "SHA-512"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200704 MBEDTLS_MD_SHA512,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200705 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200706#endif
Manuel Pégourié-Gonnard73692b72022-07-21 10:40:13 +0200707#if defined(MBEDTLS_HAS_ALG_RIPEMD160_VIA_LOWLEVEL_OR_PSA)
Jack Lloyd5d9c9632019-05-01 13:43:53 -0400708 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 OID_DESCRIPTOR(MBEDTLS_OID_DIGEST_ALG_RIPEMD160, "id-ripemd160", "RIPEMD-160"),
Jack Lloyd5d9c9632019-05-01 13:43:53 -0400710 MBEDTLS_MD_RIPEMD160,
711 },
Manuel Pégourié-Gonnardfe2b9b52022-07-05 11:35:52 +0200712#endif
Paul Bakkerc70b9822013-04-07 22:00:46 +0200713 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600714 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 MBEDTLS_MD_NONE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200716 },
717};
718
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200719FN_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)
Gilles Peskine449bd832023-01-11 14:50:10 +0100721FN_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)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800726
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{
Przemek Stekielde810282022-08-02 23:28:04 +0200737#if defined(MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800738 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA1, "hmacSHA1", "HMAC-SHA-1"),
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800740 MBEDTLS_MD_SHA1,
741 },
Przemek Stekielde810282022-08-02 23:28:04 +0200742#endif /* MBEDTLS_HAS_ALG_SHA_1_VIA_LOWLEVEL_OR_PSA */
743#if defined(MBEDTLS_HAS_ALG_SHA_224_VIA_LOWLEVEL_OR_PSA)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800744 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA224, "hmacSHA224", "HMAC-SHA-224"),
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800746 MBEDTLS_MD_SHA224,
747 },
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200748#endif
Przemek Stekielde810282022-08-02 23:28:04 +0200749#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800750 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100751 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA256, "hmacSHA256", "HMAC-SHA-256"),
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800752 MBEDTLS_MD_SHA256,
753 },
Przemek Stekielde810282022-08-02 23:28:04 +0200754#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_LOWLEVEL_OR_PSA */
Przemek Stekielbf01c642022-08-18 13:41:18 +0200755#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800756 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA384, "hmacSHA384", "HMAC-SHA-384"),
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800758 MBEDTLS_MD_SHA384,
759 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200760#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_LOWLEVEL_OR_PSA */
761#if defined(MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800762 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100763 OID_DESCRIPTOR(MBEDTLS_OID_HMAC_SHA512, "hmacSHA512", "HMAC-SHA-512"),
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800764 MBEDTLS_MD_SHA512,
765 },
Przemek Stekielbf01c642022-08-18 13:41:18 +0200766#endif /* MBEDTLS_HAS_ALG_SHA_512_VIA_LOWLEVEL_OR_PSA */
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800767 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600768 NULL_OID_DESCRIPTOR,
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800769 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)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200775
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200776#if defined(MBEDTLS_PKCS12_C)
Paul Bakker7749a222013-06-28 17:28:20 +0200777/*
778 * For PKCS#12 PBEs
779 */
780typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 mbedtls_oid_descriptor_t descriptor;
782 mbedtls_md_type_t md_alg;
783 mbedtls_cipher_type_t cipher_alg;
Paul Bakker7749a222013-06-28 17:28:20 +0200784} oid_pkcs12_pbe_alg_t;
785
786static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
787{
788 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100789 OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC,
790 "pbeWithSHAAnd3-KeyTripleDES-CBC",
791 "PBE with SHA1 and 3-Key 3DES"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC,
Paul Bakker7749a222013-06-28 17:28:20 +0200793 },
794 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100795 OID_DESCRIPTOR(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC,
796 "pbeWithSHAAnd2-KeyTripleDES-CBC",
797 "PBE with SHA1 and 2-Key 3DES"),
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC,
Paul Bakker7749a222013-06-28 17:28:20 +0200799 },
800 {
Peter Kolbus9a969b62018-12-11 13:55:56 -0600801 NULL_OID_DESCRIPTOR,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802 MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
Paul Bakker7749a222013-06-28 17:28:20 +0200803 },
804};
805
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200806FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
Gilles Peskine449bd832023-01-11 14:50:10 +0100807FN_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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814#endif /* MBEDTLS_PKCS12_C */
Paul Bakker7749a222013-06-28 17:28:20 +0200815
Manuel Pégourié-Gonnard9dbaf402015-06-22 11:50:58 +0200816#define OID_SAFE_SNPRINTF \
817 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100818 if (ret < 0 || (size_t) ret >= n) \
819 return MBEDTLS_ERR_OID_BUF_TOO_SMALL; \
820 \
Manuel Pégourié-Gonnard9dbaf402015-06-22 11:50:58 +0200821 n -= (size_t) ret; \
822 p += (size_t) ret; \
Gilles Peskine449bd832023-01-11 14:50:10 +0100823 } while (0)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200824
825/* Return the x.y.z.... style numeric string for the given OID */
Gilles Peskine449bd832023-01-11 14:50:10 +0100826int mbedtls_oid_get_numeric_string(char *buf, size_t size,
827 const mbedtls_asn1_buf *oid)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200828{
Janos Follath24eed8d2019-11-22 13:21:35 +0000829 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200830 size_t i, n;
831 unsigned int value;
832 char *p;
833
834 p = buf;
835 n = size;
836
David Horstmannc7f700c2023-02-14 14:34:15 +0000837 /* First subidentifier contains first two OID components */
838 i = 0;
839 value = 0;
David Horstmann9c1887c2023-02-15 11:48:13 +0000840 if ((oid->p[0]) == 0x80) {
841 /* Overlong encoding is not allowed */
David Horstmann5b5a0b62023-02-20 14:21:23 +0000842 return MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmann9c1887c2023-02-15 11:48:13 +0000843 }
844
David Horstmannc7f700c2023-02-14 14:34:15 +0000845 while (i < oid->len && ((oid->p[i] & 0x80) != 0)) {
846 /* Prevent overflow in value. */
David Horstmann34b3f1b2023-02-15 13:46:53 +0000847 if (value > (UINT_MAX >> 7)) {
David Horstmann5b5a0b62023-02-20 14:21:23 +0000848 return MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmannc7f700c2023-02-14 14:34:15 +0000849 }
850
David Horstmannf51851d2023-02-15 15:44:24 +0000851 value |= oid->p[i] & 0x7F;
David Horstmannc7f700c2023-02-14 14:34:15 +0000852 value <<= 7;
853 i++;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200854 }
David Horstmannc7f700c2023-02-14 14:34:15 +0000855 if (i >= oid->len) {
David Horstmann5b5a0b62023-02-20 14:21:23 +0000856 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
David Horstmannc7f700c2023-02-14 14:34:15 +0000857 }
858 /* Last byte of first subidentifier */
David Horstmannf51851d2023-02-15 15:44:24 +0000859 value |= oid->p[i] & 0x7F;
David Horstmannc7f700c2023-02-14 14:34:15 +0000860 i++;
861
862 unsigned int component1 = value / 40;
863 if (component1 > 2) {
864 /* The first component can only be 0, 1 or 2.
865 * If oid->p[0] / 40 is greater than 2, the leftover belongs to
866 * the second component. */
867 component1 = 2;
868 }
869 unsigned int component2 = value - (40 * component1);
870 ret = mbedtls_snprintf(p, n, "%u.%u", component1, component2);
871 OID_SAFE_SNPRINTF;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200872
Paul Bakkerc70b9822013-04-07 22:00:46 +0200873 value = 0;
David Horstmannc7f700c2023-02-14 14:34:15 +0000874 for (; i < oid->len; i++) {
Manuel Pégourié-Gonnarddffba8f2013-07-01 17:33:31 +0200875 /* Prevent overflow in value. */
David Horstmann34b3f1b2023-02-15 13:46:53 +0000876 if (value > (UINT_MAX >> 7)) {
David Horstmann5b5a0b62023-02-20 14:21:23 +0000877 return MBEDTLS_ERR_ASN1_INVALID_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100878 }
David Horstmann9c1887c2023-02-15 11:48:13 +0000879 if ((value == 0) && ((oid->p[i]) == 0x80)) {
880 /* Overlong encoding is not allowed */
David Horstmann5b5a0b62023-02-20 14:21:23 +0000881 return MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmann9c1887c2023-02-15 11:48:13 +0000882 }
Manuel Pégourié-Gonnarddffba8f2013-07-01 17:33:31 +0200883
Paul Bakkerc70b9822013-04-07 22:00:46 +0200884 value <<= 7;
David Horstmannf51851d2023-02-15 15:44:24 +0000885 value |= oid->p[i] & 0x7F;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200886
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 if (!(oid->p[i] & 0x80)) {
Paul Bakkerc70b9822013-04-07 22:00:46 +0200888 /* Last byte */
Gilles Peskine449bd832023-01-11 14:50:10 +0100889 ret = mbedtls_snprintf(p, n, ".%u", value);
Manuel Pégourié-Gonnard9dbaf402015-06-22 11:50:58 +0200890 OID_SAFE_SNPRINTF;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200891 value = 0;
892 }
893 }
894
Gilles Peskine449bd832023-01-11 14:50:10 +0100895 return (int) (size - n);
Paul Bakkerc70b9822013-04-07 22:00:46 +0200896}
897
David Horstmann0f4ee412023-02-21 16:17:41 +0000898static int oid_parse_number(unsigned int *num, const char **p, const char *bound)
David Horstmann92337c02023-01-18 18:40:49 +0000899{
900 int ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmannada7d722023-05-31 14:49:56 +0100901
David Horstmann0f4ee412023-02-21 16:17:41 +0000902 *num = 0;
David Horstmannada7d722023-05-31 14:49:56 +0100903
David Horstmann92337c02023-01-18 18:40:49 +0000904 while (*p < bound && **p >= '0' && **p <= '9') {
905 ret = 0;
David Horstmannce164742023-02-23 13:50:48 +0000906 if (*num > (UINT_MAX / 10)) {
David Horstmann18ec9d72023-02-20 17:18:45 +0000907 return MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmann92337c02023-01-18 18:40:49 +0000908 }
David Horstmann0f4ee412023-02-21 16:17:41 +0000909 *num *= 10;
910 *num += **p - '0';
David Horstmann92337c02023-01-18 18:40:49 +0000911 (*p)++;
912 }
David Horstmann0f4ee412023-02-21 16:17:41 +0000913 return ret;
David Horstmann92337c02023-01-18 18:40:49 +0000914}
915
916static size_t oid_subidentifier_num_bytes(unsigned int value)
917{
David Horstmann25d65e82023-05-31 14:53:07 +0100918 size_t num_bytes = 0;
David Horstmannada7d722023-05-31 14:49:56 +0100919
David Horstmann25d65e82023-05-31 14:53:07 +0100920 do {
David Horstmann92337c02023-01-18 18:40:49 +0000921 value >>= 7;
David Horstmann25d65e82023-05-31 14:53:07 +0100922 num_bytes++;
923 } while (value != 0);
924
David Horstmann92337c02023-01-18 18:40:49 +0000925 return num_bytes;
926}
927
928static int oid_subidentifier_encode_into(unsigned char **p,
929 unsigned char *bound,
930 unsigned int value)
931{
932 size_t num_bytes = oid_subidentifier_num_bytes(value);
David Horstmannada7d722023-05-31 14:49:56 +0100933
David Horstmann92337c02023-01-18 18:40:49 +0000934 if ((size_t) (bound - *p) < num_bytes) {
935 return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
936 }
937 (*p)[num_bytes - 1] = (unsigned char) (value & 0x7f);
938 value >>= 7;
939
940 for (size_t i = 2; i <= num_bytes; i++) {
941 (*p)[num_bytes - i] = 0x80 | (unsigned char) (value & 0x7f);
942 value >>= 7;
943 }
944 *p += num_bytes;
945
946 return 0;
947}
948
949/* Return the OID for the given x.y.z.... style numeric string */
950int mbedtls_oid_from_numeric_string(mbedtls_asn1_buf *oid,
David Horstmann59400ff2023-02-21 15:27:16 +0000951 const char *oid_str, size_t size)
David Horstmann92337c02023-01-18 18:40:49 +0000952{
953 int ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmann59400ff2023-02-21 15:27:16 +0000954 const char *str_ptr = oid_str;
955 const char *str_bound = oid_str + size;
David Horstmann7cdfda12023-02-21 16:20:52 +0000956 unsigned int val = 0;
David Horstmann0f4ee412023-02-21 16:17:41 +0000957 unsigned int component1, component2;
David Horstmann68833582023-05-31 17:27:28 +0100958 size_t encoded_len;
David Horstmann45d5e2d2023-06-01 15:10:33 +0100959 unsigned char *resized_mem;
David Horstmannada7d722023-05-31 14:49:56 +0100960
David Horstmann5d074162023-06-01 15:09:27 +0100961 /* Count the number of dots to get a worst-case allocation size. */
962 size_t num_dots = 0;
David Horstmann01713972023-06-01 15:04:20 +0100963 for (size_t i = 0; i < size; i++) {
David Horstmann861e5d22023-04-19 18:15:51 +0100964 if (oid_str[i] == '.') {
965 num_dots++;
966 }
967 }
968 /* Allocate maximum possible required memory:
969 * There are (num_dots + 1) integer components, but the first 2 share the
970 * same subidentifier, so we only need num_dots subidentifiers maximum. */
David Horstmann96435752023-04-26 11:50:14 +0100971 if (num_dots == 0 || (num_dots > MBEDTLS_OID_MAX_COMPONENTS - 1)) {
David Horstmann861e5d22023-04-19 18:15:51 +0100972 return MBEDTLS_ERR_ASN1_INVALID_DATA;
973 }
David Horstmann62e7fae2023-06-02 15:32:20 +0100974 /* Each byte can store 7 bits, calculate number of bytes for a
975 * subidentifier:
976 *
977 * bytes = ceil(subidentifer_size * 8 / 7)
978 */
979 size_t bytes_per_subidentifier = (((sizeof(unsigned int) * 8) - 1) / 7)
980 + 1;
981 size_t max_possible_bytes = num_dots * bytes_per_subidentifier;
David Horstmann861e5d22023-04-19 18:15:51 +0100982 oid->p = mbedtls_calloc(max_possible_bytes, 1);
983 if (oid->p == NULL) {
984 return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
985 }
986 unsigned char *out_ptr = oid->p;
987 unsigned char *out_bound = oid->p + max_possible_bytes;
David Horstmann376e8df2023-02-21 16:33:40 +0000988
David Horstmann0f4ee412023-02-21 16:17:41 +0000989 ret = oid_parse_number(&component1, &str_ptr, str_bound);
990 if (ret != 0) {
David Horstmann861e5d22023-04-19 18:15:51 +0100991 goto error;
David Horstmann92337c02023-01-18 18:40:49 +0000992 }
993 if (component1 > 2) {
994 /* First component can't be > 2 */
David Horstmann861e5d22023-04-19 18:15:51 +0100995 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
996 goto error;
David Horstmann92337c02023-01-18 18:40:49 +0000997 }
998 if (str_ptr >= str_bound || *str_ptr != '.') {
David Horstmann861e5d22023-04-19 18:15:51 +0100999 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1000 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001001 }
1002 str_ptr++;
1003
David Horstmann0f4ee412023-02-21 16:17:41 +00001004 ret = oid_parse_number(&component2, &str_ptr, str_bound);
1005 if (ret != 0) {
David Horstmann861e5d22023-04-19 18:15:51 +01001006 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001007 }
David Horstmann03329972023-02-20 17:28:36 +00001008 if ((component1 < 2) && (component2 > 39)) {
1009 /* Root nodes 0 and 1 may have up to 40 children, numbered 0-39 */
David Horstmann861e5d22023-04-19 18:15:51 +01001010 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1011 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001012 }
David Horstmann01713972023-06-01 15:04:20 +01001013 if (str_ptr < str_bound) {
David Horstmann92337c02023-01-18 18:40:49 +00001014 if (*str_ptr == '.') {
1015 str_ptr++;
1016 } else {
David Horstmann861e5d22023-04-19 18:15:51 +01001017 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1018 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001019 }
1020 }
1021
David Horstmann02127ab2023-06-02 14:50:35 +01001022 if (component2 > (UINT_MAX - (component1 * 40))) {
David Horstmann861e5d22023-04-19 18:15:51 +01001023 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1024 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001025 }
David Horstmann861e5d22023-04-19 18:15:51 +01001026 ret = oid_subidentifier_encode_into(&out_ptr, out_bound,
1027 (component1 * 40) + component2);
1028 if (ret != 0) {
1029 goto error;
1030 }
David Horstmann92337c02023-01-18 18:40:49 +00001031
David Horstmann01713972023-06-01 15:04:20 +01001032 while (str_ptr < str_bound) {
David Horstmann861e5d22023-04-19 18:15:51 +01001033 ret = oid_parse_number(&val, &str_ptr, str_bound);
David Horstmann0f4ee412023-02-21 16:17:41 +00001034 if (ret != 0) {
David Horstmann861e5d22023-04-19 18:15:51 +01001035 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001036 }
David Horstmann01713972023-06-01 15:04:20 +01001037 if (str_ptr < str_bound) {
David Horstmann92337c02023-01-18 18:40:49 +00001038 if (*str_ptr == '.') {
1039 str_ptr++;
1040 } else {
David Horstmann861e5d22023-04-19 18:15:51 +01001041 ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
1042 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001043 }
1044 }
1045
David Horstmann92337c02023-01-18 18:40:49 +00001046 ret = oid_subidentifier_encode_into(&out_ptr, out_bound, val);
1047 if (ret != 0) {
David Horstmann861e5d22023-04-19 18:15:51 +01001048 goto error;
David Horstmann92337c02023-01-18 18:40:49 +00001049 }
1050 }
David Horstmann861e5d22023-04-19 18:15:51 +01001051
David Horstmann68833582023-05-31 17:27:28 +01001052 encoded_len = out_ptr - oid->p;
David Horstmann45d5e2d2023-06-01 15:10:33 +01001053 resized_mem = mbedtls_calloc(encoded_len, 1);
1054 if (resized_mem == NULL) {
David Horstmann861e5d22023-04-19 18:15:51 +01001055 ret = MBEDTLS_ERR_ASN1_ALLOC_FAILED;
1056 goto error;
1057 }
David Horstmann45d5e2d2023-06-01 15:10:33 +01001058 memcpy(resized_mem, oid->p, encoded_len);
David Horstmann861e5d22023-04-19 18:15:51 +01001059 mbedtls_free(oid->p);
David Horstmann45d5e2d2023-06-01 15:10:33 +01001060 oid->p = resized_mem;
David Horstmann861e5d22023-04-19 18:15:51 +01001061 oid->len = encoded_len;
1062
David Horstmann92337c02023-01-18 18:40:49 +00001063 oid->tag = MBEDTLS_ASN1_OID;
1064
1065 return 0;
David Horstmann861e5d22023-04-19 18:15:51 +01001066
1067error:
1068 mbedtls_free(oid->p);
1069 oid->p = NULL;
1070 oid->len = 0;
1071 return ret;
David Horstmann92337c02023-01-18 18:40:49 +00001072}
1073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074#endif /* MBEDTLS_OID_C */