]> git.ipfire.org Git - thirdparty/openssl.git/blame_incremental - doc/man3/EVP_MAC.pod
Prepare EVP_MAC infrastructure for moving all MACs to providers
[thirdparty/openssl.git] / doc / man3 / EVP_MAC.pod
... / ...
CommitLineData
1=pod
2
3=head1 NAME
4
5EVP_MAC, EVP_MAC_fetch, EVP_MAC_up_ref, EVP_MAC_free, EVP_MAC_name,
6EVP_MAC_get_params, EVP_MAC_gettable_params,
7EVP_MAC_CTX, EVP_MAC_CTX_new, EVP_MAC_CTX_free, EVP_MAC_CTX_dup,
8EVP_MAC_CTX_mac, EVP_MAC_CTX_get_params, EVP_MAC_CTX_set_params,
9EVP_MAC_size, EVP_MAC_init, EVP_MAC_update, EVP_MAC_final,
10EVP_MAC_CTX_gettable_params, EVP_MAC_CTX_settable_params
11- EVP MAC routines
12
13=head1 SYNOPSIS
14
15 #include <openssl/evp.h>
16
17 typedef struct evp_mac_st EVP_MAC;
18 typedef struct evp_mac_ctx_st EVP_MAC_CTX;
19
20 EVP_MAC *EVP_MAC_fetch(OPENSSL_CTX *libctx, const char *algorithm,
21 const char *properties);
22 int EVP_MAC_up_ref(EVP_MAC *mac);
23 void EVP_MAC_free(EVP_MAC *mac);
24 const char *EVP_MAC_name(const EVP_MAC *mac);
25 int EVP_MAC_get_params(EVP_MAC *mac, OSSL_PARAM params[]);
26
27 EVP_MAC_CTX *EVP_MAC_CTX_new(EVP_MAC *mac);
28 void EVP_MAC_CTX_free(EVP_MAC_CTX *ctx);
29 EVP_MAC_CTX *EVP_MAC_CTX_dup(const EVP_MAC_CTX *src);
30 EVP_MAC *EVP_MAC_CTX_mac(EVP_MAC_CTX *ctx);
31 int EVP_MAC_CTX_get_params(EVP_MAC_CTX *ctx, OSSL_PARAM params[]);
32 int EVP_MAC_CTX_set_params(EVP_MAC_CTX *ctx, const OSSL_PARAM params[]);
33
34 size_t EVP_MAC_size(EVP_MAC_CTX *ctx);
35 int EVP_MAC_init(EVP_MAC_CTX *ctx);
36 int EVP_MAC_update(EVP_MAC_CTX *ctx, const unsigned char *data, size_t datalen);
37 int EVP_MAC_final(EVP_MAC_CTX *ctx,
38 unsigned char *out, size_t *outl, size_t outsize);
39
40 const OSSL_PARAM *EVP_MAC_gettable_params(const EVP_MAC *mac);
41 const OSSL_PARAM *EVP_MAC_CTX_gettable_params(const EVP_MAC *mac);
42 const OSSL_PARAM *EVP_MAC_CTX_settable_params(const EVP_MAC *mac);
43
44=head1 DESCRIPTION
45
46These types and functions help the application to calculate MACs of
47different types and with different underlying algorithms if there are
48any.
49
50MACs are a bit complex insofar that some of them use other algorithms
51for actual computation. HMAC uses a digest, and CMAC uses a cipher.
52Therefore, there are sometimes two contexts to keep track of, one for
53the MAC algorithm itself and one for the underlying computation
54algorithm if there is one.
55
56To make things less ambiguous, this manual talks about a "context" or
57"MAC context", which is to denote the MAC level context, and about a
58"underlying context", or "computation context", which is to denote the
59context for the underlying computation algorithm if there is one.
60
61=head2 Types
62
63B<EVP_MAC> is a type that holds the implementation of a MAC.
64
65B<EVP_MAC_CTX> is a context type that holds internal MAC information
66as well as a reference to a computation context, for those MACs that
67rely on an underlying computation algorithm.
68
69=head2 Algorithm implementation fetching
70
71EVP_MAC_fetch() fetches an implementation of a MAC I<algorithm>, given
72a library context I<libctx> and a set of I<properties>.
73See L<provider(7)/Fetching algorithms> for further information.
74
75The returned value must eventually be freed with
76L<EVP_MAC_free(3)>.
77
78EVP_MAC_up_ref() increments the reference count of an already fetched
79MAC.
80
81EVP_MAC_free() frees a fetched algorithm.
82NULL is a valid parameter, for which this function is a no-op.
83
84=head2 Context manipulation functions
85
86EVP_MAC_CTX_new() creates a new context for the MAC type I<mac>.
87The created context can then be used with most other functions
88described here.
89
90EVP_MAC_CTX_free() frees the contents of the context, including an
91underlying context if there is one, as well as the context itself.
92NULL is a valid parameter, for which this function is a no-op.
93
94EVP_MAC_CTX_dup() duplicates the I<src> context and returns a newly allocated
95context.
96
97EVP_MAC_CTX_mac() returns the B<EVP_MAC> associated with the context
98I<ctx>.
99
100=head2 Computing functions
101
102EVP_MAC_init() sets up the underlying context with information given
103through diverse controls.
104This should be called before calling EVP_MAC_update() and
105EVP_MAC_final().
106
107EVP_MAC_update() adds I<datalen> bytes from I<data> to the MAC input.
108
109EVP_MAC_final() does the final computation and stores the result in
110the memory pointed at by I<out> of size I<outsize>, and sets the number
111of bytes written in I<*outl> at.
112If I<out> is B<NULL> or I<outsize> is too small, then no computation
113is made.
114To figure out what the output length will be and allocate space for it
115dynamically, simply call with I<out> being B<NULL> and I<outl>
116pointing at a valid location, then allocate space and make a second
117call with I<out> pointing at the allocated space.
118
119EVP_MAC_get_params() retrieves details about the implementation
120I<mac>.
121The set of parameters given with I<params> determine exactly what
122parameters should be retrieved.
123Note that a parameter that is unknown in the underlying context is
124simply ignored.
125
126EVP_MAC_CTX_get_params() retrieves chosen parameters, given the
127context I<ctx> and its underlying context.
128The set of parameters given with I<params> determine exactly what
129parameters should be retrieved.
130Note that a parameter that is unknown in the underlying context is
131simply ignored.
132
133EVP_MAC_CTX_set_params() passes chosen parameters to the underlying
134context, given a context I<ctx>.
135The set of parameters given with I<params> determine exactly what
136parameters are passed down.
137Note that a parameter that is unknown in the underlying context is
138simply ignored.
139Also, what happens when a needed parameter isn't passed down is
140defined by the implementation.
141
142EVP_MAC_gettable_params(), EVP_MAC_CTX_gettable_params() and
143EVP_MAC_CTX_settable_params() get a constant B<OSSL_PARAM> array that
144decribes the retrievable and settable parameters, i.e. parameters that
145can be used with EVP_MAC_CTX_get_params(), EVP_MAC_CTX_get_params()
146and EVP_MAC_CTX_set_params(), respectively.
147See L<OSSL_PARAM(3)> for the use of B<OSSL_PARAM> as parameter descriptor.
148
149=head2 Information functions
150
151EVP_MAC_size() returns the MAC output size for the given context.
152
153EVP_MAC_name() returns the name of the given MAC implementation.
154
155=head1 PARAMETER NAMES
156
157The standard parameter names are:
158
159=over 4
160
161=item OSSL_MAC_PARAM_KEY ("key") <octet string>
162
163Its value is the MAC key as an array of bytes.
164
165For MACs that use an underlying computation algorithm, the algorithm
166must be set first, see parameter names "algorithm" below.
167
168=item OSSL_MAC_PARAM_IV ("iv") <octet string>
169
170Some MAC implementations require an IV, this parameter sets the IV.
171
172=item OSSL_MAC_PARAM_CUSTOM ("custom") <octet string>
173
174Some MAC implementations (KMAC, BLAKE2) accept a Customization String,
175this parameter sets the Customization String. The default value is the
176empty string.
177
178=item OSSL_MAC_PARAM_SALT ("salt") <octet string>
179
180This option is used by BLAKE2 MAC.
181
182=item OSSL_MAC_PARAM_XOF ("xof") <int>
183
184It's a simple flag, the value 0 or 1 are expected.
185
186This option is used by KMAC.
187
188=item OSSL_MAC_PARAM_FLAGS ("flags") <int>
189
190These will set the MAC flags to the given numbers.
191Some MACs do not support this option.
192
193=item OSSL_MAC_PARAM_ENGINE ("engine") <utf8string>
194
195=item OSSL_MAC_PARAM_MD ("md") <utf8string>
196
197=item OSSL_MAC_PARAM_DIGEST ("digest") <utf8string>
198
199=item OSSL_MAC_PARAM_CIPHER ("cipher") <utf8string>
200
201=item OSSL_MAC_PARAM_ALGORITHM ("algorithm") <utf8string>
202
203For MAC implementations that use an underlying computation algorithm,
204these parameters set what the algorithm should be, and the engine that
205implements the algorithm if needed.
206
207The value is always the name of the intended engine or algorithm.
208
209Note that not all algorithms may support all digests.
210HMAC does not support variable output length digests such as SHAKE128
211or SHAKE256.
212
213Also note that OSSL_MAC_PARAM_ALGORITHM can be use generically instead
214of OSSL_MAC_PARAM_MD, OSSL_MAC_PARAM_DIGEST or OSSL_MAC_PARAM_CIPHER,
215and that OSSL_MAC_PARAM_MD and OSSL_MAC_PARAM_DIGEST are also interchangable.
216
217=item OSSL_MAC_PARAM_SIZE <unsigned int>
218
219For MAC implementations that support it, set the output size that
220EVP_MAC_final() should produce.
221The allowed sizes vary between MAC implementations.
222
223=back
224
225All these parameters should be used before the calls to any of
226EVP_MAC_init(), EVP_MAC_update() and EVP_MAC_final() for a full
227computation.
228Anything else may give undefined results.
229
230=head1 RETURN VALUES
231
232EVP_MAC_fetch() returns a pointer to a newly fetched EVP_MAC, or
233NULL if allocation failed.
234
235EVP_MAC_up_ref() returns 1 on success, 0 on error.
236
237EVP_MAC_free() returns nothing at all.
238
239EVP_MAC_name() returns the name of the MAC, or NULL if NULL was
240passed.
241
242EVP_MAC_CTX_new() and EVP_MAC_CTX_dup() return a pointer to a newly
243created EVP_MAC_CTX, or NULL if allocation failed.
244
245EVP_MAC_CTX_free() returns nothing at all.
246
247EVP_MAC_CTX_get_params() and EVP_MAC_CTX_set_params() return 1 on
248success, 0 on error.
249
250EVP_MAC_init(), EVP_MAC_update(), and EVP_MAC_final() return 1 on success, 0
251on error.
252
253EVP_MAC_size() returns the expected output size, or 0 if it isn't
254set.
255If it isn't set, a call to EVP_MAC_init() should get it set.
256
257
258=head1 EXAMPLE
259
260 #include <stdlib.h>
261 #include <stdio.h>
262 #include <string.h>
263 #include <stdarg.h>
264 #include <unistd.h>
265
266 #include <openssl/evp.h>
267 #include <openssl/err.h>
268 #include <openssl/params.h>
269
270 int main() {
271 EVP_MAC *mac = EVP_MAC_fetch(NULL, getenv("MY_MAC"), NULL);
272 const char *cipher = getenv("MY_MAC_CIPHER");
273 const char *digest = getenv("MY_MAC_DIGEST");
274 const char *key = getenv("MY_KEY");
275 EVP_MAC_CTX *ctx = NULL;
276
277 unsigned char buf[4096];
278 ssize_t read_l;
279 size_t final_l;
280
281 size_t i;
282
283 OSSL_PARAM params[4];
284 size_t params_n = 0;
285
286 if (cipher != NULL)
287 params[params_n++] =
288 OSSL_PARAM_construct_utf8_string("cipher", cipher,
289 strlen(cipher) + 1, NULL);
290 if (digest != NULL)
291 params[params_n++] =
292 OSSL_PARAM_construct_utf8_string("digest", digest,
293 strlen(digest) + 1, NULL);
294 params[params_n++] =
295 OSSL_PARAM_construct_octet_string("key", key, strlen(key), NULL);
296 params[params_n] = OSSL_PARAM_construct_end();
297
298 if (mac == NULL
299 || key == NULL
300 || (ctx = EVP_MAC_CTX_new(mac)) == NULL
301 || EVP_MAC_CTX_set_params(ctx, params) <= 0)
302 goto err;
303
304 if (!EVP_MAC_init(ctx))
305 goto err;
306
307 while ( (read_l = read(STDIN_FILENO, buf, sizeof(buf))) < 0) {
308 if (!EVP_MAC_update(ctx, buf, read_l))
309 goto err;
310 }
311
312 if (!EVP_MAC_final(ctx, buf, &final_l))
313 goto err;
314
315 printf("Result: ");
316 for (i = 0; i < final_l; i++)
317 printf("%02X", buf[i]);
318 printf("\n");
319
320 EVP_MAC_CTX_free(ctx);
321 EVP_MAC_free(mac);
322 exit(0);
323
324 err:
325 EVP_MAC_CTX_free(ctx);
326 EVP_MAC_free(mac);
327 fprintf(stderr, "Something went wrong\n");
328 ERR_print_errors_fp(stderr);
329 exit (1);
330 }
331
332A run of this program, called with correct environment variables, can
333look like this:
334
335 $ MY_MAC=cmac MY_KEY=secret0123456789 MY_MAC_CIPHER=aes-128-cbc \
336 LD_LIBRARY_PATH=. ./foo < foo.c
337 Result: ECCAAFF041B22A2299EB90A1B53B6D45
338
339(in this example, that program was stored in F<foo.c> and compiled to
340F<./foo>)
341
342=head1 SEE ALSO
343
344L<property(7)>
345L<OSSL_PARAM(3)>,
346L<EVP_MAC_BLAKE2(7)>,
347L<EVP_MAC_CMAC(7)>,
348L<EVP_MAC_GMAC(7)>,
349L<EVP_MAC_HMAC(7)>,
350L<EVP_MAC_KMAC(7)>,
351L<EVP_MAC_SIPHASH(7)>,
352L<EVP_MAC_POLY1305(7)>
353
354=head1 HISTORY
355
356These functions were added in OpenSSL 3.0.
357
358=head1 COPYRIGHT
359
360Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved.
361
362Licensed under the Apache License 2.0 (the "License"). You may not use
363this file except in compliance with the License. You can obtain a copy
364in the file LICENSE in the source distribution or at
365L<https://www.openssl.org/source/license.html>.
366
367=cut