Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 1 | /* |
julhal01 | c3f4e9a | 2020-12-15 13:39:01 +0000 | [diff] [blame] | 2 | * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | |
| 7 | #ifndef CRYPTO_CLIENT_H |
| 8 | #define CRYPTO_CLIENT_H |
| 9 | |
| 10 | #include <cstdint> |
| 11 | #include <psa/crypto.h> |
Julian Hall | 99a57e3 | 2021-07-28 14:18:50 +0100 | [diff] [blame] | 12 | #include <service/common/client/service_client.h> |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 13 | |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 14 | /* |
| 15 | * Provides a client interface for accessing an instance of the Crypto service |
| 16 | * using a C++ version of the PSA Crypto API. |
| 17 | */ |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 18 | class crypto_client |
| 19 | { |
| 20 | public: |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 21 | virtual ~crypto_client(); |
| 22 | |
| 23 | int err_rpc_status() const; |
| 24 | |
| 25 | /* Key lifecycle methods */ |
Julian Hall | f572896 | 2021-06-24 09:40:23 +0100 | [diff] [blame] | 26 | virtual psa_status_t generate_key(const psa_key_attributes_t *attributes, |
| 27 | psa_key_id_t *id) = 0; |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 28 | virtual psa_status_t destroy_key(psa_key_id_t id) = 0; |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 29 | virtual psa_status_t import_key(const psa_key_attributes_t *attributes, |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 30 | const uint8_t *data, size_t data_length, psa_key_id_t *id) = 0; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 31 | |
| 32 | /* Key export methods */ |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 33 | virtual psa_status_t export_key(psa_key_id_t id, |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 34 | uint8_t *data, size_t data_size, |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 35 | size_t *data_length) = 0; |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 36 | virtual psa_status_t export_public_key(psa_key_id_t id, |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 37 | uint8_t *data, size_t data_size, size_t *data_length) = 0; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 38 | |
| 39 | /* Sign/verify methods */ |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 40 | virtual psa_status_t sign_hash(psa_key_id_t id, psa_algorithm_t alg, |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 41 | const uint8_t *hash, size_t hash_length, |
Julian Hall | f572896 | 2021-06-24 09:40:23 +0100 | [diff] [blame] | 42 | uint8_t *signature, size_t signature_size, |
| 43 | size_t *signature_length) = 0; |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 44 | virtual psa_status_t verify_hash(psa_key_id_t id, psa_algorithm_t alg, |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 45 | const uint8_t *hash, size_t hash_length, |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 46 | const uint8_t *signature, size_t signature_length) = 0; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 47 | |
| 48 | /* Asymmetric encrypt/decrypt */ |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 49 | virtual psa_status_t asymmetric_encrypt(psa_key_id_t id, psa_algorithm_t alg, |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 50 | const uint8_t *input, size_t input_length, |
| 51 | const uint8_t *salt, size_t salt_length, |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 52 | uint8_t *output, size_t output_size, size_t *output_length) = 0; |
Balint Dobszay | 3c52ce6 | 2021-05-10 16:27:18 +0200 | [diff] [blame] | 53 | virtual psa_status_t asymmetric_decrypt(psa_key_id_t id, psa_algorithm_t alg, |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 54 | const uint8_t *input, size_t input_length, |
| 55 | const uint8_t *salt, size_t salt_length, |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 56 | uint8_t *output, size_t output_size, size_t *output_length) = 0; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 57 | |
| 58 | /* Random number generation */ |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 59 | virtual psa_status_t generate_random(uint8_t *output, size_t output_size) = 0; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 60 | |
Julian Hall | f572896 | 2021-06-24 09:40:23 +0100 | [diff] [blame] | 61 | /* Hash methods */ |
| 62 | virtual psa_status_t hash_setup(uint32_t *op_handle, |
| 63 | psa_algorithm_t alg) = 0; |
| 64 | virtual psa_status_t hash_update(uint32_t op_handle, |
| 65 | const uint8_t *input, size_t input_length) = 0; |
| 66 | virtual psa_status_t hash_finish(uint32_t op_handle, |
| 67 | uint8_t *hash, size_t hash_size, size_t *hash_length) = 0; |
| 68 | |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 69 | protected: |
| 70 | crypto_client(); |
julhal01 | 734dbad | 2020-12-21 10:27:41 +0000 | [diff] [blame] | 71 | crypto_client(struct rpc_caller *caller); |
julhal01 | c3f4e9a | 2020-12-15 13:39:01 +0000 | [diff] [blame] | 72 | void set_caller(struct rpc_caller *caller); |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 73 | |
Julian Hall | 99a57e3 | 2021-07-28 14:18:50 +0100 | [diff] [blame] | 74 | struct service_client m_client; |
Julian Hall | c02fffb | 2020-11-23 18:22:06 +0100 | [diff] [blame] | 75 | }; |
| 76 | |
| 77 | #endif /* CRYPTO_CLIENT_H */ |