#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);
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)