diff options
author | Summer Qin <summer.qin@arm.com> | 2021-06-22 18:00:54 +0800 |
---|---|---|
committer | Ken Liu <ken.liu@arm.com> | 2021-07-21 09:24:43 +0200 |
commit | b9492d295c10a1ccabdaccad773c334631328273 (patch) | |
tree | 82b36573a26f5b31dcf21d3e6536e5af1b9e16e6 /interface | |
parent | 045ec4abfc73152a0116684ba9127d0a97cc8d34 (diff) | |
download | trusted-firmware-m-b9492d295c10a1ccabdaccad773c334631328273.tar.gz |
Crypto: Add support for message signing operation
Add support for crypto message signing operation:
-psa_sign_message()
-psa_verify_message()
Signed-off-by: Summer Qin <summer.qin@arm.com>
Change-Id: I685d4c12c8c132ce4ce0c79542ad9143076f3600
Diffstat (limited to 'interface')
-rw-r--r-- | interface/include/tfm_crypto_defs.h | 2 | ||||
-rw-r--r-- | interface/src/tfm_crypto_func_api.c | 59 | ||||
-rw-r--r-- | interface/src/tfm_crypto_ipc_api.c | 59 |
3 files changed, 120 insertions, 0 deletions
diff --git a/interface/include/tfm_crypto_defs.h b/interface/include/tfm_crypto_defs.h index b4c771f2df..5a860b8378 100644 --- a/interface/include/tfm_crypto_defs.h +++ b/interface/include/tfm_crypto_defs.h @@ -103,6 +103,8 @@ enum { TFM_CRYPTO_AEAD_FINISH_SID, TFM_CRYPTO_AEAD_VERIFY_SID, TFM_CRYPTO_AEAD_ABORT_SID, + TFM_CRYPTO_SIGN_MESSAGE_SID, + TFM_CRYPTO_VERIFY_MESSAGE_SID, TFM_CRYPTO_SIGN_HASH_SID, TFM_CRYPTO_VERIFY_HASH_SID, TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID, diff --git a/interface/src/tfm_crypto_func_api.c b/interface/src/tfm_crypto_func_api.c index 5d4240591d..6e6c419fe2 100644 --- a/interface/src/tfm_crypto_func_api.c +++ b/interface/src/tfm_crypto_func_api.c @@ -861,6 +861,65 @@ psa_status_t psa_aead_decrypt(psa_key_id_t key, return status; } +psa_status_t psa_sign_message(psa_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID, + .key_id = key, + .alg = alg, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + }; + psa_outvec out_vec[] = { + {.base = signature, .len = signature_size}, + }; + + status = API_DISPATCH(tfm_crypto_sign_message, + TFM_CRYPTO_SIGN_MESSAGE); + + if (status == PSA_SUCCESS) { + *signature_length = out_vec[0].len; + } + + return status; +} + +psa_status_t psa_verify_message(psa_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length) +{ + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID, + .key_id = key, + .alg = alg + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + {.base = signature, .len = signature_length} + }; + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message, + TFM_CRYPTO_VERIFY_MESSAGE); + + return status; +} + psa_status_t psa_sign_hash(psa_key_id_t key, psa_algorithm_t alg, const uint8_t *hash, diff --git a/interface/src/tfm_crypto_ipc_api.c b/interface/src/tfm_crypto_ipc_api.c index 8dc2584968..9dfa4737ec 100644 --- a/interface/src/tfm_crypto_ipc_api.c +++ b/interface/src/tfm_crypto_ipc_api.c @@ -879,6 +879,65 @@ psa_status_t psa_aead_decrypt(psa_key_id_t key, return status; } +psa_status_t psa_sign_message(psa_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID, + .key_id = key, + .alg = alg, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + }; + psa_outvec out_vec[] = { + {.base = signature, .len = signature_size}, + }; + + status = API_DISPATCH(tfm_crypto_sign_message, + TFM_CRYPTO_SIGN_MESSAGE); + + if (status == PSA_SUCCESS) { + *signature_length = out_vec[0].len; + } + + return status; +} + +psa_status_t psa_verify_message(psa_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length) +{ + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID, + .key_id = key, + .alg = alg + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + {.base = signature, .len = signature_length} + }; + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message, + TFM_CRYPTO_VERIFY_MESSAGE); + + return status; +} + psa_status_t psa_sign_hash(psa_key_id_t key, psa_algorithm_t alg, const uint8_t *hash, |