Skip to content

Commit acdf07c

Browse files
authored
Merge pull request #41 from hanno-arm/ec_pubkey_fmt_fixes
Make further adaptations to new EC public key format
2 parents 472c20b + 00114d7 commit acdf07c

File tree

3 files changed

+160
-30
lines changed

3 files changed

+160
-30
lines changed

include/mbedtls/psa_util.h

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "ecp.h"
4242
#include "md.h"
4343
#include "pk.h"
44+
#include "oid.h"
4445

4546
/* Translations for symmetric crypto. */
4647

@@ -155,6 +156,82 @@ static inline psa_algorithm_t mbedtls_psa_translate_md( mbedtls_md_type_t md_alg
155156

156157
/* Translations for ECC. */
157158

159+
static inline int mbedtls_psa_get_ecc_oid_from_id(
160+
psa_ecc_curve_t curve, char const **oid, size_t *oid_len )
161+
{
162+
switch( curve )
163+
{
164+
#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
165+
case PSA_ECC_CURVE_SECP192R1:
166+
*oid = MBEDTLS_OID_EC_GRP_SECP192R1;
167+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP192R1 );
168+
return( 0 );
169+
#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
170+
#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
171+
case PSA_ECC_CURVE_SECP224R1:
172+
*oid = MBEDTLS_OID_EC_GRP_SECP224R1;
173+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP224R1 );
174+
return( 0 );
175+
#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
176+
#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
177+
case PSA_ECC_CURVE_SECP256R1:
178+
*oid = MBEDTLS_OID_EC_GRP_SECP256R1;
179+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP256R1 );
180+
return( 0 );
181+
#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
182+
#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
183+
case PSA_ECC_CURVE_SECP384R1:
184+
*oid = MBEDTLS_OID_EC_GRP_SECP384R1;
185+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP384R1 );
186+
return( 0 );
187+
#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
188+
#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
189+
case PSA_ECC_CURVE_SECP521R1:
190+
*oid = MBEDTLS_OID_EC_GRP_SECP521R1;
191+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP521R1 );
192+
return( 0 );
193+
#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
194+
#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
195+
case PSA_ECC_CURVE_SECP192K1:
196+
*oid = MBEDTLS_OID_EC_GRP_SECP192K1;
197+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP192K1 );
198+
return( 0 );
199+
#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
200+
#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
201+
case PSA_ECC_CURVE_SECP224K1:
202+
*oid = MBEDTLS_OID_EC_GRP_SECP224K1;
203+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP224K1 );
204+
return( 0 );
205+
#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
206+
#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
207+
case PSA_ECC_CURVE_SECP256K1:
208+
*oid = MBEDTLS_OID_EC_GRP_SECP256K1;
209+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP256K1 );
210+
return( 0 );
211+
#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
212+
#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
213+
case PSA_ECC_CURVE_BRAINPOOL_P256R1:
214+
*oid = MBEDTLS_OID_EC_GRP_BP256R1;
215+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP256R1 );
216+
return( 0 );
217+
#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
218+
#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
219+
case PSA_ECC_CURVE_BRAINPOOL_P384R1:
220+
*oid = MBEDTLS_OID_EC_GRP_BP384R1;
221+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP384R1 );
222+
return( 0 );
223+
#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
224+
#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
225+
case PSA_ECC_CURVE_BRAINPOOL_P512R1:
226+
*oid = MBEDTLS_OID_EC_GRP_BP512R1;
227+
*oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP512R1 );
228+
return( 0 );
229+
#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
230+
}
231+
232+
return( -1 );
233+
}
234+
158235
static inline psa_ecc_curve_t mbedtls_psa_translate_ecc_group( mbedtls_ecp_group_id grpid )
159236
{
160237
switch( grpid )

library/pkwrite.c

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
#if defined(MBEDTLS_USE_PSA_CRYPTO)
5050
#include "psa/crypto.h"
51+
#include "mbedtls/psa_util.h"
5152
#endif
5253
#if defined(MBEDTLS_PLATFORM_C)
5354
#include "mbedtls/platform.h"
@@ -181,7 +182,8 @@ int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
181182
}
182183
else
183184
{
184-
memmove( *p - len, start, len );
185+
*p -= len;
186+
memmove( *p, start, len );
185187
}
186188
}
187189
else
@@ -196,16 +198,13 @@ int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, si
196198
int ret;
197199
unsigned char *c;
198200
size_t len = 0, par_len = 0, oid_len;
201+
mbedtls_pk_type_t pk_type;
199202
const char *oid;
200203

201204
c = buf + size;
202205

203206
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, key ) );
204207

205-
if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_OPAQUE )
206-
{
207-
return( (int) len );
208-
}
209208
if( c - buf < 1 )
210209
return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
211210

@@ -220,18 +219,51 @@ int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, si
220219
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
221220
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) );
222221

