/src/openssl/engines/ccgost/gost_md.c
Line | Count | Source (jump to first uncovered line) |
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, |
17 | | size_t count); |
18 | | static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md); |
19 | | static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from); |
20 | | static int gost_digest_cleanup(EVP_MD_CTX *ctx); |
21 | | |
22 | | EVP_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 | | |
40 | | int gost_digest_init(EVP_MD_CTX *ctx) |
41 | 0 | { |
42 | 0 | struct ossl_gost_digest_ctx *c = ctx->md_data; |
43 | 0 | memset(&(c->dctx), 0, sizeof(gost_hash_ctx)); |
44 | 0 | gost_init(&(c->cctx), &GostR3411_94_CryptoProParamSet); |
45 | 0 | c->dctx.cipher_ctx = &(c->cctx); |
46 | 0 | return 1; |
47 | 0 | } |
48 | | |
49 | | int gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count) |
50 | 0 | { |
51 | 0 | return hash_block((gost_hash_ctx *) ctx->md_data, data, count); |
52 | 0 | } |
53 | | |
54 | | int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md) |
55 | 0 | { |
56 | 0 | return finish_hash((gost_hash_ctx *) ctx->md_data, md); |
57 | |
|
58 | 0 | } |
59 | | |
60 | | int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) |
61 | 0 | { |
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, |
65 | 0 | sizeof(struct ossl_gost_digest_ctx)); |
66 | 0 | md_ctx->dctx.cipher_ctx = &(md_ctx->cctx); |
67 | 0 | } |
68 | 0 | return 1; |
69 | 0 | } |
70 | | |
71 | | int gost_digest_cleanup(EVP_MD_CTX *ctx) |
72 | 0 | { |
73 | 0 | if (ctx->md_data) |
74 | 0 | memset(ctx->md_data, 0, sizeof(struct ossl_gost_digest_ctx)); |
75 | 0 | return 1; |
76 | 0 | } |