size_t dgst_size;
int cipher_nid;
int key_set;
+/*
+ * Here begins stuff related to TLSTREE processing
+ * We MUST store the original key to derive TLSTREE keys from it
+ * and TLS seq no.
+ * */
unsigned char key[32];
+/*
+ * 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.
+ * */
} OMAC_CTX;
#define MAX_GOST_OMAC_SIZE 16
switch (cipher_nid) {
case NID_magma_cbc:
- c->dgst_size = 4;
+ c->dgst_size = 8;
break;
case NID_grasshopper_cbc:
- c->dgst_size = 8;
+ c->dgst_size = 16;
break;
}
{
int ret = 0;
+ CMAC_CTX_free(c->cmac_ctx);
c->cmac_ctx = CMAC_CTX_new();
if (c->cmac_ctx == NULL) {
GOSTerr(GOST_F_OMAC_KEY, ERR_R_MALLOC_FAILURE);
case EVP_MD_CTRL_TLSTREE:
{
OMAC_CTX *c = EVP_MD_CTX_md_data(ctx);
-
if (c->key_set) {
unsigned char diversed_key[32];
return gost_tlstree(c->cipher_nid, c->key, diversed_key,
EVP_MD *md;
if ((md = EVP_MD_meth_new(NID_magma_mac, NID_undef)) == NULL
- || !EVP_MD_meth_set_result_size(md, 4)
+ || !EVP_MD_meth_set_result_size(md, 8)
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_flags(md, 0)
EVP_MD *md;
if ((md = EVP_MD_meth_new(NID_grasshopper_mac, NID_undef)) == NULL
- || !EVP_MD_meth_set_result_size(md, 8)
+ || !EVP_MD_meth_set_result_size(md, 16)
|| !EVP_MD_meth_set_input_blocksize(md, 8)
|| !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_CTX))
|| !EVP_MD_meth_set_flags(md, 0)