From ea281d2516111f018f224409098d5a1d11e967bd Mon Sep 17 00:00:00 2001
From: Vitaly Chikunov <vt@altlinux.org>
Date: Wed, 13 May 2020 01:10:51 +0300
Subject: [PATCH] gost_omac: Rework registration of magma/kuznyechik OMAC
 digests

Convert to a table method.
---
 gost_omac.c | 75 ++++++++++++++++++++---------------------------------
 1 file changed, 28 insertions(+), 47 deletions(-)

diff --git a/gost_omac.c b/gost_omac.c
index 97fb5c0..a1e7ab4 100644
--- a/gost_omac.c
+++ b/gost_omac.c
@@ -246,66 +246,47 @@ int omac_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
     }
 }
 
-static EVP_MD *_hidden_magma_mac_md = NULL;
+static GOST_digest omac_template_digest = {
+    .input_blocksize = 8,
+    .app_datasize = sizeof(OMAC_CTX),
+    .flags = EVP_MD_FLAG_XOF,
+    .update = omac_imit_update,
+    .final = omac_imit_final,
+    .copy = omac_imit_copy,
+    .cleanup = omac_imit_cleanup,
+    .ctrl = omac_imit_ctrl,
+};
+
+GOST_digest magma_mac_digest = {
+    .nid = NID_magma_mac,
+    .template = &omac_template_digest,
+    .result_size = 8,
+    .init = magma_imit_init,
+};
+
+GOST_digest grasshopper_mac_digest = {
+    .nid = NID_grasshopper_mac,
+    .template = &omac_template_digest,
+    .result_size = 16,
+    .init = grasshopper_imit_init,
+};
 
 EVP_MD *magma_omac(void)
 {
-    if (_hidden_magma_mac_md == NULL) {
-        EVP_MD *md;
-
-        if ((md = EVP_MD_meth_new(NID_magma_mac, NID_undef)) == NULL
-            || !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, 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)
-            || !EVP_MD_meth_set_copy(md, omac_imit_copy)
-            || !EVP_MD_meth_set_cleanup(md, omac_imit_cleanup)
-            || !EVP_MD_meth_set_ctrl(md, omac_imit_ctrl)) {
-            EVP_MD_meth_free(md);
-            md = NULL;
-        }
-        _hidden_magma_mac_md = md;
-    }
-    return _hidden_magma_mac_md;
+    return GOST_init_digest(&magma_mac_digest);
 }
 
 void magma_omac_destroy(void)
 {
-    EVP_MD_meth_free(_hidden_magma_mac_md);
-    _hidden_magma_mac_md = NULL;
+    GOST_deinit_digest(&magma_mac_digest);
 }
 
-static EVP_MD *_hidden_grasshopper_mac_md = NULL;
-
 EVP_MD *grasshopper_omac(void)
 {
-    if (_hidden_grasshopper_mac_md == NULL) {
-        EVP_MD *md;
-
-        if ((md = EVP_MD_meth_new(NID_grasshopper_mac, NID_undef)) == NULL
-            || !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, 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)
-            || !EVP_MD_meth_set_copy(md, omac_imit_copy)
-            || !EVP_MD_meth_set_cleanup(md, omac_imit_cleanup)
-            || !EVP_MD_meth_set_ctrl(md, omac_imit_ctrl)) {
-            EVP_MD_meth_free(md);
-            md = NULL;
-        }
-        _hidden_grasshopper_mac_md = md;
-    }
-    return _hidden_grasshopper_mac_md;
+    return GOST_init_digest(&grasshopper_mac_digest);
 }
 
 void grasshopper_omac_destroy(void)
 {
-    EVP_MD_meth_free(_hidden_grasshopper_mac_md);
-    _hidden_grasshopper_mac_md = NULL;
+    GOST_deinit_digest(&grasshopper_mac_digest);
 }
-- 
2.39.5