2 * Public Key layer for parsing key files and structures
4 * Copyright (C) 2006-2014, Brainspark B.V.
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
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.
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.
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.
26 #if !defined(POLARSSL_CONFIG_FILE)
29 #include POLARSSL_CONFIG_FILE
32 #if defined(POLARSSL_PK_PARSE_C)
38 #if defined(POLARSSL_RSA_C)
41 #if defined(POLARSSL_ECP_C)
44 #if defined(POLARSSL_ECDSA_C)
47 #if defined(POLARSSL_PEM_PARSE_C)
50 #if defined(POLARSSL_PKCS5_C)
53 #if defined(POLARSSL_PKCS12_C)
57 #if defined(POLARSSL_PLATFORM_C)
61 #define polarssl_malloc malloc
62 #define polarssl_free free
65 #if defined(POLARSSL_FS_IO)
67 * Load all data from a file into a given buffer.
69 static int load_file( const char *path
, unsigned char **buf
, size_t *n
)
74 if( ( f
= fopen( path
, "rb" ) ) == NULL
)
75 return( POLARSSL_ERR_PK_FILE_IO_ERROR
);
77 fseek( f
, 0, SEEK_END
);
78 if( ( size
= ftell( f
) ) == -1 )
81 return( POLARSSL_ERR_PK_FILE_IO_ERROR
);
83 fseek( f
, 0, SEEK_SET
);
88 ( *buf
= (unsigned char *) polarssl_malloc( *n
+ 1 ) ) == NULL
)
91 return( POLARSSL_ERR_PK_MALLOC_FAILED
);
94 if( fread( *buf
, 1, *n
, f
) != *n
)
97 polarssl_free( *buf
);
98 return( POLARSSL_ERR_PK_FILE_IO_ERROR
);
109 * Load and parse a private key
111 int pk_parse_keyfile( pk_context
*ctx
,
112 const char *path
, const char *pwd
)
118 if ( (ret
= load_file( path
, &buf
, &n
) ) != 0 )
122 ret
= pk_parse_key( ctx
, buf
, n
, NULL
, 0 );
124 ret
= pk_parse_key( ctx
, buf
, n
,
125 (const unsigned char *) pwd
, strlen( pwd
) );
127 memset( buf
, 0, n
+ 1 );
128 polarssl_free( buf
);
134 * Load and parse a public key
136 int pk_parse_public_keyfile( pk_context
*ctx
, const char *path
)
142 if ( (ret
= load_file( path
, &buf
, &n
) ) != 0 )
145 ret
= pk_parse_public_key( ctx
, buf
, n
);
147 memset( buf
, 0, n
+ 1 );
148 polarssl_free( buf
);
152 #endif /* POLARSSL_FS_IO */
154 #if defined(POLARSSL_ECP_C)
155 /* Minimally parse an ECParameters buffer to and asn1_buf
157 * ECParameters ::= CHOICE {
158 * namedCurve OBJECT IDENTIFIER
159 * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
160 * -- implicitCurve NULL
163 static int pk_get_ecparams( unsigned char **p
, const unsigned char *end
,
168 /* Tag may be either OID or SEQUENCE */
170 if( params
->tag
!= ASN1_OID
171 #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
172 && params
->tag
!= ( ASN1_CONSTRUCTED
| ASN1_SEQUENCE
)
176 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
177 POLARSSL_ERR_ASN1_UNEXPECTED_TAG
);
180 if( ( ret
= asn1_get_tag( p
, end
, ¶ms
->len
, params
->tag
) ) != 0 )
182 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
189 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
190 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
195 #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
197 * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it.
198 * WARNING: the resulting group should only be used with
199 * pk_group_id_from_specified(), since its base point may not be set correctly
200 * if it was encoded compressed.
202 * SpecifiedECDomain ::= SEQUENCE {
203 * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...),
204 * fieldID FieldID {{FieldTypes}},
208 * cofactor INTEGER OPTIONAL,
209 * hash HashAlgorithm OPTIONAL,
213 * We only support prime-field as field type, and ignore hash and cofactor.
215 static int pk_group_from_specified( const asn1_buf
*params
, ecp_group
*grp
)
218 unsigned char *p
= params
->p
;
219 const unsigned char * const end
= params
->p
+ params
->len
;
220 const unsigned char *end_field
, *end_curve
;
224 /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */
225 if( ( ret
= asn1_get_int( &p
, end
, &ver
) ) != 0 )
226 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
228 if( ver
< 1 || ver
> 3 )
229 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
232 * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field
233 * fieldType FIELD-ID.&id({IOSet}),
234 * parameters FIELD-ID.&Type({IOSet}{@fieldType})
237 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
238 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
244 * FIELD-ID ::= TYPE-IDENTIFIER
245 * FieldTypes FIELD-ID ::= {
246 * { Prime-p IDENTIFIED BY prime-field } |
247 * { Characteristic-two IDENTIFIED BY characteristic-two-field }
249 * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 }
251 if( ( ret
= asn1_get_tag( &p
, end_field
, &len
, ASN1_OID
) ) != 0 )
254 if( len
!= OID_SIZE( OID_ANSI_X9_62_PRIME_FIELD
) ||
255 memcmp( p
, OID_ANSI_X9_62_PRIME_FIELD
, len
) != 0 )
257 return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE
);
262 /* Prime-p ::= INTEGER -- Field of size p. */
263 if( ( ret
= asn1_get_mpi( &p
, end_field
, &grp
->P
) ) != 0 )
264 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
266 grp
->pbits
= mpi_msb( &grp
->P
);
269 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
270 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
273 * Curve ::= SEQUENCE {
276 * seed BIT STRING OPTIONAL
277 * -- Shall be present if used in SpecifiedECDomain
278 * -- with version equal to ecdpVer2 or ecdpVer3
281 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
282 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
288 * FieldElement ::= OCTET STRING
289 * containing an integer in the case of a prime field
291 if( ( ret
= asn1_get_tag( &p
, end_curve
, &len
, ASN1_OCTET_STRING
) ) != 0 ||
292 ( ret
= mpi_read_binary( &grp
->A
, p
, len
) ) != 0 )
294 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
299 if( ( ret
= asn1_get_tag( &p
, end_curve
, &len
, ASN1_OCTET_STRING
) ) != 0 ||
300 ( ret
= mpi_read_binary( &grp
->B
, p
, len
) ) != 0 )
302 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
307 /* Ignore seed BIT STRING OPTIONAL */
308 if( ( ret
= asn1_get_tag( &p
, end_curve
, &len
, ASN1_BIT_STRING
) ) == 0 )
312 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
313 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
316 * ECPoint ::= OCTET STRING
318 if( ( ret
= asn1_get_tag( &p
, end
, &len
, ASN1_OCTET_STRING
) ) != 0 )
319 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
321 if( ( ret
= ecp_point_read_binary( grp
, &grp
->G
,
322 ( const unsigned char *) p
, len
) ) != 0 )
325 * If we can't read the point because it's compressed, cheat by
326 * reading only the X coordinate and the parity bit of Y.
328 if( ret
!= POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE
||
329 ( p
[0] != 0x02 && p
[0] != 0x03 ) ||
330 len
!= mpi_size( &grp
->P
) + 1 ||
331 mpi_read_binary( &grp
->G
.X
, p
+ 1, len
- 1 ) != 0 ||
332 mpi_lset( &grp
->G
.Y
, p
[0] - 2 ) != 0 ||
333 mpi_lset( &grp
->G
.Z
, 1 ) != 0 )
335 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
344 if( ( ret
= asn1_get_mpi( &p
, end
, &grp
->N
) ) )
345 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
347 grp
->nbits
= mpi_msb( &grp
->N
);
350 * Allow optional elements by purposefully not enforcing p == end here.
357 * Find the group id associated with an (almost filled) group as generated by
358 * pk_group_from_specified(), or return an error if unknown.
360 static int pk_group_id_from_group( const ecp_group
*grp
, ecp_group_id
*grp_id
)
364 const ecp_group_id
*id
;
366 ecp_group_init( &ref
);
368 for( id
= ecp_grp_id_list(); *id
!= POLARSSL_ECP_DP_NONE
; id
++ )
370 /* Load the group associated to that id */
371 ecp_group_free( &ref
);
372 MPI_CHK( ecp_use_known_dp( &ref
, *id
) );
374 /* Compare to the group we were given, starting with easy tests */
375 if( grp
->pbits
== ref
.pbits
&& grp
->nbits
== ref
.nbits
&&
376 mpi_cmp_mpi( &grp
->P
, &ref
.P
) == 0 &&
377 mpi_cmp_mpi( &grp
->A
, &ref
.A
) == 0 &&
378 mpi_cmp_mpi( &grp
->B
, &ref
.B
) == 0 &&
379 mpi_cmp_mpi( &grp
->N
, &ref
.N
) == 0 &&
380 mpi_cmp_mpi( &grp
->G
.X
, &ref
.G
.X
) == 0 &&
381 mpi_cmp_mpi( &grp
->G
.Z
, &ref
.G
.Z
) == 0 &&
382 /* For Y we may only know the parity bit, so compare only that */
383 mpi_get_bit( &grp
->G
.Y
, 0 ) == mpi_get_bit( &ref
.G
.Y
, 0 ) )
391 ecp_group_free( &ref
);
395 if( ret
== 0 && *id
== POLARSSL_ECP_DP_NONE
)
396 ret
= POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE
;
402 * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID
404 static int pk_group_id_from_specified( const asn1_buf
*params
,
405 ecp_group_id
*grp_id
)
410 ecp_group_init( &grp
);
412 if( ( ret
= pk_group_from_specified( params
, &grp
) ) != 0 )
415 ret
= pk_group_id_from_group( &grp
, grp_id
);
418 ecp_group_free( &grp
);
422 #endif /* POLARSSL_PK_PARSE_EC_EXTENDED */
425 * Use EC parameters to initialise an EC group
427 * ECParameters ::= CHOICE {
428 * namedCurve OBJECT IDENTIFIER
429 * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
430 * -- implicitCurve NULL
432 static int pk_use_ecparams( const asn1_buf
*params
, ecp_group
*grp
)
437 if( params
->tag
== ASN1_OID
)
439 if( oid_get_ec_grp( params
, &grp_id
) != 0 )
440 return( POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE
);
444 #if defined(POLARSSL_PK_PARSE_EC_EXTENDED)
445 if( ( ret
= pk_group_id_from_specified( params
, &grp_id
) ) != 0 )
448 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
453 * grp may already be initilialized; if so, make sure IDs match
455 if( grp
->id
!= POLARSSL_ECP_DP_NONE
&& grp
->id
!= grp_id
)
456 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
458 if( ( ret
= ecp_use_known_dp( grp
, grp_id
) ) != 0 )
465 * EC public key is an EC point
467 * The caller is responsible for clearing the structure upon failure if
468 * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE
469 * return code of ecp_point_read_binary() and leave p in a usable state.
471 static int pk_get_ecpubkey( unsigned char **p
, const unsigned char *end
,
476 if( ( ret
= ecp_point_read_binary( &key
->grp
, &key
->Q
,
477 (const unsigned char *) *p
, end
- *p
) ) == 0 )
479 ret
= ecp_check_pubkey( &key
->grp
, &key
->Q
);
483 * We know ecp_point_read_binary consumed all bytes or failed
485 *p
= (unsigned char *) end
;
489 #endif /* POLARSSL_ECP_C */
491 #if defined(POLARSSL_RSA_C)
493 * RSAPublicKey ::= SEQUENCE {
494 * modulus INTEGER, -- n
495 * publicExponent INTEGER -- e
498 static int pk_get_rsapubkey( unsigned char **p
,
499 const unsigned char *end
,
505 if( ( ret
= asn1_get_tag( p
, end
, &len
,
506 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
507 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+ ret
);
509 if( *p
+ len
!= end
)
510 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+
511 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
513 if( ( ret
= asn1_get_mpi( p
, end
, &rsa
->N
) ) != 0 ||
514 ( ret
= asn1_get_mpi( p
, end
, &rsa
->E
) ) != 0 )
515 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+ ret
);
518 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+
519 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
521 if( ( ret
= rsa_check_pubkey( rsa
) ) != 0 )
522 return( POLARSSL_ERR_PK_INVALID_PUBKEY
);
524 rsa
->len
= mpi_size( &rsa
->N
);
528 #endif /* POLARSSL_RSA_C */
530 /* Get a PK algorithm identifier
532 * AlgorithmIdentifier ::= SEQUENCE {
533 * algorithm OBJECT IDENTIFIER,
534 * parameters ANY DEFINED BY algorithm OPTIONAL }
536 static int pk_get_pk_alg( unsigned char **p
,
537 const unsigned char *end
,
538 pk_type_t
*pk_alg
, asn1_buf
*params
)
543 memset( params
, 0, sizeof(asn1_buf
) );
545 if( ( ret
= asn1_get_alg( p
, end
, &alg_oid
, params
) ) != 0 )
546 return( POLARSSL_ERR_PK_INVALID_ALG
+ ret
);
548 if( oid_get_pk_alg( &alg_oid
, pk_alg
) != 0 )
549 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
552 * No parameters with RSA (only for EC)
554 if( *pk_alg
== POLARSSL_PK_RSA
&&
555 ( ( params
->tag
!= ASN1_NULL
&& params
->tag
!= 0 ) ||
558 return( POLARSSL_ERR_PK_INVALID_ALG
);
565 * SubjectPublicKeyInfo ::= SEQUENCE {
566 * algorithm AlgorithmIdentifier,
567 * subjectPublicKey BIT STRING }
569 int pk_parse_subpubkey( unsigned char **p
, const unsigned char *end
,
575 pk_type_t pk_alg
= POLARSSL_PK_NONE
;
576 const pk_info_t
*pk_info
;
578 if( ( ret
= asn1_get_tag( p
, end
, &len
,
579 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
581 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
586 if( ( ret
= pk_get_pk_alg( p
, end
, &pk_alg
, &alg_params
) ) != 0 )
589 if( ( ret
= asn1_get_bitstring_null( p
, end
, &len
) ) != 0 )
590 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+ ret
);
592 if( *p
+ len
!= end
)
593 return( POLARSSL_ERR_PK_INVALID_PUBKEY
+
594 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
596 if( ( pk_info
= pk_info_from_type( pk_alg
) ) == NULL
)
597 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
599 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 )
602 #if defined(POLARSSL_RSA_C)
603 if( pk_alg
== POLARSSL_PK_RSA
)
605 ret
= pk_get_rsapubkey( p
, end
, pk_rsa( *pk
) );
607 #endif /* POLARSSL_RSA_C */
608 #if defined(POLARSSL_ECP_C)
609 if( pk_alg
== POLARSSL_PK_ECKEY_DH
|| pk_alg
== POLARSSL_PK_ECKEY
)
611 ret
= pk_use_ecparams( &alg_params
, &pk_ec( *pk
)->grp
);
613 ret
= pk_get_ecpubkey( p
, end
, pk_ec( *pk
) );
615 #endif /* POLARSSL_ECP_C */
616 ret
= POLARSSL_ERR_PK_UNKNOWN_PK_ALG
;
618 if( ret
== 0 && *p
!= end
)
619 ret
= POLARSSL_ERR_PK_INVALID_PUBKEY
620 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
;
628 #if defined(POLARSSL_RSA_C)
630 * Parse a PKCS#1 encoded private RSA key
632 static int pk_parse_key_pkcs1_der( rsa_context
*rsa
,
633 const unsigned char *key
,
638 unsigned char *p
, *end
;
640 p
= (unsigned char *) key
;
644 * This function parses the RSAPrivateKey (PKCS#1)
646 * RSAPrivateKey ::= SEQUENCE {
648 * modulus INTEGER, -- n
649 * publicExponent INTEGER, -- e
650 * privateExponent INTEGER, -- d
651 * prime1 INTEGER, -- p
652 * prime2 INTEGER, -- q
653 * exponent1 INTEGER, -- d mod (p-1)
654 * exponent2 INTEGER, -- d mod (q-1)
655 * coefficient INTEGER, -- (inverse of q) mod p
656 * otherPrimeInfos OtherPrimeInfos OPTIONAL
659 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
660 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
662 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
667 if( ( ret
= asn1_get_int( &p
, end
, &rsa
->ver
) ) != 0 )
669 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
674 return( POLARSSL_ERR_PK_KEY_INVALID_VERSION
);
677 if( ( ret
= asn1_get_mpi( &p
, end
, &rsa
->N
) ) != 0 ||
678 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->E
) ) != 0 ||
679 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->D
) ) != 0 ||
680 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->P
) ) != 0 ||
681 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->Q
) ) != 0 ||
682 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->DP
) ) != 0 ||
683 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->DQ
) ) != 0 ||
684 ( ret
= asn1_get_mpi( &p
, end
, &rsa
->QP
) ) != 0 )
687 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
690 rsa
->len
= mpi_size( &rsa
->N
);
695 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
696 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
699 if( ( ret
= rsa_check_privkey( rsa
) ) != 0 )
707 #endif /* POLARSSL_RSA_C */
709 #if defined(POLARSSL_ECP_C)
711 * Parse a SEC1 encoded private EC key
713 static int pk_parse_key_sec1_der( ecp_keypair
*eck
,
714 const unsigned char *key
,
718 int version
, pubkey_done
;
721 unsigned char *p
= (unsigned char *) key
;
722 unsigned char *end
= p
+ keylen
;
726 * RFC 5915, or SEC1 Appendix C.4
728 * ECPrivateKey ::= SEQUENCE {
729 * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
730 * privateKey OCTET STRING,
731 * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
732 * publicKey [1] BIT STRING OPTIONAL
735 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
736 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
738 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
743 if( ( ret
= asn1_get_int( &p
, end
, &version
) ) != 0 )
744 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
747 return( POLARSSL_ERR_PK_KEY_INVALID_VERSION
);
749 if( ( ret
= asn1_get_tag( &p
, end
, &len
, ASN1_OCTET_STRING
) ) != 0 )
750 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
752 if( ( ret
= mpi_read_binary( &eck
->d
, p
, len
) ) != 0 )
754 ecp_keypair_free( eck
);
755 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
761 * Is 'parameters' present?
763 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
764 ASN1_CONTEXT_SPECIFIC
| ASN1_CONSTRUCTED
| 0 ) ) == 0 )
766 if( ( ret
= pk_get_ecparams( &p
, p
+ len
, ¶ms
) ) != 0 ||
767 ( ret
= pk_use_ecparams( ¶ms
, &eck
->grp
) ) != 0 )
769 ecp_keypair_free( eck
);
773 else if( ret
!= POLARSSL_ERR_ASN1_UNEXPECTED_TAG
)
775 ecp_keypair_free( eck
);
776 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
780 * Is 'publickey' present? If not, or if we can't read it (eg because it
781 * is compressed), create it from the private key.
784 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
785 ASN1_CONTEXT_SPECIFIC
| ASN1_CONSTRUCTED
| 1 ) ) == 0 )
789 if( ( ret
= asn1_get_bitstring_null( &p
, end2
, &len
) ) != 0 )
790 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
792 if( p
+ len
!= end2
)
793 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
794 POLARSSL_ERR_ASN1_LENGTH_MISMATCH
);
796 if( ( ret
= pk_get_ecpubkey( &p
, end2
, eck
) ) == 0 )
801 * The only acceptable failure mode of pk_get_ecpubkey() above
802 * is if the point format is not recognized.
804 if( ret
!= POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE
)
805 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
808 else if ( ret
!= POLARSSL_ERR_ASN1_UNEXPECTED_TAG
)
810 ecp_keypair_free( eck
);
811 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
815 ( ret
= ecp_mul( &eck
->grp
, &eck
->Q
, &eck
->d
, &eck
->grp
.G
,
816 NULL
, NULL
) ) != 0 )
818 ecp_keypair_free( eck
);
819 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
822 if( ( ret
= ecp_check_privkey( &eck
->grp
, &eck
->d
) ) != 0 )
824 ecp_keypair_free( eck
);
830 #endif /* POLARSSL_ECP_C */
833 * Parse an unencrypted PKCS#8 encoded private key
835 static int pk_parse_key_pkcs8_unencrypted_der(
837 const unsigned char* key
,
843 unsigned char *p
= (unsigned char *) key
;
844 unsigned char *end
= p
+ keylen
;
845 pk_type_t pk_alg
= POLARSSL_PK_NONE
;
846 const pk_info_t
*pk_info
;
849 * This function parses the PrivatKeyInfo object (PKCS#8 v1.2 = RFC 5208)
851 * PrivateKeyInfo ::= SEQUENCE {
853 * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
854 * privateKey PrivateKey,
855 * attributes [0] IMPLICIT Attributes OPTIONAL }
857 * Version ::= INTEGER
858 * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
859 * PrivateKey ::= OCTET STRING
861 * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey
864 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
865 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
867 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
872 if( ( ret
= asn1_get_int( &p
, end
, &version
) ) != 0 )
873 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
876 return( POLARSSL_ERR_PK_KEY_INVALID_VERSION
+ ret
);
878 if( ( ret
= pk_get_pk_alg( &p
, end
, &pk_alg
, ¶ms
) ) != 0 )
879 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
881 if( ( ret
= asn1_get_tag( &p
, end
, &len
, ASN1_OCTET_STRING
) ) != 0 )
882 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
885 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+
886 POLARSSL_ERR_ASN1_OUT_OF_DATA
);
888 if( ( pk_info
= pk_info_from_type( pk_alg
) ) == NULL
)
889 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
891 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 )
894 #if defined(POLARSSL_RSA_C)
895 if( pk_alg
== POLARSSL_PK_RSA
)
897 if( ( ret
= pk_parse_key_pkcs1_der( pk_rsa( *pk
), p
, len
) ) != 0 )
903 #endif /* POLARSSL_RSA_C */
904 #if defined(POLARSSL_ECP_C)
905 if( pk_alg
== POLARSSL_PK_ECKEY
|| pk_alg
== POLARSSL_PK_ECKEY_DH
)
907 if( ( ret
= pk_use_ecparams( ¶ms
, &pk_ec( *pk
)->grp
) ) != 0 ||
908 ( ret
= pk_parse_key_sec1_der( pk_ec( *pk
), p
, len
) ) != 0 )
914 #endif /* POLARSSL_ECP_C */
915 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
921 * Parse an encrypted PKCS#8 encoded private key
923 static int pk_parse_key_pkcs8_encrypted_der(
925 const unsigned char *key
, size_t keylen
,
926 const unsigned char *pwd
, size_t pwdlen
)
928 int ret
, decrypted
= 0;
930 unsigned char buf
[2048];
931 unsigned char *p
, *end
;
932 asn1_buf pbe_alg_oid
, pbe_params
;
933 #if defined(POLARSSL_PKCS12_C)
934 cipher_type_t cipher_alg
;
938 memset( buf
, 0, sizeof( buf
) );
940 p
= (unsigned char *) key
;
944 return( POLARSSL_ERR_PK_PASSWORD_REQUIRED
);
947 * This function parses the EncryptedPrivatKeyInfo object (PKCS#8)
949 * EncryptedPrivateKeyInfo ::= SEQUENCE {
950 * encryptionAlgorithm EncryptionAlgorithmIdentifier,
951 * encryptedData EncryptedData
954 * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
956 * EncryptedData ::= OCTET STRING
958 * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo
960 if( ( ret
= asn1_get_tag( &p
, end
, &len
,
961 ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) ) != 0 )
963 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
968 if( ( ret
= asn1_get_alg( &p
, end
, &pbe_alg_oid
, &pbe_params
) ) != 0 )
969 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
971 if( ( ret
= asn1_get_tag( &p
, end
, &len
, ASN1_OCTET_STRING
) ) != 0 )
972 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
+ ret
);
974 if( len
> sizeof( buf
) )
975 return( POLARSSL_ERR_PK_BAD_INPUT_DATA
);
978 * Decrypt EncryptedData with appropriate PDE
980 #if defined(POLARSSL_PKCS12_C)
981 if( oid_get_pkcs12_pbe_alg( &pbe_alg_oid
, &md_alg
, &cipher_alg
) == 0 )
983 if( ( ret
= pkcs12_pbe( &pbe_params
, PKCS12_PBE_DECRYPT
,
985 pwd
, pwdlen
, p
, len
, buf
) ) != 0 )
987 if( ret
== POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH
)
988 return( POLARSSL_ERR_PK_PASSWORD_MISMATCH
);
995 else if( OID_CMP( OID_PKCS12_PBE_SHA1_RC4_128
, &pbe_alg_oid
) )
997 if( ( ret
= pkcs12_pbe_sha1_rc4_128( &pbe_params
,
1000 p
, len
, buf
) ) != 0 )
1005 // Best guess for password mismatch when using RC4. If first tag is
1006 // not ASN1_CONSTRUCTED | ASN1_SEQUENCE
1008 if( *buf
!= ( ASN1_CONSTRUCTED
| ASN1_SEQUENCE
) )
1009 return( POLARSSL_ERR_PK_PASSWORD_MISMATCH
);
1014 #endif /* POLARSSL_PKCS12_C */
1015 #if defined(POLARSSL_PKCS5_C)
1016 if( OID_CMP( OID_PKCS5_PBES2
, &pbe_alg_oid
) )
1018 if( ( ret
= pkcs5_pbes2( &pbe_params
, PKCS5_DECRYPT
, pwd
, pwdlen
,
1019 p
, len
, buf
) ) != 0 )
1021 if( ret
== POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH
)
1022 return( POLARSSL_ERR_PK_PASSWORD_MISMATCH
);
1030 #endif /* POLARSSL_PKCS5_C */
1035 if( decrypted
== 0 )
1036 return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE
);
1038 return( pk_parse_key_pkcs8_unencrypted_der( pk
, buf
, len
) );
1042 * Parse a private key
1044 int pk_parse_key( pk_context
*pk
,
1045 const unsigned char *key
, size_t keylen
,
1046 const unsigned char *pwd
, size_t pwdlen
)
1049 const pk_info_t
*pk_info
;
1051 #if defined(POLARSSL_PEM_PARSE_C)
1057 #if defined(POLARSSL_RSA_C)
1058 ret
= pem_read_buffer( &pem
,
1059 "-----BEGIN RSA PRIVATE KEY-----",
1060 "-----END RSA PRIVATE KEY-----",
1061 key
, pwd
, pwdlen
, &len
);
1064 if( ( pk_info
= pk_info_from_type( POLARSSL_PK_RSA
) ) == NULL
)
1065 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
1067 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 ||
1068 ( ret
= pk_parse_key_pkcs1_der( pk_rsa( *pk
),
1069 pem
.buf
, pem
.buflen
) ) != 0 )
1077 else if( ret
== POLARSSL_ERR_PEM_PASSWORD_MISMATCH
)
1078 return( POLARSSL_ERR_PK_PASSWORD_MISMATCH
);
1079 else if( ret
== POLARSSL_ERR_PEM_PASSWORD_REQUIRED
)
1080 return( POLARSSL_ERR_PK_PASSWORD_REQUIRED
);
1081 else if( ret
!= POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT
)
1083 #endif /* POLARSSL_RSA_C */
1085 #if defined(POLARSSL_ECP_C)
1086 ret
= pem_read_buffer( &pem
,
1087 "-----BEGIN EC PRIVATE KEY-----",
1088 "-----END EC PRIVATE KEY-----",
1089 key
, pwd
, pwdlen
, &len
);
1092 if( ( pk_info
= pk_info_from_type( POLARSSL_PK_ECKEY
) ) == NULL
)
1093 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
1095 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 ||
1096 ( ret
= pk_parse_key_sec1_der( pk_ec( *pk
),
1097 pem
.buf
, pem
.buflen
) ) != 0 )
1105 else if( ret
== POLARSSL_ERR_PEM_PASSWORD_MISMATCH
)
1106 return( POLARSSL_ERR_PK_PASSWORD_MISMATCH
);
1107 else if( ret
== POLARSSL_ERR_PEM_PASSWORD_REQUIRED
)
1108 return( POLARSSL_ERR_PK_PASSWORD_REQUIRED
);
1109 else if( ret
!= POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT
)
1111 #endif /* POLARSSL_ECP_C */
1113 ret
= pem_read_buffer( &pem
,
1114 "-----BEGIN PRIVATE KEY-----",
1115 "-----END PRIVATE KEY-----",
1116 key
, NULL
, 0, &len
);
1119 if( ( ret
= pk_parse_key_pkcs8_unencrypted_der( pk
,
1120 pem
.buf
, pem
.buflen
) ) != 0 )
1128 else if( ret
!= POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT
)
1131 ret
= pem_read_buffer( &pem
,
1132 "-----BEGIN ENCRYPTED PRIVATE KEY-----",
1133 "-----END ENCRYPTED PRIVATE KEY-----",
1134 key
, NULL
, 0, &len
);
1137 if( ( ret
= pk_parse_key_pkcs8_encrypted_der( pk
,
1138 pem
.buf
, pem
.buflen
,
1139 pwd
, pwdlen
) ) != 0 )
1147 else if( ret
!= POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT
)
1152 #endif /* POLARSSL_PEM_PARSE_C */
1155 * At this point we only know it's not a PEM formatted key. Could be any
1156 * of the known DER encoded private key formats
1158 * We try the different DER format parsers to see if one passes without
1161 if( ( ret
= pk_parse_key_pkcs8_encrypted_der( pk
, key
, keylen
,
1162 pwd
, pwdlen
) ) == 0 )
1169 if( ret
== POLARSSL_ERR_PK_PASSWORD_MISMATCH
)
1174 if( ( ret
= pk_parse_key_pkcs8_unencrypted_der( pk
, key
, keylen
) ) == 0 )
1179 #if defined(POLARSSL_RSA_C)
1180 if( ( pk_info
= pk_info_from_type( POLARSSL_PK_RSA
) ) == NULL
)
1181 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
1183 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 ||
1184 ( ret
= pk_parse_key_pkcs1_der( pk_rsa( *pk
), key
, keylen
) ) == 0 )
1190 #endif /* POLARSSL_RSA_C */
1192 #if defined(POLARSSL_ECP_C)
1193 if( ( pk_info
= pk_info_from_type( POLARSSL_PK_ECKEY
) ) == NULL
)
1194 return( POLARSSL_ERR_PK_UNKNOWN_PK_ALG
);
1196 if( ( ret
= pk_init_ctx( pk
, pk_info
) ) != 0 ||
1197 ( ret
= pk_parse_key_sec1_der( pk_ec( *pk
), key
, keylen
) ) == 0 )
1203 #endif /* POLARSSL_ECP_C */
1205 return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT
);
1209 * Parse a public key
1211 int pk_parse_public_key( pk_context
*ctx
,
1212 const unsigned char *key
, size_t keylen
)
1216 #if defined(POLARSSL_PEM_PARSE_C)
1221 ret
= pem_read_buffer( &pem
,
1222 "-----BEGIN PUBLIC KEY-----",
1223 "-----END PUBLIC KEY-----",
1224 key
, NULL
, 0, &len
);
1232 keylen
= pem
.buflen
;
1234 else if( ret
!= POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT
)
1239 #endif /* POLARSSL_PEM_PARSE_C */
1240 p
= (unsigned char *) key
;
1242 ret
= pk_parse_subpubkey( &p
, p
+ keylen
, ctx
);
1244 #if defined(POLARSSL_PEM_PARSE_C)
1251 #endif /* POLARSSL_PK_PARSE_C */