+/*
+ * TODO
+ * TLSTREE intermediate values should be recalculated only when
+ * C_i & (seq_no+1) != C_i & (seq_no)
+ * so somewhen we will store C_i & (seq_no) in this structure
+ * to avoid redundant hash calculations.
+ * */
c->cmac_ctx = CMAC_CTX_new();
if (c->cmac_ctx == NULL) {
GOSTerr(GOST_F_OMAC_KEY, ERR_R_MALLOC_FAILURE);
c->cmac_ctx = CMAC_CTX_new();
if (c->cmac_ctx == NULL) {
GOSTerr(GOST_F_OMAC_KEY, ERR_R_MALLOC_FAILURE);
if (c->key_set) {
unsigned char diversed_key[32];
return gost_tlstree(c->cipher_nid, c->key, diversed_key,
if (c->key_set) {
unsigned char diversed_key[32];
return gost_tlstree(c->cipher_nid, c->key, diversed_key,
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_init(md, magma_imit_init)
|| !EVP_MD_meth_set_update(md, omac_imit_update)
|| !EVP_MD_meth_set_final(md, omac_imit_final)
|| !EVP_MD_meth_set_init(md, magma_imit_init)
|| !EVP_MD_meth_set_update(md, omac_imit_update)
|| !EVP_MD_meth_set_final(md, omac_imit_final)
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_init(md, grasshopper_imit_init)
|| !EVP_MD_meth_set_update(md, omac_imit_update)
|| !EVP_MD_meth_set_final(md, omac_imit_final)
|| !EVP_MD_meth_set_init(md, grasshopper_imit_init)
|| !EVP_MD_meth_set_update(md, omac_imit_update)
|| !EVP_MD_meth_set_final(md, omac_imit_final)