diff --git a/library/pk_wrap.c b/library/pk_wrap.c index 8ad6fa136..31645e151 100644 --- a/library/pk_wrap.c +++ b/library/pk_wrap.c @@ -1512,7 +1512,7 @@ static int pk_opaque_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, unsigned char *sig, size_t sig_size, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { -#if !defined(MBEDTLS_ECDSA_C) +#if !defined(MBEDTLS_ECDSA_C) && !defined(MBEDTLS_RSA_C) ((void) ctx); ((void) md_alg); ((void) hash); @@ -1523,36 +1523,62 @@ static int pk_opaque_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, ((void) f_rng); ((void) p_rng); return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); -#else /* !MBEDTLS_ECDSA_C */ +#else /* !MBEDTLS_ECDSA_C && !MBEDTLS_RSA_C */ const mbedtls_svc_key_id_t *key = (const mbedtls_svc_key_id_t *) ctx; - psa_algorithm_t alg = PSA_ALG_ECDSA( mbedtls_psa_translate_md( md_alg ) ); psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_algorithm_t alg; psa_key_type_t type; psa_status_t status; - status = psa_get_key_attributes( *key, &attributes ); - if( status != PSA_SUCCESS ) - return( mbedtls_pk_error_from_psa_ecdca( status ) ); - - type = psa_get_key_type( &attributes ); - psa_reset_key_attributes( &attributes ); - - if( ! PSA_KEY_TYPE_IS_ECC_KEY_PAIR( type ) ) - return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); - /* PSA has its own RNG */ (void) f_rng; (void) p_rng; + status = psa_get_key_attributes( *key, &attributes ); + if( status != PSA_SUCCESS ) + return( mbedtls_pk_error_from_psa( status ) ); + + type = psa_get_key_type( &attributes ); + psa_reset_key_attributes( &attributes ); + +#if defined(MBEDTLS_ECDSA_C) + if( PSA_KEY_TYPE_IS_ECC_KEY_PAIR( type ) ) + alg = PSA_ALG_ECDSA( mbedtls_psa_translate_md( md_alg ) ); + else +#endif /* MBEDTLS_ECDSA_C */ +#if defined(MBEDTLS_RSA_C) + if( PSA_KEY_TYPE_IS_RSA( type ) ) + alg = PSA_ALG_RSA_PKCS1V15_SIGN( mbedtls_psa_translate_md( md_alg ) ); + else +#endif /* MBEDTLS_RSA_C */ + return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); + /* make the signature */ status = psa_sign_hash( *key, alg, hash, hash_len, sig, sig_size, sig_len ); if( status != PSA_SUCCESS ) - return( mbedtls_pk_error_from_psa_ecdsa( status ) ); + { +#if defined(MBEDTLS_ECDSA_C) + if( PSA_KEY_TYPE_IS_ECC_KEY_PAIR( type ) ) + return( mbedtls_pk_error_from_psa_ecdsa( status ) ); + else +#endif /* MBEDTLS_ECDSA_C */ +#if defined(MBEDTLS_RSA_C) + if( PSA_KEY_TYPE_IS_RSA( type ) ) + return( mbedtls_pk_error_from_psa_rsa( status ) ); + else +#endif /* MBEDTLS_RSA_C */ + return( mbedtls_pk_error_from_psa( status ) ); + } - /* transcode it to ASN.1 sequence */ - return( pk_ecdsa_sig_asn1_from_psa( sig, sig_len, sig_size ) ); -#endif /* !MBEDTLS_ECDSA_C */ +#if defined(MBEDTLS_ECDSA_C) + if( PSA_KEY_TYPE_IS_ECC_KEY_PAIR( type ) ) + /* transcode it to ASN.1 sequence */ + return( pk_ecdsa_sig_asn1_from_psa( sig, sig_len, sig_size ) ); +#endif /* MBEDTLS_ECDSA_C */ + + return 0; +#endif /* !MBEDTLS_ECDSA_C && !MBEDTLS_RSA_C */ } const mbedtls_pk_info_t mbedtls_pk_ecdsa_opaque_info = {