]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_omac.c
Update INSTALL.md
[openssl-gost/engine.git] / gost_omac.c
index 2000152d4101a936657ace013441d4c167f082d8..97fb5c0b9d6308365555a7c766fd9e1102901da9 100644 (file)
@@ -14,7 +14,19 @@ typedef struct omac_ctx {
     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
@@ -28,11 +40,11 @@ static int omac_init(EVP_MD_CTX *ctx, int cipher_nid)
 
     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;
     }
 
@@ -120,6 +132,7 @@ static int omac_key(OMAC_CTX * c, const EVP_CIPHER *cipher,
 {
     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);
@@ -189,7 +202,7 @@ int omac_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
             GOSTerr(GOST_F_OMAC_IMIT_CTRL, GOST_R_INVALID_MAC_KEY_SIZE);
             return 0;
         }
-    case EVP_MD_CTRL_MAC_LEN:
+    case EVP_MD_CTRL_XOF_LEN:   /* Supported in OpenSSL */
         {
             OMAC_CTX *c = EVP_MD_CTX_md_data(ctx);
             switch (c->cipher_nid) {
@@ -216,7 +229,6 @@ int omac_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
     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,
@@ -242,10 +254,10 @@ EVP_MD *magma_omac(void)
         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_meth_set_flags(md, EVP_MD_FLAG_XOF)
             || !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)
@@ -274,10 +286,10 @@ EVP_MD *grasshopper_omac(void)
         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)
+            || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_XOF)
             || !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)