Branch data Line data Source code
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*/
15 : : static int gost_digest_init(EVP_MD_CTX *ctx);
16 : : static int gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count);
17 : : static int gost_digest_final(EVP_MD_CTX *ctx,unsigned char *md);
18 : : static int gost_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from);
19 : : static int gost_digest_cleanup(EVP_MD_CTX *ctx);
20 : :
21 : : EVP_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 : :
40 : 23 : int gost_digest_init(EVP_MD_CTX *ctx)
41 : : {
42 : 23 : struct ossl_gost_digest_ctx *c = ctx->md_data;
43 : 23 : memset(&(c->dctx),0,sizeof(gost_hash_ctx));
44 : 23 : gost_init(&(c->cctx),&GostR3411_94_CryptoProParamSet);
45 : 23 : c->dctx.cipher_ctx= &(c->cctx);
46 : 23 : return 1;
47 : : }
48 : :
49 : 23 : int gost_digest_update(EVP_MD_CTX *ctx,const void *data,size_t count)
50 : : {
51 : 23 : return hash_block((gost_hash_ctx *)ctx->md_data,data,count);
52 : : }
53 : :
54 : 23 : int gost_digest_final(EVP_MD_CTX *ctx,unsigned char *md)
55 : : {
56 : 23 : return finish_hash((gost_hash_ctx *)ctx->md_data,md);
57 : :
58 : : }
59 : :
60 : 0 : int gost_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)
61 : : {
62 : 0 : struct ossl_gost_digest_ctx *md_ctx=to->md_data;
63 [ # # ][ # # ]: 0 : if (to->md_data && from->md_data) {
64 : 0 : memcpy(to->md_data,from->md_data,sizeof(struct ossl_gost_digest_ctx));
65 : 0 : md_ctx->dctx.cipher_ctx=&(md_ctx->cctx);
66 : : }
67 : 0 : return 1;
68 : : }
69 : :
70 : 23 : int gost_digest_cleanup(EVP_MD_CTX *ctx)
71 : : {
72 [ + - ]: 23 : if (ctx->md_data)
73 : 23 : memset(ctx->md_data,0,sizeof(struct ossl_gost_digest_ctx));
74 : 23 : return 1;
75 : : }
|