mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-01-14 14:06:33 +00:00
psa: sign/verify_hash: Wrap software implementation
Wrap sign/verify_hash software implementation into psa_sign/verify_hash_internal() functions whose signature is that of a sign/verify_hash driver entry point. Signed-off-by: Ronald Cron <ronald.cron@arm.com>
This commit is contained in:
parent
99b8ed7fda
commit
1865993763
|
@ -3341,57 +3341,14 @@ cleanup:
|
||||||
#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
|
#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
|
||||||
* defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
|
* defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
|
||||||
|
|
||||||
psa_status_t psa_sign_hash( mbedtls_svc_key_id_t key,
|
static psa_status_t psa_sign_hash_internal(
|
||||||
psa_algorithm_t alg,
|
const psa_key_attributes_t *attributes,
|
||||||
const uint8_t *hash,
|
const uint8_t *key_buffer, size_t key_buffer_size,
|
||||||
size_t hash_length,
|
psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
|
||||||
uint8_t *signature,
|
uint8_t *signature, size_t signature_size, size_t *signature_length )
|
||||||
size_t signature_size,
|
|
||||||
size_t *signature_length )
|
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
|
||||||
psa_key_slot_t *slot;
|
|
||||||
|
|
||||||
*signature_length = signature_size;
|
|
||||||
/* Immediately reject a zero-length signature buffer. This guarantees
|
|
||||||
* that signature must be a valid pointer. (On the other hand, the hash
|
|
||||||
* buffer can in principle be empty since it doesn't actually have
|
|
||||||
* to be a hash.) */
|
|
||||||
if( signature_size == 0 )
|
|
||||||
return( PSA_ERROR_BUFFER_TOO_SMALL );
|
|
||||||
|
|
||||||
status = psa_get_and_lock_key_slot_with_policy( key, &slot,
|
|
||||||
PSA_KEY_USAGE_SIGN_HASH,
|
|
||||||
alg );
|
|
||||||
if( status != PSA_SUCCESS )
|
|
||||||
goto exit;
|
|
||||||
if( ! PSA_KEY_TYPE_IS_KEY_PAIR( slot->attr.type ) )
|
|
||||||
{
|
|
||||||
status = PSA_ERROR_INVALID_ARGUMENT;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try any of the available accelerators first */
|
|
||||||
status = psa_driver_wrapper_sign_hash( slot,
|
|
||||||
alg,
|
|
||||||
hash,
|
|
||||||
hash_length,
|
|
||||||
signature,
|
|
||||||
signature_size,
|
|
||||||
signature_length );
|
|
||||||
if( status != PSA_ERROR_NOT_SUPPORTED ||
|
|
||||||
psa_key_lifetime_is_external( slot->attr.lifetime ) )
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
psa_key_attributes_t attributes_struct = {
|
|
||||||
.core = slot->attr
|
|
||||||
};
|
|
||||||
psa_key_attributes_t *attributes = &attributes_struct;
|
|
||||||
const uint8_t *key_buffer = slot->key.data;
|
|
||||||
size_t key_buffer_size = slot->key.bytes;
|
|
||||||
|
|
||||||
/* If the operation was not supported by any accelerator, try fallback. */
|
|
||||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
|
#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
|
||||||
defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
|
defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
|
||||||
if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
|
if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
|
||||||
|
@ -3457,6 +3414,62 @@ psa_status_t psa_sign_hash( mbedtls_svc_key_id_t key,
|
||||||
status = PSA_ERROR_NOT_SUPPORTED;
|
status = PSA_ERROR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return( status );
|
||||||
|
}
|
||||||
|
|
||||||
|
psa_status_t psa_sign_hash( mbedtls_svc_key_id_t key,
|
||||||
|
psa_algorithm_t alg,
|
||||||
|
const uint8_t *hash,
|
||||||
|
size_t hash_length,
|
||||||
|
uint8_t *signature,
|
||||||
|
size_t signature_size,
|
||||||
|
size_t *signature_length )
|
||||||
|
{
|
||||||
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
psa_key_slot_t *slot;
|
||||||
|
|
||||||
|
*signature_length = signature_size;
|
||||||
|
/* Immediately reject a zero-length signature buffer. This guarantees
|
||||||
|
* that signature must be a valid pointer. (On the other hand, the hash
|
||||||
|
* buffer can in principle be empty since it doesn't actually have
|
||||||
|
* to be a hash.) */
|
||||||
|
if( signature_size == 0 )
|
||||||
|
return( PSA_ERROR_BUFFER_TOO_SMALL );
|
||||||
|
|
||||||
|
status = psa_get_and_lock_key_slot_with_policy( key, &slot,
|
||||||
|
PSA_KEY_USAGE_SIGN_HASH,
|
||||||
|
alg );
|
||||||
|
if( status != PSA_SUCCESS )
|
||||||
|
goto exit;
|
||||||
|
if( ! PSA_KEY_TYPE_IS_KEY_PAIR( slot->attr.type ) )
|
||||||
|
{
|
||||||
|
status = PSA_ERROR_INVALID_ARGUMENT;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try any of the available accelerators first */
|
||||||
|
status = psa_driver_wrapper_sign_hash( slot,
|
||||||
|
alg,
|
||||||
|
hash,
|
||||||
|
hash_length,
|
||||||
|
signature,
|
||||||
|
signature_size,
|
||||||
|
signature_length );
|
||||||
|
if( status != PSA_ERROR_NOT_SUPPORTED ||
|
||||||
|
psa_key_lifetime_is_external( slot->attr.lifetime ) )
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* If the operation was not supported by any accelerator, try fallback. */
|
||||||
|
psa_key_attributes_t attributes = {
|
||||||
|
.core = slot->attr
|
||||||
|
};
|
||||||
|
status = psa_sign_hash_internal(
|
||||||
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
|
alg, hash, hash_length,
|
||||||
|
signature, signature_size, signature_length );
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
/* Fill the unused part of the output buffer (the whole buffer on error,
|
/* Fill the unused part of the output buffer (the whole buffer on error,
|
||||||
* the trailing part on success) with something that isn't a valid mac
|
* the trailing part on success) with something that isn't a valid mac
|
||||||
|
@ -3475,40 +3488,13 @@ exit:
|
||||||
return( ( status == PSA_SUCCESS ) ? unlock_status : status );
|
return( ( status == PSA_SUCCESS ) ? unlock_status : status );
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_verify_hash( mbedtls_svc_key_id_t key,
|
static psa_status_t psa_verify_hash_internal(
|
||||||
psa_algorithm_t alg,
|
const psa_key_attributes_t *attributes,
|
||||||
const uint8_t *hash,
|
const uint8_t *key_buffer, size_t key_buffer_size,
|
||||||
size_t hash_length,
|
psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
|
||||||
const uint8_t *signature,
|
const uint8_t *signature, size_t signature_length )
|
||||||
size_t signature_length )
|
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
|
||||||
psa_key_slot_t *slot;
|
|
||||||
|
|
||||||
status = psa_get_and_lock_key_slot_with_policy( key, &slot,
|
|
||||||
PSA_KEY_USAGE_VERIFY_HASH,
|
|
||||||
alg );
|
|
||||||
if( status != PSA_SUCCESS )
|
|
||||||
return( status );
|
|
||||||
|
|
||||||
/* Try any of the available accelerators first */
|
|
||||||
status = psa_driver_wrapper_verify_hash( slot,
|
|
||||||
alg,
|
|
||||||
hash,
|
|
||||||
hash_length,
|
|
||||||
signature,
|
|
||||||
signature_length );
|
|
||||||
if( status != PSA_ERROR_NOT_SUPPORTED ||
|
|
||||||
psa_key_lifetime_is_external( slot->attr.lifetime ) )
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
psa_key_attributes_t attributes_struct = {
|
|
||||||
.core = slot->attr
|
|
||||||
};
|
|
||||||
psa_key_attributes_t *attributes = &attributes_struct;
|
|
||||||
const uint8_t *key_buffer = slot->key.data;
|
|
||||||
size_t key_buffer_size = slot->key.bytes;
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
|
#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
|
||||||
defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
|
defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
|
||||||
|
@ -3568,6 +3554,46 @@ psa_status_t psa_verify_hash( mbedtls_svc_key_id_t key,
|
||||||
status = PSA_ERROR_NOT_SUPPORTED;
|
status = PSA_ERROR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return( status );
|
||||||
|
}
|
||||||
|
|
||||||
|
psa_status_t psa_verify_hash( mbedtls_svc_key_id_t key,
|
||||||
|
psa_algorithm_t alg,
|
||||||
|
const uint8_t *hash,
|
||||||
|
size_t hash_length,
|
||||||
|
const uint8_t *signature,
|
||||||
|
size_t signature_length )
|
||||||
|
{
|
||||||
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
psa_key_slot_t *slot;
|
||||||
|
|
||||||
|
status = psa_get_and_lock_key_slot_with_policy( key, &slot,
|
||||||
|
PSA_KEY_USAGE_VERIFY_HASH,
|
||||||
|
alg );
|
||||||
|
if( status != PSA_SUCCESS )
|
||||||
|
return( status );
|
||||||
|
|
||||||
|
/* Try any of the available accelerators first */
|
||||||
|
status = psa_driver_wrapper_verify_hash( slot,
|
||||||
|
alg,
|
||||||
|
hash,
|
||||||
|
hash_length,
|
||||||
|
signature,
|
||||||
|
signature_length );
|
||||||
|
if( status != PSA_ERROR_NOT_SUPPORTED ||
|
||||||
|
psa_key_lifetime_is_external( slot->attr.lifetime ) )
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
psa_key_attributes_t attributes = {
|
||||||
|
.core = slot->attr
|
||||||
|
};
|
||||||
|
status = psa_verify_hash_internal(
|
||||||
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
|
alg, hash, hash_length,
|
||||||
|
signature, signature_length );
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
unlock_status = psa_unlock_key_slot( slot );
|
unlock_status = psa_unlock_key_slot( slot );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue