1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | EVP_MAC-KMAC, EVP_MAC-KMAC128, EVP_MAC-KMAC256
|
---|
6 | - The KMAC EVP_MAC implementations
|
---|
7 |
|
---|
8 | =head1 DESCRIPTION
|
---|
9 |
|
---|
10 | Support for computing KMAC MACs through the B<EVP_MAC> API.
|
---|
11 |
|
---|
12 | =head2 Identity
|
---|
13 |
|
---|
14 | These implementations are identified with one of these names and
|
---|
15 | properties, to be used with EVP_MAC_fetch():
|
---|
16 |
|
---|
17 | =over 4
|
---|
18 |
|
---|
19 | =item "KMAC-128", "provider=default" or "provider=fips"
|
---|
20 |
|
---|
21 | =item "KMAC-256", "provider=default" or "provider=fips"
|
---|
22 |
|
---|
23 | =back
|
---|
24 |
|
---|
25 | =head2 Supported parameters
|
---|
26 |
|
---|
27 | The general description of these parameters can be found in
|
---|
28 | L<EVP_MAC(3)/PARAMETERS>.
|
---|
29 |
|
---|
30 | All these parameters can be set with EVP_MAC_CTX_set_params().
|
---|
31 | Furthermore, the "size" parameter can be retrieved with
|
---|
32 | EVP_MAC_CTX_get_params(), or with EVP_MAC_CTX_get_mac_size().
|
---|
33 | The length of the "size" parameter should not exceed that of a B<size_t>.
|
---|
34 | Likewise, the "block-size" parameter can be retrieved with
|
---|
35 | EVP_MAC_CTX_get_params(), or with EVP_MAC_CTX_get_block_size().
|
---|
36 |
|
---|
37 |
|
---|
38 | =over 4
|
---|
39 |
|
---|
40 | =item "key" (B<OSSL_MAC_PARAM_KEY>) <octet string>
|
---|
41 |
|
---|
42 | Sets the MAC key.
|
---|
43 | Setting this parameter is identical to passing a I<key> to L<EVP_MAC_init(3)>.
|
---|
44 |
|
---|
45 | =item "custom" (B<OSSL_MAC_PARAM_CUSTOM>) <octet string>
|
---|
46 |
|
---|
47 | Sets the custom value.
|
---|
48 | It is an optional value of at most 256 bytes, and is empty by default.
|
---|
49 |
|
---|
50 | =item "size" (B<OSSL_MAC_PARAM_SIZE>) <unsigned integer>
|
---|
51 |
|
---|
52 | Sets the MAC size.
|
---|
53 | By default, it is 16 for C<KMAC-128> and 32 for C<KMAC-256>.
|
---|
54 |
|
---|
55 | =item "block-size" (B<OSSL_MAC_PARAM_SIZE>) <unsigned integer>
|
---|
56 |
|
---|
57 | Gets the MAC block size.
|
---|
58 | By default, it is 168 for C<KMAC-128> and 136 for C<KMAC-256>.
|
---|
59 |
|
---|
60 | =item "xof" (B<OSSL_MAC_PARAM_XOF>) <integer>
|
---|
61 |
|
---|
62 | The "xof" parameter value is expected to be 1 or 0. Use 1 to enable XOF mode.
|
---|
63 | The default value is 0.
|
---|
64 |
|
---|
65 | =back
|
---|
66 |
|
---|
67 | The "custom" parameter must be set as part of or before the EVP_MAC_init() call.
|
---|
68 | The "xof" and "size" parameters can be set at any time before EVP_MAC_final().
|
---|
69 | The "key" parameter is set as part of the EVP_MAC_init() call, but can be
|
---|
70 | set before it instead.
|
---|
71 |
|
---|
72 | =head1 EXAMPLES
|
---|
73 |
|
---|
74 | #include <openssl/evp.h>
|
---|
75 | #include <openssl/params.h>
|
---|
76 |
|
---|
77 | static int do_kmac(const unsigned char *in, size_t in_len,
|
---|
78 | const unsigned char *key, size_t key_len,
|
---|
79 | const unsigned char *custom, size_t custom_len,
|
---|
80 | int xof_enabled, unsigned char *out, int out_len)
|
---|
81 | {
|
---|
82 | EVP_MAC_CTX *ctx = NULL;
|
---|
83 | EVP_MAC *mac = NULL;
|
---|
84 | OSSL_PARAM params[4], *p;
|
---|
85 | int ret = 0;
|
---|
86 | size_t l = 0;
|
---|
87 |
|
---|
88 | mac = EVP_MAC_fetch(NULL, "KMAC-128", NULL);
|
---|
89 | if (mac == NULL)
|
---|
90 | goto err;
|
---|
91 | ctx = EVP_MAC_CTX_new(mac);
|
---|
92 | /* The mac can be freed after it is used by EVP_MAC_CTX_new */
|
---|
93 | EVP_MAC_free(mac);
|
---|
94 | if (ctx == NULL)
|
---|
95 | goto err;
|
---|
96 |
|
---|
97 | /*
|
---|
98 | * Setup parameters required before calling EVP_MAC_init()
|
---|
99 | * The parameters OSSL_MAC_PARAM_XOF and OSSL_MAC_PARAM_SIZE may also be
|
---|
100 | * used at this point.
|
---|
101 | */
|
---|
102 | p = params;
|
---|
103 | *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
|
---|
104 | (void *)key, key_len);
|
---|
105 | if (custom != NULL && custom_len != 0)
|
---|
106 | *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
|
---|
107 | (void *)custom, custom_len);
|
---|
108 | *p = OSSL_PARAM_construct_end();
|
---|
109 | if (!EVP_MAC_CTX_set_params(ctx, params))
|
---|
110 | goto err;
|
---|
111 |
|
---|
112 | if (!EVP_MAC_init(ctx))
|
---|
113 | goto err;
|
---|
114 |
|
---|
115 | /*
|
---|
116 | * Note: the following optional parameters can be set any time
|
---|
117 | * before EVP_MAC_final().
|
---|
118 | */
|
---|
119 | p = params;
|
---|
120 | *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_XOF, &xof_enabled);
|
---|
121 | *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE, &out_len);
|
---|
122 | *p = OSSL_PARAM_construct_end();
|
---|
123 | if (!EVP_MAC_CTX_set_params(ctx, params))
|
---|
124 | goto err;
|
---|
125 |
|
---|
126 | /* The update may be called multiple times here for streamed input */
|
---|
127 | if (!EVP_MAC_update(ctx, in, in_len))
|
---|
128 | goto err;
|
---|
129 | if (!EVP_MAC_final(ctx, out, &l, out_len))
|
---|
130 | goto err;
|
---|
131 | ret = 1;
|
---|
132 | err:
|
---|
133 | EVP_MAC_CTX_free(ctx);
|
---|
134 | return ret;
|
---|
135 | }
|
---|
136 |
|
---|
137 | =head1 SEE ALSO
|
---|
138 |
|
---|
139 | L<EVP_MAC_CTX_get_params(3)>, L<EVP_MAC_CTX_set_params(3)>,
|
---|
140 | L<EVP_MAC(3)/PARAMETERS>, L<OSSL_PARAM(3)>
|
---|
141 |
|
---|
142 | =head1 COPYRIGHT
|
---|
143 |
|
---|
144 | Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.
|
---|
145 |
|
---|
146 | Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
147 | this file except in compliance with the License. You can obtain a copy
|
---|
148 | in the file LICENSE in the source distribution or at
|
---|
149 | L<https://www.openssl.org/source/license.html>.
|
---|
150 |
|
---|
151 | =cut
|
---|