223-
if( ( ret = mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_get_type( key ),
224-
&oid, &oid_len ) ) != 0 )
225-
{
226-
return( ret );
227-
}
228-
222+
pk_type = mbedtls_pk_get_type( key );
229223
#if defined(MBEDTLS_ECP_C)
230-
if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )
224+
if( pk_type == MBEDTLS_PK_ECKEY )
231225
{
232226
MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, mbedtls_pk_ec( *key ) ) );
233227
}
234228
#endif
229+
#if defined(MBEDTLS_USE_PSA_CRYPTO)
230+
if( pk_type == MBEDTLS_PK_OPAQUE )
231+
{
232+
psa_status_t status;
233+
psa_key_type_t key_type;
234+
psa_key_handle_t handle;
235+
psa_ecc_curve_t curve;
236+
237+
handle = *((psa_key_handle_t*) key->pk_ctx );
238+
239+
status = psa_get_key_information( handle, &key_type,
240+
NULL /* bitsize not needed */ );
241+
if( status != PSA_SUCCESS )
242+
return( MBEDTLS_ERR_PK_HW_ACCEL_FAILED );
243+
244+
curve = PSA_KEY_TYPE_GET_CURVE( key_type );
245+
if( curve == 0 )
246+
return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
247+
248+
ret = mbedtls_psa_get_ecc_oid_from_id( curve, &oid, &oid_len );
249+
if( ret != 0 )
250+
return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
251+
252+
/* Write EC algorithm parameters; that's akin
253+
* to pk_write_ec_param() above. */
254+
MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_oid( &c, buf,
255+
oid, oid_len ) );
256+
257+
/* The rest of the function works as for legacy EC contexts. */
258+
pk_type = MBEDTLS_PK_ECKEY;
259+
}
260+
#endif /* MBEDTLS_USE_PSA_CRYPTO */
261+
262+
if( ( ret = mbedtls_oid_get_oid_by_pk_alg( pk_type, &oid,
263+
&oid_len ) ) != 0 )
264+
{
265+
return( ret );
266+
}
235267

236268
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, buf, oid, oid_len,
237269
par_len ) );

tests/suites/test_suite_pk.function

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -778,44 +778,65 @@ exit:
778778
void pk_psa_sign( )
779779
{
780780
mbedtls_pk_context pk;
781-
psa_key_handle_t key;
782-
unsigned char hash[50], sig[100], pkey[100];
783-
size_t sig_len, klen = 0;
781+
unsigned char hash[50], sig[100], pkey_legacy[100], pkey_psa[100];
782+
unsigned char *pkey_legacy_start, *pkey_psa_start;
783+
size_t sig_len, klen_legacy, klen_psa;
784+
int ret;
785+
psa_key_handle_t handle;
784786

785787
/*
786788
* This tests making signatures with a wrapped PSA key:
787-
* - generate a fresh PSA key
789+
* - generate a fresh ECP legacy PK context
788790
* - wrap it in a PK context and make a signature this way
789791
* - extract the public key
790792
* - parse it to a PK context and verify the signature this way
791793
*/
792794

795+
/* Create legacy EC public/private key in PK context. */
793796
mbedtls_pk_init( &pk );
797+
TEST_ASSERT( mbedtls_pk_setup( &pk,
798+
mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ) ) == 0 );
799+
TEST_ASSERT( mbedtls_ecp_gen_key( MBEDTLS_ECP_DP_SECP256R1,
800+
(mbedtls_ecp_keypair*) pk.pk_ctx,
801+
rnd_std_rand, NULL ) == 0 );
802+
803+
/* Export underlying public key for re-importing in a legacy context. */
804+
ret = mbedtls_pk_write_pubkey_der( &pk, pkey_legacy,
805+
sizeof( pkey_legacy ) );
806+
TEST_ASSERT( ret >= 0 );
807+
klen_legacy = (size_t) ret;
808+
/* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
809+
pkey_legacy_start = pkey_legacy + sizeof( pkey_legacy ) - klen_legacy;
810+
811+
/* Turn PK context into an opaque one. */
812+
TEST_ASSERT( psa_allocate_key( &handle ) == PSA_SUCCESS );
813+
TEST_ASSERT( mbedtls_pk_wrap_as_opaque( &pk, &handle,
814+
PSA_ALG_SHA_256 ) == 0 );
794815

795816
memset( hash, 0x2a, sizeof hash );
796817
memset( sig, 0, sizeof sig );
797-
memset( pkey, 0, sizeof pkey );
798-
799-
key = pk_psa_genkey();
800-
TEST_ASSERT( key != 0 );
801-
802-
TEST_ASSERT( mbedtls_pk_setup_opaque( &pk, key ) == 0 );
803818

804819
TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256,
805820
hash, sizeof hash, sig, &sig_len,
806821
NULL, NULL ) == 0 );
807822

808-
mbedtls_pk_free( &pk );
809-
810-
TEST_ASSERT( PSA_SUCCESS == psa_export_public_key(
811-
key, pkey, sizeof( pkey ), &klen ) );
812-
TEST_ASSERT( PSA_SUCCESS == psa_destroy_key( key ) );
823+
/* Export underlying public key for re-importing in a psa context. */
824+
ret = mbedtls_pk_write_pubkey_der( &pk, pkey_psa,
825+
sizeof( pkey_psa ) );
826+
TEST_ASSERT( ret >= 0 );
827+
klen_psa = (size_t) ret;
828+
/* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
829+
pkey_psa_start = pkey_psa + sizeof( pkey_psa ) - klen_psa;
813830

814-
mbedtls_pk_init( &pk );
815-
816-
TEST_ASSERT( mbedtls_pk_parse_public_key( &pk, pkey, klen ) == 0 );
831+
TEST_ASSERT( klen_psa == klen_legacy );
832+
TEST_ASSERT( memcmp( pkey_psa_start, pkey_legacy_start, klen_psa ) == 0 );
817833

834+
mbedtls_pk_free( &pk );
835+
TEST_ASSERT( PSA_SUCCESS == psa_destroy_key( handle ) );
818836

837+
mbedtls_pk_init( &pk );
838+
TEST_ASSERT( mbedtls_pk_parse_public_key( &pk, pkey_legacy_start,
839+
klen_legacy ) == 0 );
819840
TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256,
820841
hash, sizeof hash, sig, sig_len ) == 0 );
821842

0 commit comments

Comments
 (0)