X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_md2012.c;h=1d0168bf994d3baeeb12733add24886522ae3f2b;hb=refs%2Fheads%2Fgost_provider;hp=08f3724fb3bc510e396d86f4a6dba7c3282ef309;hpb=7ed0037f1e9192a42f4b244221d3bddccc10be63;p=openssl-gost%2Fengine.git diff --git a/gost_md2012.c b/gost_md2012.c index 08f3724..1d0168b 100644 --- a/gost_md2012.c +++ b/gost_md2012.c @@ -1,97 +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 +#include +#include +#include + +#include "gost_prov.h" #include "gosthash2012.h" -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); - -EVP_MD digest_gost2012_512 = { - NID_id_GostR3411_2012_512, - NID_undef, - 64, /* digest size */ - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE, - gost_digest_init512, - gost_digest_update, - gost_digest_final, - gost_digest_copy, - gost_digest_cleanup, - NULL, - NULL, - {NID_undef, NID_undef, 0, 0, 0}, - 64, /* block size */ - sizeof(gost2012_hash_ctx), - NULL -}; +const char micalg_256[] = "gostr3411-2012-256"; +const char micalg_512[] = "gostr3411-2012-512"; + +/* Context management */ +static void *STREEBOG256_newctx(void *provctx); +static void STREEBOG_freectx(void *dctx); +static void *STREEBOG_dupctx(void *dctx); + +/* 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); + +/* Digest parameter descriptors */ +static const OSSL_PARAM *STREEBOG_gettable_params(void); +static int STREEBOG256_digest_get_params(OSSL_PARAM params[]); -EVP_MD digest_gost2012_256 = { - NID_id_GostR3411_2012_256, - NID_undef, - 32, /* digest size */ - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE, - gost_digest_init256, - gost_digest_update, - gost_digest_final, - gost_digest_copy, - gost_digest_cleanup, - NULL, - NULL, - {NID_undef, NID_undef, 0, 0, 0}, - 64, /* block size */ - sizeof(gost2012_hash_ctx), - NULL +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 }, + + { 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 *) ctx->md_data, 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 *) ctx->md_data, 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 *) ctx->md_data, 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 *) ctx->md_data, md); + init_gost2012_hash_ctx((gost2012_hash_ctx *)dctx, 256); + return 1; +} + +static int STREEBOG_digest_update(void *dctx, const unsigned char *in, size_t inl) +{ + gost2012_hash_block((gost2012_hash_ctx *)dctx, in, inl); return 1; } -static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) +static int STREEBOG_digest_final(void *dctx, unsigned char *out, size_t *outl, + size_t outsz) { - if (to->md_data && from->md_data) - memcpy(to->md_data, from->md_data, 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 const OSSL_PARAM *STREEBOG_gettable_params(void) +{ + 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_cleanup(EVP_MD_CTX *ctx) +static int STREEBOG256_digest_get_params(OSSL_PARAM params[]) { - if (ctx->md_data) - memset(ctx->md_data, 0x00, sizeof(gost2012_hash_ctx)); + 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; }