| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | 
							- =pod
 
- =head1 NAME
 
- EVP_MAC-KMAC, EVP_MAC-KMAC128, EVP_MAC-KMAC256
 
- - The KMAC EVP_MAC implementations
 
- =head1 DESCRIPTION
 
- Support for computing KMAC MACs through the B<EVP_MAC> API.
 
- =head2 Identity
 
- These implementations are identified with one of these names and
 
- properties, to be used with EVP_MAC_fetch():
 
- =over 4
 
- =item "KMAC-128", "provider=default" or "provider=fips"
 
- =item "KMAC-256", "provider=default" or "provider=fips"
 
- =back
 
- =head2 Supported parameters
 
- The general description of these parameters can be found in
 
- L<EVP_MAC(3)/PARAMETERS>.
 
- All these parameters can be set with EVP_MAC_CTX_set_params().
 
- Furthermore, the "size" parameter can be retrieved with
 
- EVP_MAC_CTX_get_params(), or with EVP_MAC_CTX_get_mac_size().
 
- The length of the "size" parameter should not exceed that of a B<size_t>.
 
- Likewise, the "block-size" parameter can be retrieved with
 
- EVP_MAC_CTX_get_params(), or with EVP_MAC_CTX_get_block_size().
 
- =over 4
 
- =item "key" (B<OSSL_MAC_PARAM_KEY>) <octet string>
 
- Sets the MAC key.
 
- Setting this parameter is identical to passing a I<key> to L<EVP_MAC_init(3)>.
 
- The length of the key (in bytes) must be in the range 4...512.
 
- =item "custom" (B<OSSL_MAC_PARAM_CUSTOM>) <octet string>
 
- Sets the custom value.
 
- It is an optional value with a length of at most 512 bytes, and is empty by default.
 
- =item "size" (B<OSSL_MAC_PARAM_SIZE>) <unsigned integer>
 
- Sets the MAC size.
 
- By default, it is 16 for C<KMAC-128> and 32 for C<KMAC-256>.
 
- =item "block-size" (B<OSSL_MAC_PARAM_SIZE>) <unsigned integer>
 
- Gets the MAC block size.
 
- By default, it is 168 for C<KMAC-128> and 136 for C<KMAC-256>.
 
- =item "xof" (B<OSSL_MAC_PARAM_XOF>) <integer>
 
- The "xof" parameter value is expected to be 1 or 0. Use 1 to enable XOF mode.
 
- The default value is 0.
 
- =back
 
- The "custom" parameter must be set as part of or before the EVP_MAC_init() call.
 
- The "xof" and "size" parameters can be set at any time before EVP_MAC_final().
 
- The "key" parameter is set as part of the EVP_MAC_init() call, but can be
 
- set before it instead.
 
- =head1 EXAMPLES
 
-   #include <openssl/evp.h>
 
-   #include <openssl/params.h>
 
-   static int do_kmac(const unsigned char *in, size_t in_len,
 
-                      const unsigned char *key, size_t key_len,
 
-                      const unsigned char *custom, size_t custom_len,
 
-                      int xof_enabled, unsigned char *out, int out_len)
 
-   {
 
-       EVP_MAC_CTX *ctx = NULL;
 
-       EVP_MAC *mac = NULL;
 
-       OSSL_PARAM params[4], *p;
 
-       int ret = 0;
 
-       size_t l = 0;
 
-       mac = EVP_MAC_fetch(NULL, "KMAC-128", NULL);
 
-       if (mac == NULL)
 
-           goto err;
 
-       ctx = EVP_MAC_CTX_new(mac);
 
-       /* The mac can be freed after it is used by EVP_MAC_CTX_new */
 
-       EVP_MAC_free(mac);
 
-       if (ctx == NULL)
 
-           goto err;
 
-       /*
 
-        * Setup parameters required before calling EVP_MAC_init()
 
-        * The parameters OSSL_MAC_PARAM_XOF and OSSL_MAC_PARAM_SIZE may also be
 
-        * used at this point.
 
-        */
 
-       p = params;
 
-       *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
 
-                                                (void *)key, key_len);
 
-       if (custom != NULL && custom_len != 0)
 
-         *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
 
-                                                  (void *)custom, custom_len);
 
-       *p = OSSL_PARAM_construct_end();
 
-       if (!EVP_MAC_CTX_set_params(ctx, params))
 
-           goto err;
 
-       if (!EVP_MAC_init(ctx))
 
-           goto err;
 
-       /*
 
-        * Note: the following optional parameters can be set any time
 
-        * before EVP_MAC_final().
 
-        */
 
-       p = params;
 
-       *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_XOF, &xof_enabled);
 
-       *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE, &out_len);
 
-       *p = OSSL_PARAM_construct_end();
 
-       if (!EVP_MAC_CTX_set_params(ctx, params))
 
-           goto err;
 
-       /* The update may be called multiple times here for streamed input */
 
-       if (!EVP_MAC_update(ctx, in, in_len))
 
-           goto err;
 
-       if (!EVP_MAC_final(ctx, out, &l, out_len))
 
-           goto err;
 
-       ret = 1;
 
-   err:
 
-       EVP_MAC_CTX_free(ctx);
 
-       return ret;
 
-   }
 
- =head1 SEE ALSO
 
- L<EVP_MAC_CTX_get_params(3)>, L<EVP_MAC_CTX_set_params(3)>,
 
- L<EVP_MAC(3)/PARAMETERS>, L<OSSL_PARAM(3)>
 
- =head1 COPYRIGHT
 
- Copyright 2018-2022 The OpenSSL Project Authors. All Rights Reserved.
 
- Licensed under the Apache License 2.0 (the "License").  You may not use
 
- this file except in compliance with the License.  You can obtain a copy
 
- in the file LICENSE in the source distribution or at
 
- L<https://www.openssl.org/source/license.html>.
 
- =cut
 
 
  |