X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_md2012.c;h=3ea1e3642855cb7644001d6e221d886ae198ec84;hb=c7c5c6387bdfabd1fb17860ca7432b277168798b;hp=5acb111d3f20a798acc8b87999111fbe576c4ec9;hpb=9d0a4584f65d09d396e2dd655f7ae390ac64d60e;p=openssl-gost%2Fengine.git diff --git a/gost_md2012.c b/gost_md2012.c index 5acb111..3ea1e36 100644 --- a/gost_md2012.c +++ b/gost_md2012.c @@ -1,6 +1,7 @@ /********************************************************************** * gost_md2012.c * * Copyright (c) 2013 Cryptocom LTD. * + * Copyright (c) 2020 Vitaly Chikunov * * This file is distributed under the same license as OpenSSL * * * * GOST R 34.11-2012 interface to OpenSSL engine. * @@ -11,6 +12,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,68 +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_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_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) {