<div dir="ltr"><div>In the program below, each of three calls to cmac() causes a different crash (use AddressSanitizer to be sure). I think the correct approach is to make gcry_mac_setkey() return an error code if the key has an inappropriate size.<br></div><div><br></div><div>#include <gcrypt.h></div><br>#define CF_CHECK_EQ(expr, res) if ( (expr) != (res) ) { goto end; }<br><br>static void cmac(const int mac, const int keysize) {<br>    unsigned char key[keysize];<br>    memset(key, 0, keysize);<br><br>    gcry_mac_hd_t h;<br>    CF_CHECK_EQ(gcry_mac_open(&h, mac, 0, NULL), GPG_ERR_NO_ERROR);<br>    CF_CHECK_EQ(gcry_mac_setkey(h, key, keysize), GPG_ERR_NO_ERROR);<br><br>end:<br>    /* noret */ gcry_mac_close(h);<br>}<br><br>int main(void)<br>{<br>    cmac(GCRY_MAC_CMAC_SERPENT, 64);<br>    cmac(GCRY_MAC_CMAC_IDEA, 32);<br>    cmac(GCRY_MAC_CMAC_RFC2268, 256);<br>    return 0;<br>}<br></div>