blob: 5efa1c4df921e2ceb01009912eb5932ae8848442 [file] [log] [blame]
Julian Halld4071382021-07-07 16:45:53 +01001/*
2 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Julian Halld4071382021-07-07 16:45:53 +01007#include <psa/crypto.h>
8#include "psa_crypto_client.h"
Julian Halla9490042021-08-04 10:43:34 +01009#include "crypto_caller_selector.h"
Julian Halld4071382021-07-07 16:45:53 +010010
Julian Halla6d3cbc2021-07-20 10:13:21 +010011
Julian Halld4071382021-07-07 16:45:53 +010012psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
13 psa_key_id_t key,
14 psa_algorithm_t alg)
15{
Julian Hall7a703402021-08-04 09:20:43 +010016 if (psa_crypto_client_instance.init_status != PSA_SUCCESS)
17 return psa_crypto_client_instance.init_status;
18
19 return crypto_caller_mac_sign_setup(&psa_crypto_client_instance.base,
20 &operation->handle,
21 key, alg);
Julian Halld4071382021-07-07 16:45:53 +010022}
23
24psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
25 psa_key_id_t key,
26 psa_algorithm_t alg)
27{
Julian Hall7a703402021-08-04 09:20:43 +010028 if (psa_crypto_client_instance.init_status != PSA_SUCCESS)
29 return psa_crypto_client_instance.init_status;
30
31 return crypto_caller_mac_sign_setup(&psa_crypto_client_instance.base,
32 &operation->handle,
33 key, alg);
Julian Halld4071382021-07-07 16:45:53 +010034}
35
36psa_status_t psa_mac_update(psa_mac_operation_t *operation,
37 const uint8_t *input,
38 size_t input_length)
39{
Julian Hall7a703402021-08-04 09:20:43 +010040 return crypto_caller_mac_update(&psa_crypto_client_instance.base,
41 operation->handle,
42 input, input_length);
Julian Halld4071382021-07-07 16:45:53 +010043}
44
45psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
46 uint8_t *mac,
47 size_t mac_size,
48 size_t *mac_length)
49{
Julian Hall7a703402021-08-04 09:20:43 +010050 return crypto_caller_mac_sign_finish(&psa_crypto_client_instance.base,
51 operation->handle,
52 mac, mac_size, mac_length);
Julian Halld4071382021-07-07 16:45:53 +010053}
54
55psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
56 const uint8_t *mac,
57 size_t mac_length)
58{
Julian Hall7a703402021-08-04 09:20:43 +010059 return crypto_caller_mac_verify_finish(&psa_crypto_client_instance.base,
60 operation->handle,
61 mac, mac_length);
Julian Halld4071382021-07-07 16:45:53 +010062}
63
64psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
65{
Julian Hall7a703402021-08-04 09:20:43 +010066 return crypto_caller_mac_abort(&psa_crypto_client_instance.base,
67 operation->handle);
Julian Hall188953d2021-07-30 12:11:43 +010068}
69
70static psa_status_t multi_mac_update(psa_mac_operation_t *operation,
71 const uint8_t *input,
72 size_t input_length)
73{
74 psa_status_t psa_status = PSA_SUCCESS;
Julian Hall7a703402021-08-04 09:20:43 +010075 size_t max_update_size = crypto_caller_mac_max_update_size(&psa_crypto_client_instance.base);
Julian Hall188953d2021-07-30 12:11:43 +010076 size_t bytes_processed = 0;
77
78 if (!max_update_size) {
79
80 /* Don't know the max update size so assume that the entire
81 * input can be handled in a single update. If this isn't
82 * true, the first mac update operation will fail safely.
83 */
84 max_update_size = input_length;
85 }
86
87 while (bytes_processed < input_length) {
88
89 size_t bytes_remaining = input_length - bytes_processed;
90 size_t update_len = (bytes_remaining < max_update_size) ?
91 bytes_remaining :
92 max_update_size;
93
94 psa_status = psa_mac_update(operation, &input[bytes_processed], update_len);
95
96 if (psa_status != PSA_SUCCESS) {
97
98 psa_mac_abort(operation);
99 break;
100 }
101
102 bytes_processed += update_len;
103 }
104
105 return psa_status;
106}
107
Julian Halld670b412021-07-19 15:16:27 +0100108psa_status_t psa_mac_verify(psa_key_id_t key,
109 psa_algorithm_t alg,
110 const uint8_t *input,
111 size_t input_length,
112 const uint8_t *mac,
113 size_t mac_length)
114{
Julian Hall188953d2021-07-30 12:11:43 +0100115 psa_mac_operation_t operation = psa_mac_operation_init();
116 psa_status_t psa_status = psa_mac_verify_setup(&operation, key, alg);
117
118 if (psa_status == PSA_SUCCESS) {
119
120 psa_status = multi_mac_update(&operation, input, input_length);
121 }
122
123 if (psa_status == PSA_SUCCESS) {
124
125 psa_status = psa_mac_verify_finish(&operation, mac, mac_length);
126 }
127
128 return psa_status;
Julian Halld670b412021-07-19 15:16:27 +0100129}
Julian Hallb7db5802021-07-26 16:20:40 +0100130
131psa_status_t psa_mac_compute(psa_key_id_t key,
132 psa_algorithm_t alg,
133 const uint8_t *input,
134 size_t input_length,
135 uint8_t *mac,
136 size_t mac_size,
137 size_t *mac_length)
138{
Julian Hall188953d2021-07-30 12:11:43 +0100139 psa_mac_operation_t operation = psa_mac_operation_init();
140 psa_status_t psa_status = psa_mac_sign_setup(&operation, key, alg);
141
142 if (psa_status == PSA_SUCCESS) {
143
144 psa_status = multi_mac_update(&operation, input, input_length);
145 }
146
147 if (psa_status == PSA_SUCCESS) {
148
149 psa_status = psa_mac_sign_finish(&operation, mac, mac_size, mac_length);
150 }
151
152 return psa_status;
Julian Hallb7db5802021-07-26 16:20:40 +0100153}