blob: beecdc507049b144432741cdd16bbfb2b32dea2c [file] [log] [blame]
Jaeden Ameroe54e6932018-08-06 16:19:58 +01001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml">
3<head>
4<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5<meta http-equiv="X-UA-Compatible" content="IE=9"/>
6<meta name="generator" content="Doxygen 1.8.13"/>
7<meta name="viewport" content="width=device-width, initial-scale=1"/>
8<title>Platform Security Architecture — cryptography and keystore interface: Message authentication codes</title>
9<link href="tabs.css" rel="stylesheet" type="text/css"/>
10<script type="text/javascript" src="jquery.js"></script>
11<script type="text/javascript" src="dynsections.js"></script>
12<link href="search/search.css" rel="stylesheet" type="text/css"/>
13<script type="text/javascript" src="search/searchdata.js"></script>
14<script type="text/javascript" src="search/search.js"></script>
15<link href="doxygen.css" rel="stylesheet" type="text/css" />
16</head>
17<body>
18<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
19<div id="titlearea">
20<table cellspacing="0" cellpadding="0">
21 <tbody>
22 <tr style="height: 56px;">
23 <td id="projectalign" style="padding-left: 0.5em;">
24 <div id="projectname">Platform Security Architecture — cryptography and keystore interface
25 &#160;<span id="projectnumber">Working draft</span>
26 </div>
27 </td>
28 </tr>
29 </tbody>
30</table>
31</div>
32<!-- end header part -->
33<!-- Generated by Doxygen 1.8.13 -->
34<script type="text/javascript">
35var searchBox = new SearchBox("searchBox", "search",false,'Search');
36</script>
37<script type="text/javascript" src="menudata.js"></script>
38<script type="text/javascript" src="menu.js"></script>
39<script type="text/javascript">
40$(function() {
41 initMenu('',true,false,'search.php','Search');
42 $(document).ready(function() { init_search(); });
43});
44</script>
45<div id="main-nav"></div>
46</div><!-- top -->
47<!-- window showing the filter options -->
48<div id="MSearchSelectWindow"
49 onmouseover="return searchBox.OnSearchSelectShow()"
50 onmouseout="return searchBox.OnSearchSelectHide()"
51 onkeydown="return searchBox.OnSearchSelectKey(event)">
52</div>
53
54<!-- iframe showing the search results (closed by default) -->
55<div id="MSearchResultsWindow">
56<iframe src="javascript:void(0)" frameborder="0"
57 name="MSearchResults" id="MSearchResults">
58</iframe>
59</div>
60
61<div class="header">
62 <div class="summary">
63<a href="#typedef-members">Typedefs</a> &#124;
64<a href="#func-members">Functions</a> </div>
65 <div class="headertitle">
66<div class="title">Message authentication codes</div> </div>
67</div><!--header-->
68<div class="contents">
69<table class="memberdecls">
70<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
71Typedefs</h2></td></tr>
72<tr class="memitem:ga78f0838b0c4e3db28b26355624d4bd37"><td class="memItemLeft" align="right" valign="top">typedef struct psa_mac_operation_s&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a></td></tr>
73<tr class="separator:ga78f0838b0c4e3db28b26355624d4bd37"><td class="memSeparator" colspan="2">&#160;</td></tr>
74</table><table class="memberdecls">
75<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
76Functions</h2></td></tr>
77<tr class="memitem:ga68ac2ad3253e9e27fcfbc788a4df8177"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation, <a class="el" href="group__platform.html#gac3da92a6b8a7f0c01dc348f8e0432e4c">psa_key_slot_t</a> key, <a class="el" href="group__crypto__types.html#gac2e4d47f1300d73c2f829a6d99252d69">psa_algorithm_t</a> alg)</td></tr>
78<tr class="separator:ga68ac2ad3253e9e27fcfbc788a4df8177"><td class="memSeparator" colspan="2">&#160;</td></tr>
79<tr class="memitem:gac7d1c3d075ce1604a54cbbc9933fa39d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation, <a class="el" href="group__platform.html#gac3da92a6b8a7f0c01dc348f8e0432e4c">psa_key_slot_t</a> key, <a class="el" href="group__crypto__types.html#gac2e4d47f1300d73c2f829a6d99252d69">psa_algorithm_t</a> alg)</td></tr>
80<tr class="separator:gac7d1c3d075ce1604a54cbbc9933fa39d"><td class="memSeparator" colspan="2">&#160;</td></tr>
81<tr class="memitem:ga5560af371497babefe03c9da4e8a1c05"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation, const uint8_t *input, size_t input_length)</td></tr>
82<tr class="separator:ga5560af371497babefe03c9da4e8a1c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
83<tr class="memitem:gac22bc0125580c96724a09226cfbc97f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#gac22bc0125580c96724a09226cfbc97f2">psa_mac_sign_finish</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation, uint8_t *mac, size_t mac_size, size_t *mac_length)</td></tr>
84<tr class="separator:gac22bc0125580c96724a09226cfbc97f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
85<tr class="memitem:gac92b2930d6728e1be4d011c05d485822"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#gac92b2930d6728e1be4d011c05d485822">psa_mac_verify_finish</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation, const uint8_t *mac, size_t mac_length)</td></tr>
86<tr class="separator:gac92b2930d6728e1be4d011c05d485822"><td class="memSeparator" colspan="2">&#160;</td></tr>
87<tr class="memitem:gacd8dd54855ba1bc0a03f104f252884fd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort</a> (<a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *operation)</td></tr>
88<tr class="separator:gacd8dd54855ba1bc0a03f104f252884fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
89</table>
90<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
91<h2 class="groupheader">Typedef Documentation</h2>
92<a id="ga78f0838b0c4e3db28b26355624d4bd37"></a>
93<h2 class="memtitle"><span class="permalink"><a href="#ga78f0838b0c4e3db28b26355624d4bd37">&#9670;&nbsp;</a></span>psa_mac_operation_t</h2>
94
95<div class="memitem">
96<div class="memproto">
97 <table class="memname">
98 <tr>
99 <td class="memname">typedef struct psa_mac_operation_s <a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a></td>
100 </tr>
101 </table>
102</div><div class="memdoc">
103<p>The type of the state data structure for multipart MAC operations.</p>
104<p>This is an implementation-defined <code>struct</code>. Applications should not make any assumptions about the content of this structure except as directed by the documentation of a specific implementation. </p>
105
106</div>
107</div>
108<h2 class="groupheader">Function Documentation</h2>
109<a id="gacd8dd54855ba1bc0a03f104f252884fd"></a>
110<h2 class="memtitle"><span class="permalink"><a href="#gacd8dd54855ba1bc0a03f104f252884fd">&#9670;&nbsp;</a></span>psa_mac_abort()</h2>
111
112<div class="memitem">
113<div class="memproto">
114 <table class="memname">
115 <tr>
116 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_abort </td>
117 <td>(</td>
118 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
119 <td class="paramname"><em>operation</em></td><td>)</td>
120 <td></td>
121 </tr>
122 </table>
123</div><div class="memdoc">
124<p>Abort a MAC operation.</p>
125<p>Aborting an operation frees all associated resources except for the <code>operation</code> structure itself. Once aborted, the operation object can be reused for another operation by calling <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a> or <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a> again.</p>
126<p>You may call this function any time after the operation object has been initialized by any of the following methods:</p><ul>
127<li>A call to <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a> or <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a>, whether it succeeds or not.</li>
128<li>Initializing the <code>struct</code> to all-bits-zero.</li>
129<li>Initializing the <code>struct</code> to logical zeros, e.g. <code>psa_mac_operation_t operation = {0}</code>.</li>
130</ul>
131<p>In particular, calling <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a> after the operation has been terminated by a call to <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a>, <a class="el" href="group__MAC.html#gac22bc0125580c96724a09226cfbc97f2">psa_mac_sign_finish()</a> or <a class="el" href="group__MAC.html#gac92b2930d6728e1be4d011c05d485822">psa_mac_verify_finish()</a> is safe and has no effect.</p>
132<dl class="params"><dt>Parameters</dt><dd>
133 <table class="params">
134 <tr><td class="paramdir">[in,out]</td><td class="paramname">operation</td><td>Initialized MAC operation.</td></tr>
135 </table>
136 </dd>
137</dl>
138<dl class="retval"><dt>Return values</dt><dd>
139 <table class="retval">
140 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td></td></tr>
141 <tr><td class="paramname"><a class="el" href="group__basic.html#ga933d40fa2a591004f2e93aa91e11db84">PSA_ERROR_BAD_STATE</a></td><td><code>operation</code> is not an active MAC operation. </td></tr>
142 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
143 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
144 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
145 </table>
146 </dd>
147</dl>
148
149</div>
150</div>
151<a id="gac22bc0125580c96724a09226cfbc97f2"></a>
152<h2 class="memtitle"><span class="permalink"><a href="#gac22bc0125580c96724a09226cfbc97f2">&#9670;&nbsp;</a></span>psa_mac_sign_finish()</h2>
153
154<div class="memitem">
155<div class="memproto">
156 <table class="memname">
157 <tr>
158 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_sign_finish </td>
159 <td>(</td>
160 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
161 <td class="paramname"><em>operation</em>, </td>
162 </tr>
163 <tr>
164 <td class="paramkey"></td>
165 <td></td>
166 <td class="paramtype">uint8_t *&#160;</td>
167 <td class="paramname"><em>mac</em>, </td>
168 </tr>
169 <tr>
170 <td class="paramkey"></td>
171 <td></td>
172 <td class="paramtype">size_t&#160;</td>
173 <td class="paramname"><em>mac_size</em>, </td>
174 </tr>
175 <tr>
176 <td class="paramkey"></td>
177 <td></td>
178 <td class="paramtype">size_t *&#160;</td>
179 <td class="paramname"><em>mac_length</em>&#160;</td>
180 </tr>
181 <tr>
182 <td></td>
183 <td>)</td>
184 <td></td><td></td>
185 </tr>
186 </table>
187</div><div class="memdoc">
188<p>Finish the calculation of the MAC of a message.</p>
189<p>The application must call <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a> before calling this function. This function calculates the MAC of the message formed by concatenating the inputs passed to preceding calls to <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a>.</p>
190<p>When this function returns, the operation becomes inactive.</p>
191<dl class="section warning"><dt>Warning</dt><dd>Applications should not call this function if they expect a specific value for the MAC. Call <a class="el" href="group__MAC.html#gac92b2930d6728e1be4d011c05d485822">psa_mac_verify_finish()</a> instead. Beware that comparing integrity or authenticity data such as MAC values with a function such as <code>memcmp</code> is risky because the time taken by the comparison may leak information about the MAC value which could allow an attacker to guess a valid MAC and thereby bypass security controls.</dd></dl>
192<dl class="params"><dt>Parameters</dt><dd>
193 <table class="params">
194 <tr><td class="paramdir">[in,out]</td><td class="paramname">operation</td><td>Active MAC operation. </td></tr>
195 <tr><td class="paramdir">[out]</td><td class="paramname">mac</td><td>Buffer where the MAC value is to be written. </td></tr>
196 <tr><td class="paramdir"></td><td class="paramname">mac_size</td><td>Size of the <code>mac</code> buffer in bytes. </td></tr>
197 <tr><td class="paramdir">[out]</td><td class="paramname">mac_length</td><td>On success, the number of bytes that make up the MAC value. This is always <a class="el" href="crypto__sizes_8h.html#aa84c5fb384ac7cb1bfc52adde96588ee">PSA_MAC_FINAL_SIZE</a>(<code>key_type</code>, <code>key_bits</code>, <code>alg</code>) where <code>key_type</code> and <code>key_bits</code> are the type and bit-size respectively of the key and <code>alg</code> is the MAC algorithm that is calculated.</td></tr>
198 </table>
199 </dd>
200</dl>
201<dl class="retval"><dt>Return values</dt><dd>
202 <table class="retval">
203 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td>Success. </td></tr>
204 <tr><td class="paramname"><a class="el" href="group__basic.html#ga933d40fa2a591004f2e93aa91e11db84">PSA_ERROR_BAD_STATE</a></td><td>The operation state is not valid (not started, or already completed). </td></tr>
205 <tr><td class="paramname"><a class="el" href="group__basic.html#ga695025f4ec11249aee7ea3d0f65e01c8">PSA_ERROR_BUFFER_TOO_SMALL</a></td><td>The size of the <code>mac</code> buffer is too small. You can determine a sufficient buffer size by calling <a class="el" href="crypto__sizes_8h.html#aa84c5fb384ac7cb1bfc52adde96588ee">PSA_MAC_FINAL_SIZE()</a>. </td></tr>
206 <tr><td class="paramname"><a class="el" href="group__basic.html#ga91b2ad8a867517a2651f1b076c5216e5">PSA_ERROR_INSUFFICIENT_MEMORY</a></td><td></td></tr>
207 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
208 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
209 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
210 </table>
211 </dd>
212</dl>
213
214</div>
215</div>
216<a id="ga68ac2ad3253e9e27fcfbc788a4df8177"></a>
217<h2 class="memtitle"><span class="permalink"><a href="#ga68ac2ad3253e9e27fcfbc788a4df8177">&#9670;&nbsp;</a></span>psa_mac_sign_setup()</h2>
218
219<div class="memitem">
220<div class="memproto">
221 <table class="memname">
222 <tr>
223 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_sign_setup </td>
224 <td>(</td>
225 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
226 <td class="paramname"><em>operation</em>, </td>
227 </tr>
228 <tr>
229 <td class="paramkey"></td>
230 <td></td>
231 <td class="paramtype"><a class="el" href="group__platform.html#gac3da92a6b8a7f0c01dc348f8e0432e4c">psa_key_slot_t</a>&#160;</td>
232 <td class="paramname"><em>key</em>, </td>
233 </tr>
234 <tr>
235 <td class="paramkey"></td>
236 <td></td>
237 <td class="paramtype"><a class="el" href="group__crypto__types.html#gac2e4d47f1300d73c2f829a6d99252d69">psa_algorithm_t</a>&#160;</td>
238 <td class="paramname"><em>alg</em>&#160;</td>
239 </tr>
240 <tr>
241 <td></td>
242 <td>)</td>
243 <td></td><td></td>
244 </tr>
245 </table>
246</div><div class="memdoc">
247<p>Start a multipart MAC calculation operation.</p>
248<p>This function sets up the calculation of the MAC (message authentication code) of a byte string. To verify the MAC of a message against an expected value, use <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a> instead.</p>
249<p>The sequence of operations to calculate a MAC is as follows:</p><ol type="1">
250<li>Allocate an operation object which will be passed to all the functions listed here.</li>
251<li>Call <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a> to specify the algorithm and key. The key remains associated with the operation even if the content of the key slot changes.</li>
252<li>Call <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a> zero, one or more times, passing a fragment of the message each time. The MAC that is calculated is the MAC of the concatenation of these messages in order.</li>
253<li>At the end of the message, call <a class="el" href="group__MAC.html#gac22bc0125580c96724a09226cfbc97f2">psa_mac_sign_finish()</a> to finish calculating the MAC value and retrieve it.</li>
254</ol>
255<p>The application may call <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a> at any time after the operation has been initialized with <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a>.</p>
256<p>After a successful call to <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a>, the application must eventually terminate the operation through one of the following methods:</p><ul>
257<li>A failed call to <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a>.</li>
258<li>A call to <a class="el" href="group__MAC.html#gac22bc0125580c96724a09226cfbc97f2">psa_mac_sign_finish()</a> or <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a>.</li>
259</ul>
260<dl class="params"><dt>Parameters</dt><dd>
261 <table class="params">
262 <tr><td class="paramdir">[out]</td><td class="paramname">operation</td><td>The operation object to use. </td></tr>
263 <tr><td class="paramdir"></td><td class="paramname">key</td><td>Slot containing the key to use for the operation. </td></tr>
264 <tr><td class="paramdir"></td><td class="paramname">alg</td><td>The MAC algorithm to compute (<code>PSA_ALG_XXX</code> value such that <a class="el" href="group__crypto__types.html#gaca7aee4c9dde316b3b1a150a26eab776">PSA_ALG_IS_MAC(alg)</a> is true).</td></tr>
265 </table>
266 </dd>
267</dl>
268<dl class="retval"><dt>Return values</dt><dd>
269 <table class="retval">
270 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td>Success. </td></tr>
271 <tr><td class="paramname"><a class="el" href="group__basic.html#gaba00e3e6ceb2b12965a81e5ac02ae040">PSA_ERROR_EMPTY_SLOT</a></td><td></td></tr>
272 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4d1b8dd8526177a15a210b7afc1accb1">PSA_ERROR_NOT_PERMITTED</a></td><td></td></tr>
273 <tr><td class="paramname"><a class="el" href="group__basic.html#ga798df25a505ebf931f7bec1f80f1f85f">PSA_ERROR_INVALID_ARGUMENT</a></td><td><code>key</code> is not compatible with <code>alg</code>. </td></tr>
274 <tr><td class="paramname"><a class="el" href="group__basic.html#ga1dcc6d130633ed5db8942257581b55dd">PSA_ERROR_NOT_SUPPORTED</a></td><td><code>alg</code> is not supported or is not a MAC algorithm. </td></tr>
275 <tr><td class="paramname"><a class="el" href="group__basic.html#ga91b2ad8a867517a2651f1b076c5216e5">PSA_ERROR_INSUFFICIENT_MEMORY</a></td><td></td></tr>
276 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
277 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
278 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
279 </table>
280 </dd>
281</dl>
282
283</div>
284</div>
285<a id="ga5560af371497babefe03c9da4e8a1c05"></a>
286<h2 class="memtitle"><span class="permalink"><a href="#ga5560af371497babefe03c9da4e8a1c05">&#9670;&nbsp;</a></span>psa_mac_update()</h2>
287
288<div class="memitem">
289<div class="memproto">
290 <table class="memname">
291 <tr>
292 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_update </td>
293 <td>(</td>
294 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
295 <td class="paramname"><em>operation</em>, </td>
296 </tr>
297 <tr>
298 <td class="paramkey"></td>
299 <td></td>
300 <td class="paramtype">const uint8_t *&#160;</td>
301 <td class="paramname"><em>input</em>, </td>
302 </tr>
303 <tr>
304 <td class="paramkey"></td>
305 <td></td>
306 <td class="paramtype">size_t&#160;</td>
307 <td class="paramname"><em>input_length</em>&#160;</td>
308 </tr>
309 <tr>
310 <td></td>
311 <td>)</td>
312 <td></td><td></td>
313 </tr>
314 </table>
315</div><div class="memdoc">
316<p>Add a message fragment to a multipart MAC operation.</p>
317<p>The application must call <a class="el" href="group__MAC.html#ga68ac2ad3253e9e27fcfbc788a4df8177">psa_mac_sign_setup()</a> or <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a> before calling this function.</p>
318<p>If this function returns an error status, the operation becomes inactive.</p>
319<dl class="params"><dt>Parameters</dt><dd>
320 <table class="params">
321 <tr><td class="paramdir">[in,out]</td><td class="paramname">operation</td><td>Active MAC operation. </td></tr>
322 <tr><td class="paramdir">[in]</td><td class="paramname">input</td><td>Buffer containing the message fragment to add to the MAC calculation. </td></tr>
323 <tr><td class="paramdir"></td><td class="paramname">input_length</td><td>Size of the <code>input</code> buffer in bytes.</td></tr>
324 </table>
325 </dd>
326</dl>
327<dl class="retval"><dt>Return values</dt><dd>
328 <table class="retval">
329 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td>Success. </td></tr>
330 <tr><td class="paramname"><a class="el" href="group__basic.html#ga933d40fa2a591004f2e93aa91e11db84">PSA_ERROR_BAD_STATE</a></td><td>The operation state is not valid (not started, or already completed). </td></tr>
331 <tr><td class="paramname"><a class="el" href="group__basic.html#ga91b2ad8a867517a2651f1b076c5216e5">PSA_ERROR_INSUFFICIENT_MEMORY</a></td><td></td></tr>
332 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
333 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
334 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
335 </table>
336 </dd>
337</dl>
338
339</div>
340</div>
341<a id="gac92b2930d6728e1be4d011c05d485822"></a>
342<h2 class="memtitle"><span class="permalink"><a href="#gac92b2930d6728e1be4d011c05d485822">&#9670;&nbsp;</a></span>psa_mac_verify_finish()</h2>
343
344<div class="memitem">
345<div class="memproto">
346 <table class="memname">
347 <tr>
348 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_verify_finish </td>
349 <td>(</td>
350 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
351 <td class="paramname"><em>operation</em>, </td>
352 </tr>
353 <tr>
354 <td class="paramkey"></td>
355 <td></td>
356 <td class="paramtype">const uint8_t *&#160;</td>
357 <td class="paramname"><em>mac</em>, </td>
358 </tr>
359 <tr>
360 <td class="paramkey"></td>
361 <td></td>
362 <td class="paramtype">size_t&#160;</td>
363 <td class="paramname"><em>mac_length</em>&#160;</td>
364 </tr>
365 <tr>
366 <td></td>
367 <td>)</td>
368 <td></td><td></td>
369 </tr>
370 </table>
371</div><div class="memdoc">
372<p>Finish the calculation of the MAC of a message and compare it with an expected value.</p>
373<p>The application must call <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a> before calling this function. This function calculates the MAC of the message formed by concatenating the inputs passed to preceding calls to <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a>. It then compares the calculated MAC with the expected MAC passed as a parameter to this function.</p>
374<p>When this function returns, the operation becomes inactive.</p>
375<dl class="section note"><dt>Note</dt><dd>Implementations shall make the best effort to ensure that the comparison between the actual MAC and the expected MAC is performed in constant time.</dd></dl>
376<dl class="params"><dt>Parameters</dt><dd>
377 <table class="params">
378 <tr><td class="paramdir">[in,out]</td><td class="paramname">operation</td><td>Active MAC operation. </td></tr>
379 <tr><td class="paramdir">[in]</td><td class="paramname">mac</td><td>Buffer containing the expected MAC value. </td></tr>
380 <tr><td class="paramdir"></td><td class="paramname">mac_length</td><td>Size of the <code>mac</code> buffer in bytes.</td></tr>
381 </table>
382 </dd>
383</dl>
384<dl class="retval"><dt>Return values</dt><dd>
385 <table class="retval">
386 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td>The expected MAC is identical to the actual MAC of the message. </td></tr>
387 <tr><td class="paramname"><a class="el" href="group__basic.html#ga35927f755d232c4766de600f2c49e9f2">PSA_ERROR_INVALID_SIGNATURE</a></td><td>The MAC of the message was calculated successfully, but it differs from the expected MAC. </td></tr>
388 <tr><td class="paramname"><a class="el" href="group__basic.html#ga933d40fa2a591004f2e93aa91e11db84">PSA_ERROR_BAD_STATE</a></td><td>The operation state is not valid (not started, or already completed). </td></tr>
389 <tr><td class="paramname"><a class="el" href="group__basic.html#ga91b2ad8a867517a2651f1b076c5216e5">PSA_ERROR_INSUFFICIENT_MEMORY</a></td><td></td></tr>
390 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
391 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
392 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
393 </table>
394 </dd>
395</dl>
396
397</div>
398</div>
399<a id="gac7d1c3d075ce1604a54cbbc9933fa39d"></a>
400<h2 class="memtitle"><span class="permalink"><a href="#gac7d1c3d075ce1604a54cbbc9933fa39d">&#9670;&nbsp;</a></span>psa_mac_verify_setup()</h2>
401
402<div class="memitem">
403<div class="memproto">
404 <table class="memname">
405 <tr>
406 <td class="memname"><a class="el" href="group__basic.html#ga05676e70ba5c6a7565aff3c36677c1f9">psa_status_t</a> psa_mac_verify_setup </td>
407 <td>(</td>
408 <td class="paramtype"><a class="el" href="group__MAC.html#ga78f0838b0c4e3db28b26355624d4bd37">psa_mac_operation_t</a> *&#160;</td>
409 <td class="paramname"><em>operation</em>, </td>
410 </tr>
411 <tr>
412 <td class="paramkey"></td>
413 <td></td>
414 <td class="paramtype"><a class="el" href="group__platform.html#gac3da92a6b8a7f0c01dc348f8e0432e4c">psa_key_slot_t</a>&#160;</td>
415 <td class="paramname"><em>key</em>, </td>
416 </tr>
417 <tr>
418 <td class="paramkey"></td>
419 <td></td>
420 <td class="paramtype"><a class="el" href="group__crypto__types.html#gac2e4d47f1300d73c2f829a6d99252d69">psa_algorithm_t</a>&#160;</td>
421 <td class="paramname"><em>alg</em>&#160;</td>
422 </tr>
423 <tr>
424 <td></td>
425 <td>)</td>
426 <td></td><td></td>
427 </tr>
428 </table>
429</div><div class="memdoc">
430<p>Start a multipart MAC verification operation.</p>
431<p>This function sets up the verification of the MAC (message authentication code) of a byte string against an expected value.</p>
432<p>The sequence of operations to verify a MAC is as follows:</p><ol type="1">
433<li>Allocate an operation object which will be passed to all the functions listed here.</li>
434<li>Call <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a> to specify the algorithm and key. The key remains associated with the operation even if the content of the key slot changes.</li>
435<li>Call <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a> zero, one or more times, passing a fragment of the message each time. The MAC that is calculated is the MAC of the concatenation of these messages in order.</li>
436<li>At the end of the message, call <a class="el" href="group__MAC.html#gac92b2930d6728e1be4d011c05d485822">psa_mac_verify_finish()</a> to finish calculating the actual MAC of the message and verify it against the expected value.</li>
437</ol>
438<p>The application may call <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a> at any time after the operation has been initialized with <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a>.</p>
439<p>After a successful call to <a class="el" href="group__MAC.html#gac7d1c3d075ce1604a54cbbc9933fa39d">psa_mac_verify_setup()</a>, the application must eventually terminate the operation through one of the following methods:</p><ul>
440<li>A failed call to <a class="el" href="group__MAC.html#ga5560af371497babefe03c9da4e8a1c05">psa_mac_update()</a>.</li>
441<li>A call to <a class="el" href="group__MAC.html#gac92b2930d6728e1be4d011c05d485822">psa_mac_verify_finish()</a> or <a class="el" href="group__MAC.html#gacd8dd54855ba1bc0a03f104f252884fd">psa_mac_abort()</a>.</li>
442</ul>
443<dl class="params"><dt>Parameters</dt><dd>
444 <table class="params">
445 <tr><td class="paramdir">[out]</td><td class="paramname">operation</td><td>The operation object to use. </td></tr>
446 <tr><td class="paramdir"></td><td class="paramname">key</td><td>Slot containing the key to use for the operation. </td></tr>
447 <tr><td class="paramdir"></td><td class="paramname">alg</td><td>The MAC algorithm to compute (<code>PSA_ALG_XXX</code> value such that <a class="el" href="group__crypto__types.html#gaca7aee4c9dde316b3b1a150a26eab776">PSA_ALG_IS_MAC</a>(<code>alg</code>) is true).</td></tr>
448 </table>
449 </dd>
450</dl>
451<dl class="retval"><dt>Return values</dt><dd>
452 <table class="retval">
453 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4cc859e2c66ca381c7418db3527a65e1">PSA_SUCCESS</a></td><td>Success. </td></tr>
454 <tr><td class="paramname"><a class="el" href="group__basic.html#gaba00e3e6ceb2b12965a81e5ac02ae040">PSA_ERROR_EMPTY_SLOT</a></td><td></td></tr>
455 <tr><td class="paramname"><a class="el" href="group__basic.html#ga4d1b8dd8526177a15a210b7afc1accb1">PSA_ERROR_NOT_PERMITTED</a></td><td></td></tr>
456 <tr><td class="paramname"><a class="el" href="group__basic.html#ga798df25a505ebf931f7bec1f80f1f85f">PSA_ERROR_INVALID_ARGUMENT</a></td><td><code>key</code> is not compatible with <code>alg</code>. </td></tr>
457 <tr><td class="paramname"><a class="el" href="group__basic.html#ga1dcc6d130633ed5db8942257581b55dd">PSA_ERROR_NOT_SUPPORTED</a></td><td><code>alg</code> is not supported or is not a MAC algorithm. </td></tr>
458 <tr><td class="paramname"><a class="el" href="group__basic.html#ga91b2ad8a867517a2651f1b076c5216e5">PSA_ERROR_INSUFFICIENT_MEMORY</a></td><td></td></tr>
459 <tr><td class="paramname"><a class="el" href="group__basic.html#ga5cdb6948371d49e916106249020ea3f7">PSA_ERROR_COMMUNICATION_FAILURE</a></td><td></td></tr>
460 <tr><td class="paramname"><a class="el" href="group__basic.html#ga08b10e70fa5ff0b05c631d9f8f6b2c6b">PSA_ERROR_HARDWARE_FAILURE</a></td><td></td></tr>
461 <tr><td class="paramname"><a class="el" href="group__basic.html#ga2c5dda1485cb54f2385cb9c1279a7004">PSA_ERROR_TAMPERING_DETECTED</a></td><td></td></tr>
462 </table>
463 </dd>
464</dl>
465
466</div>
467</div>
468</div><!-- contents -->
469<!-- start footer part -->
470<hr class="footer"/><address class="footer"><small>
471Generated by &#160;<a href="http://www.doxygen.org/index.html">
472<img class="footer" src="doxygen.png" alt="doxygen"/>
473</a> 1.8.13
474</small></address>
475</body>
476</html>