gost_md.c revision 280304
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, 17 size_t count); 18static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md); 19static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from); 20static int gost_digest_cleanup(EVP_MD_CTX *ctx); 21 22EVP_MD digest_gost = { 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, 65 sizeof(struct ossl_gost_digest_ctx)); 66 md_ctx->dctx.cipher_ctx = &(md_ctx->cctx); 67 } 68 return 1; 69} 70 71int gost_digest_cleanup(EVP_MD_CTX *ctx) 72{ 73 if (ctx->md_data) 74 memset(ctx->md_data, 0, sizeof(struct ossl_gost_digest_ctx)); 75 return 1; 76} 77