From ec78b0e7d8df62895b6ad489cd7f94699888ffeb Mon Sep 17 00:00:00 2001 From: Vitaly Chikunov Date: Wed, 13 May 2020 01:02:13 +0300 Subject: [PATCH] gost_md2012: Add registration using GostR3411_2012_{256,512}_digest --- gost_md2012.c | 75 ++++++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 46 deletions(-) diff --git a/gost_md2012.c b/gost_md2012.c index 5acb111..8d1bde8 100644 --- a/gost_md2012.c +++ b/gost_md2012.c @@ -11,6 +11,7 @@ #include #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,67 +28,49 @@ 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; +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, + .template = &GostR3411_2012_template_digest, + .result_size = 32, + .init = gost_digest_init256, + .ctrl = gost_digest_ctrl_256, +}; 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_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; + return GOST_init_digest(&GostR3411_2012_256_digest); } void digest_gost2012_256_destroy(void) { - EVP_MD_meth_free(_hidden_GostR3411_2012_256_md); - _hidden_GostR3411_2012_256_md = NULL; + GOST_deinit_digest(&GostR3411_2012_256_digest); } +GOST_digest GostR3411_2012_512_digest = { + .nid = NID_id_GostR3411_2012_512, + .template = &GostR3411_2012_template_digest, + .result_size = 64, + .init = gost_digest_init512, + .ctrl = gost_digest_ctrl_512, +}; + 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_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; + return GOST_init_digest(&GostR3411_2012_512_digest); } void digest_gost2012_512_destroy(void) { - EVP_MD_meth_free(_hidden_GostR3411_2012_512_md); - _hidden_GostR3411_2012_512_md = NULL; + GOST_deinit_digest(&GostR3411_2012_512_digest); } static int gost_digest_init512(EVP_MD_CTX *ctx) -- 2.39.2