blob: cd4289a2ed6b28b84e0de5d9548453fc3e00cc61 [file] [log] [blame]
/*
* Copyright (c) 2019-2022, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include <stddef.h>
#include <stdint.h>
#include "config_crypto.h"
#include "tfm_mbedcrypto_include.h"
#include "tfm_crypto_api.h"
#include "tfm_crypto_key.h"
#include "tfm_crypto_defs.h"
#include "crypto_library.h"
/*!
* \addtogroup tfm_crypto_api_shim_layer
*
*/
/*!@{*/
#if CRYPTO_ASYM_SIGN_MODULE_ENABLED
psa_status_t tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],
psa_outvec out_vec[],
struct tfm_crypto_key_id_s *encoded_key)
{
const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
tfm_crypto_library_key_id_t library_key = tfm_crypto_library_key_id_init(
encoded_key->owner, encoded_key->key_id);
switch (iov->function_id) {
case TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID:
{
const uint8_t *input = in_vec[1].base;
size_t input_length = in_vec[1].len;
uint8_t *signature = out_vec[0].base;
size_t signature_size = out_vec[0].len;
status = psa_sign_message(library_key, iov->alg, input, input_length,
signature, signature_size, &(out_vec[0].len));
if (status != PSA_SUCCESS) {
out_vec[0].len = 0;
}
return status;
}
case TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID:
{
const uint8_t *input = in_vec[1].base;
size_t input_length = in_vec[1].len;
const uint8_t *signature = in_vec[2].base;
size_t signature_length = in_vec[2].len;
return psa_verify_message(library_key, iov->alg, input, input_length,
signature, signature_length);
}
case TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID:
{
const uint8_t *hash = in_vec[1].base;
size_t hash_length = in_vec[1].len;
uint8_t *signature = out_vec[0].base;
size_t signature_size = out_vec[0].len;
status = psa_sign_hash(library_key, iov->alg, hash, hash_length,
signature, signature_size, &(out_vec[0].len));
if (status != PSA_SUCCESS) {
out_vec[0].len = 0;
}
return status;
}
case TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID:
{
const uint8_t *hash = in_vec[1].base;
size_t hash_length = in_vec[1].len;
const uint8_t *signature = in_vec[2].base;
size_t signature_length = in_vec[2].len;
return psa_verify_hash(library_key, iov->alg, hash, hash_length,
signature, signature_length);
}
default:
return PSA_ERROR_NOT_SUPPORTED;
}
return PSA_ERROR_NOT_SUPPORTED;
}
#else /* CRYPTO_ASYM_SIGN_MODULE_ENABLED */
psa_status_t tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],
psa_outvec out_vec[],
struct tfm_crypto_key_id_s *encoded_key)
{
(void)in_vec;
(void)out_vec;
(void)encoded_key;
return PSA_ERROR_NOT_SUPPORTED;
}
#endif /* CRYPTO_ASYM_SIGN_MODULE_ENABLED */
#if CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED
psa_status_t tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],
psa_outvec out_vec[],
struct tfm_crypto_key_id_s *encoded_key)
{
const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
tfm_crypto_library_key_id_t library_key = tfm_crypto_library_key_id_init(
encoded_key->owner, encoded_key->key_id);
switch (iov->function_id) {
case TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID:
{
const uint8_t *input = in_vec[1].base;
size_t input_length = in_vec[1].len;
const uint8_t *salt = in_vec[2].base;
size_t salt_length = in_vec[2].len;
uint8_t *output = out_vec[0].base;
size_t output_size = out_vec[0].len;
status = psa_asymmetric_encrypt(library_key, iov->alg,
input, input_length,
salt, salt_length,
output, output_size,
&(out_vec[0].len));
if (status != PSA_SUCCESS) {
out_vec[0].len = 0;
}
return status;
}
case TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID:
{
const uint8_t *input = in_vec[1].base;
size_t input_length = in_vec[1].len;
const uint8_t *salt = in_vec[2].base;
size_t salt_length = in_vec[2].len;
uint8_t *output = out_vec[0].base;
size_t output_size = out_vec[0].len;
status = psa_asymmetric_decrypt(library_key, iov->alg,
input, input_length,
salt, salt_length,
output, output_size,
&(out_vec[0].len));
if (status != PSA_SUCCESS) {
out_vec[0].len = 0;
}
return status;
}
default:
return PSA_ERROR_NOT_SUPPORTED;
}
return PSA_ERROR_NOT_SUPPORTED;
}
#else /* CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED */
psa_status_t tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],
psa_outvec out_vec[],
struct tfm_crypto_key_id_s *encoded_key)
{
(void)in_vec;
(void)out_vec;
(void)encoded_key;
return PSA_ERROR_NOT_SUPPORTED;
}
#endif /* CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED */
/*!@}*/