3,
    GCRY_MAC_GMAC_SERPENT       = 404,
    GCRY_MAC_GMAC_SEED          = 405,
    GCRY_MAC_GMAC_SM4           = 406,
    GCRY_MAC_GMAC_ARIA          = 407,

    GCRY_MAC_POLY1305           = 501,
    GCRY_MAC_POLY1305_AES       = 502,
    GCRY_MAC_POLY1305_CAMELLIA  = 503,
    GCRY_MAC_POLY1305_TWOFISH   = 504,
    GCRY_MAC_POLY1305_SERPENT   = 505,
    GCRY_MAC_POLY1305_SEED      = 506,
    GCRY_MAC_POLY1305_SM4       = 507,
    GCRY_MAC_POLY1305_ARIA      = 508
  };

/* Flags used with the open function.  */
enum gcry_mac_flags
  {
    GCRY_MAC_FLAG_SECURE = 1   /* Allocate all buffers in "secure" memory.  */
  };

/* Create a MAC handle for algorithm ALGO.  FLAGS may be given as an bitwise OR
   of the gcry_mac_flags values.  CTX maybe NULL or gcry_ctx_t object to be
   associated with HANDLE.  */
gcry_error_t gcry_mac_open (gcry_mac_hd_t *handle, int algo,
                            unsigned int flags, gcry_ctx_t ctx);

/* Close the MAC handle H and release all resource. */
void gcry_mac_close (gcry_mac_hd_t h);

/* Perform various operations on the MAC object H. */
gcry_error_t gcry_mac_ctl (gcry_mac_hd_t h, int cmd, void *buffer,
                           size_t buflen);

/* Retrieve various information about the MAC algorithm ALGO. */
gcry_error_t gcry_mac_algo_info (int algo, int what, void *buffer,
                                 size_t *nbytes);

/* Set KEY of length KEYLEN bytes for the MAC handle HD.  */
gcry_error_t gcry_mac_setkey (gcry_mac_hd_t hd, const void *key,
                              size_t keylen);

/* Set initialization vector IV of length IVLEN for the MAC handle HD. */
gcry_error_t gcry_mac_setiv (gcry_mac_hd_t hd, const void *iv,
                             size_t ivlen);

/* Pass LENGTH bytes of data in BUFFER to the MAC object HD so that
   it can update the MAC values.  */
gcry_error_t gcry_mac_write (gcry_mac_hd_t hd, const void *buffer,
                             size_t length);

/* Read out the final authentication code from the MAC object HD to BUFFER. */
gcry_error_t gcry_mac_read (gcry_mac_hd_t hd, void *buffer, size_t *buflen);

/* Verify the final authentication code from the MAC object HD with BUFFER. */
gcry_error_t gcry_mac_verify (gcry_mac_hd_t hd, const void *buffer,
                              size_t buflen);

/* Retrieve the algorithm used with MAC. */
int gcry_mac_get_algo (gcry_mac_hd_t hd);

/* Retrieve the length in bytes of the MAC yielded by algorithm ALGO. */
unsigned int gcry_mac_get_algo_maclen (int algo);

/* Retrieve the default key length in bytes used with algorithm A. */
unsigned int gcry_mac_get_algo_keylen (int algo);

/* Map the MAC algorithm whose ID is contained in ALGORITHM to a
   string representation of the algorithm name.  For unknown algorithm
   IDs this function returns "?".  */
const char *gcry_mac_algo_name (int algorithm) _GCRY_GCC_ATTR_PURE;

/* Map the algorithm name NAME to an MAC algorithm ID.  Return 0 if
   the algorithm name is not known. */
int gcry_mac_map_name (const char *name) _GCRY_GCC_ATTR_PURE;

/* Reset the handle to the state after open/setkey.  */
#define gcry_mac_reset(h)  gcry_mac_ctl ((h), GCRYCTL_RESET, NULL, 0)

/* Return 0 if the algorithm A is available for use. */
#define gcry_mac_test_algo(a) \
            gcry_mac_algo_info( (a), GCRYCTL_TEST_ALGO, NULL, NULL )

