]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - gost_md2012.c
openssl 1.1.0 compatibility
[openssl-gost/engine.git] / gost_md2012.c
1 /**********************************************************************
2  *                          gost_md2012.c                             *
3  *             Copyright (c) 2013 Cryptocom LTD.                      *
4  *         This file is distributed under the same license as OpenSSL *
5  *                                                                    *
6  *          GOST R 34.11-2012 interface to OpenSSL engine.            *
7  *                                                                    *
8  * Author: Alexey Degtyarev <alexey@renatasystems.org>                *
9  *                                                                    *
10  **********************************************************************/
11
12 #include <openssl/evp.h>
13 #include "gosthash2012.h"
14
15 static int gost_digest_init512(EVP_MD_CTX *ctx);
16 static int gost_digest_init256(EVP_MD_CTX *ctx);
17 static int gost_digest_update(EVP_MD_CTX *ctx, const void *data,
18                               size_t count);
19 static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md);
20 static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from);
21 static int gost_digest_cleanup(EVP_MD_CTX *ctx);
22 static int gost_digest_ctrl_256(EVP_MD_CTX *ctx, int type, int arg,
23                                 void *ptr);
24 static int gost_digest_ctrl_512(EVP_MD_CTX *ctx, int type, int arg,
25                                 void *ptr);
26
27 const char micalg_256[] = "gostr3411-2012-256";
28 const char micalg_512[] = "gostr3411-2012-512";
29
30 static EVP_MD *_hidden_GostR3411_2012_256_md = NULL;
31 static EVP_MD *_hidden_GostR3411_2012_512_md = NULL;
32
33 EVP_MD *digest_gost2012_256(void)
34 {
35     if (_hidden_GostR3411_2012_256_md == NULL) {
36         EVP_MD *md;
37
38         if ((md = EVP_MD_meth_new(NID_id_GostR3411_2012_256, NID_undef)) == NULL
39             || !EVP_MD_meth_set_result_size(md, 32)
40             || !EVP_MD_meth_set_input_blocksize(md, 64)
41             || !EVP_MD_meth_set_app_datasize(md, sizeof(gost2012_hash_ctx))
42             || !EVP_MD_meth_set_init(md, gost_digest_init256)
43             || !EVP_MD_meth_set_update(md, gost_digest_update)
44             || !EVP_MD_meth_set_final(md, gost_digest_final)
45             || !EVP_MD_meth_set_copy(md, gost_digest_copy)
46             || !EVP_MD_meth_set_ctrl(md, gost_digest_ctrl_256)
47             || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) {
48             EVP_MD_meth_free(md);
49             md = NULL;
50         }
51         _hidden_GostR3411_2012_256_md = md;
52     }
53     return _hidden_GostR3411_2012_256_md;
54 }
55
56 void digest_gost2012_256_destroy(void)
57 {
58     EVP_MD_meth_free(_hidden_GostR3411_2012_256_md);
59     _hidden_GostR3411_2012_256_md = NULL;
60 }
61
62 EVP_MD *digest_gost2012_512(void)
63 {
64     if (_hidden_GostR3411_2012_512_md == NULL) {
65         EVP_MD *md;
66
67         if ((md = EVP_MD_meth_new(NID_id_GostR3411_2012_512, NID_undef)) == NULL
68             || !EVP_MD_meth_set_result_size(md, 64)
69             || !EVP_MD_meth_set_input_blocksize(md, 64)
70             || !EVP_MD_meth_set_app_datasize(md, sizeof(gost2012_hash_ctx))
71             || !EVP_MD_meth_set_init(md, gost_digest_init512)
72             || !EVP_MD_meth_set_update(md, gost_digest_update)
73             || !EVP_MD_meth_set_final(md, gost_digest_final)
74             || !EVP_MD_meth_set_copy(md, gost_digest_copy)
75             || !EVP_MD_meth_set_ctrl(md, gost_digest_ctrl_512)
76             || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) {
77             EVP_MD_meth_free(md);
78             md = NULL;
79         }
80         _hidden_GostR3411_2012_512_md = md;
81     }
82     return _hidden_GostR3411_2012_512_md;
83 }
84
85 void digest_gost2012_512_destroy(void)
86 {
87     EVP_MD_meth_free(_hidden_GostR3411_2012_512_md);
88     _hidden_GostR3411_2012_512_md = NULL;
89 }
90
91 static int gost_digest_init512(EVP_MD_CTX *ctx)
92 {
93     init_gost2012_hash_ctx((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), 512);
94     return 1;
95 }
96
97 static int gost_digest_init256(EVP_MD_CTX *ctx)
98 {
99     init_gost2012_hash_ctx((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), 256);
100     return 1;
101 }
102
103 static int gost_digest_update(EVP_MD_CTX *ctx, const void *data, size_t count)
104 {
105     gost2012_hash_block((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), data, count);
106     return 1;
107 }
108
109 static int gost_digest_final(EVP_MD_CTX *ctx, unsigned char *md)
110 {
111     gost2012_finish_hash((gost2012_hash_ctx *) EVP_MD_CTX_md_data(ctx), md);
112     return 1;
113 }
114
115 static int gost_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from)
116 {
117     if (EVP_MD_CTX_md_data(to) && EVP_MD_CTX_md_data(from))
118         memcpy(EVP_MD_CTX_md_data(to), EVP_MD_CTX_md_data(from), sizeof(gost2012_hash_ctx));
119
120     return 1;
121 }
122
123 static int gost_digest_cleanup(EVP_MD_CTX *ctx)
124 {
125     if (EVP_MD_CTX_md_data(ctx))
126         memset(EVP_MD_CTX_md_data(ctx), 0x00, sizeof(gost2012_hash_ctx));
127
128     return 1;
129 }
130
131 static int gost_digest_ctrl_256(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
132 {
133     switch (type) {
134     case EVP_MD_CTRL_MICALG:
135         {
136             *((char **)ptr) = OPENSSL_malloc(strlen(micalg_256) + 1);
137             if (*((char **)ptr) != NULL) {
138                 strcpy(*((char **)ptr), micalg_256);
139                 return 1;
140             }
141             return 0;
142         }
143     default:
144         return 0;
145     }
146 }
147
148 static int gost_digest_ctrl_512(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
149 {
150     switch (type) {
151     case EVP_MD_CTRL_MICALG:
152         {
153             *((char **)ptr) = OPENSSL_malloc(strlen(micalg_512) + 1);
154             if (*((char **)ptr) != NULL) {
155                 strcpy(*((char **)ptr), micalg_512);
156                 return 1;
157             }
158             return 0;
159         }
160         return 1;
161     default:
162         return 0;
163     }
164 }