blob: 5f6f0e133b9635e0376af036d3419a622ee865a6 [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 Hallc02fffb2020-11-23 18:22:06 +010012
13struct rpc_caller;
14
julhal01734dbad2020-12-21 10:27:41 +000015/*
16 * Provides a client interface for accessing an instance of the Crypto service
17 * using a C++ version of the PSA Crypto API.
18 */
Julian Hallc02fffb2020-11-23 18:22:06 +010019class crypto_client
20{
21public:
Julian Hallc02fffb2020-11-23 18:22:06 +010022 virtual ~crypto_client();
23
24 int err_rpc_status() const;
25
26 /* Key lifecycle methods */
julhal01734dbad2020-12-21 10:27:41 +000027 virtual psa_status_t generate_key(const psa_key_attributes_t *attributes, psa_key_handle_t *handle) = 0;
28 virtual psa_status_t destroy_key(psa_key_handle_t handle) = 0;
29 virtual psa_status_t open_key(psa_key_id_t id, psa_key_handle_t *handle) = 0;
30 virtual psa_status_t close_key(psa_key_handle_t handle) = 0;
31 virtual psa_status_t import_key(const psa_key_attributes_t *attributes,
32 const uint8_t *data, size_t data_length, psa_key_handle_t *handle) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010033
34 /* Key export methods */
julhal01734dbad2020-12-21 10:27:41 +000035 virtual psa_status_t export_key(psa_key_handle_t handle,
Julian Hallc02fffb2020-11-23 18:22:06 +010036 uint8_t *data, size_t data_size,
julhal01734dbad2020-12-21 10:27:41 +000037 size_t *data_length) = 0;
38 virtual psa_status_t export_public_key(psa_key_handle_t handle,
39 uint8_t *data, size_t data_size, size_t *data_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010040
41 /* Sign/verify methods */
julhal01734dbad2020-12-21 10:27:41 +000042 virtual psa_status_t sign_hash(psa_key_handle_t handle, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010043 const uint8_t *hash, size_t hash_length,
julhal01734dbad2020-12-21 10:27:41 +000044 uint8_t *signature, size_t signature_size, size_t *signature_length) = 0;
45 virtual psa_status_t verify_hash(psa_key_handle_t handle, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010046 const uint8_t *hash, size_t hash_length,
julhal01734dbad2020-12-21 10:27:41 +000047 const uint8_t *signature, size_t signature_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010048
49 /* Asymmetric encrypt/decrypt */
julhal01734dbad2020-12-21 10:27:41 +000050 virtual psa_status_t asymmetric_encrypt(psa_key_handle_t handle, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010051 const uint8_t *input, size_t input_length,
52 const uint8_t *salt, size_t salt_length,
julhal01734dbad2020-12-21 10:27:41 +000053 uint8_t *output, size_t output_size, size_t *output_length) = 0;
54 virtual psa_status_t asymmetric_decrypt(psa_key_handle_t handle, psa_algorithm_t alg,
Julian Hallc02fffb2020-11-23 18:22:06 +010055 const uint8_t *input, size_t input_length,
56 const uint8_t *salt, size_t salt_length,
julhal01734dbad2020-12-21 10:27:41 +000057 uint8_t *output, size_t output_size, size_t *output_length) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010058
59 /* Random number generation */
julhal01734dbad2020-12-21 10:27:41 +000060 virtual psa_status_t generate_random(uint8_t *output, size_t output_size) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010061
62protected:
63 crypto_client();
julhal01734dbad2020-12-21 10:27:41 +000064 crypto_client(struct rpc_caller *caller);
julhal01c3f4e9a2020-12-15 13:39:01 +000065 void set_caller(struct rpc_caller *caller);
Julian Hallc02fffb2020-11-23 18:22:06 +010066
Julian Hallc02fffb2020-11-23 18:22:06 +010067 struct rpc_caller *m_caller;
68 int m_err_rpc_status;
69};
70
71#endif /* CRYPTO_CLIENT_H */