]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_md2012.c
Ensure that CMAC_ACPKM_CTX_copy works with 2 non-NULL pointers.
[openssl-gost/engine.git] / gost_md2012.c
index 9385b080c908c9df0426d76b1fdb65f719206cc4..3ea1e3642855cb7644001d6e221d886ae198ec84 100644 (file)
@@ -1,6 +1,7 @@
 /**********************************************************************
  *                          gost_md2012.c                             *
  *             Copyright (c) 2013 Cryptocom LTD.                      *
+ *             Copyright (c) 2020 Vitaly Chikunov <vt@altlinux.org>   *
  *         This file is distributed under the same license as OpenSSL *
  *                                                                    *
  *          GOST R 34.11-2012 interface to OpenSSL engine.            *
@@ -11,6 +12,7 @@
 
 #include <openssl/evp.h>
 #include "gosthash2012.h"
+#include "gost_lcl.h"
 
 static int gost_digest_init512(EVP_MD_CTX *ctx);
 static int gost_digest_init256(EVP_MD_CTX *ctx);
@@ -27,70 +29,32 @@ static int gost_digest_ctrl_512(EVP_MD_CTX *ctx, int type, int arg,
 const char micalg_256[] = "gostr3411-2012-256";
 const char micalg_512[] = "gostr3411-2012-512";
 
-static EVP_MD *_hidden_GostR3411_2012_256_md = NULL;
-static EVP_MD *_hidden_GostR3411_2012_512_md = NULL;
-
-EVP_MD *digest_gost2012_256(void)
-{
-    if (_hidden_GostR3411_2012_256_md == NULL) {
-        EVP_MD *md;
-
-        if ((md =
-             EVP_MD_meth_new(NID_id_GostR3411_2012_256, NID_undef)) == NULL
-           || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_PKEY_METHOD_SIGNATURE)
-            || !EVP_MD_meth_set_result_size(md, 32)
-            || !EVP_MD_meth_set_input_blocksize(md, 64)
-            || !EVP_MD_meth_set_app_datasize(md, sizeof(gost2012_hash_ctx))
-            || !EVP_MD_meth_set_init(md, gost_digest_init256)
-            || !EVP_MD_meth_set_update(md, gost_digest_update)
-            || !EVP_MD_meth_set_final(md, gost_digest_final)
-            || !EVP_MD_meth_set_copy(md, gost_digest_copy)
-            || !EVP_MD_meth_set_ctrl(md, gost_digest_ctrl_256)
-            || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) {
-            EVP_MD_meth_free(md);
-            md = NULL;
-        }
-        _hidden_GostR3411_2012_256_md = md;
-    }
-    return _hidden_GostR3411_2012_256_md;
-}
-
-void digest_gost2012_256_destroy(void)
-{
-    EVP_MD_meth_free(_hidden_GostR3411_2012_256_md);
-    _hidden_GostR3411_2012_256_md = NULL;
-}
-
-EVP_MD *digest_gost2012_512(void)
-{
-    if (_hidden_GostR3411_2012_512_md == NULL) {
-        EVP_MD *md;
-
-        if ((md =
-             EVP_MD_meth_new(NID_id_GostR3411_2012_512, NID_undef)) == NULL
-           || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_PKEY_METHOD_SIGNATURE)
-            || !EVP_MD_meth_set_result_size(md, 64)
-            || !EVP_MD_meth_set_input_blocksize(md, 64)
-            || !EVP_MD_meth_set_app_datasize(md, sizeof(gost2012_hash_ctx))
-            || !EVP_MD_meth_set_init(md, gost_digest_init512)
-            || !EVP_MD_meth_set_update(md, gost_digest_update)
-            || !EVP_MD_meth_set_final(md, gost_digest_final)
-            || !EVP_MD_meth_set_copy(md, gost_digest_copy)
-            || !EVP_MD_meth_set_ctrl(md, gost_digest_ctrl_512)
-            || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) {
-            EVP_MD_meth_free(md);
-            md = NULL;
-        }
-        _hidden_GostR3411_2012_512_md = md;
-    }
-    return _hidden_GostR3411_2012_512_md;
-}
-
-void digest_gost2012_512_destroy(void)
-{
-    EVP_MD_meth_free(_hidden_GostR3411_2012_512_md);
-    _hidden_GostR3411_2012_512_md = NULL;
-}
+GOST_digest GostR3411_2012_template_digest = {
+    .input_blocksize = 64,
+    .app_datasize = sizeof(gost2012_hash_ctx),
+    .update = gost_digest_update,
+    .final = gost_digest_final,
+    .copy = gost_digest_copy,
+    .cleanup = gost_digest_cleanup,
+};
+
+GOST_digest GostR3411_2012_256_digest = {
+    .nid = NID_id_GostR3411_2012_256,
+    .alias = "streebog256",
+    .template = &GostR3411_2012_template_digest,
+    .result_size = 32,
+    .init = gost_digest_init256,
+    .ctrl = gost_digest_ctrl_256,
+};
+
+GOST_digest GostR3411_2012_512_digest = {
+    .nid = NID_id_GostR3411_2012_512,
+    .alias = "streebog512",
+    .template = &GostR3411_2012_template_digest,
+    .result_size = 64,
+    .init = gost_digest_init512,
+    .ctrl = gost_digest_ctrl_512,
+};
 
 static int gost_digest_init512(EVP_MD_CTX *ctx)
 {