@@ -537,25 +537,53 @@ static psa_status_t psa_import_rsa_key( mbedtls_pk_context *pk,
537
537
}
538
538
#endif /* defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C) */
539
539
540
- #if defined(MBEDTLS_ECP_C ) && defined(MBEDTLS_PK_PARSE_C )
541
- /* Import an elliptic curve parsed by the mbedtls pk module. */
542
- static psa_status_t psa_import_ecp_key ( psa_ecc_curve_t expected_curve ,
543
- mbedtls_pk_context * pk ,
544
- mbedtls_ecp_keypair * * p_ecp )
540
+ #if defined(MBEDTLS_ECP_C )
541
+ /* Import a public key given as a byte string which is a SEC1 2.3.3 ECPoint. */
542
+ static psa_status_t psa_import_ec_public_key ( psa_ecc_curve_t curve ,
543
+ const uint8_t * data ,
544
+ size_t data_length ,
545
+ mbedtls_ecp_keypair * * p_ecp )
545
546
{
546
- if ( mbedtls_pk_get_type ( pk ) != MBEDTLS_PK_ECKEY )
547
- return ( PSA_ERROR_INVALID_ARGUMENT );
548
- else
547
+ psa_status_t status = PSA_ERROR_TAMPERING_DETECTED ;
548
+ mbedtls_ecp_keypair * ecp = NULL ;
549
+ mbedtls_ecp_group_id grp_id = mbedtls_ecc_group_of_psa ( curve );
550
+
551
+ * p_ecp = NULL ;
552
+ ecp = mbedtls_calloc ( 1 , sizeof ( * ecp ) );
553
+ if ( ecp == NULL )
554
+ return ( PSA_ERROR_INSUFFICIENT_MEMORY );
555
+ mbedtls_ecp_keypair_init ( ecp );
556
+
557
+ /* Load the group. */
558
+ status = mbedtls_to_psa_error (
559
+ mbedtls_ecp_group_load ( & ecp -> grp , grp_id ) );
560
+ if ( status != PSA_SUCCESS )
561
+ goto exit ;
562
+ /* Load the public value. */
563
+ status = mbedtls_to_psa_error (
564
+ mbedtls_ecp_point_read_binary ( & ecp -> grp , & ecp -> Q ,
565
+ data , data_length ) );
566
+ if ( status != PSA_SUCCESS )
567
+ goto exit ;
568
+
569
+ /* Check that the point belongs to the group. */
570
+ status = mbedtls_to_psa_error (
571
+ mbedtls_ecp_check_pubkey ( & ecp -> grp , & ecp -> Q ) );
572
+ if ( status != PSA_SUCCESS )
573
+ goto exit ;
574
+
575
+ * p_ecp = ecp ;
576
+ return ( PSA_SUCCESS );
577
+
578
+ exit :
579
+ if ( ecp != NULL )
549
580
{
550
- mbedtls_ecp_keypair * ecp = mbedtls_pk_ec ( * pk );
551
- psa_ecc_curve_t actual_curve = mbedtls_ecc_group_to_psa ( ecp -> grp .id );
552
- if ( actual_curve != expected_curve )
553
- return ( PSA_ERROR_INVALID_ARGUMENT );
554
- * p_ecp = ecp ;
555
- return ( PSA_SUCCESS );
581
+ mbedtls_ecp_keypair_free ( ecp );
582
+ mbedtls_free ( ecp );
556
583
}
584
+ return ( status );
557
585
}
558
- #endif /* defined(MBEDTLS_ECP_C) && defined(MBEDTLS_PK_PARSE_C) */
586
+ #endif /* defined(MBEDTLS_ECP_C) */
559
587
560
588
#if defined(MBEDTLS_ECP_C )
561
589
/* Import a private key given as a byte string which is the private value
@@ -644,9 +672,8 @@ psa_status_t psa_import_key_into_slot( psa_key_slot_t *slot,
644
672
}
645
673
else
646
674
#endif /* MBEDTLS_ECP_C */
647
- #if defined(MBEDTLS_PK_PARSE_C )
648
- if ( PSA_KEY_TYPE_IS_RSA ( slot -> type ) ||
649
- PSA_KEY_TYPE_IS_ECC ( slot -> type ) )
675
+ #if defined(MBEDTLS_RSA_C ) && defined(MBEDTLS_PK_PARSE_C )
676
+ if ( PSA_KEY_TYPE_IS_RSA ( slot -> type ) )
650
677
{
651
678
int ret ;
652
679
mbedtls_pk_context pk ;
@@ -663,20 +690,7 @@ psa_status_t psa_import_key_into_slot( psa_key_slot_t *slot,
663
690
/* We have something that the pkparse module recognizes.
664
691
* If it has the expected type and passes any type-specific
665
692
* checks, store it. */
666
- #if defined(MBEDTLS_RSA_C )
667
- if ( PSA_KEY_TYPE_IS_RSA ( slot -> type ) )
668
- status = psa_import_rsa_key ( & pk , & slot -> data .rsa );
669
- else
670
- #endif /* MBEDTLS_RSA_C */
671
- #if defined(MBEDTLS_ECP_C )
672
- if ( PSA_KEY_TYPE_IS_ECC ( slot -> type ) )
673
- status = psa_import_ecp_key ( PSA_KEY_TYPE_GET_CURVE ( slot -> type ),
674
- & pk , & slot -> data .ecp );
675
- else
676
- #endif /* MBEDTLS_ECP_C */
677
- {
678
- status = PSA_ERROR_NOT_SUPPORTED ;
679
- }
693
+ status = psa_import_rsa_key ( & pk , & slot -> data .rsa );
680
694
681
695
/* Free the content of the pk object only on error. On success,
682
696
* the content of the object has been stored in the slot. */
@@ -687,7 +701,20 @@ psa_status_t psa_import_key_into_slot( psa_key_slot_t *slot,
687
701
}
688
702
}
689
703
else
690
- #endif /* defined(MBEDTLS_PK_PARSE_C) */
704
+ #endif /* defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C) */
705
+ #if defined(MBEDTLS_ECP_C )
706
+ if ( PSA_KEY_TYPE_IS_ECC ( slot -> type ) )
707
+ {
708
+ status = psa_import_ec_public_key (
709
+ PSA_KEY_TYPE_GET_CURVE ( slot -> type ),
710
+ data , data_length ,
711
+ & slot -> data .ecp );
712
+
713
+ if ( status != PSA_SUCCESS )
714
+ return ( status );
715
+ }
716
+ else
717
+ #endif /* MBEDTLS_ECP_C */
691
718
{
692
719
return ( PSA_ERROR_NOT_SUPPORTED );
693
720
}
@@ -915,6 +942,19 @@ static int pk_write_pubkey_rsa( mbedtls_pk_context *key, unsigned char *buf, siz
915
942
return ( (int ) len );
916
943
}
917
944
945
+ static int pk_write_pubkey_ecp ( mbedtls_pk_context * key , unsigned char * buf , size_t size )
946
+ {
947
+ int ret ;
948
+ unsigned char * c ;
949
+ size_t len = 0 ;
950
+
951
+ c = buf + size ;
952
+
953
+ MBEDTLS_ASN1_CHK_ADD ( len , mbedtls_pk_write_pubkey ( & c , buf , key ) );
954
+
955
+ return ( (int ) len );
956
+ }
957
+
918
958
static psa_status_t psa_internal_export_key ( psa_key_slot_t * slot ,
919
959
uint8_t * data ,
920
960
size_t data_size ,
@@ -992,7 +1032,7 @@ static psa_status_t psa_internal_export_key( psa_key_slot_t *slot,
992
1032
}
993
1033
else
994
1034
{
995
- ret = mbedtls_pk_write_pubkey_der ( & pk , data , data_size );
1035
+ ret = pk_write_pubkey_ecp ( & pk , data , data_size );
996
1036
}
997
1037
}
998
1038
else
@@ -4040,32 +4080,17 @@ static psa_status_t psa_key_agreement_ecdh( const uint8_t *peer_key,
4040
4080
size_t shared_secret_size ,
4041
4081
size_t * shared_secret_length )
4042
4082
{
4043
- mbedtls_pk_context pk ;
4044
4083
mbedtls_ecp_keypair * their_key = NULL ;
4045
4084
mbedtls_ecdh_context ecdh ;
4046
4085
psa_status_t status ;
4047
4086
mbedtls_ecdh_init ( & ecdh );
4048
- mbedtls_pk_init ( & pk );
4049
4087
4050
- status = mbedtls_to_psa_error (
4051
- mbedtls_pk_parse_public_key ( & pk , peer_key , peer_key_length ) );
4088
+ status = psa_import_ec_public_key (
4089
+ mbedtls_ecc_group_to_psa ( our_key -> grp .id ),
4090
+ peer_key , peer_key_length ,
4091
+ & their_key );
4052
4092
if ( status != PSA_SUCCESS )
4053
4093
goto exit ;
4054
- switch ( mbedtls_pk_get_type ( & pk ) )
4055
- {
4056
- case MBEDTLS_PK_ECKEY :
4057
- case MBEDTLS_PK_ECKEY_DH :
4058
- break ;
4059
- default :
4060
- status = PSA_ERROR_INVALID_ARGUMENT ;
4061
- goto exit ;
4062
- }
4063
- their_key = mbedtls_pk_ec ( pk );
4064
- if ( their_key -> grp .id != our_key -> grp .id )
4065
- {
4066
- status = PSA_ERROR_INVALID_ARGUMENT ;
4067
- goto exit ;
4068
- }
4069
4094
4070
4095
status = mbedtls_to_psa_error (
4071
4096
mbedtls_ecdh_get_params ( & ecdh , their_key , MBEDTLS_ECDH_THEIRS ) );
@@ -4083,7 +4108,6 @@ static psa_status_t psa_key_agreement_ecdh( const uint8_t *peer_key,
4083
4108
& global_data .ctr_drbg ) );
4084
4109
4085
4110
exit :
4086
- mbedtls_pk_free ( & pk );
4087
4111
mbedtls_ecdh_free ( & ecdh );
4088
4112
return ( status );
4089
4113
}
0 commit comments