X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_md2012.c;h=1d0168bf994d3baeeb12733add24886522ae3f2b;hb=refs%2Fheads%2Fgost_provider;hp=5462dea84c6cf0dc869c155fb47ef0abc08178b6;hpb=eb01b80247de3fa3848d58d7f2816aff8f396630;p=openssl-gost%2Fengine.git diff --git a/gost_md2012.c b/gost_md2012.c index 5462dea..1d0168b 100644 --- a/gost_md2012.c +++ b/gost_md2012.c @@ -1,175 +1,115 @@ -/********************************************************************** - * gost_md2012.c * - * Copyright (c) 2013 Cryptocom LTD. * - * This file is distributed under the same license as OpenSSL * - * * - * GOST R 34.11-2012 interface to OpenSSL engine. * - * * - * Author: Alexey Degtyarev * - * * - **********************************************************************/ - -#include "compat.h" -#include -#include "gosthash2012.h" +#include +#include +#include -static int gost_digest_init512(EVP_MD_CTX *ctx); -static int gost_digest_init256(EVP_MD_CTX *ctx); -static int gost_digest_update(EVP_MD_CTX *ctx, const void *data, - size_t count); -static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md); -static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from); -static int gost_digest_cleanup(EVP_MD_CTX *ctx); -static int gost_digest_ctrl_256(EVP_MD_CTX *ctx, int type, int arg, - void *ptr); -static int gost_digest_ctrl_512(EVP_MD_CTX *ctx, int type, int arg, - void *ptr); +#include "gost_prov.h" +#include "gosthash2012.h" 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; +/* Context management */ +static void *STREEBOG256_newctx(void *provctx); +static void STREEBOG_freectx(void *dctx); +static void *STREEBOG_dupctx(void *dctx); -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 -#if (OPENSSL_VERSION_NUMBER <= 0x10002100L) - || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) -#endif - || !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; -} +/* Digest generation */ +static int STREEBOG256_digest_init(void *dctx); +static int STREEBOG_digest_update(void *dctx, const unsigned char *in, size_t inl); +static int STREEBOG_digest_final(void *dctx, unsigned char *out, size_t *outl, + size_t outsz); -void digest_gost2012_256_destroy(void) -{ - EVP_MD_meth_free(_hidden_GostR3411_2012_256_md); - _hidden_GostR3411_2012_256_md = NULL; -} +/* Digest parameter descriptors */ +static const OSSL_PARAM *STREEBOG_gettable_params(void); +static int STREEBOG256_digest_get_params(OSSL_PARAM params[]); -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 -#if (OPENSSL_VERSION_NUMBER <= 0x10002100L) - || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) -#endif - || !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; -} +OSSL_DISPATCH streebog256_funcs[] = { + { OSSL_FUNC_DIGEST_NEWCTX, (funcptr_t)STREEBOG256_newctx }, + { OSSL_FUNC_DIGEST_FREECTX, (funcptr_t)STREEBOG_freectx }, + { OSSL_FUNC_DIGEST_DUPCTX, (funcptr_t)STREEBOG_dupctx }, -void digest_gost2012_512_destroy(void) -{ - EVP_MD_meth_free(_hidden_GostR3411_2012_512_md); - _hidden_GostR3411_2012_512_md = NULL; -} + { OSSL_FUNC_DIGEST_INIT, (funcptr_t)STREEBOG256_digest_init }, + { OSSL_FUNC_DIGEST_UPDATE, (funcptr_t)STREEBOG_digest_update }, + { OSSL_FUNC_DIGEST_FINAL, (funcptr_t)STREEBOG_digest_final }, + + { OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (funcptr_t)STREEBOG_gettable_params }, + { OSSL_FUNC_DIGEST_GET_PARAMS, (funcptr_t)STREEBOG256_digest_get_params }, + + { 0, NULL }, +}; -static int gost_digest_init512(EVP_MD_CTX *ctx) +static void *STREEBOG256_newctx(void *provctx) { - init_gost2012_hash_ctx((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), - 512); - return 1; + gost2012_hash_ctx *pctx = OPENSSL_zalloc(sizeof(gost2012_hash_ctx)); + return pctx; } -static int gost_digest_init256(EVP_MD_CTX *ctx) +static void STREEBOG_freectx(void *dctx) { - init_gost2012_hash_ctx((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), - 256); - return 1; + OPENSSL_free(dctx); } -static int gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count) +static void *STREEBOG_dupctx(void *dctx) { - gost2012_hash_block((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), data, - count); - return 1; + gost2012_hash_ctx *pctx = OPENSSL_zalloc(sizeof(gost2012_hash_ctx)); + if (pctx == NULL) + return NULL; + + if (pctx) + memcpy(pctx, dctx, sizeof(gost2012_hash_ctx)); + + return pctx; } -static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md) +static int STREEBOG256_digest_init(void *dctx) { - gost2012_finish_hash((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), md); - return 1; + init_gost2012_hash_ctx((gost2012_hash_ctx *)dctx, 256); + return 1; } -static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) +static int STREEBOG_digest_update(void *dctx, const unsigned char *in, size_t inl) { - if (EVP_MD_CTX_md_data(to) && EVP_MD_CTX_md_data(from)) - memcpy(EVP_MD_CTX_md_data(to), EVP_MD_CTX_md_data(from), - sizeof(gost2012_hash_ctx)); - + gost2012_hash_block((gost2012_hash_ctx *)dctx, in, inl); return 1; } -static int gost_digest_cleanup(EVP_MD_CTX *ctx) +static int STREEBOG_digest_final(void *dctx, unsigned char *out, size_t *outl, + size_t outsz) { - if (EVP_MD_CTX_md_data(ctx)) - memset(EVP_MD_CTX_md_data(ctx), 0x00, sizeof(gost2012_hash_ctx)); + gost2012_hash_ctx *pctx = (gost2012_hash_ctx *)dctx; - return 1; + if (pctx->digest_size/8 > outsz) + return 0; + + gost2012_finish_hash(pctx, out); + *outl = pctx->digest_size/8; + return 1; } -static int gost_digest_ctrl_256(EVP_MD_CTX *ctx, int type, int arg, void *ptr) +static const OSSL_PARAM *STREEBOG_gettable_params(void) { - switch (type) { - case EVP_MD_CTRL_MICALG: - { - *((char **)ptr) = OPENSSL_malloc(strlen(micalg_256) + 1); - if (*((char **)ptr) != NULL) { - strcpy(*((char **)ptr), micalg_256); - return 1; - } - return 0; - } - default: - return 0; - } + static const OSSL_PARAM table[] = { + OSSL_PARAM_size_t("blocksize", NULL), + OSSL_PARAM_size_t("size", NULL), + /* OSSL_PARAM_utf8_ptr("micalg", NULL, strlen(micalg_256)+1), */ + OSSL_PARAM_END + }; + + return table; } -static int gost_digest_ctrl_512(EVP_MD_CTX *ctx, int type, int arg, void *ptr) +static int STREEBOG256_digest_get_params(OSSL_PARAM params[]) { - switch (type) { - case EVP_MD_CTRL_MICALG: - { - *((char **)ptr) = OPENSSL_malloc(strlen(micalg_512) + 1); - if (*((char **)ptr) != NULL) { - strcpy(*((char **)ptr), micalg_512); - return 1; - } - } - default: - return 0; - } + OSSL_PARAM *p; + + if ((p = OSSL_PARAM_locate(params, "blocksize")) != NULL) + if (!OSSL_PARAM_set_size_t(p, 64)) + return 0; + if ((p = OSSL_PARAM_locate(params, "size")) != NULL) + if (!OSSL_PARAM_set_size_t(p, 32)) + return 0; +/* if ((p = OSSL_PARAM_locate(params, "micalg")) != NULL) + if (!OSSL_PARAM_set_utf8_ptr(p, micalg_256)) + return 0; */ + return 1; }