pkparse.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257
  1. /*
  2. * Public Key layer for parsing key files and structures
  3. *
  4. * Copyright (C) 2006-2014, 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. #if !defined(POLARSSL_CONFIG_FILE)
  26. #include "polarssl/config.h"
  27. #else
  28. #include POLARSSL_CONFIG_FILE
  29. #endif
  30. #if defined(POLARSSL_PK_PARSE_C)
  31. #include "polarssl/pk.h"
  32. #include "polarssl/asn1.h"
  33. #include "polarssl/oid.h"
  34. #if defined(POLARSSL_RSA_C)
  35. #include "polarssl/rsa.h"
  36. #endif
  37. #if defined(POLARSSL_ECP_C)
  38. #include "polarssl/ecp.h"
  39. #endif
  40. #if defined(POLARSSL_ECDSA_C)
  41. #include "polarssl/ecdsa.h"
  42. #endif
  43. #if defined(POLARSSL_PEM_PARSE_C)
  44. #include "polarssl/pem.h"
  45. #endif
  46. #if defined(POLARSSL_PKCS5_C)
  47. #include "polarssl/pkcs5.h"
  48. #endif
  49. #if defined(POLARSSL_PKCS12_C)
  50. #include "polarssl/pkcs12.h"
  51. #endif
  52. #if defined(POLARSSL_PLATFORM_C)
  53. #include "polarssl/platform.h"
  54. #else
  55. #include <stdlib.h>
  56. #define polarssl_malloc malloc
  57. #define polarssl_free free
  58. #endif
  59. #if defined(POLARSSL_FS_IO)
  60. /* Implementation that should never be optimized out by the compiler */
  61. static void polarssl_zeroize( void *v, size_t n ) {
  62. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  63. }
  64. /*
  65. * Load all data from a file into a given buffer.
  66. */
  67. static int load_file( const char *path, unsigned char **buf, size_t *n )
  68. {
  69. FILE *f;
  70. long size;
  71. if( ( f = fopen( path, "rb" ) ) == NULL )
  72. return( POLARSSL_ERR_PK_FILE_IO_ERROR );
  73. fseek( f, 0, SEEK_END );
  74. if( ( size = ftell( f ) ) == -1 )
  75. {
  76. fclose( f );
  77. return( POLARSSL_ERR_PK_FILE_IO_ERROR );
  78. }
  79. fseek( f, 0, SEEK_SET );
  80. *n = (size_t) size;
  81. if( *n + 1 == 0 ||
  82. ( *buf = (unsigned char *) polarssl_malloc( *n + 1 ) ) == NULL )
  83. {
  84. fclose( f );
  85. return( POLARSSL_ERR_PK_MALLOC_FAILED );
  86. }
  87. if( fread( *buf, 1, *n, f ) != *n )
  88. {
  89. fclose( f );
  90. polarssl_free( *buf );
  91. return( POLARSSL_ERR_PK_FILE_IO_ERROR );
  92. }
  93. fclose( f );
  94. (*buf)[*n] = '\0';
  95. return( 0 );
  96. }
  97. /*
  98. * Load and parse a private key
  99. */
  100. int pk_parse_keyfile( pk_context *ctx,
  101. const char *path, const char *pwd )
  102. {
  103. int ret;
  104. size_t n;
  105. unsigned char *buf;
  106. if( ( ret = load_file( path, &buf, &n ) ) != 0 )
  107. return( ret );
  108. if( pwd == NULL )
  109. ret = pk_parse_key( ctx, buf, n, NULL, 0 );
  110. else
  111. ret = pk_parse_key( ctx, buf, n,
  112. (const unsigned char *) pwd, strlen( pwd ) );
  113. polarssl_zeroize( buf, n + 1 );
  114. polarssl_free( buf );
  115. return( ret );
  116. }
  117. /*
  118. * Load and parse a public key
  119. */
  120. int pk_parse_public_keyfile( pk_context *ctx, const char *path )
  121. {
  122. int ret;
  123. size_t n;
  124. unsigned char *buf;
  125. if( ( ret = load_file( path, &buf, &n ) ) != 0 )
  126. return( ret );
  127. ret = pk_parse_public_key( ctx, buf, n );
  128. polarssl_zeroize( buf, n + 1 );
  129. polarssl_free( buf );
  130. return( ret );
  131. }
  132. #endif /* POLARSSL_FS_IO */
  133. #if defined(POLARSSL_ECP_C)
  134. /* Minimally parse an ECParameters buffer to and asn1_buf
  135. *
  136. * ECParameters ::= CHOICE {
  137. * namedCurve OBJECT IDENTIFIER
  138. * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
  139. * -- implicitCurve NULL
  140. * }
  141. */
  142. static int pk_get_ecparams( unsigned char **p, const unsigned char *end,
  143. asn1_buf *params )
  144. {
  145. int ret;
  146. /* Tag may be either OID or SEQUENCE */
  147. params->tag = **p;
  148. if( params->tag != ASN1_OID
  149. #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
  150. && params->tag != ( ASN1_CONSTRUCTED | ASN1_SEQUENCE )
  151. #endif
  152. )
  153. {
  154. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  155. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  156. }
  157. if( ( ret = asn1_get_tag( p, end, &params->len, params->tag ) ) != 0 )
  158. {
  159. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  160. }
  161. params->p = *p;
  162. *p += params->len;
  163. if( *p != end )
  164. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  165. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  166. return( 0 );
  167. }
  168. #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
  169. /*
  170. * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it.
  171. * WARNING: the resulting group should only be used with
  172. * pk_group_id_from_specified(), since its base point may not be set correctly
  173. * if it was encoded compressed.
  174. *
  175. * SpecifiedECDomain ::= SEQUENCE {
  176. * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...),
  177. * fieldID FieldID {{FieldTypes}},
  178. * curve Curve,
  179. * base ECPoint,
  180. * order INTEGER,
  181. * cofactor INTEGER OPTIONAL,
  182. * hash HashAlgorithm OPTIONAL,
  183. * ...
  184. * }
  185. *
  186. * We only support prime-field as field type, and ignore hash and cofactor.
  187. */
  188. static int pk_group_from_specified( const asn1_buf *params, ecp_group *grp )
  189. {
  190. int ret;
  191. unsigned char *p = params->p;
  192. const unsigned char * const end = params->p + params->len;
  193. const unsigned char *end_field, *end_curve;
  194. size_t len;
  195. int ver;
  196. /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */
  197. if( ( ret = asn1_get_int( &p, end, &ver ) ) != 0 )
  198. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  199. if( ver < 1 || ver > 3 )
  200. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  201. /*
  202. * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field
  203. * fieldType FIELD-ID.&id({IOSet}),
  204. * parameters FIELD-ID.&Type({IOSet}{@fieldType})
  205. * }
  206. */
  207. if( ( ret = asn1_get_tag( &p, end, &len,
  208. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  209. return( ret );
  210. end_field = p + len;
  211. /*
  212. * FIELD-ID ::= TYPE-IDENTIFIER
  213. * FieldTypes FIELD-ID ::= {
  214. * { Prime-p IDENTIFIED BY prime-field } |
  215. * { Characteristic-two IDENTIFIED BY characteristic-two-field }
  216. * }
  217. * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 }
  218. */
  219. if( ( ret = asn1_get_tag( &p, end_field, &len, ASN1_OID ) ) != 0 )
  220. return( ret );
  221. if( len != OID_SIZE( OID_ANSI_X9_62_PRIME_FIELD ) ||
  222. memcmp( p, OID_ANSI_X9_62_PRIME_FIELD, len ) != 0 )
  223. {
  224. return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE );
  225. }
  226. p += len;
  227. /* Prime-p ::= INTEGER -- Field of size p. */
  228. if( ( ret = asn1_get_mpi( &p, end_field, &grp->P ) ) != 0 )
  229. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  230. grp->pbits = mpi_msb( &grp->P );
  231. if( p != end_field )
  232. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  233. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  234. /*
  235. * Curve ::= SEQUENCE {
  236. * a FieldElement,
  237. * b FieldElement,
  238. * seed BIT STRING OPTIONAL
  239. * -- Shall be present if used in SpecifiedECDomain
  240. * -- with version equal to ecdpVer2 or ecdpVer3
  241. * }
  242. */
  243. if( ( ret = asn1_get_tag( &p, end, &len,
  244. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  245. return( ret );
  246. end_curve = p + len;
  247. /*
  248. * FieldElement ::= OCTET STRING
  249. * containing an integer in the case of a prime field
  250. */
  251. if( ( ret = asn1_get_tag( &p, end_curve, &len, ASN1_OCTET_STRING ) ) != 0 ||
  252. ( ret = mpi_read_binary( &grp->A, p, len ) ) != 0 )
  253. {
  254. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  255. }
  256. p += len;
  257. if( ( ret = asn1_get_tag( &p, end_curve, &len, ASN1_OCTET_STRING ) ) != 0 ||
  258. ( ret = mpi_read_binary( &grp->B, p, len ) ) != 0 )
  259. {
  260. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  261. }
  262. p += len;
  263. /* Ignore seed BIT STRING OPTIONAL */
  264. if( ( ret = asn1_get_tag( &p, end_curve, &len, ASN1_BIT_STRING ) ) == 0 )
  265. p += len;
  266. if( p != end_curve )
  267. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  268. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  269. /*
  270. * ECPoint ::= OCTET STRING
  271. */
  272. if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 )
  273. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  274. if( ( ret = ecp_point_read_binary( grp, &grp->G,
  275. ( const unsigned char *) p, len ) ) != 0 )
  276. {
  277. /*
  278. * If we can't read the point because it's compressed, cheat by
  279. * reading only the X coordinate and the parity bit of Y.
  280. */
  281. if( ret != POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE ||
  282. ( p[0] != 0x02 && p[0] != 0x03 ) ||
  283. len != mpi_size( &grp->P ) + 1 ||
  284. mpi_read_binary( &grp->G.X, p + 1, len - 1 ) != 0 ||
  285. mpi_lset( &grp->G.Y, p[0] - 2 ) != 0 ||
  286. mpi_lset( &grp->G.Z, 1 ) != 0 )
  287. {
  288. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  289. }
  290. }
  291. p += len;
  292. /*
  293. * order INTEGER
  294. */
  295. if( ( ret = asn1_get_mpi( &p, end, &grp->N ) ) )
  296. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  297. grp->nbits = mpi_msb( &grp->N );
  298. /*
  299. * Allow optional elements by purposefully not enforcing p == end here.
  300. */
  301. return( 0 );
  302. }
  303. /*
  304. * Find the group id associated with an (almost filled) group as generated by
  305. * pk_group_from_specified(), or return an error if unknown.
  306. */
  307. static int pk_group_id_from_group( const ecp_group *grp, ecp_group_id *grp_id )
  308. {
  309. int ret = 0;
  310. ecp_group ref;
  311. const ecp_group_id *id;
  312. ecp_group_init( &ref );
  313. for( id = ecp_grp_id_list(); *id != POLARSSL_ECP_DP_NONE; id++ )
  314. {
  315. /* Load the group associated to that id */
  316. ecp_group_free( &ref );
  317. MPI_CHK( ecp_use_known_dp( &ref, *id ) );
  318. /* Compare to the group we were given, starting with easy tests */
  319. if( grp->pbits == ref.pbits && grp->nbits == ref.nbits &&
  320. mpi_cmp_mpi( &grp->P, &ref.P ) == 0 &&
  321. mpi_cmp_mpi( &grp->A, &ref.A ) == 0 &&
  322. mpi_cmp_mpi( &grp->B, &ref.B ) == 0 &&
  323. mpi_cmp_mpi( &grp->N, &ref.N ) == 0 &&
  324. mpi_cmp_mpi( &grp->G.X, &ref.G.X ) == 0 &&
  325. mpi_cmp_mpi( &grp->G.Z, &ref.G.Z ) == 0 &&
  326. /* For Y we may only know the parity bit, so compare only that */
  327. mpi_get_bit( &grp->G.Y, 0 ) == mpi_get_bit( &ref.G.Y, 0 ) )
  328. {
  329. break;
  330. }
  331. }
  332. cleanup:
  333. ecp_group_free( &ref );
  334. *grp_id = *id;
  335. if( ret == 0 && *id == POLARSSL_ECP_DP_NONE )
  336. ret = POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE;
  337. return( ret );
  338. }
  339. /*
  340. * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID
  341. */
  342. static int pk_group_id_from_specified( const asn1_buf *params,
  343. ecp_group_id *grp_id )
  344. {
  345. int ret;
  346. ecp_group grp;
  347. ecp_group_init( &grp );
  348. if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 )
  349. goto cleanup;
  350. ret = pk_group_id_from_group( &grp, grp_id );
  351. cleanup:
  352. ecp_group_free( &grp );
  353. return( ret );
  354. }
  355. #endif /* POLARSSL_PK_PARSE_EC_EXTENDED */
  356. /*
  357. * Use EC parameters to initialise an EC group
  358. *
  359. * ECParameters ::= CHOICE {
  360. * namedCurve OBJECT IDENTIFIER
  361. * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
  362. * -- implicitCurve NULL
  363. */
  364. static int pk_use_ecparams( const asn1_buf *params, ecp_group *grp )
  365. {
  366. int ret;
  367. ecp_group_id grp_id;
  368. if( params->tag == ASN1_OID )
  369. {
  370. if( oid_get_ec_grp( params, &grp_id ) != 0 )
  371. return( POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE );
  372. }
  373. else
  374. {
  375. #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
  376. if( ( ret = pk_group_id_from_specified( params, &grp_id ) ) != 0 )
  377. return( ret );
  378. #else
  379. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  380. #endif
  381. }
  382. /*
  383. * grp may already be initilialized; if so, make sure IDs match
  384. */
  385. if( grp->id != POLARSSL_ECP_DP_NONE && grp->id != grp_id )
  386. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  387. if( ( ret = ecp_use_known_dp( grp, grp_id ) ) != 0 )
  388. return( ret );
  389. return( 0 );
  390. }
  391. /*
  392. * EC public key is an EC point
  393. *
  394. * The caller is responsible for clearing the structure upon failure if
  395. * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE
  396. * return code of ecp_point_read_binary() and leave p in a usable state.
  397. */
  398. static int pk_get_ecpubkey( unsigned char **p, const unsigned char *end,
  399. ecp_keypair *key )
  400. {
  401. int ret;
  402. if( ( ret = ecp_point_read_binary( &key->grp, &key->Q,
  403. (const unsigned char *) *p, end - *p ) ) == 0 )
  404. {
  405. ret = ecp_check_pubkey( &key->grp, &key->Q );
  406. }
  407. /*
  408. * We know ecp_point_read_binary consumed all bytes or failed
  409. */
  410. *p = (unsigned char *) end;
  411. return( ret );
  412. }
  413. #endif /* POLARSSL_ECP_C */
  414. #if defined(POLARSSL_RSA_C)
  415. /*
  416. * RSAPublicKey ::= SEQUENCE {
  417. * modulus INTEGER, -- n
  418. * publicExponent INTEGER -- e
  419. * }
  420. */
  421. static int pk_get_rsapubkey( unsigned char **p,
  422. const unsigned char *end,
  423. rsa_context *rsa )
  424. {
  425. int ret;
  426. size_t len;
  427. if( ( ret = asn1_get_tag( p, end, &len,
  428. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  429. return( POLARSSL_ERR_PK_INVALID_PUBKEY + ret );
  430. if( *p + len != end )
  431. return( POLARSSL_ERR_PK_INVALID_PUBKEY +
  432. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  433. if( ( ret = asn1_get_mpi( p, end, &rsa->N ) ) != 0 ||
  434. ( ret = asn1_get_mpi( p, end, &rsa->E ) ) != 0 )
  435. return( POLARSSL_ERR_PK_INVALID_PUBKEY + ret );
  436. if( *p != end )
  437. return( POLARSSL_ERR_PK_INVALID_PUBKEY +
  438. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  439. if( ( ret = rsa_check_pubkey( rsa ) ) != 0 )
  440. return( POLARSSL_ERR_PK_INVALID_PUBKEY );
  441. rsa->len = mpi_size( &rsa->N );
  442. return( 0 );
  443. }
  444. #endif /* POLARSSL_RSA_C */
  445. /* Get a PK algorithm identifier
  446. *
  447. * AlgorithmIdentifier ::= SEQUENCE {
  448. * algorithm OBJECT IDENTIFIER,
  449. * parameters ANY DEFINED BY algorithm OPTIONAL }
  450. */
  451. static int pk_get_pk_alg( unsigned char **p,
  452. const unsigned char *end,
  453. pk_type_t *pk_alg, asn1_buf *params )
  454. {
  455. int ret;
  456. asn1_buf alg_oid;
  457. memset( params, 0, sizeof(asn1_buf) );
  458. if( ( ret = asn1_get_alg( p, end, &alg_oid, params ) ) != 0 )
  459. return( POLARSSL_ERR_PK_INVALID_ALG + ret );
  460. if( oid_get_pk_alg( &alg_oid, pk_alg ) != 0 )
  461. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  462. /*
  463. * No parameters with RSA (only for EC)
  464. */
  465. if( *pk_alg == POLARSSL_PK_RSA &&
  466. ( ( params->tag != ASN1_NULL && params->tag != 0 ) ||
  467. params->len != 0 ) )
  468. {
  469. return( POLARSSL_ERR_PK_INVALID_ALG );
  470. }
  471. return( 0 );
  472. }
  473. /*
  474. * SubjectPublicKeyInfo ::= SEQUENCE {
  475. * algorithm AlgorithmIdentifier,
  476. * subjectPublicKey BIT STRING }
  477. */
  478. int pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
  479. pk_context *pk )
  480. {
  481. int ret;
  482. size_t len;
  483. asn1_buf alg_params;
  484. pk_type_t pk_alg = POLARSSL_PK_NONE;
  485. const pk_info_t *pk_info;
  486. if( ( ret = asn1_get_tag( p, end, &len,
  487. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  488. {
  489. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  490. }
  491. end = *p + len;
  492. if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 )
  493. return( ret );
  494. if( ( ret = asn1_get_bitstring_null( p, end, &len ) ) != 0 )
  495. return( POLARSSL_ERR_PK_INVALID_PUBKEY + ret );
  496. if( *p + len != end )
  497. return( POLARSSL_ERR_PK_INVALID_PUBKEY +
  498. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  499. if( ( pk_info = pk_info_from_type( pk_alg ) ) == NULL )
  500. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  501. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 )
  502. return( ret );
  503. #if defined(POLARSSL_RSA_C)
  504. if( pk_alg == POLARSSL_PK_RSA )
  505. {
  506. ret = pk_get_rsapubkey( p, end, pk_rsa( *pk ) );
  507. } else
  508. #endif /* POLARSSL_RSA_C */
  509. #if defined(POLARSSL_ECP_C)
  510. if( pk_alg == POLARSSL_PK_ECKEY_DH || pk_alg == POLARSSL_PK_ECKEY )
  511. {
  512. ret = pk_use_ecparams( &alg_params, &pk_ec( *pk )->grp );
  513. if( ret == 0 )
  514. ret = pk_get_ecpubkey( p, end, pk_ec( *pk ) );
  515. } else
  516. #endif /* POLARSSL_ECP_C */
  517. ret = POLARSSL_ERR_PK_UNKNOWN_PK_ALG;
  518. if( ret == 0 && *p != end )
  519. ret = POLARSSL_ERR_PK_INVALID_PUBKEY
  520. POLARSSL_ERR_ASN1_LENGTH_MISMATCH;
  521. if( ret != 0 )
  522. pk_free( pk );
  523. return( ret );
  524. }
  525. #if defined(POLARSSL_RSA_C)
  526. /*
  527. * Parse a PKCS#1 encoded private RSA key
  528. */
  529. static int pk_parse_key_pkcs1_der( rsa_context *rsa,
  530. const unsigned char *key,
  531. size_t keylen )
  532. {
  533. int ret;
  534. size_t len;
  535. unsigned char *p, *end;
  536. p = (unsigned char *) key;
  537. end = p + keylen;
  538. /*
  539. * This function parses the RSAPrivateKey (PKCS#1)
  540. *
  541. * RSAPrivateKey ::= SEQUENCE {
  542. * version Version,
  543. * modulus INTEGER, -- n
  544. * publicExponent INTEGER, -- e
  545. * privateExponent INTEGER, -- d
  546. * prime1 INTEGER, -- p
  547. * prime2 INTEGER, -- q
  548. * exponent1 INTEGER, -- d mod (p-1)
  549. * exponent2 INTEGER, -- d mod (q-1)
  550. * coefficient INTEGER, -- (inverse of q) mod p
  551. * otherPrimeInfos OtherPrimeInfos OPTIONAL
  552. * }
  553. */
  554. if( ( ret = asn1_get_tag( &p, end, &len,
  555. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  556. {
  557. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  558. }
  559. end = p + len;
  560. if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 )
  561. {
  562. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  563. }
  564. if( rsa->ver != 0 )
  565. {
  566. return( POLARSSL_ERR_PK_KEY_INVALID_VERSION );
  567. }
  568. if( ( ret = asn1_get_mpi( &p, end, &rsa->N ) ) != 0 ||
  569. ( ret = asn1_get_mpi( &p, end, &rsa->E ) ) != 0 ||
  570. ( ret = asn1_get_mpi( &p, end, &rsa->D ) ) != 0 ||
  571. ( ret = asn1_get_mpi( &p, end, &rsa->P ) ) != 0 ||
  572. ( ret = asn1_get_mpi( &p, end, &rsa->Q ) ) != 0 ||
  573. ( ret = asn1_get_mpi( &p, end, &rsa->DP ) ) != 0 ||
  574. ( ret = asn1_get_mpi( &p, end, &rsa->DQ ) ) != 0 ||
  575. ( ret = asn1_get_mpi( &p, end, &rsa->QP ) ) != 0 )
  576. {
  577. rsa_free( rsa );
  578. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  579. }
  580. rsa->len = mpi_size( &rsa->N );
  581. if( p != end )
  582. {
  583. rsa_free( rsa );
  584. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  585. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  586. }
  587. if( ( ret = rsa_check_privkey( rsa ) ) != 0 )
  588. {
  589. rsa_free( rsa );
  590. return( ret );
  591. }
  592. return( 0 );
  593. }
  594. #endif /* POLARSSL_RSA_C */
  595. #if defined(POLARSSL_ECP_C)
  596. /*
  597. * Parse a SEC1 encoded private EC key
  598. */
  599. static int pk_parse_key_sec1_der( ecp_keypair *eck,
  600. const unsigned char *key,
  601. size_t keylen )
  602. {
  603. int ret;
  604. int version, pubkey_done;
  605. size_t len;
  606. asn1_buf params;
  607. unsigned char *p = (unsigned char *) key;
  608. unsigned char *end = p + keylen;
  609. unsigned char *end2;
  610. /*
  611. * RFC 5915, or SEC1 Appendix C.4
  612. *
  613. * ECPrivateKey ::= SEQUENCE {
  614. * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
  615. * privateKey OCTET STRING,
  616. * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
  617. * publicKey [1] BIT STRING OPTIONAL
  618. * }
  619. */
  620. if( ( ret = asn1_get_tag( &p, end, &len,
  621. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  622. {
  623. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  624. }
  625. end = p + len;
  626. if( ( ret = asn1_get_int( &p, end, &version ) ) != 0 )
  627. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  628. if( version != 1 )
  629. return( POLARSSL_ERR_PK_KEY_INVALID_VERSION );
  630. if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 )
  631. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  632. if( ( ret = mpi_read_binary( &eck->d, p, len ) ) != 0 )
  633. {
  634. ecp_keypair_free( eck );
  635. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  636. }
  637. p += len;
  638. /*
  639. * Is 'parameters' present?
  640. */
  641. if( ( ret = asn1_get_tag( &p, end, &len,
  642. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0 ) ) == 0 )
  643. {
  644. if( ( ret = pk_get_ecparams( &p, p + len, &params) ) != 0 ||
  645. ( ret = pk_use_ecparams( &params, &eck->grp ) ) != 0 )
  646. {
  647. ecp_keypair_free( eck );
  648. return( ret );
  649. }
  650. }
  651. else if( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  652. {
  653. ecp_keypair_free( eck );
  654. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  655. }
  656. /*
  657. * Is 'publickey' present? If not, or if we can't read it (eg because it
  658. * is compressed), create it from the private key.
  659. */
  660. pubkey_done = 0;
  661. if( ( ret = asn1_get_tag( &p, end, &len,
  662. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 1 ) ) == 0 )
  663. {
  664. end2 = p + len;
  665. if( ( ret = asn1_get_bitstring_null( &p, end2, &len ) ) != 0 )
  666. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  667. if( p + len != end2 )
  668. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  669. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  670. if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) == 0 )
  671. pubkey_done = 1;
  672. else
  673. {
  674. /*
  675. * The only acceptable failure mode of pk_get_ecpubkey() above
  676. * is if the point format is not recognized.
  677. */
  678. if( ret != POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE )
  679. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  680. }
  681. }
  682. else if( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  683. {
  684. ecp_keypair_free( eck );
  685. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  686. }
  687. if( ! pubkey_done &&
  688. ( ret = ecp_mul( &eck->grp, &eck->Q, &eck->d, &eck->grp.G,
  689. NULL, NULL ) ) != 0 )
  690. {
  691. ecp_keypair_free( eck );
  692. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  693. }
  694. if( ( ret = ecp_check_privkey( &eck->grp, &eck->d ) ) != 0 )
  695. {
  696. ecp_keypair_free( eck );
  697. return( ret );
  698. }
  699. return( 0 );
  700. }
  701. #endif /* POLARSSL_ECP_C */
  702. /*
  703. * Parse an unencrypted PKCS#8 encoded private key
  704. */
  705. static int pk_parse_key_pkcs8_unencrypted_der(
  706. pk_context *pk,
  707. const unsigned char* key,
  708. size_t keylen )
  709. {
  710. int ret, version;
  711. size_t len;
  712. asn1_buf params;
  713. unsigned char *p = (unsigned char *) key;
  714. unsigned char *end = p + keylen;
  715. pk_type_t pk_alg = POLARSSL_PK_NONE;
  716. const pk_info_t *pk_info;
  717. /*
  718. * This function parses the PrivatKeyInfo object (PKCS#8 v1.2 = RFC 5208)
  719. *
  720. * PrivateKeyInfo ::= SEQUENCE {
  721. * version Version,
  722. * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
  723. * privateKey PrivateKey,
  724. * attributes [0] IMPLICIT Attributes OPTIONAL }
  725. *
  726. * Version ::= INTEGER
  727. * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
  728. * PrivateKey ::= OCTET STRING
  729. *
  730. * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey
  731. */
  732. if( ( ret = asn1_get_tag( &p, end, &len,
  733. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  734. {
  735. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  736. }
  737. end = p + len;
  738. if( ( ret = asn1_get_int( &p, end, &version ) ) != 0 )
  739. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  740. if( version != 0 )
  741. return( POLARSSL_ERR_PK_KEY_INVALID_VERSION + ret );
  742. if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, &params ) ) != 0 )
  743. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  744. if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 )
  745. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  746. if( len < 1 )
  747. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT +
  748. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  749. if( ( pk_info = pk_info_from_type( pk_alg ) ) == NULL )
  750. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  751. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 )
  752. return( ret );
  753. #if defined(POLARSSL_RSA_C)
  754. if( pk_alg == POLARSSL_PK_RSA )
  755. {
  756. if( ( ret = pk_parse_key_pkcs1_der( pk_rsa( *pk ), p, len ) ) != 0 )
  757. {
  758. pk_free( pk );
  759. return( ret );
  760. }
  761. } else
  762. #endif /* POLARSSL_RSA_C */
  763. #if defined(POLARSSL_ECP_C)
  764. if( pk_alg == POLARSSL_PK_ECKEY || pk_alg == POLARSSL_PK_ECKEY_DH )
  765. {
  766. if( ( ret = pk_use_ecparams( &params, &pk_ec( *pk )->grp ) ) != 0 ||
  767. ( ret = pk_parse_key_sec1_der( pk_ec( *pk ), p, len ) ) != 0 )
  768. {
  769. pk_free( pk );
  770. return( ret );
  771. }
  772. } else
  773. #endif /* POLARSSL_ECP_C */
  774. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  775. return( 0 );
  776. }
  777. /*
  778. * Parse an encrypted PKCS#8 encoded private key
  779. */
  780. static int pk_parse_key_pkcs8_encrypted_der(
  781. pk_context *pk,
  782. const unsigned char *key, size_t keylen,
  783. const unsigned char *pwd, size_t pwdlen )
  784. {
  785. int ret, decrypted = 0;
  786. size_t len;
  787. unsigned char buf[2048];
  788. unsigned char *p, *end;
  789. asn1_buf pbe_alg_oid, pbe_params;
  790. #if defined(POLARSSL_PKCS12_C)
  791. cipher_type_t cipher_alg;
  792. md_type_t md_alg;
  793. #endif
  794. memset( buf, 0, sizeof( buf ) );
  795. p = (unsigned char *) key;
  796. end = p + keylen;
  797. if( pwdlen == 0 )
  798. return( POLARSSL_ERR_PK_PASSWORD_REQUIRED );
  799. /*
  800. * This function parses the EncryptedPrivatKeyInfo object (PKCS#8)
  801. *
  802. * EncryptedPrivateKeyInfo ::= SEQUENCE {
  803. * encryptionAlgorithm EncryptionAlgorithmIdentifier,
  804. * encryptedData EncryptedData
  805. * }
  806. *
  807. * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
  808. *
  809. * EncryptedData ::= OCTET STRING
  810. *
  811. * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo
  812. */
  813. if( ( ret = asn1_get_tag( &p, end, &len,
  814. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  815. {
  816. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  817. }
  818. end = p + len;
  819. if( ( ret = asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 )
  820. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  821. if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 )
  822. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret );
  823. if( len > sizeof( buf ) )
  824. return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
  825. /*
  826. * Decrypt EncryptedData with appropriate PDE
  827. */
  828. #if defined(POLARSSL_PKCS12_C)
  829. if( oid_get_pkcs12_pbe_alg( &pbe_alg_oid, &md_alg, &cipher_alg ) == 0 )
  830. {
  831. if( ( ret = pkcs12_pbe( &pbe_params, PKCS12_PBE_DECRYPT,
  832. cipher_alg, md_alg,
  833. pwd, pwdlen, p, len, buf ) ) != 0 )
  834. {
  835. if( ret == POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH )
  836. return( POLARSSL_ERR_PK_PASSWORD_MISMATCH );
  837. return( ret );
  838. }
  839. decrypted = 1;
  840. }
  841. else if( OID_CMP( OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) )
  842. {
  843. if( ( ret = pkcs12_pbe_sha1_rc4_128( &pbe_params,
  844. PKCS12_PBE_DECRYPT,
  845. pwd, pwdlen,
  846. p, len, buf ) ) != 0 )
  847. {
  848. return( ret );
  849. }
  850. // Best guess for password mismatch when using RC4. If first tag is
  851. // not ASN1_CONSTRUCTED | ASN1_SEQUENCE
  852. //
  853. if( *buf != ( ASN1_CONSTRUCTED | ASN1_SEQUENCE ) )
  854. return( POLARSSL_ERR_PK_PASSWORD_MISMATCH );
  855. decrypted = 1;
  856. }
  857. else
  858. #endif /* POLARSSL_PKCS12_C */
  859. #if defined(POLARSSL_PKCS5_C)
  860. if( OID_CMP( OID_PKCS5_PBES2, &pbe_alg_oid ) )
  861. {
  862. if( ( ret = pkcs5_pbes2( &pbe_params, PKCS5_DECRYPT, pwd, pwdlen,
  863. p, len, buf ) ) != 0 )
  864. {
  865. if( ret == POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH )
  866. return( POLARSSL_ERR_PK_PASSWORD_MISMATCH );
  867. return( ret );
  868. }
  869. decrypted = 1;
  870. }
  871. else
  872. #endif /* POLARSSL_PKCS5_C */
  873. {
  874. ((void) pwd);
  875. }
  876. if( decrypted == 0 )
  877. return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE );
  878. return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) );
  879. }
  880. /*
  881. * Parse a private key
  882. */
  883. int pk_parse_key( pk_context *pk,
  884. const unsigned char *key, size_t keylen,
  885. const unsigned char *pwd, size_t pwdlen )
  886. {
  887. int ret;
  888. const pk_info_t *pk_info;
  889. #if defined(POLARSSL_PEM_PARSE_C)
  890. size_t len;
  891. pem_context pem;
  892. pem_init( &pem );
  893. #if defined(POLARSSL_RSA_C)
  894. ret = pem_read_buffer( &pem,
  895. "-----BEGIN RSA PRIVATE KEY-----",
  896. "-----END RSA PRIVATE KEY-----",
  897. key, pwd, pwdlen, &len );
  898. if( ret == 0 )
  899. {
  900. if( ( pk_info = pk_info_from_type( POLARSSL_PK_RSA ) ) == NULL )
  901. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  902. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 ||
  903. ( ret = pk_parse_key_pkcs1_der( pk_rsa( *pk ),
  904. pem.buf, pem.buflen ) ) != 0 )
  905. {
  906. pk_free( pk );
  907. }
  908. pem_free( &pem );
  909. return( ret );
  910. }
  911. else if( ret == POLARSSL_ERR_PEM_PASSWORD_MISMATCH )
  912. return( POLARSSL_ERR_PK_PASSWORD_MISMATCH );
  913. else if( ret == POLARSSL_ERR_PEM_PASSWORD_REQUIRED )
  914. return( POLARSSL_ERR_PK_PASSWORD_REQUIRED );
  915. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  916. return( ret );
  917. #endif /* POLARSSL_RSA_C */
  918. #if defined(POLARSSL_ECP_C)
  919. ret = pem_read_buffer( &pem,
  920. "-----BEGIN EC PRIVATE KEY-----",
  921. "-----END EC PRIVATE KEY-----",
  922. key, pwd, pwdlen, &len );
  923. if( ret == 0 )
  924. {
  925. if( ( pk_info = pk_info_from_type( POLARSSL_PK_ECKEY ) ) == NULL )
  926. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  927. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 ||
  928. ( ret = pk_parse_key_sec1_der( pk_ec( *pk ),
  929. pem.buf, pem.buflen ) ) != 0 )
  930. {
  931. pk_free( pk );
  932. }
  933. pem_free( &pem );
  934. return( ret );
  935. }
  936. else if( ret == POLARSSL_ERR_PEM_PASSWORD_MISMATCH )
  937. return( POLARSSL_ERR_PK_PASSWORD_MISMATCH );
  938. else if( ret == POLARSSL_ERR_PEM_PASSWORD_REQUIRED )
  939. return( POLARSSL_ERR_PK_PASSWORD_REQUIRED );
  940. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  941. return( ret );
  942. #endif /* POLARSSL_ECP_C */
  943. ret = pem_read_buffer( &pem,
  944. "-----BEGIN PRIVATE KEY-----",
  945. "-----END PRIVATE KEY-----",
  946. key, NULL, 0, &len );
  947. if( ret == 0 )
  948. {
  949. if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk,
  950. pem.buf, pem.buflen ) ) != 0 )
  951. {
  952. pk_free( pk );
  953. }
  954. pem_free( &pem );
  955. return( ret );
  956. }
  957. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  958. return( ret );
  959. ret = pem_read_buffer( &pem,
  960. "-----BEGIN ENCRYPTED PRIVATE KEY-----",
  961. "-----END ENCRYPTED PRIVATE KEY-----",
  962. key, NULL, 0, &len );
  963. if( ret == 0 )
  964. {
  965. if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk,
  966. pem.buf, pem.buflen,
  967. pwd, pwdlen ) ) != 0 )
  968. {
  969. pk_free( pk );
  970. }
  971. pem_free( &pem );
  972. return( ret );
  973. }
  974. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  975. return( ret );
  976. #else
  977. ((void) pwd);
  978. ((void) pwdlen);
  979. #endif /* POLARSSL_PEM_PARSE_C */
  980. /*
  981. * At this point we only know it's not a PEM formatted key. Could be any
  982. * of the known DER encoded private key formats
  983. *
  984. * We try the different DER format parsers to see if one passes without
  985. * error
  986. */
  987. if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, key, keylen,
  988. pwd, pwdlen ) ) == 0 )
  989. {
  990. return( 0 );
  991. }
  992. pk_free( pk );
  993. if( ret == POLARSSL_ERR_PK_PASSWORD_MISMATCH )
  994. {
  995. return( ret );
  996. }
  997. if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 )
  998. return( 0 );
  999. pk_free( pk );
  1000. #if defined(POLARSSL_RSA_C)
  1001. if( ( pk_info = pk_info_from_type( POLARSSL_PK_RSA ) ) == NULL )
  1002. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  1003. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 ||
  1004. ( ret = pk_parse_key_pkcs1_der( pk_rsa( *pk ), key, keylen ) ) == 0 )
  1005. {
  1006. return( 0 );
  1007. }
  1008. pk_free( pk );
  1009. #endif /* POLARSSL_RSA_C */
  1010. #if defined(POLARSSL_ECP_C)
  1011. if( ( pk_info = pk_info_from_type( POLARSSL_PK_ECKEY ) ) == NULL )
  1012. return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG );
  1013. if( ( ret = pk_init_ctx( pk, pk_info ) ) != 0 ||
  1014. ( ret = pk_parse_key_sec1_der( pk_ec( *pk ), key, keylen ) ) == 0 )
  1015. {
  1016. return( 0 );
  1017. }
  1018. pk_free( pk );
  1019. #endif /* POLARSSL_ECP_C */
  1020. return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT );
  1021. }
  1022. /*
  1023. * Parse a public key
  1024. */
  1025. int pk_parse_public_key( pk_context *ctx,
  1026. const unsigned char *key, size_t keylen )
  1027. {
  1028. int ret;
  1029. unsigned char *p;
  1030. #if defined(POLARSSL_PEM_PARSE_C)
  1031. size_t len;
  1032. pem_context pem;
  1033. pem_init( &pem );
  1034. ret = pem_read_buffer( &pem,
  1035. "-----BEGIN PUBLIC KEY-----",
  1036. "-----END PUBLIC KEY-----",
  1037. key, NULL, 0, &len );
  1038. if( ret == 0 )
  1039. {
  1040. /*
  1041. * Was PEM encoded
  1042. */
  1043. key = pem.buf;
  1044. keylen = pem.buflen;
  1045. }
  1046. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  1047. {
  1048. pem_free( &pem );
  1049. return( ret );
  1050. }
  1051. #endif /* POLARSSL_PEM_PARSE_C */
  1052. p = (unsigned char *) key;
  1053. ret = pk_parse_subpubkey( &p, p + keylen, ctx );
  1054. #if defined(POLARSSL_PEM_PARSE_C)
  1055. pem_free( &pem );
  1056. #endif
  1057. return( ret );
  1058. }
  1059. #endif /* POLARSSL_PK_PARSE_C */