Deleted Added
full compact
gost_eng.c (256281) gost_eng.c (280304)
1/**********************************************************************
2 * gost_eng.c *
3 * Copyright (c) 2005-2006 Cryptocom LTD *
4 * This file is distributed under the same license as OpenSSL *
5 * *
6 * Main file of GOST engine *
7 * for OpenSSL *
8 * Requires OpenSSL 0.9.9 for compilation *
9 **********************************************************************/
10#include <string.h>
11#include <openssl/crypto.h>
12#include <openssl/err.h>
13#include <openssl/evp.h>
14#include <openssl/engine.h>
15#include <openssl/obj_mac.h>
16#include "e_gost_err.h"
17#include "gost_lcl.h"
18static const char *engine_gost_id = "gost";
1/**********************************************************************
2 * gost_eng.c *
3 * Copyright (c) 2005-2006 Cryptocom LTD *
4 * This file is distributed under the same license as OpenSSL *
5 * *
6 * Main file of GOST engine *
7 * for OpenSSL *
8 * Requires OpenSSL 0.9.9 for compilation *
9 **********************************************************************/
10#include <string.h>
11#include <openssl/crypto.h>
12#include <openssl/err.h>
13#include <openssl/evp.h>
14#include <openssl/engine.h>
15#include <openssl/obj_mac.h>
16#include "e_gost_err.h"
17#include "gost_lcl.h"
18static const char *engine_gost_id = "gost";
19static const char *engine_gost_name = "Reference implementation of GOST engine";
19static const char *engine_gost_name =
20 "Reference implementation of GOST engine";
20
21/* Symmetric cipher and digest function registrar */
22
23static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
21
22/* Symmetric cipher and digest function registrar */
23
24static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
24 const int **nids, int nid);
25 const int **nids, int nid);
25
26static int gost_digests(ENGINE *e, const EVP_MD **digest,
26
27static int gost_digests(ENGINE *e, const EVP_MD **digest,
27 const int **nids, int ind);
28 const int **nids, int ind);
28
29
29static int gost_pkey_meths (ENGINE *e, EVP_PKEY_METHOD **pmeth,
30 const int **nids, int nid);
30static int gost_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth,
31 const int **nids, int nid);
31
32
32static int gost_pkey_asn1_meths (ENGINE *e, EVP_PKEY_ASN1_METHOD **ameth,
33 const int **nids, int nid);
33static int gost_pkey_asn1_meths(ENGINE *e, EVP_PKEY_ASN1_METHOD **ameth,
34 const int **nids, int nid);
34
35
35static int gost_cipher_nids[] =
36 {NID_id_Gost28147_89, NID_gost89_cnt,0};
36static int gost_cipher_nids[] = { NID_id_Gost28147_89, NID_gost89_cnt, 0 };
37
38static int gost_digest_nids[] =
37
38static int gost_digest_nids[] =
39 {NID_id_GostR3411_94,NID_id_Gost28147_89_MAC, 0};
39 { NID_id_GostR3411_94, NID_id_Gost28147_89_MAC, 0 };
40
40
41static int gost_pkey_meth_nids[] =
42 {NID_id_GostR3410_94,
43 NID_id_GostR3410_2001, NID_id_Gost28147_89_MAC, 0};
41static int gost_pkey_meth_nids[] = { NID_id_GostR3410_94,
42 NID_id_GostR3410_2001, NID_id_Gost28147_89_MAC, 0
43};
44
45static EVP_PKEY_METHOD *pmeth_GostR3410_94 = NULL,
44
45static EVP_PKEY_METHOD *pmeth_GostR3410_94 = NULL,
46 *pmeth_GostR3410_2001 = NULL,
47 *pmeth_Gost28147_MAC = NULL;
46 *pmeth_GostR3410_2001 = NULL, *pmeth_Gost28147_MAC = NULL;
48
49static EVP_PKEY_ASN1_METHOD *ameth_GostR3410_94 = NULL,
47
48static EVP_PKEY_ASN1_METHOD *ameth_GostR3410_94 = NULL,
50 *ameth_GostR3410_2001 = NULL,
51 *ameth_Gost28147_MAC = NULL;
49 *ameth_GostR3410_2001 = NULL, *ameth_Gost28147_MAC = NULL;
52
50
53
54static int gost_engine_init(ENGINE *e)
51static int gost_engine_init(ENGINE *e)
55 {
56 return 1;
57 }
52{
53 return 1;
54}
58
59static int gost_engine_finish(ENGINE *e)
55
56static int gost_engine_finish(ENGINE *e)
60 {
61 return 1;
62 }
57{
58 return 1;
59}
63
64static int gost_engine_destroy(ENGINE *e)
60
61static int gost_engine_destroy(ENGINE *e)
65 {
66 gost_param_free();
62{
63 gost_param_free();
67
64
68 pmeth_GostR3410_94 = NULL;
69 pmeth_GostR3410_2001 = NULL;
70 pmeth_Gost28147_MAC = NULL;
71 ameth_GostR3410_94 = NULL;
72 ameth_GostR3410_2001 = NULL;
73 ameth_Gost28147_MAC = NULL;
74 return 1;
75 }
65 pmeth_GostR3410_94 = NULL;
66 pmeth_GostR3410_2001 = NULL;
67 pmeth_Gost28147_MAC = NULL;
68 ameth_GostR3410_94 = NULL;
69 ameth_GostR3410_2001 = NULL;
70 ameth_Gost28147_MAC = NULL;
71 return 1;
72}
76
73
77static int bind_gost (ENGINE *e,const char *id)
78 {
79 int ret = 0;
80 if (id && strcmp(id, engine_gost_id)) return 0;
81 if (ameth_GostR3410_94)
82 {
83 printf("GOST engine already loaded\n");
84 goto end;
85 }
74static int bind_gost(ENGINE *e, const char *id)
75{
76 int ret = 0;
77 if (id && strcmp(id, engine_gost_id))
78 return 0;
79 if (ameth_GostR3410_94) {
80 printf("GOST engine already loaded\n");
81 goto end;
82 }
86
83
87 if (!ENGINE_set_id(e, engine_gost_id))
88 {
89 printf("ENGINE_set_id failed\n");
90 goto end;
91 }
92 if (!ENGINE_set_name(e, engine_gost_name))
93 {
94 printf("ENGINE_set_name failed\n");
95 goto end;
96 }
97 if (!ENGINE_set_digests(e, gost_digests))
98 {
99 printf("ENGINE_set_digests failed\n");
100 goto end;
101 }
102 if (! ENGINE_set_ciphers(e, gost_ciphers))
103 {
104 printf("ENGINE_set_ciphers failed\n");
105 goto end;
106 }
107 if (! ENGINE_set_pkey_meths(e, gost_pkey_meths))
108 {
109 printf("ENGINE_set_pkey_meths failed\n");
110 goto end;
111 }
112 if (! ENGINE_set_pkey_asn1_meths(e, gost_pkey_asn1_meths))
113 {
114 printf("ENGINE_set_pkey_asn1_meths failed\n");
115 goto end;
116 }
117 /* Control function and commands */
118 if (!ENGINE_set_cmd_defns(e,gost_cmds))
119 {
120 fprintf(stderr,"ENGINE_set_cmd_defns failed\n");
121 goto end;
122 }
123 if (!ENGINE_set_ctrl_function(e,gost_control_func))
124 {
125 fprintf(stderr,"ENGINE_set_ctrl_func failed\n");
126 goto end;
127 }
128 if ( ! ENGINE_set_destroy_function(e, gost_engine_destroy)
129 || ! ENGINE_set_init_function(e,gost_engine_init)
130 || ! ENGINE_set_finish_function(e,gost_engine_finish))
131 {
132 goto end;
133 }
84 if (!ENGINE_set_id(e, engine_gost_id)) {
85 printf("ENGINE_set_id failed\n");
86 goto end;
87 }
88 if (!ENGINE_set_name(e, engine_gost_name)) {
89 printf("ENGINE_set_name failed\n");
90 goto end;
91 }
92 if (!ENGINE_set_digests(e, gost_digests)) {
93 printf("ENGINE_set_digests failed\n");
94 goto end;
95 }
96 if (!ENGINE_set_ciphers(e, gost_ciphers)) {
97 printf("ENGINE_set_ciphers failed\n");
98 goto end;
99 }
100 if (!ENGINE_set_pkey_meths(e, gost_pkey_meths)) {
101 printf("ENGINE_set_pkey_meths failed\n");
102 goto end;
103 }
104 if (!ENGINE_set_pkey_asn1_meths(e, gost_pkey_asn1_meths)) {
105 printf("ENGINE_set_pkey_asn1_meths failed\n");
106 goto end;
107 }
108 /* Control function and commands */
109 if (!ENGINE_set_cmd_defns(e, gost_cmds)) {
110 fprintf(stderr, "ENGINE_set_cmd_defns failed\n");
111 goto end;
112 }
113 if (!ENGINE_set_ctrl_function(e, gost_control_func)) {
114 fprintf(stderr, "ENGINE_set_ctrl_func failed\n");
115 goto end;
116 }
117 if (!ENGINE_set_destroy_function(e, gost_engine_destroy)
118 || !ENGINE_set_init_function(e, gost_engine_init)
119 || !ENGINE_set_finish_function(e, gost_engine_finish)) {
120 goto end;
121 }
134
122
135 if (!register_ameth_gost(NID_id_GostR3410_94, &ameth_GostR3410_94, "GOST94", "GOST R 34.10-94")) goto end;
136 if (!register_ameth_gost(NID_id_GostR3410_2001, &ameth_GostR3410_2001, "GOST2001", "GOST R 34.10-2001")) goto end;
137 if (!register_ameth_gost(NID_id_Gost28147_89_MAC, &ameth_Gost28147_MAC,
138 "GOST-MAC", "GOST 28147-89 MAC")) goto end;
123 if (!register_ameth_gost
124 (NID_id_GostR3410_94, &ameth_GostR3410_94, "GOST94",
125 "GOST R 34.10-94"))
126 goto end;
127 if (!register_ameth_gost
128 (NID_id_GostR3410_2001, &ameth_GostR3410_2001, "GOST2001",
129 "GOST R 34.10-2001"))
130 goto end;
131 if (!register_ameth_gost(NID_id_Gost28147_89_MAC, &ameth_Gost28147_MAC,
132 "GOST-MAC", "GOST 28147-89 MAC"))
133 goto end;
139
134
140 if (!register_pmeth_gost(NID_id_GostR3410_94, &pmeth_GostR3410_94, 0)) goto end;
141 if (!register_pmeth_gost(NID_id_GostR3410_2001, &pmeth_GostR3410_2001, 0)) goto end;
142 if (!register_pmeth_gost(NID_id_Gost28147_89_MAC, &pmeth_Gost28147_MAC, 0))
143 goto end;
144 if ( ! ENGINE_register_ciphers(e)
145 || ! ENGINE_register_digests(e)
146 || ! ENGINE_register_pkey_meths(e)
147 /* These two actually should go in LIST_ADD command */
148 || ! EVP_add_cipher(&cipher_gost)
149 || ! EVP_add_cipher(&cipher_gost_cpacnt)
150 || ! EVP_add_digest(&digest_gost)
151 || ! EVP_add_digest(&imit_gost_cpa)
152 )
153 {
154 goto end;
155 }
135 if (!register_pmeth_gost(NID_id_GostR3410_94, &pmeth_GostR3410_94, 0))
136 goto end;
137 if (!register_pmeth_gost(NID_id_GostR3410_2001, &pmeth_GostR3410_2001, 0))
138 goto end;
139 if (!register_pmeth_gost
140 (NID_id_Gost28147_89_MAC, &pmeth_Gost28147_MAC, 0))
141 goto end;
142 if (!ENGINE_register_ciphers(e)
143 || !ENGINE_register_digests(e)
144 || !ENGINE_register_pkey_meths(e)
145 /* These two actually should go in LIST_ADD command */
146 || !EVP_add_cipher(&cipher_gost)
147 || !EVP_add_cipher(&cipher_gost_cpacnt)
148 || !EVP_add_digest(&digest_gost)
149 || !EVP_add_digest(&imit_gost_cpa)
150 ) {
151 goto end;
152 }
156
153
157 ERR_load_GOST_strings();
158 ret = 1;
159 end:
160 return ret;
161 }
154 ERR_load_GOST_strings();
155 ret = 1;
156 end:
157 return ret;
158}
162
163#ifndef OPENSSL_NO_DYNAMIC_ENGINE
164IMPLEMENT_DYNAMIC_BIND_FN(bind_gost)
159
160#ifndef OPENSSL_NO_DYNAMIC_ENGINE
161IMPLEMENT_DYNAMIC_BIND_FN(bind_gost)
165IMPLEMENT_DYNAMIC_CHECK_FN()
166#endif /* ndef OPENSSL_NO_DYNAMIC_ENGINE */
167
162 IMPLEMENT_DYNAMIC_CHECK_FN()
163#endif /* ndef OPENSSL_NO_DYNAMIC_ENGINE */
168static int gost_digests(ENGINE *e, const EVP_MD **digest,
164static int gost_digests(ENGINE *e, const EVP_MD **digest,
169 const int **nids, int nid)
170 {
171 int ok =1 ;
172 if (!digest)
173 {
174 *nids = gost_digest_nids;
175 return 2;
176 }
177 /*printf("Digest no %d requested\n",nid);*/
178 if(nid == NID_id_GostR3411_94)
179 {
180 *digest = &digest_gost;
181 }
182 else if (nid == NID_id_Gost28147_89_MAC)
183 {
184 *digest = &imit_gost_cpa;
185 }
186 else
187 {
188 ok =0;
189 *digest = NULL;
190 }
191 return ok;
192 }
193
194static int gost_ciphers (ENGINE *e,const EVP_CIPHER **cipher,
195 const int **nids, int nid)
196 {
197 int ok = 1;
198 if (!cipher)
199 {
200 *nids = gost_cipher_nids;
201 return 2; /* two ciphers are supported */
202 }
165 const int **nids, int nid)
166{
167 int ok = 1;
168 if (!digest) {
169 *nids = gost_digest_nids;
170 return 2;
171 }
172 /*
173 * printf("Digest no %d requested\n",nid);
174 */
175 if (nid == NID_id_GostR3411_94) {
176 *digest = &digest_gost;
177 } else if (nid == NID_id_Gost28147_89_MAC) {
178 *digest = &imit_gost_cpa;
179 } else {
180 ok = 0;
181 *digest = NULL;
182 }
183 return ok;
184}
203
185
204 if(nid == NID_id_Gost28147_89)
205 {
206 *cipher = &cipher_gost;
207 }
208 else if (nid == NID_gost89_cnt)
209 {
210 *cipher = &cipher_gost_cpacnt;
211 }
212 else
213 {
214 ok = 0;
215 *cipher = NULL;
216 }
217 return ok;
218 }
186static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
187 const int **nids, int nid)
188{
189 int ok = 1;
190 if (!cipher) {
191 *nids = gost_cipher_nids;
192 return 2; /* two ciphers are supported */
193 }
219
194
220static int gost_pkey_meths (ENGINE *e, EVP_PKEY_METHOD **pmeth,
221 const int **nids, int nid)
222 {
223 if (!pmeth)
224 {
225 *nids = gost_pkey_meth_nids;
226 return 3;
227 }
195 if (nid == NID_id_Gost28147_89) {
196 *cipher = &cipher_gost;
197 } else if (nid == NID_gost89_cnt) {
198 *cipher = &cipher_gost_cpacnt;
199 } else {
200 ok = 0;
201 *cipher = NULL;
202 }
203 return ok;
204}
228
205
229 switch (nid)
230 {
231 case NID_id_GostR3410_94: *pmeth = pmeth_GostR3410_94; return 1;
232 case NID_id_GostR3410_2001: *pmeth = pmeth_GostR3410_2001; return 1;
233 case NID_id_Gost28147_89_MAC: *pmeth = pmeth_Gost28147_MAC; return 1;
234 default:;
235 }
236
237 *pmeth = NULL;
238 return 0;
239 }
206static int gost_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth,
207 const int **nids, int nid)
208{
209 if (!pmeth) {
210 *nids = gost_pkey_meth_nids;
211 return 3;
212 }
240
213
241static int gost_pkey_asn1_meths (ENGINE *e, EVP_PKEY_ASN1_METHOD **ameth,
242 const int **nids, int nid)
243 {
244 if (!ameth)
245 {
246 *nids = gost_pkey_meth_nids;
247 return 3;
248 }
249 switch (nid)
250 {
251 case NID_id_GostR3410_94: *ameth = ameth_GostR3410_94; return 1;
252 case NID_id_GostR3410_2001: *ameth = ameth_GostR3410_2001; return 1;
253 case NID_id_Gost28147_89_MAC: *ameth = ameth_Gost28147_MAC; return 1;
254
255 default:;
256 }
257
258 *ameth = NULL;
259 return 0;
260 }
214 switch (nid) {
215 case NID_id_GostR3410_94:
216 *pmeth = pmeth_GostR3410_94;
217 return 1;
218 case NID_id_GostR3410_2001:
219 *pmeth = pmeth_GostR3410_2001;
220 return 1;
221 case NID_id_Gost28147_89_MAC:
222 *pmeth = pmeth_Gost28147_MAC;
223 return 1;
224 default:;
225 }
261
226
227 *pmeth = NULL;
228 return 0;
229}
230
231static int gost_pkey_asn1_meths(ENGINE *e, EVP_PKEY_ASN1_METHOD **ameth,
232 const int **nids, int nid)
233{
234 if (!ameth) {
235 *nids = gost_pkey_meth_nids;
236 return 3;
237 }
238 switch (nid) {
239 case NID_id_GostR3410_94:
240 *ameth = ameth_GostR3410_94;
241 return 1;
242 case NID_id_GostR3410_2001:
243 *ameth = ameth_GostR3410_2001;
244 return 1;
245 case NID_id_Gost28147_89_MAC:
246 *ameth = ameth_Gost28147_MAC;
247 return 1;
248
249 default:;
250 }
251
252 *ameth = NULL;
253 return 0;
254}
255
262#ifdef OPENSSL_NO_DYNAMIC_ENGINE
263static ENGINE *engine_gost(void)
256#ifdef OPENSSL_NO_DYNAMIC_ENGINE
257static ENGINE *engine_gost(void)
264 {
265 ENGINE *ret = ENGINE_new();
266 if (!ret)
267 return NULL;
268 if (!bind_gost(ret,engine_gost_id))
269 {
270 ENGINE_free(ret);
271 return NULL;
272 }
273 return ret;
274 }
275
276void ENGINE_load_gost(void)
277 {
278 ENGINE *toadd;
279 if (pmeth_GostR3410_94)
280 return;
281 toadd = engine_gost();
282 if (!toadd) return;
283 ENGINE_add(toadd);
284 ENGINE_free(toadd);
285 ERR_clear_error();
286 }
287#endif
258{
259 ENGINE *ret = ENGINE_new();
260 if (!ret)
261 return NULL;
262 if (!bind_gost(ret, engine_gost_id)) {
263 ENGINE_free(ret);
264 return NULL;
265 }
266 return ret;
267}
288
268
269void ENGINE_load_gost(void)
270{
271 ENGINE *toadd;
272 if (pmeth_GostR3410_94)
273 return;
274 toadd = engine_gost();
275 if (!toadd)
276 return;
277 ENGINE_add(toadd);
278 ENGINE_free(toadd);
279 ERR_clear_error();
280}
281#endif