This Trac instance is not used for development anymore!

We migrated our development workflow to git and Gitea.
To test the future redirection, replace trac by ariadne in the page URL.

source: ps/trunk/build/premake/premake5/contrib/mbedtls/library/oid.c

Last change on this file was 20366, checked in by Itms, 7 years ago

Alpha 12 version of Premake 5, including prebuilt binary for Windows.
Directly taken from https://premake.github.io/.

Refs #3729.

File size: 22.8 KB
Line 
1/**
2 * \file oid.c
3 *
4 * \brief Object Identifier (OID) database
5 *
6 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
7 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 * This file is part of mbed TLS (https://tls.mbed.org)
22 */
23
24#if !defined(MBEDTLS_CONFIG_FILE)
25#include "mbedtls/config.h"
26#else
27#include MBEDTLS_CONFIG_FILE
28#endif
29
30#if defined(MBEDTLS_OID_C)
31
32#include "mbedtls/oid.h"
33#include "mbedtls/rsa.h"
34
35#include <stdio.h>
36#include <string.h>
37
38#if defined(MBEDTLS_PLATFORM_C)
39#include "mbedtls/platform.h"
40#else
41#define mbedtls_snprintf snprintf
42#endif
43
44#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
45#include "mbedtls/x509.h"
46#endif
47
48/*
49 * Macro to automatically add the size of #define'd OIDs
50 */
51#define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s)
52
53/*
54 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
55 * the other functions)
56 */
57#define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \
58static const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid ) \
59{ \
60 const TYPE_T *p = LIST; \
61 const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p; \
62 if( p == NULL || oid == NULL ) return( NULL ); \
63 while( cur->asn1 != NULL ) { \
64 if( cur->asn1_len == oid->len && \
65 memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \
66 return( p ); \
67 } \
68 p++; \
69 cur = (const mbedtls_oid_descriptor_t *) p; \
70 } \
71 return( NULL ); \
72}
73
74/*
75 * Macro to generate a function for retrieving a single attribute from the
76 * descriptor of an mbedtls_oid_descriptor_t wrapper.
77 */
78#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
79int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
80{ \
81 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
82 if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
83 *ATTR1 = data->descriptor.ATTR1; \
84 return( 0 ); \
85}
86
87/*
88 * Macro to generate a function for retrieving a single attribute from an
89 * mbedtls_oid_descriptor_t wrapper.
90 */
91#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
92int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
93{ \
94 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
95 if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
96 *ATTR1 = data->ATTR1; \
97 return( 0 ); \
98}
99
100/*
101 * Macro to generate a function for retrieving two attributes from an
102 * mbedtls_oid_descriptor_t wrapper.
103 */
104#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
105 ATTR2_TYPE, ATTR2) \
106int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \
107{ \
108 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
109 if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
110 *ATTR1 = data->ATTR1; \
111 *ATTR2 = data->ATTR2; \
112 return( 0 ); \
113}
114
115/*
116 * Macro to generate a function for retrieving the OID based on a single
117 * attribute from a mbedtls_oid_descriptor_t wrapper.
118 */
119#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
120int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \
121{ \
122 const TYPE_T *cur = LIST; \
123 while( cur->descriptor.asn1 != NULL ) { \
124 if( cur->ATTR1 == ATTR1 ) { \
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}
133
134/*
135 * Macro to generate a function for retrieving the OID based on two
136 * attributes from a mbedtls_oid_descriptor_t wrapper.
137 */
138#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
139 ATTR2_TYPE, ATTR2) \
140int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \
141 size_t *olen ) \
142{ \
143 const TYPE_T *cur = LIST; \
144 while( cur->descriptor.asn1 != NULL ) { \
145 if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \
146 *oid = cur->descriptor.asn1; \
147 *olen = cur->descriptor.asn1_len; \
148 return( 0 ); \
149 } \
150 cur++; \
151 } \
152 return( MBEDTLS_ERR_OID_NOT_FOUND ); \
153}
154
155/*
156 * For X520 attribute types
157 */
158typedef struct {
159 mbedtls_oid_descriptor_t descriptor;
160 const char *short_name;
161} oid_x520_attr_t;
162
163static const oid_x520_attr_t oid_x520_attr_type[] =
164{
165 {
166 { ADD_LEN( MBEDTLS_OID_AT_CN ), "id-at-commonName", "Common Name" },
167 "CN",
168 },
169 {
170 { ADD_LEN( MBEDTLS_OID_AT_COUNTRY ), "id-at-countryName", "Country" },
171 "C",
172 },
173 {
174 { ADD_LEN( MBEDTLS_OID_AT_LOCALITY ), "id-at-locality", "Locality" },
175 "L",
176 },
177 {
178 { ADD_LEN( MBEDTLS_OID_AT_STATE ), "id-at-state", "State" },
179 "ST",
180 },
181 {
182 { ADD_LEN( MBEDTLS_OID_AT_ORGANIZATION ),"id-at-organizationName", "Organization" },
183 "O",
184 },
185 {
186 { ADD_LEN( MBEDTLS_OID_AT_ORG_UNIT ), "id-at-organizationalUnitName", "Org Unit" },
187 "OU",
188 },
189 {
190 { ADD_LEN( MBEDTLS_OID_PKCS9_EMAIL ), "emailAddress", "E-mail address" },
191 "emailAddress",
192 },
193 {
194 { ADD_LEN( MBEDTLS_OID_AT_SERIAL_NUMBER ),"id-at-serialNumber", "Serial number" },
195 "serialNumber",
196 },
197 {
198 { ADD_LEN( MBEDTLS_OID_AT_POSTAL_ADDRESS ),"id-at-postalAddress", "Postal address" },
199 "postalAddress",
200 },
201 {
202 { ADD_LEN( MBEDTLS_OID_AT_POSTAL_CODE ), "id-at-postalCode", "Postal code" },
203 "postalCode",
204 },
205 {
206 { ADD_LEN( MBEDTLS_OID_AT_SUR_NAME ), "id-at-surName", "Surname" },
207 "SN",
208 },
209 {
210 { ADD_LEN( MBEDTLS_OID_AT_GIVEN_NAME ), "id-at-givenName", "Given name" },
211 "GN",
212 },
213 {
214 { ADD_LEN( MBEDTLS_OID_AT_INITIALS ), "id-at-initials", "Initials" },
215 "initials",
216 },
217 {
218 { ADD_LEN( MBEDTLS_OID_AT_GENERATION_QUALIFIER ), "id-at-generationQualifier", "Generation qualifier" },
219 "generationQualifier",
220 },
221 {
222 { ADD_LEN( MBEDTLS_OID_AT_TITLE ), "id-at-title", "Title" },
223 "title",
224 },
225 {
226 { ADD_LEN( MBEDTLS_OID_AT_DN_QUALIFIER ),"id-at-dnQualifier", "Distinguished Name qualifier" },
227 "dnQualifier",
228 },
229 {
230 { ADD_LEN( MBEDTLS_OID_AT_PSEUDONYM ), "id-at-pseudonym", "Pseudonym" },
231 "pseudonym",
232 },
233 {
234 { ADD_LEN( MBEDTLS_OID_DOMAIN_COMPONENT ), "id-domainComponent", "Domain component" },
235 "DC",
236 },
237 {
238 { ADD_LEN( MBEDTLS_OID_AT_UNIQUE_IDENTIFIER ), "id-at-uniqueIdentifier", "Unique Identifier" },
239 "uniqueIdentifier",
240 },
241 {
242 { NULL, 0, NULL, NULL },
243 NULL,
244 }
245};
246
247FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
248FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name)
249
250#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
251/*
252 * For X509 extensions
253 */
254typedef struct {
255 mbedtls_oid_descriptor_t descriptor;
256 int ext_type;
257} oid_x509_ext_t;
258
259static const oid_x509_ext_t oid_x509_ext[] =
260{
261 {
262 { ADD_LEN( MBEDTLS_OID_BASIC_CONSTRAINTS ), "id-ce-basicConstraints", "Basic Constraints" },
263 MBEDTLS_X509_EXT_BASIC_CONSTRAINTS,
264 },
265 {
266 { ADD_LEN( MBEDTLS_OID_KEY_USAGE ), "id-ce-keyUsage", "Key Usage" },
267 MBEDTLS_X509_EXT_KEY_USAGE,
268 },
269 {
270 { ADD_LEN( MBEDTLS_OID_EXTENDED_KEY_USAGE ), "id-ce-extKeyUsage", "Extended Key Usage" },
271 MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE,
272 },
273 {
274 { ADD_LEN( MBEDTLS_OID_SUBJECT_ALT_NAME ), "id-ce-subjectAltName", "Subject Alt Name" },
275 MBEDTLS_X509_EXT_SUBJECT_ALT_NAME,
276 },
277 {
278 { ADD_LEN( MBEDTLS_OID_NS_CERT_TYPE ), "id-netscape-certtype", "Netscape Certificate Type" },
279 MBEDTLS_X509_EXT_NS_CERT_TYPE,
280 },
281 {
282 { NULL, 0, NULL, NULL },
283 0,
284 },
285};
286
287FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
288FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)
289
290static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
291{
292 { ADD_LEN( MBEDTLS_OID_SERVER_AUTH ), "id-kp-serverAuth", "TLS Web Server Authentication" },
293 { ADD_LEN( MBEDTLS_OID_CLIENT_AUTH ), "id-kp-clientAuth", "TLS Web Client Authentication" },
294 { ADD_LEN( MBEDTLS_OID_CODE_SIGNING ), "id-kp-codeSigning", "Code Signing" },
295 { ADD_LEN( MBEDTLS_OID_EMAIL_PROTECTION ), "id-kp-emailProtection", "E-mail Protection" },
296 { ADD_LEN( MBEDTLS_OID_TIME_STAMPING ), "id-kp-timeStamping", "Time Stamping" },
297 { ADD_LEN( MBEDTLS_OID_OCSP_SIGNING ), "id-kp-OCSPSigning", "OCSP Signing" },
298 { NULL, 0, NULL, NULL },
299};
300
301FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
302FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, mbedtls_oid_descriptor_t, ext_key_usage, const char *, description)
303#endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */
304
305#if defined(MBEDTLS_MD_C)
306/*
307 * For SignatureAlgorithmIdentifier
308 */
309typedef struct {
310 mbedtls_oid_descriptor_t descriptor;
311 mbedtls_md_type_t md_alg;
312 mbedtls_pk_type_t pk_alg;
313} oid_sig_alg_t;
314
315static const oid_sig_alg_t oid_sig_alg[] =
316{
317 {
318 { ADD_LEN( MBEDTLS_OID_PKCS1_MD2 ), "md2WithRSAEncryption", "RSA with MD2" },
319 MBEDTLS_MD_MD2, MBEDTLS_PK_RSA,
320 },
321 {
322 { ADD_LEN( MBEDTLS_OID_PKCS1_MD4 ), "md4WithRSAEncryption", "RSA with MD4" },
323 MBEDTLS_MD_MD4, MBEDTLS_PK_RSA,
324 },
325 {
326 { ADD_LEN( MBEDTLS_OID_PKCS1_MD5 ), "md5WithRSAEncryption", "RSA with MD5" },
327 MBEDTLS_MD_MD5, MBEDTLS_PK_RSA,
328 },
329 {
330 { ADD_LEN( MBEDTLS_OID_PKCS1_SHA1 ), "sha-1WithRSAEncryption", "RSA with SHA1" },
331 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
332 },
333 {
334 { ADD_LEN( MBEDTLS_OID_PKCS1_SHA224 ), "sha224WithRSAEncryption", "RSA with SHA-224" },
335 MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA,
336 },
337 {
338 { ADD_LEN( MBEDTLS_OID_PKCS1_SHA256 ), "sha256WithRSAEncryption", "RSA with SHA-256" },
339 MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA,
340 },
341 {
342 { ADD_LEN( MBEDTLS_OID_PKCS1_SHA384 ), "sha384WithRSAEncryption", "RSA with SHA-384" },
343 MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA,
344 },
345 {
346 { ADD_LEN( MBEDTLS_OID_PKCS1_SHA512 ), "sha512WithRSAEncryption", "RSA with SHA-512" },
347 MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA,
348 },
349 {
350 { ADD_LEN( MBEDTLS_OID_RSA_SHA_OBS ), "sha-1WithRSAEncryption", "RSA with SHA1" },
351 MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
352 },
353 {
354 { ADD_LEN( MBEDTLS_OID_ECDSA_SHA1 ), "ecdsa-with-SHA1", "ECDSA with SHA1" },
355 MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA,
356 },
357 {
358 { ADD_LEN( MBEDTLS_OID_ECDSA_SHA224 ), "ecdsa-with-SHA224", "ECDSA with SHA224" },
359 MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA,
360 },
361 {
362 { ADD_LEN( MBEDTLS_OID_ECDSA_SHA256 ), "ecdsa-with-SHA256", "ECDSA with SHA256" },
363 MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA,
364 },
365 {
366 { ADD_LEN( MBEDTLS_OID_ECDSA_SHA384 ), "ecdsa-with-SHA384", "ECDSA with SHA384" },
367 MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA,
368 },
369 {
370 { ADD_LEN( MBEDTLS_OID_ECDSA_SHA512 ), "ecdsa-with-SHA512", "ECDSA with SHA512" },
371 MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA,
372 },
373 {
374 { ADD_LEN( MBEDTLS_OID_RSASSA_PSS ), "RSASSA-PSS", "RSASSA-PSS" },
375 MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS,
376 },
377 {
378 { NULL, 0, NULL, NULL },
379 MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
380 },
381};
382
383FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
384FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description)
385FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, mbedtls_pk_type_t, pk_alg)
386FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, mbedtls_pk_type_t, pk_alg, mbedtls_md_type_t, md_alg)
387#endif /* MBEDTLS_MD_C */
388
389/*
390 * For PublicKeyInfo (PKCS1, RFC 5480)
391 */
392typedef struct {
393 mbedtls_oid_descriptor_t descriptor;
394 mbedtls_pk_type_t pk_alg;
395} oid_pk_alg_t;
396
397static const oid_pk_alg_t oid_pk_alg[] =
398{
399 {
400 { ADD_LEN( MBEDTLS_OID_PKCS1_RSA ), "rsaEncryption", "RSA" },
401 MBEDTLS_PK_RSA,
402 },
403 {
404 { ADD_LEN( MBEDTLS_OID_EC_ALG_UNRESTRICTED ), "id-ecPublicKey", "Generic EC key" },
405 MBEDTLS_PK_ECKEY,
406 },
407 {
408 { ADD_LEN( MBEDTLS_OID_EC_ALG_ECDH ), "id-ecDH", "EC key for ECDH" },
409 MBEDTLS_PK_ECKEY_DH,
410 },
411 {
412 { NULL, 0, NULL, NULL },
413 MBEDTLS_PK_NONE,
414 },
415};
416
417FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)
418FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
419FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg)
420
421#if defined(MBEDTLS_ECP_C)
422/*
423 * For namedCurve (RFC 5480)
424 */
425typedef struct {
426 mbedtls_oid_descriptor_t descriptor;
427 mbedtls_ecp_group_id grp_id;
428} oid_ecp_grp_t;
429
430static const oid_ecp_grp_t oid_ecp_grp[] =
431{
432 {
433 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192R1 ), "secp192r1", "secp192r1" },
434 MBEDTLS_ECP_DP_SECP192R1,
435 },
436 {
437 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224R1 ), "secp224r1", "secp224r1" },
438 MBEDTLS_ECP_DP_SECP224R1,
439 },
440 {
441 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256R1 ), "secp256r1", "secp256r1" },
442 MBEDTLS_ECP_DP_SECP256R1,
443 },
444 {
445 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP384R1 ), "secp384r1", "secp384r1" },
446 MBEDTLS_ECP_DP_SECP384R1,
447 },
448 {
449 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP521R1 ), "secp521r1", "secp521r1" },
450 MBEDTLS_ECP_DP_SECP521R1,
451 },
452 {
453 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192K1 ), "secp192k1", "secp192k1" },
454 MBEDTLS_ECP_DP_SECP192K1,
455 },
456 {
457 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224K1 ), "secp224k1", "secp224k1" },
458 MBEDTLS_ECP_DP_SECP224K1,
459 },
460 {
461 { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256K1 ), "secp256k1", "secp256k1" },
462 MBEDTLS_ECP_DP_SECP256K1,
463 },
464 {
465 { ADD_LEN( MBEDTLS_OID_EC_GRP_BP256R1 ), "brainpoolP256r1","brainpool256r1" },
466 MBEDTLS_ECP_DP_BP256R1,
467 },
468 {
469 { ADD_LEN( MBEDTLS_OID_EC_GRP_BP384R1 ), "brainpoolP384r1","brainpool384r1" },
470 MBEDTLS_ECP_DP_BP384R1,
471 },
472 {
473 { ADD_LEN( MBEDTLS_OID_EC_GRP_BP512R1 ), "brainpoolP512r1","brainpool512r1" },
474 MBEDTLS_ECP_DP_BP512R1,
475 },
476 {
477 { NULL, 0, NULL, NULL },
478 MBEDTLS_ECP_DP_NONE,
479 },
480};
481
482FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
483FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
484FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id)
485#endif /* MBEDTLS_ECP_C */
486
487#if defined(MBEDTLS_CIPHER_C)
488/*
489 * For PKCS#5 PBES2 encryption algorithm
490 */
491typedef struct {
492 mbedtls_oid_descriptor_t descriptor;
493 mbedtls_cipher_type_t cipher_alg;
494} oid_cipher_alg_t;
495
496static const oid_cipher_alg_t oid_cipher_alg[] =
497{
498 {
499 { ADD_LEN( MBEDTLS_OID_DES_CBC ), "desCBC", "DES-CBC" },
500 MBEDTLS_CIPHER_DES_CBC,
501 },
502 {
503 { ADD_LEN( MBEDTLS_OID_DES_EDE3_CBC ), "des-ede3-cbc", "DES-EDE3-CBC" },
504 MBEDTLS_CIPHER_DES_EDE3_CBC,
505 },
506 {
507 { NULL, 0, NULL, NULL },
508 MBEDTLS_CIPHER_NONE,
509 },
510};
511
512FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
513FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg)
514#endif /* MBEDTLS_CIPHER_C */
515
516#if defined(MBEDTLS_MD_C)
517/*
518 * For digestAlgorithm
519 */
520typedef struct {
521 mbedtls_oid_descriptor_t descriptor;
522 mbedtls_md_type_t md_alg;
523} oid_md_alg_t;
524
525static const oid_md_alg_t oid_md_alg[] =
526{
527 {
528 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD2 ), "id-md2", "MD2" },
529 MBEDTLS_MD_MD2,
530 },
531 {
532 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD4 ), "id-md4", "MD4" },
533 MBEDTLS_MD_MD4,
534 },
535 {
536 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD5 ), "id-md5", "MD5" },
537 MBEDTLS_MD_MD5,
538 },
539 {
540 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA1 ), "id-sha1", "SHA-1" },
541 MBEDTLS_MD_SHA1,
542 },
543 {
544 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA224 ), "id-sha224", "SHA-224" },
545 MBEDTLS_MD_SHA224,
546 },
547 {
548 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA256 ), "id-sha256", "SHA-256" },
549 MBEDTLS_MD_SHA256,
550 },
551 {
552 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA384 ), "id-sha384", "SHA-384" },
553 MBEDTLS_MD_SHA384,
554 },
555 {
556 { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA512 ), "id-sha512", "SHA-512" },
557 MBEDTLS_MD_SHA512,
558 },
559 {
560 { NULL, 0, NULL, NULL },
561 MBEDTLS_MD_NONE,
562 },
563};
564
565FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
566FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
567FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg)
568#endif /* MBEDTLS_MD_C */
569
570#if defined(MBEDTLS_PKCS12_C)
571/*
572 * For PKCS#12 PBEs
573 */
574typedef struct {
575 mbedtls_oid_descriptor_t descriptor;
576 mbedtls_md_type_t md_alg;
577 mbedtls_cipher_type_t cipher_alg;
578} oid_pkcs12_pbe_alg_t;
579
580static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
581{
582 {
583 { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), "pbeWithSHAAnd3-KeyTripleDES-CBC", "PBE with SHA1 and 3-Key 3DES" },
584 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC,
585 },
586 {
587 { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), "pbeWithSHAAnd2-KeyTripleDES-CBC", "PBE with SHA1 and 2-Key 3DES" },
588 MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC,
589 },
590 {
591 { NULL, 0, NULL, NULL },
592 MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
593 },
594};
595
596FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
597FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, mbedtls_md_type_t, md_alg, mbedtls_cipher_type_t, cipher_alg)
598#endif /* MBEDTLS_PKCS12_C */
599
600#define OID_SAFE_SNPRINTF \
601 do { \
602 if( ret < 0 || (size_t) ret >= n ) \
603 return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); \
604 \
605 n -= (size_t) ret; \
606 p += (size_t) ret; \
607 } while( 0 )
608
609/* Return the x.y.z.... style numeric string for the given OID */
610int mbedtls_oid_get_numeric_string( char *buf, size_t size,
611 const mbedtls_asn1_buf *oid )
612{
613 int ret;
614 size_t i, n;
615 unsigned int value;
616 char *p;
617
618 p = buf;
619 n = size;
620
621 /* First byte contains first two dots */
622 if( oid->len > 0 )
623 {
624 ret = mbedtls_snprintf( p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40 );
625 OID_SAFE_SNPRINTF;
626 }
627
628 value = 0;
629 for( i = 1; i < oid->len; i++ )
630 {
631 /* Prevent overflow in value. */
632 if( ( ( value << 7 ) >> 7 ) != value )
633 return( MBEDTLS_ERR_OID_BUF_TOO_SMALL );
634
635 value <<= 7;
636 value += oid->p[i] & 0x7F;
637
638 if( !( oid->p[i] & 0x80 ) )
639 {
640 /* Last byte */
641 ret = mbedtls_snprintf( p, n, ".%d", value );
642 OID_SAFE_SNPRINTF;
643 value = 0;
644 }
645 }
646
647 return( (int) ( size - n ) );
648}
649
650#endif /* MBEDTLS_OID_C */
Note: See TracBrowser for help on using the repository browser.