blob: 2868ef94fc5b3984ca4cadc8a996d09549b6bb1b [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
Dave Rodgman7ff79652023-11-03 12:04:52 +00007 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakkerc70b9822013-04-07 22:00:46 +02008 */
9
Gilles Peskinedb09ef62020-06-03 01:43:33 +020010#include "common.h"
Paul Bakkerc70b9822013-04-07 22:00:46 +020011
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020012#if defined(MBEDTLS_OID_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +020013
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000014#include "mbedtls/oid.h"
15#include "mbedtls/rsa.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000016#include "mbedtls/error.h"
Paul Bakkerc70b9822013-04-07 22:00:46 +020017
Gilles Peskinea8cd2e62024-05-17 19:00:46 +020018#include <limits.h>
Rich Evans00ab4702015-02-06 13:43:58 +000019#include <stdio.h>
20#include <string.h>
21
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000022#include "mbedtls/platform.h"
Rich Evans8f3a9432015-01-30 10:54:04 +000023
Paul Bakkerdd1150e2013-06-28 17:20:22 +020024/*
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +020025 * Macro to automatically add the size of #define'd OIDs
26 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s)
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +020028
29/*
Paul Bakkerdd1150e2013-06-28 17:20:22 +020030 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
31 * the other functions)
32 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010033#define FN_OID_TYPED_FROM_ASN1(TYPE_T, NAME, LIST) \
34 static const TYPE_T *oid_ ## NAME ## _from_asn1( \
35 const mbedtls_asn1_buf *oid) \
Hanno Becker1eeca412018-10-15 12:01:35 +010036 { \
37 const TYPE_T *p = (LIST); \
38 const mbedtls_oid_descriptor_t *cur = \
39 (const mbedtls_oid_descriptor_t *) p; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010040 if (p == NULL || oid == NULL) return NULL; \
41 while (cur->asn1 != NULL) { \
42 if (cur->asn1_len == oid->len && \
43 memcmp(cur->asn1, oid->p, oid->len) == 0) { \
44 return p; \
Hanno Becker1eeca412018-10-15 12:01:35 +010045 } \
46 p++; \
47 cur = (const mbedtls_oid_descriptor_t *) p; \
48 } \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 return NULL; \
Hanno Becker1eeca412018-10-15 12:01:35 +010050 }
Paul Bakkerbd51ad52013-06-28 16:51:52 +020051
52/*
Paul Bakkerdd1150e2013-06-28 17:20:22 +020053 * Macro to generate a function for retrieving a single attribute from the
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054 * descriptor of an mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +020055 */
56#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010057 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \
58 { \
59 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
60 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
61 *ATTR1 = data->descriptor.ATTR1; \
62 return 0; \
63 }
Paul Bakkerdd1150e2013-06-28 17:20:22 +020064
65/*
66 * Macro to generate a function for retrieving a single attribute from an
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020067 * mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +020068 */
69#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010070 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \
71 { \
72 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
73 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
74 *ATTR1 = data->ATTR1; \
75 return 0; \
76 }
Paul Bakkerdd1150e2013-06-28 17:20:22 +020077
78/*
79 * Macro to generate a function for retrieving two attributes from an
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 * mbedtls_oid_descriptor_t wrapper.
Paul Bakkerdd1150e2013-06-28 17:20:22 +020081 */
82#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
83 ATTR2_TYPE, ATTR2) \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010084 int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, \
85 ATTR2_TYPE * ATTR2) \
86 { \
87 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \
88 if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \
89 *(ATTR1) = data->ATTR1; \
90 *(ATTR2) = data->ATTR2; \
91 return 0; \
92 }
Paul Bakkerdd1150e2013-06-28 17:20:22 +020093
94/*
Paul Bakkerce6ae232013-06-28 18:05:35 +020095 * Macro to generate a function for retrieving the OID based on a single
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096 * attribute from a mbedtls_oid_descriptor_t wrapper.
Paul Bakkerce6ae232013-06-28 18:05:35 +020097 */
98#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010099 int FN_NAME(ATTR1_TYPE ATTR1, const char **oid, size_t *olen) \
100 { \
101 const TYPE_T *cur = (LIST); \
102 while (cur->descriptor.asn1 != NULL) { \
103 if (cur->ATTR1 == (ATTR1)) { \
104 *oid = cur->descriptor.asn1; \
105 *olen = cur->descriptor.asn1_len; \
106 return 0; \
107 } \
108 cur++; \
109 } \
110 return MBEDTLS_ERR_OID_NOT_FOUND; \
111 }
Paul Bakkerce6ae232013-06-28 18:05:35 +0200112
113/*
114 * Macro to generate a function for retrieving the OID based on two
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115 * attributes from a mbedtls_oid_descriptor_t wrapper.
Paul Bakkerce6ae232013-06-28 18:05:35 +0200116 */
117#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
118 ATTR2_TYPE, ATTR2) \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100119 int FN_NAME(ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid, \
120 size_t *olen) \
121 { \
122 const TYPE_T *cur = (LIST); \
123 while (cur->descriptor.asn1 != NULL) { \
124 if (cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2)) { \
125 *oid = cur->descriptor.asn1; \
126 *olen = cur->descriptor.asn1_len; \
127 return 0; \
128 } \
129 cur++; \
130 } \
131 return MBEDTLS_ERR_OID_NOT_FOUND; \
132 }
Paul Bakkerce6ae232013-06-28 18:05:35 +0200133
134/*
Paul Bakkerc70b9822013-04-07 22:00:46 +0200135 * For X520 attribute types
136 */
137typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200138 mbedtls_oid_descriptor_t descriptor;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200139 const char *short_name;
140} oid_x520_attr_t;
141
142static const oid_x520_attr_t oid_x520_attr_type[] =
143{
144 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100145 { ADD_LEN(MBEDTLS_OID_AT_CN), "id-at-commonName", "Common Name" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200146 "CN",
147 },
148 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100149 { ADD_LEN(MBEDTLS_OID_AT_COUNTRY), "id-at-countryName", "Country" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200150 "C",
151 },
152 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100153 { ADD_LEN(MBEDTLS_OID_AT_LOCALITY), "id-at-locality", "Locality" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200154 "L",
155 },
156 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100157 { ADD_LEN(MBEDTLS_OID_AT_STATE), "id-at-state", "State" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200158 "ST",
159 },
160 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100161 { ADD_LEN(MBEDTLS_OID_AT_ORGANIZATION), "id-at-organizationName", "Organization" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200162 "O",
163 },
164 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100165 { ADD_LEN(MBEDTLS_OID_AT_ORG_UNIT), "id-at-organizationalUnitName", "Org Unit" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200166 "OU",
167 },
168 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100169 { ADD_LEN(MBEDTLS_OID_PKCS9_EMAIL), "emailAddress", "E-mail address" },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200170 "emailAddress",
171 },
172 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100173 { ADD_LEN(MBEDTLS_OID_AT_SERIAL_NUMBER), "id-at-serialNumber", "Serial number" },
Paul Bakker7b0be682013-10-29 14:24:37 +0100174 "serialNumber",
175 },
176 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100177 { ADD_LEN(MBEDTLS_OID_AT_POSTAL_ADDRESS), "id-at-postalAddress",
178 "Postal address" },
Paul Bakker7b0be682013-10-29 14:24:37 +0100179 "postalAddress",
180 },
181 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100182 { ADD_LEN(MBEDTLS_OID_AT_POSTAL_CODE), "id-at-postalCode", "Postal code" },
Paul Bakker7b0be682013-10-29 14:24:37 +0100183 "postalCode",
184 },
185 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100186 { ADD_LEN(MBEDTLS_OID_AT_SUR_NAME), "id-at-surName", "Surname" },
Paul Bakker63844402014-04-30 15:34:12 +0200187 "SN",
188 },
189 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100190 { ADD_LEN(MBEDTLS_OID_AT_GIVEN_NAME), "id-at-givenName", "Given name" },
Paul Bakker63844402014-04-30 15:34:12 +0200191 "GN",
192 },
193 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100194 { ADD_LEN(MBEDTLS_OID_AT_INITIALS), "id-at-initials", "Initials" },
Paul Bakker63844402014-04-30 15:34:12 +0200195 "initials",
196 },
197 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100198 { ADD_LEN(MBEDTLS_OID_AT_GENERATION_QUALIFIER), "id-at-generationQualifier",
199 "Generation qualifier" },
Paul Bakker63844402014-04-30 15:34:12 +0200200 "generationQualifier",
201 },
202 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100203 { ADD_LEN(MBEDTLS_OID_AT_TITLE), "id-at-title", "Title" },
Paul Bakker63844402014-04-30 15:34:12 +0200204 "title",
205 },
206 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100207 { ADD_LEN(MBEDTLS_OID_AT_DN_QUALIFIER), "id-at-dnQualifier",
208 "Distinguished Name qualifier" },
Paul Bakker63844402014-04-30 15:34:12 +0200209 "dnQualifier",
210 },
211 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100212 { ADD_LEN(MBEDTLS_OID_AT_PSEUDONYM), "id-at-pseudonym", "Pseudonym" },
Paul Bakker63844402014-04-30 15:34:12 +0200213 "pseudonym",
214 },
215 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100216 { ADD_LEN(MBEDTLS_OID_DOMAIN_COMPONENT), "id-domainComponent",
217 "Domain component" },
Paul Bakker63844402014-04-30 15:34:12 +0200218 "DC",
219 },
220 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100221 { ADD_LEN(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER), "id-at-uniqueIdentifier",
222 "Unique Identifier" },
Manuel Pégourié-Gonnard9409e0c2015-03-27 13:03:54 +0100223 "uniqueIdentifier",
224 },
225 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200226 { NULL, 0, NULL, NULL },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200227 NULL,
228 }
229};
230
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200231FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100232FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name,
233 oid_x520_attr_t,
234 x520_attr,
235 const char *,
236 short_name)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200237
Paul Bakkerc70b9822013-04-07 22:00:46 +0200238/*
239 * For X509 extensions
240 */
241typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200242 mbedtls_oid_descriptor_t descriptor;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200243 int ext_type;
244} oid_x509_ext_t;
245
246static const oid_x509_ext_t oid_x509_ext[] =
247{
248 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100249 { ADD_LEN(MBEDTLS_OID_BASIC_CONSTRAINTS), "id-ce-basicConstraints",
250 "Basic Constraints" },
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100251 MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200252 },
253 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100254 { ADD_LEN(MBEDTLS_OID_KEY_USAGE), "id-ce-keyUsage", "Key Usage" },
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100255 MBEDTLS_OID_X509_EXT_KEY_USAGE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200256 },
257 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100258 { ADD_LEN(MBEDTLS_OID_EXTENDED_KEY_USAGE), "id-ce-extKeyUsage",
259 "Extended Key Usage" },
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100260 MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200261 },
262 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100263 { ADD_LEN(MBEDTLS_OID_SUBJECT_ALT_NAME), "id-ce-subjectAltName",
264 "Subject Alt Name" },
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100265 MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200266 },
267 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100268 { ADD_LEN(MBEDTLS_OID_NS_CERT_TYPE), "id-netscape-certtype",
269 "Netscape Certificate Type" },
Manuel Pégourié-Gonnardc49ada42019-01-28 09:20:59 +0100270 MBEDTLS_OID_X509_EXT_NS_CERT_TYPE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200271 },
272 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100273 { ADD_LEN(MBEDTLS_OID_CERTIFICATE_POLICIES), "id-ce-certificatePolicies",
274 "Certificate Policies" },
Ron Eldore8234162019-04-03 09:45:07 +0300275 MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES,
276 },
277 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200278 { NULL, 0, NULL, NULL },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200279 0,
280 },
281};
282
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200283FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
284FN_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 +0200285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
Paul Bakkerc70b9822013-04-07 22:00:46 +0200287{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100288 { ADD_LEN(MBEDTLS_OID_SERVER_AUTH), "id-kp-serverAuth",
289 "TLS Web Server Authentication" },
290 { ADD_LEN(MBEDTLS_OID_CLIENT_AUTH), "id-kp-clientAuth",
291 "TLS Web Client Authentication" },
292 { ADD_LEN(MBEDTLS_OID_CODE_SIGNING), "id-kp-codeSigning", "Code Signing" },
293 { ADD_LEN(MBEDTLS_OID_EMAIL_PROTECTION), "id-kp-emailProtection", "E-mail Protection" },
294 { ADD_LEN(MBEDTLS_OID_TIME_STAMPING), "id-kp-timeStamping", "Time Stamping" },
295 { ADD_LEN(MBEDTLS_OID_OCSP_SIGNING), "id-kp-OCSPSigning", "OCSP Signing" },
296 { ADD_LEN(MBEDTLS_OID_WISUN_FAN), "id-kp-wisun-fan-device",
297 "Wi-SUN Alliance Field Area Network (FAN)" },
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200298 { NULL, 0, NULL, NULL },
Paul Bakkerc70b9822013-04-07 22:00:46 +0200299};
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200300
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200301FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100302FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage,
303 mbedtls_oid_descriptor_t,
304 ext_key_usage,
305 const char *,
306 description)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200307
Ron Eldor11ee0712019-03-25 18:22:52 +0200308static const mbedtls_oid_descriptor_t oid_certificate_policies[] =
309{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100310 { ADD_LEN(MBEDTLS_OID_ANY_POLICY), "anyPolicy", "Any Policy" },
Ron Eldor11ee0712019-03-25 18:22:52 +0200311 { NULL, 0, NULL, NULL },
312};
313
314FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100315FN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies,
316 mbedtls_oid_descriptor_t,
317 certificate_policies,
318 const char *,
319 description)
Ron Eldor11ee0712019-03-25 18:22:52 +0200320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321#if defined(MBEDTLS_MD_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200322/*
323 * For SignatureAlgorithmIdentifier
324 */
325typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 mbedtls_oid_descriptor_t descriptor;
327 mbedtls_md_type_t md_alg;
328 mbedtls_pk_type_t pk_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200329} oid_sig_alg_t;
330
331static const oid_sig_alg_t oid_sig_alg[] =
332{
palaviv06f18282016-08-06 23:00:38 +0300333#if defined(MBEDTLS_RSA_C)
334#if defined(MBEDTLS_MD2_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200335 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100336 { ADD_LEN(MBEDTLS_OID_PKCS1_MD2), "md2WithRSAEncryption", "RSA with MD2" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 MBEDTLS_MD_MD2, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200338 },
palaviv06f18282016-08-06 23:00:38 +0300339#endif /* MBEDTLS_MD2_C */
340#if defined(MBEDTLS_MD4_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200341 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100342 { ADD_LEN(MBEDTLS_OID_PKCS1_MD4), "md4WithRSAEncryption", "RSA with MD4" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 MBEDTLS_MD_MD4, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200344 },
palaviv06f18282016-08-06 23:00:38 +0300345#endif /* MBEDTLS_MD4_C */
346#if defined(MBEDTLS_MD5_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200347 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100348 { ADD_LEN(MBEDTLS_OID_PKCS1_MD5), "md5WithRSAEncryption", "RSA with MD5" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349 MBEDTLS_MD_MD5, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200350 },
palaviv06f18282016-08-06 23:00:38 +0300351#endif /* MBEDTLS_MD5_C */
352#if defined(MBEDTLS_SHA1_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200353 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100354 { ADD_LEN(MBEDTLS_OID_PKCS1_SHA1), "sha-1WithRSAEncryption", "RSA with SHA1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200356 },
palaviv06f18282016-08-06 23:00:38 +0300357#endif /* MBEDTLS_SHA1_C */
358#if defined(MBEDTLS_SHA256_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200359 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100360 { ADD_LEN(MBEDTLS_OID_PKCS1_SHA224), "sha224WithRSAEncryption", "RSA with SHA-224" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200362 },
363 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100364 { ADD_LEN(MBEDTLS_OID_PKCS1_SHA256), "sha256WithRSAEncryption", "RSA with SHA-256" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200366 },
palaviv06f18282016-08-06 23:00:38 +0300367#endif /* MBEDTLS_SHA256_C */
368#if defined(MBEDTLS_SHA512_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200369 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100370 { ADD_LEN(MBEDTLS_OID_PKCS1_SHA384), "sha384WithRSAEncryption", "RSA with SHA-384" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200372 },
373 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100374 { ADD_LEN(MBEDTLS_OID_PKCS1_SHA512), "sha512WithRSAEncryption", "RSA with SHA-512" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200376 },
palaviv06f18282016-08-06 23:00:38 +0300377#endif /* MBEDTLS_SHA512_C */
378#if defined(MBEDTLS_SHA1_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200379 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100380 { ADD_LEN(MBEDTLS_OID_RSA_SHA_OBS), "sha-1WithRSAEncryption", "RSA with SHA1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200382 },
palaviv06f18282016-08-06 23:00:38 +0300383#endif /* MBEDTLS_SHA1_C */
384#endif /* MBEDTLS_RSA_C */
385#if defined(MBEDTLS_ECDSA_C)
386#if defined(MBEDTLS_SHA1_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200387 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100388 { ADD_LEN(MBEDTLS_OID_ECDSA_SHA1), "ecdsa-with-SHA1", "ECDSA with SHA1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200390 },
palaviv06f18282016-08-06 23:00:38 +0300391#endif /* MBEDTLS_SHA1_C */
392#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200393 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100394 { ADD_LEN(MBEDTLS_OID_ECDSA_SHA224), "ecdsa-with-SHA224", "ECDSA with SHA224" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200395 MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200396 },
397 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100398 { ADD_LEN(MBEDTLS_OID_ECDSA_SHA256), "ecdsa-with-SHA256", "ECDSA with SHA256" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399 MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200400 },
palaviv06f18282016-08-06 23:00:38 +0300401#endif /* MBEDTLS_SHA256_C */
402#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200403 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100404 { ADD_LEN(MBEDTLS_OID_ECDSA_SHA384), "ecdsa-with-SHA384", "ECDSA with SHA384" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405 MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200406 },
407 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100408 { ADD_LEN(MBEDTLS_OID_ECDSA_SHA512), "ecdsa-with-SHA512", "ECDSA with SHA512" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA,
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200410 },
palaviv06f18282016-08-06 23:00:38 +0300411#endif /* MBEDTLS_SHA512_C */
412#endif /* MBEDTLS_ECDSA_C */
413#if defined(MBEDTLS_RSA_C)
Manuel Pégourié-Gonnard1e60cd02013-07-10 10:28:53 +0200414 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100415 { ADD_LEN(MBEDTLS_OID_RSASSA_PSS), "RSASSA-PSS", "RSASSA-PSS" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS,
Manuel Pégourié-Gonnard59a75d52014-01-22 10:12:57 +0100417 },
palaviv06f18282016-08-06 23:00:38 +0300418#endif /* MBEDTLS_RSA_C */
Manuel Pégourié-Gonnard59a75d52014-01-22 10:12:57 +0100419 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200420 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200422 },
423};
424
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200425FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100426FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc,
427 oid_sig_alg_t,
428 sig_alg,
429 const char *,
430 description)
431FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg,
432 oid_sig_alg_t,
433 sig_alg,
434 mbedtls_md_type_t,
435 md_alg,
436 mbedtls_pk_type_t,
437 pk_alg)
438FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg,
439 oid_sig_alg_t,
440 oid_sig_alg,
441 mbedtls_pk_type_t,
442 pk_alg,
443 mbedtls_md_type_t,
444 md_alg)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#endif /* MBEDTLS_MD_C */
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200446
Paul Bakkerc70b9822013-04-07 22:00:46 +0200447/*
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200448 * For PublicKeyInfo (PKCS1, RFC 5480)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200449 */
450typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451 mbedtls_oid_descriptor_t descriptor;
452 mbedtls_pk_type_t pk_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200453} oid_pk_alg_t;
454
455static const oid_pk_alg_t oid_pk_alg[] =
456{
457 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100458 { ADD_LEN(MBEDTLS_OID_PKCS1_RSA), "rsaEncryption", "RSA" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 MBEDTLS_PK_RSA,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200460 },
461 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100462 { ADD_LEN(MBEDTLS_OID_EC_ALG_UNRESTRICTED), "id-ecPublicKey", "Generic EC key" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200463 MBEDTLS_PK_ECKEY,
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200464 },
465 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100466 { ADD_LEN(MBEDTLS_OID_EC_ALG_ECDH), "id-ecDH", "EC key for ECDH" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 MBEDTLS_PK_ECKEY_DH,
Manuel Pégourié-Gonnard5a9b82e2013-07-01 16:57:44 +0200468 },
469 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200470 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471 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_pk_alg_t, pk_alg, oid_pk_alg)
476FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100477FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg,
478 oid_pk_alg_t,
479 oid_pk_alg,
480 mbedtls_pk_type_t,
481 pk_alg)
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200484/*
485 * For namedCurve (RFC 5480)
486 */
487typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 mbedtls_oid_descriptor_t descriptor;
489 mbedtls_ecp_group_id grp_id;
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200490} oid_ecp_grp_t;
491
492static const oid_ecp_grp_t oid_ecp_grp[] =
493{
palaviva9f90f02016-08-06 23:10:49 +0300494#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200495 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100496 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP192R1), "secp192r1", "secp192r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497 MBEDTLS_ECP_DP_SECP192R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200498 },
palaviva9f90f02016-08-06 23:10:49 +0300499#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
500#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200501 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100502 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP224R1), "secp224r1", "secp224r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503 MBEDTLS_ECP_DP_SECP224R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200504 },
palaviva9f90f02016-08-06 23:10:49 +0300505#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
506#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200507 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100508 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP256R1), "secp256r1", "secp256r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200509 MBEDTLS_ECP_DP_SECP256R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200510 },
palaviva9f90f02016-08-06 23:10:49 +0300511#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
512#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200513 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100514 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP384R1), "secp384r1", "secp384r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 MBEDTLS_ECP_DP_SECP384R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200516 },
palaviva9f90f02016-08-06 23:10:49 +0300517#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
518#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200519 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100520 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP521R1), "secp521r1", "secp521r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200521 MBEDTLS_ECP_DP_SECP521R1,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200522 },
palaviva9f90f02016-08-06 23:10:49 +0300523#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
524#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200525 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100526 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP192K1), "secp192k1", "secp192k1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200527 MBEDTLS_ECP_DP_SECP192K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100528 },
palaviva9f90f02016-08-06 23:10:49 +0300529#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
530#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100531 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100532 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP224K1), "secp224k1", "secp224k1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 MBEDTLS_ECP_DP_SECP224K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100534 },
palaviva9f90f02016-08-06 23:10:49 +0300535#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
536#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100537 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100538 { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP256K1), "secp256k1", "secp256k1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539 MBEDTLS_ECP_DP_SECP256K1,
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100540 },
palaviva9f90f02016-08-06 23:10:49 +0300541#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
542#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
Manuel Pégourié-Gonnard9bcff392014-01-10 18:26:48 +0100543 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100544 { ADD_LEN(MBEDTLS_OID_EC_GRP_BP256R1), "brainpoolP256r1", "brainpool256r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200545 MBEDTLS_ECP_DP_BP256R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200546 },
palaviva9f90f02016-08-06 23:10:49 +0300547#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
548#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200549 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100550 { ADD_LEN(MBEDTLS_OID_EC_GRP_BP384R1), "brainpoolP384r1", "brainpool384r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551 MBEDTLS_ECP_DP_BP384R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200552 },
palaviva9f90f02016-08-06 23:10:49 +0300553#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
554#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200555 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100556 { ADD_LEN(MBEDTLS_OID_EC_GRP_BP512R1), "brainpoolP512r1", "brainpool512r1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200557 MBEDTLS_ECP_DP_BP512R1,
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200558 },
palaviva9f90f02016-08-06 23:10:49 +0300559#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
Manuel Pégourié-Gonnard48ac3db2013-10-10 15:11:33 +0200560 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200561 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 MBEDTLS_ECP_DP_NONE,
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200563 },
564};
565
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200566FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
567FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100568FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp,
569 oid_ecp_grp_t,
570 oid_ecp_grp,
571 mbedtls_ecp_group_id,
572 grp_id)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnardf0b30d02013-07-01 17:34:57 +0200574
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575#if defined(MBEDTLS_CIPHER_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200576/*
Paul Bakker9b5e8852013-06-28 16:12:50 +0200577 * For PKCS#5 PBES2 encryption algorithm
578 */
579typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 mbedtls_oid_descriptor_t descriptor;
581 mbedtls_cipher_type_t cipher_alg;
Paul Bakker9b5e8852013-06-28 16:12:50 +0200582} oid_cipher_alg_t;
583
584static const oid_cipher_alg_t oid_cipher_alg[] =
585{
586 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100587 { ADD_LEN(MBEDTLS_OID_DES_CBC), "desCBC", "DES-CBC" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200588 MBEDTLS_CIPHER_DES_CBC,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200589 },
590 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100591 { ADD_LEN(MBEDTLS_OID_DES_EDE3_CBC), "des-ede3-cbc", "DES-EDE3-CBC" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 MBEDTLS_CIPHER_DES_EDE3_CBC,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200593 },
594 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200595 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 MBEDTLS_CIPHER_NONE,
Paul Bakker9b5e8852013-06-28 16:12:50 +0200597 },
598};
599
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200600FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100601FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg,
602 oid_cipher_alg_t,
603 cipher_alg,
604 mbedtls_cipher_type_t,
605 cipher_alg)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606#endif /* MBEDTLS_CIPHER_C */
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608#if defined(MBEDTLS_MD_C)
Paul Bakker9b5e8852013-06-28 16:12:50 +0200609/*
Paul Bakkerc70b9822013-04-07 22:00:46 +0200610 * For digestAlgorithm
611 */
612typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613 mbedtls_oid_descriptor_t descriptor;
614 mbedtls_md_type_t md_alg;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200615} oid_md_alg_t;
616
617static const oid_md_alg_t oid_md_alg[] =
618{
palaviv57303202016-08-06 22:36:07 +0300619#if defined(MBEDTLS_MD2_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200620 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100621 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD2), "id-md2", "MD2" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 MBEDTLS_MD_MD2,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200623 },
palaviv57303202016-08-06 22:36:07 +0300624#endif /* MBEDTLS_MD2_C */
625#if defined(MBEDTLS_MD4_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200626 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100627 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD4), "id-md4", "MD4" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628 MBEDTLS_MD_MD4,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200629 },
palaviv57303202016-08-06 22:36:07 +0300630#endif /* MBEDTLS_MD4_C */
631#if defined(MBEDTLS_MD5_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200632 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100633 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD5), "id-md5", "MD5" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200634 MBEDTLS_MD_MD5,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200635 },
palaviv57303202016-08-06 22:36:07 +0300636#endif /* MBEDTLS_MD5_C */
637#if defined(MBEDTLS_SHA1_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200638 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100639 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA1), "id-sha1", "SHA-1" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640 MBEDTLS_MD_SHA1,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200641 },
palaviv57303202016-08-06 22:36:07 +0300642#endif /* MBEDTLS_SHA1_C */
643#if defined(MBEDTLS_SHA256_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200644 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100645 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA224), "id-sha224", "SHA-224" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646 MBEDTLS_MD_SHA224,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200647 },
648 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100649 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA256), "id-sha256", "SHA-256" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 MBEDTLS_MD_SHA256,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200651 },
palaviv57303202016-08-06 22:36:07 +0300652#endif /* MBEDTLS_SHA256_C */
653#if defined(MBEDTLS_SHA512_C)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200654 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100655 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA384), "id-sha384", "SHA-384" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656 MBEDTLS_MD_SHA384,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200657 },
658 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100659 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA512), "id-sha512", "SHA-512" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 MBEDTLS_MD_SHA512,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200661 },
palaviv57303202016-08-06 22:36:07 +0300662#endif /* MBEDTLS_SHA512_C */
Jack Lloyd5d9c9632019-05-01 13:43:53 -0400663#if defined(MBEDTLS_RIPEMD160_C)
664 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100665 { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_RIPEMD160), "id-ripemd160", "RIPEMD-160" },
Jack Lloyd5d9c9632019-05-01 13:43:53 -0400666 MBEDTLS_MD_RIPEMD160,
667 },
668#endif /* MBEDTLS_RIPEMD160_C */
Paul Bakkerc70b9822013-04-07 22:00:46 +0200669 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200670 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 MBEDTLS_MD_NONE,
Paul Bakkerc70b9822013-04-07 22:00:46 +0200672 },
673};
674
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200675FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
676FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100677FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md,
678 oid_md_alg_t,
679 oid_md_alg,
680 mbedtls_md_type_t,
681 md_alg)
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800682
683/*
684 * For HMAC digestAlgorithm
685 */
686typedef struct {
687 mbedtls_oid_descriptor_t descriptor;
688 mbedtls_md_type_t md_hmac;
689} oid_md_hmac_t;
690
691static const oid_md_hmac_t oid_md_hmac[] =
692{
693#if defined(MBEDTLS_SHA1_C)
694 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100695 { ADD_LEN(MBEDTLS_OID_HMAC_SHA1), "hmacSHA1", "HMAC-SHA-1" },
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800696 MBEDTLS_MD_SHA1,
697 },
698#endif /* MBEDTLS_SHA1_C */
699#if defined(MBEDTLS_SHA256_C)
700 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100701 { ADD_LEN(MBEDTLS_OID_HMAC_SHA224), "hmacSHA224", "HMAC-SHA-224" },
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800702 MBEDTLS_MD_SHA224,
703 },
704 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100705 { ADD_LEN(MBEDTLS_OID_HMAC_SHA256), "hmacSHA256", "HMAC-SHA-256" },
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800706 MBEDTLS_MD_SHA256,
707 },
708#endif /* MBEDTLS_SHA256_C */
709#if defined(MBEDTLS_SHA512_C)
710 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100711 { ADD_LEN(MBEDTLS_OID_HMAC_SHA384), "hmacSHA384", "HMAC-SHA-384" },
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800712 MBEDTLS_MD_SHA384,
713 },
714 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100715 { ADD_LEN(MBEDTLS_OID_HMAC_SHA512), "hmacSHA512", "HMAC-SHA-512" },
Antonio Quartulli12ccef22017-12-20 07:03:55 +0800716 MBEDTLS_MD_SHA512,
717 },
718#endif /* MBEDTLS_SHA512_C */
719 {
720 { NULL, 0, NULL, NULL },
721 MBEDTLS_MD_NONE,
722 },
723};
724
725FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac)
726FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727#endif /* MBEDTLS_MD_C */
Paul Bakkerbd51ad52013-06-28 16:51:52 +0200728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200729#if defined(MBEDTLS_PKCS12_C)
Paul Bakker7749a222013-06-28 17:28:20 +0200730/*
731 * For PKCS#12 PBEs
732 */
733typedef struct {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200734 mbedtls_oid_descriptor_t descriptor;
735 mbedtls_md_type_t md_alg;
736 mbedtls_cipher_type_t cipher_alg;
Paul Bakker7749a222013-06-28 17:28:20 +0200737} oid_pkcs12_pbe_alg_t;
738
739static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
740{
741 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100742 { ADD_LEN(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC), "pbeWithSHAAnd3-KeyTripleDES-CBC",
743 "PBE with SHA1 and 3-Key 3DES" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC,
Paul Bakker7749a222013-06-28 17:28:20 +0200745 },
746 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100747 { ADD_LEN(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC), "pbeWithSHAAnd2-KeyTripleDES-CBC",
748 "PBE with SHA1 and 2-Key 3DES" },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC,
Paul Bakker7749a222013-06-28 17:28:20 +0200750 },
751 {
Manuel Pégourié-Gonnard298aae42013-08-15 14:22:17 +0200752 { NULL, 0, NULL, NULL },
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200753 MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
Paul Bakker7749a222013-06-28 17:28:20 +0200754 },
755};
756
Manuel Pégourié-Gonnardf78e4de2015-05-29 10:52:14 +0200757FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100758FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg,
759 oid_pkcs12_pbe_alg_t,
760 pkcs12_pbe_alg,
761 mbedtls_md_type_t,
762 md_alg,
763 mbedtls_cipher_type_t,
764 cipher_alg)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200765#endif /* MBEDTLS_PKCS12_C */
Paul Bakker7749a222013-06-28 17:28:20 +0200766
Paul Bakkerc70b9822013-04-07 22:00:46 +0200767/* Return the x.y.z.... style numeric string for the given OID */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100768int mbedtls_oid_get_numeric_string(char *buf, size_t size,
769 const mbedtls_asn1_buf *oid)
Paul Bakkerc70b9822013-04-07 22:00:46 +0200770{
Janos Follath24eed8d2019-11-22 13:21:35 +0000771 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500772 char *p = buf;
773 size_t n = size;
774 unsigned int value = 0;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200775
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500776 if (size > INT_MAX) {
777 /* Avoid overflow computing return value */
778 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
David Horstmannbeb90e32023-02-15 11:48:13 +0000779 }
780
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500781 if (oid->len <= 0) {
782 /* OID must not be empty */
David Horstmann0518d532023-02-20 14:21:23 +0000783 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
David Horstmanncdaee542023-02-14 14:34:15 +0000784 }
David Horstmanncdaee542023-02-14 14:34:15 +0000785
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500786 for (size_t i = 0; i < oid->len; i++) {
Manuel Pégourié-Gonnarddffba8f2013-07-01 17:33:31 +0200787 /* Prevent overflow in value. */
David Horstmann8f81d8a2023-02-15 13:46:53 +0000788 if (value > (UINT_MAX >> 7)) {
David Horstmann0518d532023-02-20 14:21:23 +0000789 return MBEDTLS_ERR_ASN1_INVALID_DATA;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100790 }
David Horstmannbeb90e32023-02-15 11:48:13 +0000791 if ((value == 0) && ((oid->p[i]) == 0x80)) {
792 /* Overlong encoding is not allowed */
David Horstmann0518d532023-02-20 14:21:23 +0000793 return MBEDTLS_ERR_ASN1_INVALID_DATA;
David Horstmannbeb90e32023-02-15 11:48:13 +0000794 }
Manuel Pégourié-Gonnarddffba8f2013-07-01 17:33:31 +0200795
Paul Bakkerc70b9822013-04-07 22:00:46 +0200796 value <<= 7;
David Horstmannd1381812023-02-15 15:44:24 +0000797 value |= oid->p[i] & 0x7F;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200798
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100799 if (!(oid->p[i] & 0x80)) {
Paul Bakkerc70b9822013-04-07 22:00:46 +0200800 /* Last byte */
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500801 if (n == size) {
802 int component1;
803 unsigned int component2;
804 /* First subidentifier contains first two OID components */
805 if (value >= 80) {
806 component1 = '2';
807 component2 = value - 80;
808 } else if (value >= 40) {
809 component1 = '1';
810 component2 = value - 40;
811 } else {
812 component1 = '0';
813 component2 = value;
814 }
815 ret = mbedtls_snprintf(p, n, "%c.%u", component1, component2);
816 } else {
817 ret = mbedtls_snprintf(p, n, ".%u", value);
818 }
819 if (ret < 2 || (size_t) ret >= n) {
820 return MBEDTLS_ERR_OID_BUF_TOO_SMALL;
821 }
822 n -= (size_t) ret;
823 p += ret;
Paul Bakkerc70b9822013-04-07 22:00:46 +0200824 value = 0;
825 }
826 }
827
Demi Marie Obenour6b8e8ff2023-03-11 17:45:28 -0500828 if (value != 0) {
829 /* Unterminated subidentifier */
830 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
831 }
832
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100833 return (int) (size - n);
Paul Bakkerc70b9822013-04-07 22:00:46 +0200834}
835
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200836#endif /* MBEDTLS_OID_C */