gost_md.c revision 238384
1/********************************************************************** 2 * md_gost.c * 3 * Copyright (c) 2005-2006 Cryptocom LTD * 4 * This file is distributed under the same license as OpenSSL * 5 * * 6 * OpenSSL interface to GOST R 34.11-94 hash functions * 7 * Requires OpenSSL 0.9.9 for compilation * 8 **********************************************************************/ 9#include <string.h> 10#include "gost_lcl.h" 11#include "gosthash.h" 12#include "e_gost_err.h" 13 14/* implementation of GOST 34.11 hash function See gost_md.c*/ 15static int gost_digest_init(EVP_MD_CTX *ctx); 16static int gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count); 17static int gost_digest_final(EVP_MD_CTX *ctx,unsigned char *md); 18static int gost_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from); 19static int gost_digest_cleanup(EVP_MD_CTX *ctx); 20 21EVP_MD digest_gost= 22 { 23 NID_id_GostR3411_94, 24 NID_undef, 25 32, 26 EVP_MD_FLAG_PKEY_METHOD_SIGNATURE, 27 gost_digest_init, 28 gost_digest_update, 29 gost_digest_final, 30 gost_digest_copy, 31 gost_digest_cleanup, 32 NULL, 33 NULL, 34 {NID_undef,NID_undef,0,0,0}, 35 32, 36 sizeof(struct ossl_gost_digest_ctx ), 37 NULL 38 }; 39 40int gost_digest_init(EVP_MD_CTX *ctx) 41 { 42 struct ossl_gost_digest_ctx *c = ctx->md_data; 43 memset(&(c->dctx),0,sizeof(gost_hash_ctx)); 44 gost_init(&(c->cctx),&GostR3411_94_CryptoProParamSet); 45 c->dctx.cipher_ctx= &(c->cctx); 46 return 1; 47 } 48 49int gost_digest_update(EVP_MD_CTX *ctx,const void *data,size_t count) 50 { 51 return hash_block((gost_hash_ctx *)ctx->md_data,data,count); 52 } 53 54int gost_digest_final(EVP_MD_CTX *ctx,unsigned char *md) 55 { 56 return finish_hash((gost_hash_ctx *)ctx->md_data,md); 57 58 } 59 60int gost_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from) 61 { 62 struct ossl_gost_digest_ctx *md_ctx=to->md_data; 63 if (to->md_data && from->md_data) { 64 memcpy(to->md_data,from->md_data,sizeof(struct ossl_gost_digest_ctx)); 65 md_ctx->dctx.cipher_ctx=&(md_ctx->cctx); 66 } 67 return 1; 68 } 69 70int gost_digest_cleanup(EVP_MD_CTX *ctx) 71 { 72 if (ctx->md_data) 73 memset(ctx->md_data,0,sizeof(struct ossl_gost_digest_ctx)); 74 return 1; 75 } 76