x509.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. /*
  2. * X.509 common functions for parsing and verification
  3. *
  4. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  8. * not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * This file is part of mbed TLS (https://tls.mbed.org)
  20. */
  21. /*
  22. * The ITU-T X.509 standard defines a certificate format for PKI.
  23. *
  24. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  25. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  26. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  27. *
  28. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  29. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  30. */
  31. #if !defined(MBEDTLS_CONFIG_FILE)
  32. #include "mbedtls/config.h"
  33. #else
  34. #include MBEDTLS_CONFIG_FILE
  35. #endif
  36. #if defined(MBEDTLS_X509_USE_C)
  37. #include "mbedtls/x509.h"
  38. #include "mbedtls/asn1.h"
  39. #include "mbedtls/oid.h"
  40. #ifdef PRINTF_STDLIB
  41. #include <stdio.h>
  42. #endif
  43. #ifdef PRINTF_CUSTOM
  44. #include "tinystdio.h"
  45. #endif
  46. #include <string.h>
  47. #if defined(MBEDTLS_PEM_PARSE_C)
  48. #include "mbedtls/pem.h"
  49. #endif
  50. #if defined(MBEDTLS_PLATFORM_C)
  51. #include "mbedtls/platform.h"
  52. #else
  53. #ifdef PRINTF_STDLIB
  54. #include <stdio.h>
  55. #endif
  56. #ifdef PRINTF_CUSTOM
  57. #include "tinystdio.h"
  58. #endif
  59. #include <stdlib.h>
  60. #define mbedtls_free free
  61. #define mbedtls_calloc calloc
  62. #define mbedtls_printf printf
  63. #define mbedtls_snprintf snprintf
  64. #endif
  65. #if defined(MBEDTLS_HAVE_TIME)
  66. #include "mbedtls/platform_time.h"
  67. #endif
  68. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  69. #include <windows.h>
  70. #else
  71. #include <time.h>
  72. #endif
  73. #if defined(MBEDTLS_FS_IO)
  74. #ifdef PRINTF_STDLIB
  75. #include <stdio.h>
  76. #endif
  77. #ifdef PRINTF_CUSTOM
  78. #include "tinystdio.h"
  79. #endif
  80. #if !defined(_WIN32)
  81. #include <sys/types.h>
  82. #include <sys/stat.h>
  83. #include <dirent.h>
  84. #endif
  85. #endif
  86. #define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); }
  87. #define CHECK_RANGE(min, max, val) if( val < min || val > max ){ return( ret ); }
  88. /*
  89. * CertificateSerialNumber ::= INTEGER
  90. */
  91. int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end,
  92. mbedtls_x509_buf *serial )
  93. {
  94. int ret;
  95. if( ( end - *p ) < 1 )
  96. return( MBEDTLS_ERR_X509_INVALID_SERIAL +
  97. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  98. if( **p != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2 ) &&
  99. **p != MBEDTLS_ASN1_INTEGER )
  100. return( MBEDTLS_ERR_X509_INVALID_SERIAL +
  101. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  102. serial->tag = *(*p)++;
  103. if( ( ret = mbedtls_asn1_get_len( p, end, &serial->len ) ) != 0 )
  104. return( MBEDTLS_ERR_X509_INVALID_SERIAL + ret );
  105. serial->p = *p;
  106. *p += serial->len;
  107. return( 0 );
  108. }
  109. /* Get an algorithm identifier without parameters (eg for signatures)
  110. *
  111. * AlgorithmIdentifier ::= SEQUENCE {
  112. * algorithm OBJECT IDENTIFIER,
  113. * parameters ANY DEFINED BY algorithm OPTIONAL }
  114. */
  115. int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end,
  116. mbedtls_x509_buf *alg )
  117. {
  118. int ret;
  119. if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 )
  120. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  121. return( 0 );
  122. }
  123. /*
  124. * Parse an algorithm identifier with (optional) paramaters
  125. */
  126. int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end,
  127. mbedtls_x509_buf *alg, mbedtls_x509_buf *params )
  128. {
  129. int ret;
  130. if( ( ret = mbedtls_asn1_get_alg( p, end, alg, params ) ) != 0 )
  131. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  132. return( 0 );
  133. }
  134. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  135. /*
  136. * HashAlgorithm ::= AlgorithmIdentifier
  137. *
  138. * AlgorithmIdentifier ::= SEQUENCE {
  139. * algorithm OBJECT IDENTIFIER,
  140. * parameters ANY DEFINED BY algorithm OPTIONAL }
  141. *
  142. * For HashAlgorithm, parameters MUST be NULL or absent.
  143. */
  144. static int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg )
  145. {
  146. int ret;
  147. unsigned char *p;
  148. const unsigned char *end;
  149. mbedtls_x509_buf md_oid;
  150. size_t len;
  151. /* Make sure we got a SEQUENCE and setup bounds */
  152. if( alg->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  153. return( MBEDTLS_ERR_X509_INVALID_ALG +
  154. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  155. p = (unsigned char *) alg->p;
  156. end = p + alg->len;
  157. if( p >= end )
  158. return( MBEDTLS_ERR_X509_INVALID_ALG +
  159. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  160. /* Parse md_oid */
  161. md_oid.tag = *p;
  162. if( ( ret = mbedtls_asn1_get_tag( &p, end, &md_oid.len, MBEDTLS_ASN1_OID ) ) != 0 )
  163. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  164. md_oid.p = p;
  165. p += md_oid.len;
  166. /* Get md_alg from md_oid */
  167. if( ( ret = mbedtls_oid_get_md_alg( &md_oid, md_alg ) ) != 0 )
  168. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  169. /* Make sure params is absent of NULL */
  170. if( p == end )
  171. return( 0 );
  172. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_NULL ) ) != 0 || len != 0 )
  173. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  174. if( p != end )
  175. return( MBEDTLS_ERR_X509_INVALID_ALG +
  176. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  177. return( 0 );
  178. }
  179. /*
  180. * RSASSA-PSS-params ::= SEQUENCE {
  181. * hashAlgorithm [0] HashAlgorithm DEFAULT sha1Identifier,
  182. * maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier,
  183. * saltLength [2] INTEGER DEFAULT 20,
  184. * trailerField [3] INTEGER DEFAULT 1 }
  185. * -- Note that the tags in this Sequence are explicit.
  186. *
  187. * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value
  188. * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other
  189. * option. Enfore this at parsing time.
  190. */
  191. int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params,
  192. mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md,
  193. int *salt_len )
  194. {
  195. int ret;
  196. unsigned char *p;
  197. const unsigned char *end, *end2;
  198. size_t len;
  199. mbedtls_x509_buf alg_id, alg_params;
  200. /* First set everything to defaults */
  201. *md_alg = MBEDTLS_MD_SHA1;
  202. *mgf_md = MBEDTLS_MD_SHA1;
  203. *salt_len = 20;
  204. /* Make sure params is a SEQUENCE and setup bounds */
  205. if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  206. return( MBEDTLS_ERR_X509_INVALID_ALG +
  207. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  208. p = (unsigned char *) params->p;
  209. end = p + params->len;
  210. if( p == end )
  211. return( 0 );
  212. /*
  213. * HashAlgorithm
  214. */
  215. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  216. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 )
  217. {
  218. end2 = p + len;
  219. /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */
  220. if( ( ret = mbedtls_x509_get_alg_null( &p, end2, &alg_id ) ) != 0 )
  221. return( ret );
  222. if( ( ret = mbedtls_oid_get_md_alg( &alg_id, md_alg ) ) != 0 )
  223. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  224. if( p != end2 )
  225. return( MBEDTLS_ERR_X509_INVALID_ALG +
  226. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  227. }
  228. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  229. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  230. if( p == end )
  231. return( 0 );
  232. /*
  233. * MaskGenAlgorithm
  234. */
  235. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  236. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 )
  237. {
  238. end2 = p + len;
  239. /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */
  240. if( ( ret = mbedtls_x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 )
  241. return( ret );
  242. /* Only MFG1 is recognised for now */
  243. if( MBEDTLS_OID_CMP( MBEDTLS_OID_MGF1, &alg_id ) != 0 )
  244. return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE +
  245. MBEDTLS_ERR_OID_NOT_FOUND );
  246. /* Parse HashAlgorithm */
  247. if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 )
  248. return( ret );
  249. if( p != end2 )
  250. return( MBEDTLS_ERR_X509_INVALID_ALG +
  251. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  252. }
  253. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  254. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  255. if( p == end )
  256. return( 0 );
  257. /*
  258. * salt_len
  259. */
  260. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  261. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 2 ) ) == 0 )
  262. {
  263. end2 = p + len;
  264. if( ( ret = mbedtls_asn1_get_int( &p, end2, salt_len ) ) != 0 )
  265. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  266. if( p != end2 )
  267. return( MBEDTLS_ERR_X509_INVALID_ALG +
  268. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  269. }
  270. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  271. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  272. if( p == end )
  273. return( 0 );
  274. /*
  275. * trailer_field (if present, must be 1)
  276. */
  277. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  278. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ) == 0 )
  279. {
  280. int trailer_field;
  281. end2 = p + len;
  282. if( ( ret = mbedtls_asn1_get_int( &p, end2, &trailer_field ) ) != 0 )
  283. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  284. if( p != end2 )
  285. return( MBEDTLS_ERR_X509_INVALID_ALG +
  286. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  287. if( trailer_field != 1 )
  288. return( MBEDTLS_ERR_X509_INVALID_ALG );
  289. }
  290. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  291. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  292. if( p != end )
  293. return( MBEDTLS_ERR_X509_INVALID_ALG +
  294. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  295. return( 0 );
  296. }
  297. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  298. /*
  299. * AttributeTypeAndValue ::= SEQUENCE {
  300. * type AttributeType,
  301. * value AttributeValue }
  302. *
  303. * AttributeType ::= OBJECT IDENTIFIER
  304. *
  305. * AttributeValue ::= ANY DEFINED BY AttributeType
  306. */
  307. static int x509_get_attr_type_value( unsigned char **p,
  308. const unsigned char *end,
  309. mbedtls_x509_name *cur )
  310. {
  311. int ret;
  312. size_t len;
  313. mbedtls_x509_buf *oid;
  314. mbedtls_x509_buf *val;
  315. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  316. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  317. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  318. if( ( end - *p ) < 1 )
  319. return( MBEDTLS_ERR_X509_INVALID_NAME +
  320. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  321. oid = &cur->oid;
  322. oid->tag = **p;
  323. if( ( ret = mbedtls_asn1_get_tag( p, end, &oid->len, MBEDTLS_ASN1_OID ) ) != 0 )
  324. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  325. oid->p = *p;
  326. *p += oid->len;
  327. if( ( end - *p ) < 1 )
  328. return( MBEDTLS_ERR_X509_INVALID_NAME +
  329. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  330. if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING &&
  331. **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING &&
  332. **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING &&
  333. **p != MBEDTLS_ASN1_BIT_STRING )
  334. return( MBEDTLS_ERR_X509_INVALID_NAME +
  335. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  336. val = &cur->val;
  337. val->tag = *(*p)++;
  338. if( ( ret = mbedtls_asn1_get_len( p, end, &val->len ) ) != 0 )
  339. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  340. val->p = *p;
  341. *p += val->len;
  342. cur->next = NULL;
  343. return( 0 );
  344. }
  345. /*
  346. * Name ::= CHOICE { -- only one possibility for now --
  347. * rdnSequence RDNSequence }
  348. *
  349. * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
  350. *
  351. * RelativeDistinguishedName ::=
  352. * SET OF AttributeTypeAndValue
  353. *
  354. * AttributeTypeAndValue ::= SEQUENCE {
  355. * type AttributeType,
  356. * value AttributeValue }
  357. *
  358. * AttributeType ::= OBJECT IDENTIFIER
  359. *
  360. * AttributeValue ::= ANY DEFINED BY AttributeType
  361. *
  362. * The data structure is optimized for the common case where each RDN has only
  363. * one element, which is represented as a list of AttributeTypeAndValue.
  364. * For the general case we still use a flat list, but we mark elements of the
  365. * same set so that they are "merged" together in the functions that consume
  366. * this list, eg mbedtls_x509_dn_gets().
  367. */
  368. int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,
  369. mbedtls_x509_name *cur )
  370. {
  371. int ret;
  372. size_t set_len;
  373. const unsigned char *end_set;
  374. /* don't use recursion, we'd risk stack overflow if not optimized */
  375. while( 1 )
  376. {
  377. /*
  378. * parse SET
  379. */
  380. if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len,
  381. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 )
  382. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  383. end_set = *p + set_len;
  384. while( 1 )
  385. {
  386. if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 )
  387. return( ret );
  388. if( *p == end_set )
  389. break;
  390. /* Mark this item as being no the only one in a set */
  391. cur->next_merged = 1;
  392. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
  393. if( cur->next == NULL )
  394. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  395. cur = cur->next;
  396. }
  397. /*
  398. * continue until end of SEQUENCE is reached
  399. */
  400. if( *p == end )
  401. return( 0 );
  402. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
  403. if( cur->next == NULL )
  404. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  405. cur = cur->next;
  406. }
  407. }
  408. static int x509_parse_int( unsigned char **p, size_t n, int *res )
  409. {
  410. *res = 0;
  411. for( ; n > 0; --n )
  412. {
  413. if( ( **p < '0') || ( **p > '9' ) )
  414. return ( MBEDTLS_ERR_X509_INVALID_DATE );
  415. *res *= 10;
  416. *res += ( *(*p)++ - '0' );
  417. }
  418. return( 0 );
  419. }
  420. static int x509_date_is_valid(const mbedtls_x509_time *t)
  421. {
  422. int ret = MBEDTLS_ERR_X509_INVALID_DATE;
  423. CHECK_RANGE( 0, 9999, t->year );
  424. CHECK_RANGE( 0, 23, t->hour );
  425. CHECK_RANGE( 0, 59, t->min );
  426. CHECK_RANGE( 0, 59, t->sec );
  427. switch( t->mon )
  428. {
  429. case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  430. CHECK_RANGE( 1, 31, t->day );
  431. break;
  432. case 4: case 6: case 9: case 11:
  433. CHECK_RANGE( 1, 30, t->day );
  434. break;
  435. case 2:
  436. CHECK_RANGE( 1, 28 + (t->year % 4 == 0), t->day );
  437. break;
  438. default:
  439. return( ret );
  440. }
  441. return( 0 );
  442. }
  443. /*
  444. * Parse an ASN1_UTC_TIME (yearlen=2) or ASN1_GENERALIZED_TIME (yearlen=4)
  445. * field.
  446. */
  447. static int x509_parse_time( unsigned char **p, size_t len, size_t yearlen,
  448. mbedtls_x509_time *tm )
  449. {
  450. int ret;
  451. /*
  452. * Minimum length is 10 or 12 depending on yearlen
  453. */
  454. if ( len < yearlen + 8 )
  455. return ( MBEDTLS_ERR_X509_INVALID_DATE );
  456. len -= yearlen + 8;
  457. /*
  458. * Parse year, month, day, hour, minute
  459. */
  460. CHECK( x509_parse_int( p, yearlen, &tm->year ) );
  461. if ( 2 == yearlen )
  462. {
  463. if ( tm->year < 50 )
  464. tm->year += 100;
  465. tm->year += 1900;
  466. }
  467. CHECK( x509_parse_int( p, 2, &tm->mon ) );
  468. CHECK( x509_parse_int( p, 2, &tm->day ) );
  469. CHECK( x509_parse_int( p, 2, &tm->hour ) );
  470. CHECK( x509_parse_int( p, 2, &tm->min ) );
  471. /*
  472. * Parse seconds if present
  473. */
  474. if ( len >= 2 )
  475. {
  476. CHECK( x509_parse_int( p, 2, &tm->sec ) );
  477. len -= 2;
  478. }
  479. else
  480. return ( MBEDTLS_ERR_X509_INVALID_DATE );
  481. /*
  482. * Parse trailing 'Z' if present
  483. */
  484. if ( 1 == len && 'Z' == **p )
  485. {
  486. (*p)++;
  487. len--;
  488. }
  489. /*
  490. * We should have parsed all characters at this point
  491. */
  492. if ( 0 != len )
  493. return ( MBEDTLS_ERR_X509_INVALID_DATE );
  494. CHECK( x509_date_is_valid( tm ) );
  495. return ( 0 );
  496. }
  497. /*
  498. * Time ::= CHOICE {
  499. * utcTime UTCTime,
  500. * generalTime GeneralizedTime }
  501. */
  502. int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end,
  503. mbedtls_x509_time *tm )
  504. {
  505. int ret;
  506. size_t len, year_len;
  507. unsigned char tag;
  508. if( ( end - *p ) < 1 )
  509. return( MBEDTLS_ERR_X509_INVALID_DATE +
  510. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  511. tag = **p;
  512. if( tag == MBEDTLS_ASN1_UTC_TIME )
  513. year_len = 2;
  514. else if( tag == MBEDTLS_ASN1_GENERALIZED_TIME )
  515. year_len = 4;
  516. else
  517. return( MBEDTLS_ERR_X509_INVALID_DATE +
  518. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  519. (*p)++;
  520. ret = mbedtls_asn1_get_len( p, end, &len );
  521. if( ret != 0 )
  522. return( MBEDTLS_ERR_X509_INVALID_DATE + ret );
  523. return x509_parse_time( p, len, year_len, tm );
  524. }
  525. int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig )
  526. {
  527. int ret;
  528. size_t len;
  529. int tag_type;
  530. if( ( end - *p ) < 1 )
  531. return( MBEDTLS_ERR_X509_INVALID_SIGNATURE +
  532. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  533. tag_type = **p;
  534. if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 )
  535. return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + ret );
  536. sig->tag = tag_type;
  537. sig->len = len;
  538. sig->p = *p;
  539. *p += len;
  540. return( 0 );
  541. }
  542. /*
  543. * Get signature algorithm from alg OID and optional parameters
  544. */
  545. int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params,
  546. mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg,
  547. void **sig_opts )
  548. {
  549. int ret;
  550. if( *sig_opts != NULL )
  551. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  552. if( ( ret = mbedtls_oid_get_sig_alg( sig_oid, md_alg, pk_alg ) ) != 0 )
  553. return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + ret );
  554. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  555. if( *pk_alg == MBEDTLS_PK_RSASSA_PSS )
  556. {
  557. mbedtls_pk_rsassa_pss_options *pss_opts;
  558. pss_opts = mbedtls_calloc( 1, sizeof( mbedtls_pk_rsassa_pss_options ) );
  559. if( pss_opts == NULL )
  560. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  561. ret = mbedtls_x509_get_rsassa_pss_params( sig_params,
  562. md_alg,
  563. &pss_opts->mgf1_hash_id,
  564. &pss_opts->expected_salt_len );
  565. if( ret != 0 )
  566. {
  567. mbedtls_free( pss_opts );
  568. return( ret );
  569. }
  570. *sig_opts = (void *) pss_opts;
  571. }
  572. else
  573. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  574. {
  575. /* Make sure parameters are absent or NULL */
  576. if( ( sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0 ) ||
  577. sig_params->len != 0 )
  578. return( MBEDTLS_ERR_X509_INVALID_ALG );
  579. }
  580. return( 0 );
  581. }
  582. /*
  583. * X.509 Extensions (No parsing of extensions, pointer should
  584. * be either manually updated or extensions should be parsed!)
  585. */
  586. int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end,
  587. mbedtls_x509_buf *ext, int tag )
  588. {
  589. int ret;
  590. size_t len;
  591. if( *p == end )
  592. return( 0 );
  593. ext->tag = **p;
  594. if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len,
  595. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 )
  596. return( ret );
  597. ext->p = *p;
  598. end = *p + ext->len;
  599. /*
  600. * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
  601. *
  602. * Extension ::= SEQUENCE {
  603. * extnID OBJECT IDENTIFIER,
  604. * critical BOOLEAN DEFAULT FALSE,
  605. * extnValue OCTET STRING }
  606. */
  607. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  608. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  609. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  610. if( end != *p + len )
  611. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  612. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  613. return( 0 );
  614. }
  615. /*
  616. * Store the name in printable form into buf; no more
  617. * than size characters will be written
  618. */
  619. int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn )
  620. {
  621. int ret;
  622. size_t i, n;
  623. unsigned char c, merge = 0;
  624. const mbedtls_x509_name *name;
  625. const char *short_name = NULL;
  626. char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p;
  627. memset( s, 0, sizeof( s ) );
  628. name = dn;
  629. p = buf;
  630. n = size;
  631. while( name != NULL )
  632. {
  633. if( !name->oid.p )
  634. {
  635. name = name->next;
  636. continue;
  637. }
  638. if( name != dn )
  639. {
  640. ret = mbedtls_snprintf( p, n, merge ? " + " : ", " );
  641. MBEDTLS_X509_SAFE_SNPRINTF;
  642. }
  643. ret = mbedtls_oid_get_attr_short_name( &name->oid, &short_name );
  644. if( ret == 0 )
  645. ret = mbedtls_snprintf( p, n, "%s=", short_name );
  646. else
  647. ret = mbedtls_snprintf( p, n, "\?\?=" );
  648. MBEDTLS_X509_SAFE_SNPRINTF;
  649. for( i = 0; i < name->val.len; i++ )
  650. {
  651. if( i >= sizeof( s ) - 1 )
  652. break;
  653. c = name->val.p[i];
  654. if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
  655. s[i] = '?';
  656. else s[i] = c;
  657. }
  658. s[i] = '\0';
  659. ret = mbedtls_snprintf( p, n, "%s", s );
  660. MBEDTLS_X509_SAFE_SNPRINTF;
  661. merge = name->next_merged;
  662. name = name->next;
  663. }
  664. return( (int) ( size - n ) );
  665. }
  666. /*
  667. * Store the serial in printable form into buf; no more
  668. * than size characters will be written
  669. */
  670. int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial )
  671. {
  672. int ret;
  673. size_t i, n, nr;
  674. char *p;
  675. p = buf;
  676. n = size;
  677. nr = ( serial->len <= 32 )
  678. ? serial->len : 28;
  679. for( i = 0; i < nr; i++ )
  680. {
  681. if( i == 0 && nr > 1 && serial->p[i] == 0x0 )
  682. continue;
  683. ret = mbedtls_snprintf( p, n, "%02X%s",
  684. serial->p[i], ( i < nr - 1 ) ? ":" : "" );
  685. MBEDTLS_X509_SAFE_SNPRINTF;
  686. }
  687. if( nr != serial->len )
  688. {
  689. ret = mbedtls_snprintf( p, n, "...." );
  690. MBEDTLS_X509_SAFE_SNPRINTF;
  691. }
  692. return( (int) ( size - n ) );
  693. }
  694. /*
  695. * Helper for writing signature algorithms
  696. */
  697. int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid,
  698. mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,
  699. const void *sig_opts )
  700. {
  701. int ret;
  702. char *p = buf;
  703. size_t n = size;
  704. const char *desc = NULL;
  705. ret = mbedtls_oid_get_sig_alg_desc( sig_oid, &desc );
  706. if( ret != 0 )
  707. ret = mbedtls_snprintf( p, n, "???" );
  708. else
  709. ret = mbedtls_snprintf( p, n, "%s", desc );
  710. MBEDTLS_X509_SAFE_SNPRINTF;
  711. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  712. if( pk_alg == MBEDTLS_PK_RSASSA_PSS )
  713. {
  714. const mbedtls_pk_rsassa_pss_options *pss_opts;
  715. const mbedtls_md_info_t *md_info, *mgf_md_info;
  716. pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts;
  717. md_info = mbedtls_md_info_from_type( md_alg );
  718. mgf_md_info = mbedtls_md_info_from_type( pss_opts->mgf1_hash_id );
  719. ret = mbedtls_snprintf( p, n, " (%s, MGF1-%s, 0x%02X)",
  720. md_info ? mbedtls_md_get_name( md_info ) : "???",
  721. mgf_md_info ? mbedtls_md_get_name( mgf_md_info ) : "???",
  722. pss_opts->expected_salt_len );
  723. MBEDTLS_X509_SAFE_SNPRINTF;
  724. }
  725. #else
  726. ((void) pk_alg);
  727. ((void) md_alg);
  728. ((void) sig_opts);
  729. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  730. return( (int)( size - n ) );
  731. }
  732. /*
  733. * Helper for writing "RSA key size", "EC key size", etc
  734. */
  735. int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name )
  736. {
  737. char *p = buf;
  738. size_t n = buf_size;
  739. int ret;
  740. ret = mbedtls_snprintf( p, n, "%s key size", name );
  741. MBEDTLS_X509_SAFE_SNPRINTF;
  742. return( 0 );
  743. }
  744. #if defined(MBEDTLS_HAVE_TIME_DATE)
  745. /*
  746. * Set the time structure to the current time.
  747. * Return 0 on success, non-zero on failure.
  748. */
  749. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  750. static int x509_get_current_time( mbedtls_x509_time *now )
  751. {
  752. SYSTEMTIME st;
  753. GetSystemTime( &st );
  754. now->year = st.wYear;
  755. now->mon = st.wMonth;
  756. now->day = st.wDay;
  757. now->hour = st.wHour;
  758. now->min = st.wMinute;
  759. now->sec = st.wSecond;
  760. return( 0 );
  761. }
  762. #else
  763. static int x509_get_current_time( mbedtls_x509_time *now )
  764. {
  765. struct tm *lt;
  766. mbedtls_time_t tt;
  767. int ret = 0;
  768. #if defined(MBEDTLS_THREADING_C)
  769. if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 )
  770. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  771. #endif
  772. tt = mbedtls_time( NULL );
  773. lt = gmtime( &tt );
  774. if( lt == NULL )
  775. ret = -1;
  776. else
  777. {
  778. now->year = lt->tm_year + 1900;
  779. now->mon = lt->tm_mon + 1;
  780. now->day = lt->tm_mday;
  781. now->hour = lt->tm_hour;
  782. now->min = lt->tm_min;
  783. now->sec = lt->tm_sec;
  784. }
  785. #if defined(MBEDTLS_THREADING_C)
  786. if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 )
  787. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  788. #endif
  789. return( ret );
  790. }
  791. #endif /* _WIN32 && !EFIX64 && !EFI32 */
  792. /*
  793. * Return 0 if before <= after, 1 otherwise
  794. */
  795. static int x509_check_time( const mbedtls_x509_time *before, const mbedtls_x509_time *after )
  796. {
  797. if( before->year > after->year )
  798. return( 1 );
  799. if( before->year == after->year &&
  800. before->mon > after->mon )
  801. return( 1 );
  802. if( before->year == after->year &&
  803. before->mon == after->mon &&
  804. before->day > after->day )
  805. return( 1 );
  806. if( before->year == after->year &&
  807. before->mon == after->mon &&
  808. before->day == after->day &&
  809. before->hour > after->hour )
  810. return( 1 );
  811. if( before->year == after->year &&
  812. before->mon == after->mon &&
  813. before->day == after->day &&
  814. before->hour == after->hour &&
  815. before->min > after->min )
  816. return( 1 );
  817. if( before->year == after->year &&
  818. before->mon == after->mon &&
  819. before->day == after->day &&
  820. before->hour == after->hour &&
  821. before->min == after->min &&
  822. before->sec > after->sec )
  823. return( 1 );
  824. return( 0 );
  825. }
  826. int mbedtls_x509_time_is_past( const mbedtls_x509_time *to )
  827. {
  828. mbedtls_x509_time now;
  829. if( x509_get_current_time( &now ) != 0 )
  830. return( 1 );
  831. return( x509_check_time( &now, to ) );
  832. }
  833. int mbedtls_x509_time_is_future( const mbedtls_x509_time *from )
  834. {
  835. mbedtls_x509_time now;
  836. if( x509_get_current_time( &now ) != 0 )
  837. return( 1 );
  838. return( x509_check_time( from, &now ) );
  839. }
  840. #else /* MBEDTLS_HAVE_TIME_DATE */
  841. int mbedtls_x509_time_is_past( const mbedtls_x509_time *to )
  842. {
  843. ((void) to);
  844. return( 0 );
  845. }
  846. int mbedtls_x509_time_is_future( const mbedtls_x509_time *from )
  847. {
  848. ((void) from);
  849. return( 0 );
  850. }
  851. #endif /* MBEDTLS_HAVE_TIME_DATE */
  852. #if defined(MBEDTLS_SELF_TEST)
  853. #include "mbedtls/x509_crt.h"
  854. #include "mbedtls/certs.h"
  855. /*
  856. * Checkup routine
  857. */
  858. int mbedtls_x509_self_test( int verbose )
  859. {
  860. #if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C)
  861. int ret;
  862. uint32_t flags;
  863. mbedtls_x509_crt cacert;
  864. mbedtls_x509_crt clicert;
  865. if( verbose != 0 )
  866. mbedtls_printf( " X.509 certificate load: " );
  867. mbedtls_x509_crt_init( &clicert );
  868. ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt,
  869. mbedtls_test_cli_crt_len );
  870. if( ret != 0 )
  871. {
  872. if( verbose != 0 )
  873. mbedtls_printf( "failed\n" );
  874. return( ret );
  875. }
  876. mbedtls_x509_crt_init( &cacert );
  877. ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt,
  878. mbedtls_test_ca_crt_len );
  879. if( ret != 0 )
  880. {
  881. if( verbose != 0 )
  882. mbedtls_printf( "failed\n" );
  883. return( ret );
  884. }
  885. if( verbose != 0 )
  886. mbedtls_printf( "passed\n X.509 signature verify: ");
  887. ret = mbedtls_x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL );
  888. if( ret != 0 )
  889. {
  890. if( verbose != 0 )
  891. mbedtls_printf( "failed\n" );
  892. return( ret );
  893. }
  894. if( verbose != 0 )
  895. mbedtls_printf( "passed\n\n");
  896. mbedtls_x509_crt_free( &cacert );
  897. mbedtls_x509_crt_free( &clicert );
  898. return( 0 );
  899. #else
  900. ((void) verbose);
  901. return( 0 );
  902. #endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */
  903. }
  904. #endif /* MBEDTLS_SELF_TEST */
  905. #endif /* MBEDTLS_X509_USE_C */