blob: 42085bed8aebc64b0ba7891b2e5c8afb52095dab [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 Hall7a703402021-08-04 09:20:43 +010021 virtual ~crypto_client();
Julian Hallc02fffb2020-11-23 18:22:06 +010022
Julian Hall7a703402021-08-04 09:20:43 +010023 int err_rpc_status() const;
Julian Hallc02fffb2020-11-23 18:22:06 +010024
Julian Hall7a703402021-08-04 09:20:43 +010025 /* Key lifecycle methods */
26 virtual psa_status_t generate_key(
27 const psa_key_attributes_t *attributes,
28 psa_key_id_t *id) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010029
Julian Hall7a703402021-08-04 09:20:43 +010030 virtual psa_status_t destroy_key(
31 psa_key_id_t id) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010032
Julian Hall7a703402021-08-04 09:20:43 +010033 virtual psa_status_t import_key(
34 const psa_key_attributes_t *attributes,
35 const uint8_t *data, size_t data_length,
36 psa_key_id_t *id) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010037
Julian Hall7a703402021-08-04 09:20:43 +010038 virtual psa_status_t copy_key(
39 psa_key_id_t source_key,
40 const psa_key_attributes_t *attributes,
41 psa_key_id_t *target_key) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010042
Julian Hall7a703402021-08-04 09:20:43 +010043 virtual psa_status_t purge_key(
44 psa_key_id_t id) = 0;
Julian Hallc02fffb2020-11-23 18:22:06 +010045
Julian Hall7a703402021-08-04 09:20:43 +010046 virtual psa_status_t get_key_attributes(
47 psa_key_id_t id,
48 psa_key_attributes_t *attributes) = 0;
49
50 /* Key export methods */
51 virtual psa_status_t export_key(
52 psa_key_id_t id,
53 uint8_t *data, size_t data_size, size_t *data_length) = 0;
54
55 virtual psa_status_t export_public_key(
56 psa_key_id_t id,
57 uint8_t *data, size_t data_size, size_t *data_length) = 0;
58
59 /* Sign/verify methods */
60 virtual psa_status_t sign_hash(
61 psa_key_id_t id,
62 psa_algorithm_t alg,
63 const uint8_t *hash, size_t hash_length,
64 uint8_t *signature, size_t signature_size, size_t *signature_length) = 0;
65
66 virtual psa_status_t verify_hash(
67 psa_key_id_t id,
68 psa_algorithm_t alg,
69 const uint8_t *hash, size_t hash_length,
70 const uint8_t *signature, size_t signature_length) = 0;
71
72 /* Asymmetric encrypt/decrypt */
73 virtual psa_status_t asymmetric_encrypt(
74 psa_key_id_t id,
75 psa_algorithm_t alg,
76 const uint8_t *input, size_t input_length,
77 const uint8_t *salt, size_t salt_length,
78 uint8_t *output, size_t output_size, size_t *output_length) = 0;
79
80 virtual psa_status_t asymmetric_decrypt(
81 psa_key_id_t id,
82 psa_algorithm_t alg,
83 const uint8_t *input, size_t input_length,
84 const uint8_t *salt, size_t salt_length,
85 uint8_t *output, size_t output_size, size_t *output_length) = 0;
86
87 /* Random number generation */
88 virtual psa_status_t generate_random(
89 uint8_t *output, size_t output_size) = 0;
90
91 /* Hash methods */
92 virtual psa_status_t hash_setup(
93 uint32_t *op_handle,
94 psa_algorithm_t alg) = 0;
95
96 virtual psa_status_t hash_update(
97 uint32_t op_handle,
98 const uint8_t *input, size_t input_length) = 0;
99
100 virtual psa_status_t hash_finish(
101 uint32_t op_handle,
102 uint8_t *hash, size_t hash_size, size_t *hash_length) = 0;
Julian Hallf5728962021-06-24 09:40:23 +0100103
Julian Hallc02fffb2020-11-23 18:22:06 +0100104protected:
Julian Hall7a703402021-08-04 09:20:43 +0100105 crypto_client();
106 crypto_client(struct rpc_caller *caller);
107 void set_caller(struct rpc_caller *caller);
Julian Hallc02fffb2020-11-23 18:22:06 +0100108
Julian Hall7a703402021-08-04 09:20:43 +0100109 struct service_client m_client;
Julian Hallc02fffb2020-11-23 18:22:06 +0100110};
111
112#endif /* CRYPTO_CLIENT_H */