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