28 #if defined(POLARSSL_PK_PARSE_C)
34 #if defined(POLARSSL_RSA_C)
37 #if defined(POLARSSL_ECP_C)
40 #if defined(POLARSSL_ECDSA_C)
43 #if defined(POLARSSL_PEM_PARSE_C)
46 #if defined(POLARSSL_PKCS5_C)
49 #if defined(POLARSSL_PKCS12_C)
53 #if defined(POLARSSL_MEMORY_C)
57 #define polarssl_malloc malloc
58 #define polarssl_free free
61 #if defined(POLARSSL_FS_IO)
65 static int load_file(
const char *path,
unsigned char **buf,
size_t *n )
70 if( ( f = fopen( path,
"rb" ) ) == NULL )
73 fseek( f, 0, SEEK_END );
74 if( ( size = ftell( f ) ) == -1 )
79 fseek( f, 0, SEEK_SET );
90 if( fread( *buf, 1, *n, f ) != *n )
108 const char *path,
const char *pwd )
114 if ( (ret = load_file( path, &buf, &n ) ) != 0 )
121 (
const unsigned char *) pwd, strlen( pwd ) );
123 memset( buf, 0, n + 1 );
138 if ( (ret = load_file( path, &buf, &n ) ) != 0 )
143 memset( buf, 0, n + 1 );
150 #if defined(POLARSSL_ECP_C)
159 static int pk_get_ecparams(
unsigned char **p,
const unsigned char *end,
205 static int pk_get_ecpubkey(
unsigned char **p,
const unsigned char *end,
211 (
const unsigned char *) *p, end - *p ) ) != 0 ||
221 *p = (
unsigned char *) end;
227 #if defined(POLARSSL_RSA_C)
234 static int pk_get_rsapubkey(
unsigned char **p,
235 const unsigned char *end,
245 if( *p + len != end )
272 static int pk_get_pk_alg(
unsigned char **p,
273 const unsigned char *end,
279 memset( params, 0,
sizeof(
asn1_buf) );
281 if( ( ret =
asn1_get_alg( p, end, &alg_oid, params ) ) != 0 )
322 if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 )
328 if( *p + len != end )
338 #if defined(POLARSSL_RSA_C)
341 ret = pk_get_rsapubkey( p, end,
pk_rsa( *pk ) );
344 #if defined(POLARSSL_ECP_C)
347 ret = pk_use_ecparams( &alg_params, &
pk_ec( *pk )->grp );
349 ret = pk_get_ecpubkey( p, end,
pk_ec( *pk ) );
354 if( ret == 0 && *p != end )
364 #if defined(POLARSSL_RSA_C)
368 static int pk_parse_key_pkcs1_der(
rsa_context *rsa,
369 const unsigned char *key,
374 unsigned char *p, *end;
376 p = (
unsigned char *) key;
432 POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
445 #if defined(POLARSSL_ECP_C)
449 static int pk_parse_key_sec1_der(
ecp_keypair *eck,
450 const unsigned char *key,
457 unsigned char *p = (
unsigned char *) key;
458 unsigned char *end = p + keylen;
502 if( ( ret = pk_get_ecparams( &p, p + len, ¶ms) ) != 0 ||
503 ( ret = pk_use_ecparams( ¶ms, &eck->
grp ) ) != 0 )
526 if( p + len != end2 )
528 POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
530 if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) != 0 )
539 NULL, NULL ) ) != 0 )
558 static int pk_parse_key_pkcs8_unencrypted_der(
560 const unsigned char* key,
566 unsigned char *p = (
unsigned char *) key;
567 unsigned char *end = p + keylen;
601 if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, ¶ms ) ) != 0 )
617 #if defined(POLARSSL_RSA_C)
620 if( ( ret = pk_parse_key_pkcs1_der(
pk_rsa( *pk ), p, len ) ) != 0 )
627 #if defined(POLARSSL_ECP_C)
630 if( ( ret = pk_use_ecparams( ¶ms, &
pk_ec( *pk )->grp ) ) != 0 ||
631 ( ret = pk_parse_key_sec1_der(
pk_ec( *pk ), p, len ) ) != 0 )
646 static int pk_parse_key_pkcs8_encrypted_der(
648 const unsigned char *key,
size_t keylen,
649 const unsigned char *pwd,
size_t pwdlen )
653 unsigned char buf[2048];
654 unsigned char *p, *end;
656 #if defined(POLARSSL_PKCS12_C)
661 memset( buf, 0,
sizeof( buf ) );
663 p = (
unsigned char *) key;
691 if( ( ret =
asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 )
697 if( len >
sizeof( buf ) )
703 #if defined(POLARSSL_PKCS12_C)
708 pwd, pwdlen, p, len, buf ) ) != 0 )
721 p, len, buf ) ) != 0 )
734 #if defined(POLARSSL_PKCS5_C)
738 p, len, buf ) ) != 0 )
753 return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) );
760 const unsigned char *key,
size_t keylen,
761 const unsigned char *pwd,
size_t pwdlen )
766 #if defined(POLARSSL_PEM_PARSE_C)
772 #if defined(POLARSSL_RSA_C)
773 ret = pem_read_buffer( &pem,
774 "-----BEGIN RSA PRIVATE KEY-----",
775 "-----END RSA PRIVATE KEY-----",
776 key, pwd, pwdlen, &len );
783 ( ret = pk_parse_key_pkcs1_der(
pk_rsa( *pk ),
784 pem.buf, pem.buflen ) ) != 0 )
800 #if defined(POLARSSL_ECP_C)
801 ret = pem_read_buffer( &pem,
802 "-----BEGIN EC PRIVATE KEY-----",
803 "-----END EC PRIVATE KEY-----",
804 key, pwd, pwdlen, &len );
811 ( ret = pk_parse_key_sec1_der(
pk_ec( *pk ),
812 pem.buf, pem.buflen ) ) != 0 )
828 ret = pem_read_buffer( &pem,
829 "-----BEGIN PRIVATE KEY-----",
830 "-----END PRIVATE KEY-----",
831 key, NULL, 0, &len );
834 if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk,
835 pem.buf, pem.buflen ) ) != 0 )
846 ret = pem_read_buffer( &pem,
847 "-----BEGIN ENCRYPTED PRIVATE KEY-----",
848 "-----END ENCRYPTED PRIVATE KEY-----",
849 key, NULL, 0, &len );
852 if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk,
854 pwd, pwdlen ) ) != 0 )
876 if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, key, keylen,
877 pwd, pwdlen ) ) == 0 )
889 if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 )
894 #if defined(POLARSSL_RSA_C)
899 ( ret = pk_parse_key_pkcs1_der(
pk_rsa( *pk ), key, keylen ) ) == 0 )
907 #if defined(POLARSSL_ECP_C)
912 ( ret = pk_parse_key_sec1_der(
pk_ec( *pk ), key, keylen ) ) == 0 )
927 const unsigned char *key,
size_t keylen )
931 #if defined(POLARSSL_PEM_PARSE_C)
936 ret = pem_read_buffer( &pem,
937 "-----BEGIN PUBLIC KEY-----",
938 "-----END PUBLIC KEY-----",
939 key, NULL, 0, &len );
955 p = (
unsigned char *) key;
959 #if defined(POLARSSL_PEM_PARSE_C)