oid.c 27 KB

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