1238384Sjkim/********************************************************************** 2238384Sjkim * md_gost.c * 3238384Sjkim * Copyright (c) 2005-2006 Cryptocom LTD * 4238384Sjkim * This file is distributed under the same license as OpenSSL * 5238384Sjkim * * 6238384Sjkim * OpenSSL interface to GOST R 34.11-94 hash functions * 7238384Sjkim * Requires OpenSSL 0.9.9 for compilation * 8238384Sjkim **********************************************************************/ 9238384Sjkim#include <string.h> 10238384Sjkim#include "gost_lcl.h" 11238384Sjkim#include "gosthash.h" 12238384Sjkim#include "e_gost_err.h" 13238384Sjkim 14238384Sjkim/* implementation of GOST 34.11 hash function See gost_md.c*/ 15238384Sjkimstatic int gost_digest_init(EVP_MD_CTX *ctx); 16280304Sjkimstatic int gost_digest_update(EVP_MD_CTX *ctx, const void *data, 17280304Sjkim size_t count); 18280304Sjkimstatic int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md); 19280304Sjkimstatic int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from); 20238384Sjkimstatic int gost_digest_cleanup(EVP_MD_CTX *ctx); 21238384Sjkim 22280304SjkimEVP_MD digest_gost = { 23280304Sjkim NID_id_GostR3411_94, 24280304Sjkim NID_undef, 25280304Sjkim 32, 26280304Sjkim EVP_MD_FLAG_PKEY_METHOD_SIGNATURE, 27280304Sjkim gost_digest_init, 28280304Sjkim gost_digest_update, 29280304Sjkim gost_digest_final, 30280304Sjkim gost_digest_copy, 31280304Sjkim gost_digest_cleanup, 32280304Sjkim NULL, 33280304Sjkim NULL, 34280304Sjkim {NID_undef, NID_undef, 0, 0, 0}, 35280304Sjkim 32, 36280304Sjkim sizeof(struct ossl_gost_digest_ctx), 37280304Sjkim NULL 38280304Sjkim}; 39238384Sjkim 40280304Sjkimint gost_digest_init(EVP_MD_CTX *ctx) 41280304Sjkim{ 42280304Sjkim struct ossl_gost_digest_ctx *c = ctx->md_data; 43280304Sjkim memset(&(c->dctx), 0, sizeof(gost_hash_ctx)); 44280304Sjkim gost_init(&(c->cctx), &GostR3411_94_CryptoProParamSet); 45280304Sjkim c->dctx.cipher_ctx = &(c->cctx); 46280304Sjkim return 1; 47280304Sjkim} 48238384Sjkim 49280304Sjkimint gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count) 50280304Sjkim{ 51280304Sjkim return hash_block((gost_hash_ctx *) ctx->md_data, data, count); 52280304Sjkim} 53238384Sjkim 54280304Sjkimint gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md) 55280304Sjkim{ 56280304Sjkim return finish_hash((gost_hash_ctx *) ctx->md_data, md); 57238384Sjkim 58280304Sjkim} 59238384Sjkim 60280304Sjkimint gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) 61280304Sjkim{ 62280304Sjkim struct ossl_gost_digest_ctx *md_ctx = to->md_data; 63280304Sjkim if (to->md_data && from->md_data) { 64280304Sjkim memcpy(to->md_data, from->md_data, 65280304Sjkim sizeof(struct ossl_gost_digest_ctx)); 66280304Sjkim md_ctx->dctx.cipher_ctx = &(md_ctx->cctx); 67280304Sjkim } 68280304Sjkim return 1; 69280304Sjkim} 70280304Sjkim 71280304Sjkimint gost_digest_cleanup(EVP_MD_CTX *ctx) 72280304Sjkim{ 73280304Sjkim if (ctx->md_data) 74280304Sjkim memset(ctx->md_data, 0, sizeof(struct ossl_gost_digest_ctx)); 75280304Sjkim return 1; 76280304Sjkim} 77