PageRenderTime 64ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/src/polarssl/x509parse.c

http://github.com/zedshaw/mongrel2
C | 2557 lines | 1686 code | 455 blank | 416 comment | 559 complexity | 3993873b85972e89e8635f9de1b5ffe6 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, Unlicense

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * X.509 certificate and private key decoding
  3. *
  4. * Copyright (C) 2006-2011, Brainspark B.V.
  5. *
  6. * This file is part of PolarSSL (http://www.polarssl.org)
  7. * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. */
  25. /*
  26. * The ITU-T X.509 standard defines a certificat format for PKI.
  27. *
  28. * http://www.ietf.org/rfc/rfc2459.txt
  29. * http://www.ietf.org/rfc/rfc3279.txt
  30. *
  31. * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
  32. *
  33. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  34. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  35. */
  36. #include "polarssl/config.h"
  37. #if defined(POLARSSL_X509_PARSE_C)
  38. #include "polarssl/x509.h"
  39. #include "polarssl/asn1.h"
  40. #include "polarssl/pem.h"
  41. #include "polarssl/des.h"
  42. #include "polarssl/md2.h"
  43. #include "polarssl/md4.h"
  44. #include "polarssl/md5.h"
  45. #include "polarssl/sha1.h"
  46. #include "polarssl/sha2.h"
  47. #include "polarssl/sha4.h"
  48. #include "polarssl/dhm.h"
  49. #include <string.h>
  50. #include <stdlib.h>
  51. #if defined(_WIN32)
  52. #include <windows.h>
  53. #else
  54. #include <time.h>
  55. #endif
  56. #if defined(POLARSSL_FS_IO)
  57. #include <stdio.h>
  58. #endif
  59. /*
  60. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  61. */
  62. static int x509_get_version( unsigned char **p,
  63. const unsigned char *end,
  64. int *ver )
  65. {
  66. int ret;
  67. size_t len;
  68. if( ( ret = asn1_get_tag( p, end, &len,
  69. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0 ) ) != 0 )
  70. {
  71. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  72. {
  73. *ver = 0;
  74. return( 0 );
  75. }
  76. return( ret );
  77. }
  78. end = *p + len;
  79. if( ( ret = asn1_get_int( p, end, ver ) ) != 0 )
  80. return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + ret );
  81. if( *p != end )
  82. return( POLARSSL_ERR_X509_CERT_INVALID_VERSION +
  83. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  84. return( 0 );
  85. }
  86. /*
  87. * Version ::= INTEGER { v1(0), v2(1) }
  88. */
  89. static int x509_crl_get_version( unsigned char **p,
  90. const unsigned char *end,
  91. int *ver )
  92. {
  93. int ret;
  94. if( ( ret = asn1_get_int( p, end, ver ) ) != 0 )
  95. {
  96. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  97. {
  98. *ver = 0;
  99. return( 0 );
  100. }
  101. return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + ret );
  102. }
  103. return( 0 );
  104. }
  105. /*
  106. * CertificateSerialNumber ::= INTEGER
  107. */
  108. static int x509_get_serial( unsigned char **p,
  109. const unsigned char *end,
  110. x509_buf *serial )
  111. {
  112. int ret;
  113. if( ( end - *p ) < 1 )
  114. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL +
  115. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  116. if( **p != ( ASN1_CONTEXT_SPECIFIC | ASN1_PRIMITIVE | 2 ) &&
  117. **p != ASN1_INTEGER )
  118. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL +
  119. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  120. serial->tag = *(*p)++;
  121. if( ( ret = asn1_get_len( p, end, &serial->len ) ) != 0 )
  122. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL + ret );
  123. serial->p = *p;
  124. *p += serial->len;
  125. return( 0 );
  126. }
  127. /*
  128. * AlgorithmIdentifier ::= SEQUENCE {
  129. * algorithm OBJECT IDENTIFIER,
  130. * parameters ANY DEFINED BY algorithm OPTIONAL }
  131. */
  132. static int x509_get_alg( unsigned char **p,
  133. const unsigned char *end,
  134. x509_buf *alg )
  135. {
  136. int ret;
  137. size_t len;
  138. if( ( ret = asn1_get_tag( p, end, &len,
  139. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  140. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  141. end = *p + len;
  142. alg->tag = **p;
  143. if( ( ret = asn1_get_tag( p, end, &alg->len, ASN1_OID ) ) != 0 )
  144. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  145. alg->p = *p;
  146. *p += alg->len;
  147. if( *p == end )
  148. return( 0 );
  149. /*
  150. * assume the algorithm parameters must be NULL
  151. */
  152. if( ( ret = asn1_get_tag( p, end, &len, ASN1_NULL ) ) != 0 )
  153. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  154. if( *p != end )
  155. return( POLARSSL_ERR_X509_CERT_INVALID_ALG +
  156. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  157. return( 0 );
  158. }
  159. /*
  160. * AttributeTypeAndValue ::= SEQUENCE {
  161. * type AttributeType,
  162. * value AttributeValue }
  163. *
  164. * AttributeType ::= OBJECT IDENTIFIER
  165. *
  166. * AttributeValue ::= ANY DEFINED BY AttributeType
  167. */
  168. static int x509_get_attr_type_value( unsigned char **p,
  169. const unsigned char *end,
  170. x509_name *cur )
  171. {
  172. int ret;
  173. size_t len;
  174. x509_buf *oid;
  175. x509_buf *val;
  176. if( ( ret = asn1_get_tag( p, end, &len,
  177. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  178. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  179. oid = &cur->oid;
  180. oid->tag = **p;
  181. if( ( ret = asn1_get_tag( p, end, &oid->len, ASN1_OID ) ) != 0 )
  182. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  183. oid->p = *p;
  184. *p += oid->len;
  185. if( ( end - *p ) < 1 )
  186. return( POLARSSL_ERR_X509_CERT_INVALID_NAME +
  187. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  188. if( **p != ASN1_BMP_STRING && **p != ASN1_UTF8_STRING &&
  189. **p != ASN1_T61_STRING && **p != ASN1_PRINTABLE_STRING &&
  190. **p != ASN1_IA5_STRING && **p != ASN1_UNIVERSAL_STRING )
  191. return( POLARSSL_ERR_X509_CERT_INVALID_NAME +
  192. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  193. val = &cur->val;
  194. val->tag = *(*p)++;
  195. if( ( ret = asn1_get_len( p, end, &val->len ) ) != 0 )
  196. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  197. val->p = *p;
  198. *p += val->len;
  199. cur->next = NULL;
  200. return( 0 );
  201. }
  202. /*
  203. * RelativeDistinguishedName ::=
  204. * SET OF AttributeTypeAndValue
  205. *
  206. * AttributeTypeAndValue ::= SEQUENCE {
  207. * type AttributeType,
  208. * value AttributeValue }
  209. *
  210. * AttributeType ::= OBJECT IDENTIFIER
  211. *
  212. * AttributeValue ::= ANY DEFINED BY AttributeType
  213. */
  214. static int x509_get_name( unsigned char **p,
  215. const unsigned char *end,
  216. x509_name *cur )
  217. {
  218. int ret;
  219. size_t len;
  220. const unsigned char *end2;
  221. x509_name *use;
  222. if( ( ret = asn1_get_tag( p, end, &len,
  223. ASN1_CONSTRUCTED | ASN1_SET ) ) != 0 )
  224. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  225. end2 = end;
  226. end = *p + len;
  227. use = cur;
  228. do
  229. {
  230. if( ( ret = x509_get_attr_type_value( p, end, use ) ) != 0 )
  231. return( ret );
  232. if( *p != end )
  233. {
  234. use->next = (x509_name *) malloc(
  235. sizeof( x509_name ) );
  236. if( use->next == NULL )
  237. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  238. memset( use->next, 0, sizeof( x509_name ) );
  239. use = use->next;
  240. }
  241. }
  242. while( *p != end );
  243. /*
  244. * recurse until end of SEQUENCE is reached
  245. */
  246. if( *p == end2 )
  247. return( 0 );
  248. cur->next = (x509_name *) malloc(
  249. sizeof( x509_name ) );
  250. if( cur->next == NULL )
  251. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  252. return( x509_get_name( p, end2, cur->next ) );
  253. }
  254. /*
  255. * Time ::= CHOICE {
  256. * utcTime UTCTime,
  257. * generalTime GeneralizedTime }
  258. */
  259. static int x509_get_time( unsigned char **p,
  260. const unsigned char *end,
  261. x509_time *time )
  262. {
  263. int ret;
  264. size_t len;
  265. char date[64];
  266. unsigned char tag;
  267. if( ( end - *p ) < 1 )
  268. return( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  269. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  270. tag = **p;
  271. if ( tag == ASN1_UTC_TIME )
  272. {
  273. (*p)++;
  274. ret = asn1_get_len( p, end, &len );
  275. if( ret != 0 )
  276. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  277. memset( date, 0, sizeof( date ) );
  278. memcpy( date, *p, ( len < sizeof( date ) - 1 ) ?
  279. len : sizeof( date ) - 1 );
  280. if( sscanf( date, "%2d%2d%2d%2d%2d%2d",
  281. &time->year, &time->mon, &time->day,
  282. &time->hour, &time->min, &time->sec ) < 5 )
  283. return( POLARSSL_ERR_X509_CERT_INVALID_DATE );
  284. time->year += 100 * ( time->year < 50 );
  285. time->year += 1900;
  286. *p += len;
  287. return( 0 );
  288. }
  289. else if ( tag == ASN1_GENERALIZED_TIME )
  290. {
  291. (*p)++;
  292. ret = asn1_get_len( p, end, &len );
  293. if( ret != 0 )
  294. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  295. memset( date, 0, sizeof( date ) );
  296. memcpy( date, *p, ( len < sizeof( date ) - 1 ) ?
  297. len : sizeof( date ) - 1 );
  298. if( sscanf( date, "%4d%2d%2d%2d%2d%2d",
  299. &time->year, &time->mon, &time->day,
  300. &time->hour, &time->min, &time->sec ) < 5 )
  301. return( POLARSSL_ERR_X509_CERT_INVALID_DATE );
  302. *p += len;
  303. return( 0 );
  304. }
  305. else
  306. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  307. }
  308. /*
  309. * Validity ::= SEQUENCE {
  310. * notBefore Time,
  311. * notAfter Time }
  312. */
  313. static int x509_get_dates( unsigned char **p,
  314. const unsigned char *end,
  315. x509_time *from,
  316. x509_time *to )
  317. {
  318. int ret;
  319. size_t len;
  320. if( ( ret = asn1_get_tag( p, end, &len,
  321. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  322. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  323. end = *p + len;
  324. if( ( ret = x509_get_time( p, end, from ) ) != 0 )
  325. return( ret );
  326. if( ( ret = x509_get_time( p, end, to ) ) != 0 )
  327. return( ret );
  328. if( *p != end )
  329. return( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  330. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  331. return( 0 );
  332. }
  333. /*
  334. * SubjectPublicKeyInfo ::= SEQUENCE {
  335. * algorithm AlgorithmIdentifier,
  336. * subjectPublicKey BIT STRING }
  337. */
  338. static int x509_get_pubkey( unsigned char **p,
  339. const unsigned char *end,
  340. x509_buf *pk_alg_oid,
  341. mpi *N, mpi *E )
  342. {
  343. int ret, can_handle;
  344. size_t len;
  345. unsigned char *end2;
  346. if( ( ret = x509_get_alg( p, end, pk_alg_oid ) ) != 0 )
  347. return( ret );
  348. /*
  349. * only RSA public keys handled at this time
  350. */
  351. can_handle = 0;
  352. if( pk_alg_oid->len == 9 &&
  353. memcmp( pk_alg_oid->p, OID_PKCS1_RSA, 9 ) == 0 )
  354. can_handle = 1;
  355. if( pk_alg_oid->len == 9 &&
  356. memcmp( pk_alg_oid->p, OID_PKCS1, 8 ) == 0 )
  357. {
  358. if( pk_alg_oid->p[8] >= 2 && pk_alg_oid->p[8] <= 5 )
  359. can_handle = 1;
  360. if ( pk_alg_oid->p[8] >= 11 && pk_alg_oid->p[8] <= 14 )
  361. can_handle = 1;
  362. }
  363. if( pk_alg_oid->len == 5 &&
  364. memcmp( pk_alg_oid->p, OID_RSA_SHA_OBS, 5 ) == 0 )
  365. can_handle = 1;
  366. if( can_handle == 0 )
  367. return( POLARSSL_ERR_X509_UNKNOWN_PK_ALG );
  368. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 )
  369. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  370. if( ( end - *p ) < 1 )
  371. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  372. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  373. end2 = *p + len;
  374. if( *(*p)++ != 0 )
  375. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY );
  376. /*
  377. * RSAPublicKey ::= SEQUENCE {
  378. * modulus INTEGER, -- n
  379. * publicExponent INTEGER -- e
  380. * }
  381. */
  382. if( ( ret = asn1_get_tag( p, end2, &len,
  383. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  384. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  385. if( *p + len != end2 )
  386. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  387. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  388. if( ( ret = asn1_get_mpi( p, end2, N ) ) != 0 ||
  389. ( ret = asn1_get_mpi( p, end2, E ) ) != 0 )
  390. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  391. if( *p != end )
  392. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  393. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  394. return( 0 );
  395. }
  396. static int x509_get_sig( unsigned char **p,
  397. const unsigned char *end,
  398. x509_buf *sig )
  399. {
  400. int ret;
  401. size_t len;
  402. sig->tag = **p;
  403. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 )
  404. return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE + ret );
  405. if( --len < 1 || *(*p)++ != 0 )
  406. return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE );
  407. sig->len = len;
  408. sig->p = *p;
  409. *p += len;
  410. return( 0 );
  411. }
  412. /*
  413. * X.509 v2/v3 unique identifier (not parsed)
  414. */
  415. static int x509_get_uid( unsigned char **p,
  416. const unsigned char *end,
  417. x509_buf *uid, int n )
  418. {
  419. int ret;
  420. if( *p == end )
  421. return( 0 );
  422. uid->tag = **p;
  423. if( ( ret = asn1_get_tag( p, end, &uid->len,
  424. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | n ) ) != 0 )
  425. {
  426. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  427. return( 0 );
  428. return( ret );
  429. }
  430. uid->p = *p;
  431. *p += uid->len;
  432. return( 0 );
  433. }
  434. /*
  435. * X.509 Extensions (No parsing of extensions, pointer should
  436. * be either manually updated or extensions should be parsed!
  437. */
  438. static int x509_get_ext( unsigned char **p,
  439. const unsigned char *end,
  440. x509_buf *ext, int tag )
  441. {
  442. int ret;
  443. size_t len;
  444. if( *p == end )
  445. return( 0 );
  446. ext->tag = **p;
  447. if( ( ret = asn1_get_tag( p, end, &ext->len,
  448. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | tag ) ) != 0 )
  449. return( ret );
  450. ext->p = *p;
  451. end = *p + ext->len;
  452. /*
  453. * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
  454. *
  455. * Extension ::= SEQUENCE {
  456. * extnID OBJECT IDENTIFIER,
  457. * critical BOOLEAN DEFAULT FALSE,
  458. * extnValue OCTET STRING }
  459. */
  460. if( ( ret = asn1_get_tag( p, end, &len,
  461. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  462. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  463. if( end != *p + len )
  464. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  465. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  466. return( 0 );
  467. }
  468. /*
  469. * X.509 CRL v2 extensions (no extensions parsed yet.)
  470. */
  471. static int x509_get_crl_ext( unsigned char **p,
  472. const unsigned char *end,
  473. x509_buf *ext )
  474. {
  475. int ret;
  476. size_t len = 0;
  477. /* Get explicit tag */
  478. if( ( ret = x509_get_ext( p, end, ext, 0) ) != 0 )
  479. {
  480. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  481. return( 0 );
  482. return( ret );
  483. }
  484. while( *p < end )
  485. {
  486. if( ( ret = asn1_get_tag( p, end, &len,
  487. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  488. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  489. *p += len;
  490. }
  491. if( *p != end )
  492. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  493. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  494. return( 0 );
  495. }
  496. /*
  497. * X.509 CRL v2 entry extensions (no extensions parsed yet.)
  498. */
  499. static int x509_get_crl_entry_ext( unsigned char **p,
  500. const unsigned char *end,
  501. x509_buf *ext )
  502. {
  503. int ret;
  504. size_t len = 0;
  505. /* OPTIONAL */
  506. if (end <= *p)
  507. return( 0 );
  508. ext->tag = **p;
  509. ext->p = *p;
  510. /*
  511. * Get CRL-entry extension sequence header
  512. * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2
  513. */
  514. if( ( ret = asn1_get_tag( p, end, &ext->len,
  515. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  516. {
  517. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  518. {
  519. ext->p = NULL;
  520. return( 0 );
  521. }
  522. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  523. }
  524. end = *p + ext->len;
  525. if( end != *p + ext->len )
  526. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  527. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  528. while( *p < end )
  529. {
  530. if( ( ret = asn1_get_tag( p, end, &len,
  531. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  532. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  533. *p += len;
  534. }
  535. if( *p != end )
  536. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  537. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  538. return( 0 );
  539. }
  540. static int x509_get_basic_constraints( unsigned char **p,
  541. const unsigned char *end,
  542. int *ca_istrue,
  543. int *max_pathlen )
  544. {
  545. int ret;
  546. size_t len;
  547. /*
  548. * BasicConstraints ::= SEQUENCE {
  549. * cA BOOLEAN DEFAULT FALSE,
  550. * pathLenConstraint INTEGER (0..MAX) OPTIONAL }
  551. */
  552. *ca_istrue = 0; /* DEFAULT FALSE */
  553. *max_pathlen = 0; /* endless */
  554. if( ( ret = asn1_get_tag( p, end, &len,
  555. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  556. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  557. if( *p == end )
  558. return 0;
  559. if( ( ret = asn1_get_bool( p, end, ca_istrue ) ) != 0 )
  560. {
  561. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  562. ret = asn1_get_int( p, end, ca_istrue );
  563. if( ret != 0 )
  564. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  565. if( *ca_istrue != 0 )
  566. *ca_istrue = 1;
  567. }
  568. if( *p == end )
  569. return 0;
  570. if( ( ret = asn1_get_int( p, end, max_pathlen ) ) != 0 )
  571. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  572. if( *p != end )
  573. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  574. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  575. (*max_pathlen)++;
  576. return 0;
  577. }
  578. static int x509_get_ns_cert_type( unsigned char **p,
  579. const unsigned char *end,
  580. unsigned char *ns_cert_type)
  581. {
  582. int ret;
  583. x509_bitstring bs = { 0, 0, NULL };
  584. if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 )
  585. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  586. if( bs.len != 1 )
  587. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  588. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  589. /* Get actual bitstring */
  590. *ns_cert_type = *bs.p;
  591. return 0;
  592. }
  593. static int x509_get_key_usage( unsigned char **p,
  594. const unsigned char *end,
  595. unsigned char *key_usage)
  596. {
  597. int ret;
  598. x509_bitstring bs = { 0, 0, NULL };
  599. if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 )
  600. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  601. if( bs.len > 1 )
  602. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  603. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  604. /* Get actual bitstring */
  605. *key_usage = *bs.p;
  606. return 0;
  607. }
  608. /*
  609. * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
  610. *
  611. * KeyPurposeId ::= OBJECT IDENTIFIER
  612. */
  613. static int x509_get_ext_key_usage( unsigned char **p,
  614. const unsigned char *end,
  615. x509_sequence *ext_key_usage)
  616. {
  617. int ret;
  618. if( ( ret = asn1_get_sequence_of( p, end, ext_key_usage, ASN1_OID ) ) != 0 )
  619. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  620. /* Sequence length must be >= 1 */
  621. if( ext_key_usage->buf.p == NULL )
  622. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  623. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  624. return 0;
  625. }
  626. /*
  627. * X.509 v3 extensions
  628. *
  629. * TODO: Perform all of the basic constraints tests required by the RFC
  630. * TODO: Set values for undetected extensions to a sane default?
  631. *
  632. */
  633. static int x509_get_crt_ext( unsigned char **p,
  634. const unsigned char *end,
  635. x509_cert *crt )
  636. {
  637. int ret;
  638. size_t len;
  639. unsigned char *end_ext_data, *end_ext_octet;
  640. if( ( ret = x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 )
  641. {
  642. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  643. return( 0 );
  644. return( ret );
  645. }
  646. while( *p < end )
  647. {
  648. /*
  649. * Extension ::= SEQUENCE {
  650. * extnID OBJECT IDENTIFIER,
  651. * critical BOOLEAN DEFAULT FALSE,
  652. * extnValue OCTET STRING }
  653. */
  654. x509_buf extn_oid = {0, 0, NULL};
  655. int is_critical = 0; /* DEFAULT FALSE */
  656. if( ( ret = asn1_get_tag( p, end, &len,
  657. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  658. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  659. end_ext_data = *p + len;
  660. /* Get extension ID */
  661. extn_oid.tag = **p;
  662. if( ( ret = asn1_get_tag( p, end, &extn_oid.len, ASN1_OID ) ) != 0 )
  663. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  664. extn_oid.p = *p;
  665. *p += extn_oid.len;
  666. if( ( end - *p ) < 1 )
  667. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  668. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  669. /* Get optional critical */
  670. if( ( ret = asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 &&
  671. ( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) )
  672. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  673. /* Data should be octet string type */
  674. if( ( ret = asn1_get_tag( p, end_ext_data, &len,
  675. ASN1_OCTET_STRING ) ) != 0 )
  676. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  677. end_ext_octet = *p + len;
  678. if( end_ext_octet != end_ext_data )
  679. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  680. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  681. /*
  682. * Detect supported extensions
  683. */
  684. if( ( OID_SIZE( OID_BASIC_CONSTRAINTS ) == extn_oid.len ) &&
  685. memcmp( extn_oid.p, OID_BASIC_CONSTRAINTS, extn_oid.len ) == 0 )
  686. {
  687. /* Parse basic constraints */
  688. if( ( ret = x509_get_basic_constraints( p, end_ext_octet,
  689. &crt->ca_istrue, &crt->max_pathlen ) ) != 0 )
  690. return ( ret );
  691. crt->ext_types |= EXT_BASIC_CONSTRAINTS;
  692. }
  693. else if( ( OID_SIZE( OID_NS_CERT_TYPE ) == extn_oid.len ) &&
  694. memcmp( extn_oid.p, OID_NS_CERT_TYPE, extn_oid.len ) == 0 )
  695. {
  696. /* Parse netscape certificate type */
  697. if( ( ret = x509_get_ns_cert_type( p, end_ext_octet,
  698. &crt->ns_cert_type ) ) != 0 )
  699. return ( ret );
  700. crt->ext_types |= EXT_NS_CERT_TYPE;
  701. }
  702. else if( ( OID_SIZE( OID_KEY_USAGE ) == extn_oid.len ) &&
  703. memcmp( extn_oid.p, OID_KEY_USAGE, extn_oid.len ) == 0 )
  704. {
  705. /* Parse key usage */
  706. if( ( ret = x509_get_key_usage( p, end_ext_octet,
  707. &crt->key_usage ) ) != 0 )
  708. return ( ret );
  709. crt->ext_types |= EXT_KEY_USAGE;
  710. }
  711. else if( ( OID_SIZE( OID_EXTENDED_KEY_USAGE ) == extn_oid.len ) &&
  712. memcmp( extn_oid.p, OID_EXTENDED_KEY_USAGE, extn_oid.len ) == 0 )
  713. {
  714. /* Parse extended key usage */
  715. if( ( ret = x509_get_ext_key_usage( p, end_ext_octet,
  716. &crt->ext_key_usage ) ) != 0 )
  717. return ( ret );
  718. crt->ext_types |= EXT_EXTENDED_KEY_USAGE;
  719. }
  720. else
  721. {
  722. /* No parser found, skip extension */
  723. *p = end_ext_octet;
  724. #if !defined(POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
  725. if( is_critical )
  726. {
  727. /* Data is marked as critical: fail */
  728. return ( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  729. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  730. }
  731. #endif
  732. }
  733. }
  734. if( *p != end )
  735. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  736. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  737. return( 0 );
  738. }
  739. /*
  740. * X.509 CRL Entries
  741. */
  742. static int x509_get_entries( unsigned char **p,
  743. const unsigned char *end,
  744. x509_crl_entry *entry )
  745. {
  746. int ret;
  747. size_t entry_len;
  748. x509_crl_entry *cur_entry = entry;
  749. if( *p == end )
  750. return( 0 );
  751. if( ( ret = asn1_get_tag( p, end, &entry_len,
  752. ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 )
  753. {
  754. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  755. return( 0 );
  756. return( ret );
  757. }
  758. end = *p + entry_len;
  759. while( *p < end )
  760. {
  761. size_t len2;
  762. const unsigned char *end2;
  763. if( ( ret = asn1_get_tag( p, end, &len2,
  764. ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 )
  765. {
  766. return( ret );
  767. }
  768. cur_entry->raw.tag = **p;
  769. cur_entry->raw.p = *p;
  770. cur_entry->raw.len = len2;
  771. end2 = *p + len2;
  772. if( ( ret = x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 )
  773. return( ret );
  774. if( ( ret = x509_get_time( p, end2, &cur_entry->revocation_date ) ) != 0 )
  775. return( ret );
  776. if( ( ret = x509_get_crl_entry_ext( p, end2, &cur_entry->entry_ext ) ) != 0 )
  777. return( ret );
  778. if ( *p < end )
  779. {
  780. cur_entry->next = malloc( sizeof( x509_crl_entry ) );
  781. if( cur_entry->next == NULL )
  782. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  783. cur_entry = cur_entry->next;
  784. memset( cur_entry, 0, sizeof( x509_crl_entry ) );
  785. }
  786. }
  787. return( 0 );
  788. }
  789. static int x509_get_sig_alg( const x509_buf *sig_oid, int *sig_alg )
  790. {
  791. if( sig_oid->len == 9 &&
  792. memcmp( sig_oid->p, OID_PKCS1, 8 ) == 0 )
  793. {
  794. if( sig_oid->p[8] >= 2 && sig_oid->p[8] <= 5 )
  795. {
  796. *sig_alg = sig_oid->p[8];
  797. return( 0 );
  798. }
  799. if ( sig_oid->p[8] >= 11 && sig_oid->p[8] <= 14 )
  800. {
  801. *sig_alg = sig_oid->p[8];
  802. return( 0 );
  803. }
  804. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  805. }
  806. if( sig_oid->len == 5 &&
  807. memcmp( sig_oid->p, OID_RSA_SHA_OBS, 5 ) == 0 )
  808. {
  809. *sig_alg = SIG_RSA_SHA1;
  810. return( 0 );
  811. }
  812. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  813. }
  814. /*
  815. * Parse and fill a single X.509 certificate in DER format
  816. */
  817. int x509parse_crt_der( x509_cert *crt, const unsigned char *buf, size_t buflen )
  818. {
  819. int ret;
  820. size_t len;
  821. unsigned char *p, *end;
  822. /*
  823. * Check for valid input
  824. */
  825. if( crt == NULL || buf == NULL )
  826. return( POLARSSL_ERR_X509_INVALID_INPUT );
  827. p = (unsigned char *) malloc( len = buflen );
  828. if( p == NULL )
  829. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  830. memcpy( p, buf, buflen );
  831. buflen = 0;
  832. crt->raw.p = p;
  833. crt->raw.len = len;
  834. end = p + len;
  835. /*
  836. * Certificate ::= SEQUENCE {
  837. * tbsCertificate TBSCertificate,
  838. * signatureAlgorithm AlgorithmIdentifier,
  839. * signatureValue BIT STRING }
  840. */
  841. if( ( ret = asn1_get_tag( &p, end, &len,
  842. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  843. {
  844. x509_free( crt );
  845. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT );
  846. }
  847. if( len != (size_t) ( end - p ) )
  848. {
  849. x509_free( crt );
  850. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  851. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  852. }
  853. /*
  854. * TBSCertificate ::= SEQUENCE {
  855. */
  856. crt->tbs.p = p;
  857. if( ( ret = asn1_get_tag( &p, end, &len,
  858. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  859. {
  860. x509_free( crt );
  861. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  862. }
  863. end = p + len;
  864. crt->tbs.len = end - crt->tbs.p;
  865. /*
  866. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  867. *
  868. * CertificateSerialNumber ::= INTEGER
  869. *
  870. * signature AlgorithmIdentifier
  871. */
  872. if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 ||
  873. ( ret = x509_get_serial( &p, end, &crt->serial ) ) != 0 ||
  874. ( ret = x509_get_alg( &p, end, &crt->sig_oid1 ) ) != 0 )
  875. {
  876. x509_free( crt );
  877. return( ret );
  878. }
  879. crt->version++;
  880. if( crt->version > 3 )
  881. {
  882. x509_free( crt );
  883. return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
  884. }
  885. if( ( ret = x509_get_sig_alg( &crt->sig_oid1, &crt->sig_alg ) ) != 0 )
  886. {
  887. x509_free( crt );
  888. return( ret );
  889. }
  890. /*
  891. * issuer Name
  892. */
  893. crt->issuer_raw.p = p;
  894. if( ( ret = asn1_get_tag( &p, end, &len,
  895. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  896. {
  897. x509_free( crt );
  898. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  899. }
  900. if( ( ret = x509_get_name( &p, p + len, &crt->issuer ) ) != 0 )
  901. {
  902. x509_free( crt );
  903. return( ret );
  904. }
  905. crt->issuer_raw.len = p - crt->issuer_raw.p;
  906. /*
  907. * Validity ::= SEQUENCE {
  908. * notBefore Time,
  909. * notAfter Time }
  910. *
  911. */
  912. if( ( ret = x509_get_dates( &p, end, &crt->valid_from,
  913. &crt->valid_to ) ) != 0 )
  914. {
  915. x509_free( crt );
  916. return( ret );
  917. }
  918. /*
  919. * subject Name
  920. */
  921. crt->subject_raw.p = p;
  922. if( ( ret = asn1_get_tag( &p, end, &len,
  923. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  924. {
  925. x509_free( crt );
  926. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  927. }
  928. if( ( ret = x509_get_name( &p, p + len, &crt->subject ) ) != 0 )
  929. {
  930. x509_free( crt );
  931. return( ret );
  932. }
  933. crt->subject_raw.len = p - crt->subject_raw.p;
  934. /*
  935. * SubjectPublicKeyInfo ::= SEQUENCE
  936. * algorithm AlgorithmIdentifier,
  937. * subjectPublicKey BIT STRING }
  938. */
  939. if( ( ret = asn1_get_tag( &p, end, &len,
  940. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  941. {
  942. x509_free( crt );
  943. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  944. }
  945. if( ( ret = x509_get_pubkey( &p, p + len, &crt->pk_oid,
  946. &crt->rsa.N, &crt->rsa.E ) ) != 0 )
  947. {
  948. x509_free( crt );
  949. return( ret );
  950. }
  951. if( ( ret = rsa_check_pubkey( &crt->rsa ) ) != 0 )
  952. {
  953. x509_free( crt );
  954. return( ret );
  955. }
  956. crt->rsa.len = mpi_size( &crt->rsa.N );
  957. /*
  958. * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
  959. * -- If present, version shall be v2 or v3
  960. * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
  961. * -- If present, version shall be v2 or v3
  962. * extensions [3] EXPLICIT Extensions OPTIONAL
  963. * -- If present, version shall be v3
  964. */
  965. if( crt->version == 2 || crt->version == 3 )
  966. {
  967. ret = x509_get_uid( &p, end, &crt->issuer_id, 1 );
  968. if( ret != 0 )
  969. {
  970. x509_free( crt );
  971. return( ret );
  972. }
  973. }
  974. if( crt->version == 2 || crt->version == 3 )
  975. {
  976. ret = x509_get_uid( &p, end, &crt->subject_id, 2 );
  977. if( ret != 0 )
  978. {
  979. x509_free( crt );
  980. return( ret );
  981. }
  982. }
  983. if( crt->version == 3 )
  984. {
  985. ret = x509_get_crt_ext( &p, end, crt);
  986. if( ret != 0 )
  987. {
  988. x509_free( crt );
  989. return( ret );
  990. }
  991. }
  992. if( p != end )
  993. {
  994. x509_free( crt );
  995. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  996. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  997. }
  998. end = crt->raw.p + crt->raw.len;
  999. /*
  1000. * signatureAlgorithm AlgorithmIdentifier,
  1001. * signatureValue BIT STRING
  1002. */
  1003. if( ( ret = x509_get_alg( &p, end, &crt->sig_oid2 ) ) != 0 )
  1004. {
  1005. x509_free( crt );
  1006. return( ret );
  1007. }
  1008. if( memcmp( crt->sig_oid1.p, crt->sig_oid2.p, crt->sig_oid1.len ) != 0 )
  1009. {
  1010. x509_free( crt );
  1011. return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH );
  1012. }
  1013. if( ( ret = x509_get_sig( &p, end, &crt->sig ) ) != 0 )
  1014. {
  1015. x509_free( crt );
  1016. return( ret );
  1017. }
  1018. if( p != end )
  1019. {
  1020. x509_free( crt );
  1021. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1022. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1023. }
  1024. return( 0 );
  1025. }
  1026. /*
  1027. * Parse one or more PEM certificates from a buffer and add them to the chained list
  1028. */
  1029. int x509parse_crt( x509_cert *chain, const unsigned char *buf, size_t buflen )
  1030. {
  1031. int ret, success = 0, first_error = 0, total_failed = 0;
  1032. x509_cert *crt, *prev = NULL;
  1033. int buf_format = X509_FORMAT_DER;
  1034. crt = chain;
  1035. /*
  1036. * Check for valid input
  1037. */
  1038. if( crt == NULL || buf == NULL )
  1039. return( POLARSSL_ERR_X509_INVALID_INPUT );
  1040. while( crt->version != 0 && crt->next != NULL )
  1041. {
  1042. prev = crt;
  1043. crt = crt->next;
  1044. }
  1045. /*
  1046. * Add new certificate on the end of the chain if needed.
  1047. */
  1048. if ( crt->version != 0 && crt->next == NULL)
  1049. {
  1050. crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
  1051. if( crt->next == NULL )
  1052. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1053. prev = crt;
  1054. crt = crt->next;
  1055. memset( crt, 0, sizeof( x509_cert ) );
  1056. }
  1057. /*
  1058. * Determine buffer content. Buffer contains either one DER certificate or
  1059. * one or more PEM certificates.
  1060. */
  1061. #if defined(POLARSSL_PEM_C)
  1062. if( strstr( (char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL )
  1063. buf_format = X509_FORMAT_PEM;
  1064. #endif
  1065. if( buf_format == X509_FORMAT_DER )
  1066. return x509parse_crt_der( crt, buf, buflen );
  1067. #if defined(POLARSSL_PEM_C)
  1068. if( buf_format == X509_FORMAT_PEM )
  1069. {
  1070. pem_context pem;
  1071. while( buflen > 0 )
  1072. {
  1073. size_t use_len;
  1074. pem_init( &pem );
  1075. ret = pem_read_buffer( &pem,
  1076. "-----BEGIN CERTIFICATE-----",
  1077. "-----END CERTIFICATE-----",
  1078. buf, NULL, 0, &use_len );
  1079. if( ret == 0 )
  1080. {
  1081. /*
  1082. * Was PEM encoded
  1083. */
  1084. buflen -= use_len;
  1085. buf += use_len;
  1086. }
  1087. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1088. {
  1089. pem_free( &pem );
  1090. if( first_error == 0 )
  1091. first_error = ret;
  1092. continue;
  1093. }
  1094. else
  1095. break;
  1096. ret = x509parse_crt_der( crt, pem.buf, pem.buflen );
  1097. pem_free( &pem );
  1098. if( ret != 0 )
  1099. {
  1100. /*
  1101. * quit parsing on a memory error
  1102. */
  1103. if( ret == POLARSSL_ERR_X509_MALLOC_FAILED )
  1104. {
  1105. if( prev )
  1106. prev->next = NULL;
  1107. if( crt != chain )
  1108. free( crt );
  1109. return( ret );
  1110. }
  1111. if( first_error == 0 )
  1112. first_error = ret;
  1113. total_failed++;
  1114. memset( crt, 0, sizeof( x509_cert ) );
  1115. continue;
  1116. }
  1117. success = 1;
  1118. /*
  1119. * Add new certificate to the list
  1120. */
  1121. crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
  1122. if( crt->next == NULL )
  1123. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1124. prev = crt;
  1125. crt = crt->next;
  1126. memset( crt, 0, sizeof( x509_cert ) );
  1127. }
  1128. }
  1129. #endif
  1130. if( crt->version == 0 )
  1131. {
  1132. if( prev )
  1133. prev->next = NULL;
  1134. if( crt != chain )
  1135. free( crt );
  1136. }
  1137. if( success )
  1138. return( total_failed );
  1139. else if( first_error )
  1140. return( first_error );
  1141. else
  1142. return( POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT );
  1143. }
  1144. /*
  1145. * Parse one or more CRLs and add them to the chained list
  1146. */
  1147. int x509parse_crl( x509_crl *chain, const unsigned char *buf, size_t buflen )
  1148. {
  1149. int ret;
  1150. size_t len;
  1151. unsigned char *p, *end;
  1152. x509_crl *crl;
  1153. #if defined(POLARSSL_PEM_C)
  1154. size_t use_len;
  1155. pem_context pem;
  1156. #endif
  1157. crl = chain;
  1158. /*
  1159. * Check for valid input
  1160. */
  1161. if( crl == NULL || buf == NULL )
  1162. return( POLARSSL_ERR_X509_INVALID_INPUT );
  1163. while( crl->version != 0 && crl->next != NULL )
  1164. crl = crl->next;
  1165. /*
  1166. * Add new CRL on the end of the chain if needed.
  1167. */
  1168. if ( crl->version != 0 && crl->next == NULL)
  1169. {
  1170. crl->next = (x509_crl *) malloc( sizeof( x509_crl ) );
  1171. if( crl->next == NULL )
  1172. {
  1173. x509_crl_free( crl );
  1174. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1175. }
  1176. crl = crl->next;
  1177. memset( crl, 0, sizeof( x509_crl ) );
  1178. }
  1179. #if defined(POLARSSL_PEM_C)
  1180. pem_init( &pem );
  1181. ret = pem_read_buffer( &pem,
  1182. "-----BEGIN X509 CRL-----",
  1183. "-----END X509 CRL-----",
  1184. buf, NULL, 0, &use_len );
  1185. if( ret == 0 )
  1186. {
  1187. /*
  1188. * Was PEM encoded
  1189. */
  1190. buflen -= use_len;
  1191. buf += use_len;
  1192. /*
  1193. * Steal PEM buffer
  1194. */
  1195. p = pem.buf;
  1196. pem.buf = NULL;
  1197. len = pem.buflen;
  1198. pem_free( &pem );
  1199. }
  1200. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1201. {
  1202. pem_free( &pem );
  1203. return( ret );
  1204. }
  1205. else
  1206. {
  1207. /*
  1208. * nope, copy the raw DER data
  1209. */
  1210. p = (unsigned char *) malloc( len = buflen );
  1211. if( p == NULL )
  1212. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1213. memcpy( p, buf, buflen );
  1214. buflen = 0;
  1215. }
  1216. #else
  1217. p = (unsigned char *) malloc( len = buflen );
  1218. if( p == NULL )
  1219. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1220. memcpy( p, buf, buflen );
  1221. buflen = 0;
  1222. #endif
  1223. crl->raw.p = p;
  1224. crl->raw.len = len;
  1225. end = p + len;
  1226. /*
  1227. * CertificateList ::= SEQUENCE {
  1228. * tbsCertList TBSCertList,
  1229. * signatureAlgorithm AlgorithmIdentifier,
  1230. * signatureValue BIT STRING }
  1231. */
  1232. if( ( ret = asn1_get_tag( &p, end, &len,
  1233. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1234. {
  1235. x509_crl_free( crl );
  1236. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT );
  1237. }
  1238. if( len != (size_t) ( end - p ) )
  1239. {
  1240. x509_crl_free( crl );
  1241. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1242. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1243. }
  1244. /*
  1245. * TBSCertList ::= SEQUENCE {
  1246. */
  1247. crl->tbs.p = p;
  1248. if( ( ret = asn1_get_tag( &p, end, &len,
  1249. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1250. {
  1251. x509_crl_free( crl );
  1252. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1253. }
  1254. end = p + len;
  1255. crl->tbs.len = end - crl->tbs.p;
  1256. /*
  1257. * Version ::= INTEGER OPTIONAL { v1(0), v2(1) }
  1258. * -- if present, MUST be v2
  1259. *
  1260. * signature AlgorithmIdentifier
  1261. */
  1262. if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 ||
  1263. ( ret = x509_get_alg( &p, end, &crl->sig_oid1 ) ) != 0 )
  1264. {
  1265. x509_crl_free( crl );
  1266. return( ret );
  1267. }
  1268. crl->version++;
  1269. if( crl->version > 2 )
  1270. {
  1271. x509_crl_free( crl );
  1272. return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
  1273. }
  1274. if( ( ret = x509_get_sig_alg( &crl->sig_oid1, &crl->sig_alg ) ) != 0 )
  1275. {
  1276. x509_crl_free( crl );
  1277. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  1278. }
  1279. /*
  1280. * issuer Name
  1281. */
  1282. crl->issuer_raw.p = p;
  1283. if( ( ret = asn1_get_tag( &p, end, &len,
  1284. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1285. {
  1286. x509_crl_free( crl );
  1287. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1288. }
  1289. if( ( ret = x509_get_name( &p, p + len, &crl->issuer ) ) != 0 )
  1290. {
  1291. x509_crl_free( crl );
  1292. return( ret );
  1293. }
  1294. crl->issuer_raw.len = p - crl->issuer_raw.p;
  1295. /*
  1296. * thisUpdate Time
  1297. * nextUpdate Time OPTIONAL
  1298. */
  1299. if( ( ret = x509_get_time( &p, end, &crl->this_update ) ) != 0 )
  1300. {
  1301. x509_crl_free( crl );
  1302. return( ret );
  1303. }
  1304. if( ( ret = x509_get_time( &p, end, &crl->next_update ) ) != 0 )
  1305. {
  1306. if ( ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  1307. POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) &&
  1308. ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  1309. POLARSSL_ERR_ASN1_OUT_OF_DATA ) )
  1310. {
  1311. x509_crl_free( crl );
  1312. return( ret );
  1313. }
  1314. }
  1315. /*
  1316. * revokedCertificates SEQUENCE OF SEQUENCE {
  1317. * userCertificate CertificateSerialNumber,
  1318. * revocationDate Time,
  1319. * crlEntryExtensions Extensions OPTIONAL
  1320. * -- if present, MUST be v2
  1321. * } OPTIONAL
  1322. */
  1323. if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 )
  1324. {
  1325. x509_crl_free( crl );
  1326. return( ret );
  1327. }
  1328. /*
  1329. * crlExtensions EXPLICIT Extensions OPTIONAL
  1330. * -- if present, MUST be v2
  1331. */
  1332. if( crl->version == 2 )
  1333. {
  1334. ret = x509_get_crl_ext( &p, end, &crl->crl_ext );
  1335. if( ret != 0 )
  1336. {
  1337. x509_crl_free( crl );
  1338. return( ret );
  1339. }
  1340. }
  1341. if( p != end )
  1342. {
  1343. x509_crl_free( crl );
  1344. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1345. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1346. }
  1347. end = crl->raw.p + crl->raw.len;
  1348. /*
  1349. * signatureAlgorithm AlgorithmIdentifier,
  1350. * signatureValue BIT STRING
  1351. */
  1352. if( ( ret = x509_get_alg( &p, end, &crl->sig_oid2 ) ) != 0 )
  1353. {
  1354. x509_crl_free( crl );
  1355. return( ret );
  1356. }
  1357. if( memcmp( crl->sig_oid1.p, crl->sig_oid2.p, crl->sig_oid1.len ) != 0 )
  1358. {
  1359. x509_crl_free( crl );
  1360. return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH );
  1361. }
  1362. if( ( ret = x509_get_sig( &p, end, &crl->sig ) ) != 0 )
  1363. {
  1364. x509_crl_free( crl );
  1365. return( ret );
  1366. }
  1367. if( p != end )
  1368. {
  1369. x509_crl_free( crl );
  1370. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1371. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1372. }
  1373. if( buflen > 0 )
  1374. {
  1375. crl->next = (x509_crl *) malloc( sizeof( x509_crl ) );
  1376. if( crl->next == NULL )
  1377. {
  1378. x509_crl_free( crl );
  1379. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1380. }
  1381. crl = crl->next;
  1382. memset( crl, 0, sizeof( x509_crl ) );
  1383. return( x509parse_crl( crl, buf, buflen ) );
  1384. }
  1385. return( 0 );
  1386. }
  1387. #if defined(POLARSSL_FS_IO)
  1388. /*
  1389. * Load all data from a file into a given buffer.
  1390. */
  1391. int load_file( const char *path, unsigned char **buf, size_t *n )
  1392. {
  1393. FILE *f;
  1394. if( ( f = fopen( path, "rb" ) ) == NULL )
  1395. return( POLARSSL_ERR_X509_FILE_IO_ERROR );
  1396. fseek( f, 0, SEEK_END );
  1397. *n = (size_t) ftell( f );
  1398. fseek( f, 0, SEEK_SET );
  1399. if( ( *buf = (unsigned char *) malloc( *n + 1 ) ) == NULL )
  1400. return( POLARSSL_ERR_X509_MALLOC_FAILED );
  1401. if( fread( *buf, 1, *n, f ) != *n )
  1402. {
  1403. fclose( f );
  1404. free( *buf );
  1405. return( POLARSSL_ERR_X509_FILE_IO_ERROR );
  1406. }
  1407. fclose( f );
  1408. (*buf)[*n] = '\0';
  1409. return( 0 );
  1410. }
  1411. /*
  1412. * Load one or more certificates and add them to the chained list
  1413. */
  1414. int x509parse_crtfile( x509_cert *chain, const char *path )
  1415. {
  1416. int ret;
  1417. size_t n;
  1418. unsigned char *buf;
  1419. if ( (ret = load_file( path, &buf, &n ) ) != 0 )
  1420. return( ret );
  1421. ret = x509parse_crt( chain, buf, n );
  1422. memset( buf, 0, n + 1 );
  1423. free( buf );
  1424. return( ret );
  1425. }
  1426. /*
  1427. * Load one or more CRLs and add them to the chained list
  1428. */
  1429. int x509parse_crlfile( x509_crl *chain, const char *path )
  1430. {
  1431. int ret;
  1432. size_t n;
  1433. unsigned char *buf;
  1434. if ( (ret = load_file( path, &buf, &n ) ) != 0 )
  1435. return( ret );
  1436. ret = x509parse_crl( chain, buf, n );
  1437. memset( buf, 0, n + 1 );
  1438. free( buf );
  1439. return( ret );
  1440. }
  1441. /*
  1442. * Load and parse a private RSA key
  1443. */
  1444. int x509parse_keyfile( rsa_context *rsa, const char *path, const char *pwd )
  1445. {
  1446. int ret;
  1447. size_t n;
  1448. unsigned char *buf;
  1449. if ( (ret = load_file( path, &buf, &n ) ) != 0 )
  1450. return( ret );
  1451. if( pwd == NULL )
  1452. ret = x509parse_key( rsa, buf, n, NULL, 0 );
  1453. else
  1454. ret = x509parse_key( rsa, buf, n,
  1455. (unsigned char *) pwd, strlen( pwd ) );
  1456. memset( buf, 0, n + 1 );
  1457. free( buf );
  1458. return( ret );
  1459. }
  1460. /*
  1461. * Load and parse a public RSA key
  1462. */
  1463. int x509parse_public_keyfile( rsa_context *rsa, const char *path )
  1464. {
  1465. int ret;
  1466. size_t n;
  1467. unsigned char *buf;
  1468. if ( (ret = load_file( path, &buf, &n ) ) != 0 )
  1469. return( ret );
  1470. ret = x509parse_public_key( rsa, buf, n );
  1471. memset( buf, 0, n + 1 );
  1472. free( buf );
  1473. return( ret );
  1474. }
  1475. #endif /* POLARSSL_FS_IO */
  1476. /*
  1477. * Parse a private RSA key
  1478. */
  1479. int x509parse_key( rsa_context *rsa, const unsigned char *key, size_t keylen,
  1480. const unsigned char *pwd, size_t pwdlen )
  1481. {
  1482. int ret;
  1483. size_t len;
  1484. unsigned char *p, *end;
  1485. unsigned char *p_alt;
  1486. x509_buf pk_alg_oid;
  1487. #if defined(POLARSSL_PEM_C)
  1488. pem_context pem;
  1489. pem_init( &pem );
  1490. ret = pem_read_buffer( &pem,
  1491. "-----BEGIN RSA PRIVATE KEY-----",
  1492. "-----END RSA PRIVATE KEY-----",
  1493. key, pwd, pwdlen, &len );
  1494. if( ret == POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1495. {
  1496. ret = pem_read_buffer( &pem,
  1497. "-----BEGIN PRIVATE KEY-----",
  1498. "-----END PRIVATE KEY-----",
  1499. key, pwd, pwdlen, &len );
  1500. }
  1501. if( ret == 0 )
  1502. {
  1503. /*
  1504. * Was PEM encoded
  1505. */
  1506. keylen = pem.buflen;
  1507. }
  1508. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1509. {
  1510. pem_free( &pem );
  1511. return( ret );
  1512. }
  1513. p = ( ret == 0 ) ? pem.buf : (unsigned char *) key;
  1514. #else
  1515. ((void) pwd);
  1516. ((void) pwdlen);
  1517. p = (unsigned char *) key;
  1518. #endif
  1519. end = p + keylen;
  1520. /*
  1521. * Note: Depending on the type of private key file one can expect either a
  1522. * PrivatKeyInfo object (PKCS#8) or a RSAPrivateKey (PKCS#1) directly.
  1523. *
  1524. * PrivateKeyInfo ::= SEQUENCE {
  1525. * version Version,
  1526. * algorithm AlgorithmIdentifier,
  1527. * PrivateKey BIT STRING
  1528. * }
  1529. *
  1530. * AlgorithmIdentifier ::= SEQUENCE {
  1531. * algorithm OBJECT IDENTIFIER,
  1532. * parameters ANY DEFINED BY algorithm OPTIONAL
  1533. * }
  1534. *
  1535. * RSAPrivateKey ::= SEQUENCE {
  1536. * version Version,
  1537. * modulus INTEGER, -- n
  1538. * publicExponent INTEGER, -- e
  1539. * privateExponent INTEGER, -- d
  1540. * prime1 INTEGER, -- p
  1541. * prime2 INTEGER, -- q
  1542. * exponent1 INTEGER, -- d mod (p-1)
  1543. * exponent2 INTEGER, -- d mod (q-1)
  1544. * coefficient INTEGER, -- (inverse of q) mod p
  1545. * otherPrimeInfos OtherPrimeInfos OPTIONAL
  1546. * }
  1547. */
  1548. if( ( ret = asn1_get_tag( &p, end, &len,
  1549. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1550. {
  1551. #if defined(POLARSSL_PEM_C)
  1552. pem_free( &pem );
  1553. #endif
  1554. rsa_free( rsa );
  1555. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1556. }
  1557. end = p + len;
  1558. if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 )
  1559. {
  1560. #if defined(POLARSSL_PEM_C)
  1561. pem_free( &pem );
  1562. #endif
  1563. rsa_free( rsa );
  1564. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1565. }
  1566. if( rsa->ver != 0 )
  1567. {
  1568. #if defined(POLARSSL_PEM_C)
  1569. pem_free( &pem );
  1570. #endif
  1571. rsa_free( rsa );
  1572. return( POLARSSL_ERR_X509_KEY_INVALID_VERSION + ret );
  1573. }
  1574. p_alt = p;
  1575. if( ( ret = x509_get_alg( &p_alt, end, &pk_alg_oid ) ) != 0 )
  1576. {
  1577. // Assume that we have the PKCS#1 format if wrong
  1578. // tag was encountered
  1579. //
  1580. if( ret != POLARSSL_ERR_X509_CERT_INVALID_ALG +
  1581. POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  1582. {
  1583. #if defined(POLARSSL_PEM_C)
  1584. pem_free( &pem );
  1585. #endif
  1586. rsa_free( rsa );
  1587. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT );
  1588. }
  1589. }
  1590. else
  1591. {
  1592. int ca

Large files files are truncated, but you can click here to view the full file