size_t dgst_size;
int cipher_nid;
int key_set;
+ unsigned char key[32];
} OMAC_CTX;
#define MAX_GOST_OMAC_SIZE 16
c_to->dgst_size = c_from->dgst_size;
c_to->cipher_nid = c_from->cipher_nid;
c_to->key_set = c_from->key_set;
+ memcpy(c_to->key, c_from->key, 32);
} else {
return 0;
}
OMAC_CTX *c = EVP_MD_CTX_md_data(ctx);
const EVP_MD *md = EVP_MD_CTX_md(ctx);
const EVP_CIPHER *cipher = NULL;
+ int ret = 0;
if (c->cipher_nid == NID_undef) {
switch (EVP_MD_nid(md)) {
if (arg == 0) {
struct gost_mac_key *key = (struct gost_mac_key *)ptr;
- return omac_key(c, cipher, key->key, 32);
-
+ ret = omac_key(c, cipher, key->key, 32);
+ if (ret > 0)
+ memcpy(c->key, key->key, 32);
+ return ret;
} else if (arg == 32) {
- return omac_key(c, cipher, ptr, 32);
+ ret = omac_key(c, cipher, ptr, 32);
+ if (ret > 0)
+ memcpy(c->key, ptr, 32);
+ return ret;
}
GOSTerr(GOST_F_OMAC_IMIT_CTRL, GOST_R_INVALID_MAC_KEY_SIZE);
return 0;
}
return 1;
}
+#ifdef EVP_MD_CTRL_TLSTREE
+ 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,
+ (const unsigned char *)ptr) ?
+ omac_key(c, EVP_get_cipherbynid(c->cipher_nid),
+ diversed_key, 32) : 0;
+ }
+ GOSTerr(GOST_F_OMAC_IMIT_CTRL, GOST_R_BAD_ORDER);
+ return 0;
+ }
+ return 0;
+#endif
default:
return 0;
}