blob: d9963805e517cc55cb29ef1d591af1cc65e3074d [file] [log] [blame]
Julian Hallc02fffb2020-11-23 18:22:06 +01001/*
julhal01c3f4e9a2020-12-15 13:39:01 +00002 * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Julian Hallc02fffb2020-11-23 18:22:06 +01003 *
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 Hall99a57e32021-07-28 14:18:50 +010012#include <service/common/client/service_client.h>
Julian Hallc02fffb2020-11-23 18:22:06 +010013
julhal01734dbad2020-12-21 10:27:41 +000014/*
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 Hallc02fffb2020-11-23 18:22:06 +010018class crypto_client
19{
20public:
Julian Hallc02fffb2020-11-23 18:22:06 +010021 virtual ~crypto_client();
22
23 int err_rpc_status() const;
24
25 /* Key lifecycle methods */
Julian Hallf5728962021-06-24 09:40:23 +010026 virtual psa_status_t generate_key(const psa_key_attributes_t *attributes,
27 psa_key_id_t *id) = 0;
Balint Dobszay3c52ce62021-05-10 16:27:18 +020028 virtual psa_status_t destroy_key(psa_key_id_t id) = 0;
julhal01734dbad2020-12-21 10:27:41 +000029 virtual psa_status_t import_key(const psa_key_attributes_t *attributes,
Balint Dobszay3c52ce62021-05-10 16:27:18 +020030 const uint8_t *data, size_t data_length, psa_key_id_t *id) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010031
32 /* Key export methods */
Balint Dobszay3c52ce62021-05-10 16:27:18 +020033 virtual psa_status_t export_key(psa_key_id_t id,
Julian Hallc02fffb2020-11-23 18:22:06 +010034 uint8_t *data, size_t data_size,
julhal01734dbad2020-12-21 10:27:41 +000035 size_t *data_length) = 0;
Balint Dobszay3c52ce62021-05-10 16:27:18 +020036 virtual psa_status_t export_public_key(psa_key_id_t id,
julhal01734dbad2020-12-21 10:27:41 +000037 uint8_t *data, size_t data_size, size_t *data_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010038
39 /* Sign/verify methods */
Balint Dobszay3c52ce62021-05-10 16:27:18 +020040 virtual psa_status_t sign_hash(psa_key_id_t id, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010041 const uint8_t *hash, size_t hash_length,
Julian Hallf5728962021-06-24 09:40:23 +010042 uint8_t *signature, size_t signature_size,
43 size_t *signature_length) = 0;
Balint Dobszay3c52ce62021-05-10 16:27:18 +020044 virtual psa_status_t verify_hash(psa_key_id_t id, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010045 const uint8_t *hash, size_t hash_length,
julhal01734dbad2020-12-21 10:27:41 +000046 const uint8_t *signature, size_t signature_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010047
48 /* Asymmetric encrypt/decrypt */
Balint Dobszay3c52ce62021-05-10 16:27:18 +020049 virtual psa_status_t asymmetric_encrypt(psa_key_id_t id, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010050 const uint8_t *input, size_t input_length,
51 const uint8_t *salt, size_t salt_length,
julhal01734dbad2020-12-21 10:27:41 +000052 uint8_t *output, size_t output_size, size_t *output_length) = 0;
Balint Dobszay3c52ce62021-05-10 16:27:18 +020053 virtual psa_status_t asymmetric_decrypt(psa_key_id_t id, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010054 const uint8_t *input, size_t input_length,
55 const uint8_t *salt, size_t salt_length,
julhal01734dbad2020-12-21 10:27:41 +000056 uint8_t *output, size_t output_size, size_t *output_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010057
58 /* Random number generation */
julhal01734dbad2020-12-21 10:27:41 +000059 virtual psa_status_t generate_random(uint8_t *output, size_t output_size) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010060
Julian Hallf5728962021-06-24 09:40:23 +010061 /* 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 Hallc02fffb2020-11-23 18:22:06 +010069protected:
70 crypto_client();
julhal01734dbad2020-12-21 10:27:41 +000071 crypto_client(struct rpc_caller *caller);
julhal01c3f4e9a2020-12-15 13:39:01 +000072 void set_caller(struct rpc_caller *caller);
Julian Hallc02fffb2020-11-23 18:22:06 +010073
Julian Hall99a57e32021-07-28 14:18:50 +010074 struct service_client m_client;
Julian Hallc02fffb2020-11-23 18:22:06 +010075};
76
77#endif /* CRYPTO_CLIENT_H */