1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53: #include <stdio.h>
54: #include <string.h>
55: #include <openssl/crypto.h>
56: #include <openssl/pem.h>
57: #include <openssl/dso.h>
58: #include <openssl/engine.h>
59: #include <openssl/rand.h>
60: #ifndef OPENSSL_NO_RSA
61: #include <openssl/rsa.h>
62: #endif
63: #ifndef OPENSSL_NO_DSA
64: #include <openssl/dsa.h>
65: #endif
66: #ifndef OPENSSL_NO_DH
67: #include <openssl/dh.h>
68: #endif
69: #include <openssl/bn.h>
70:
71: #ifndef OPENSSL_NO_HW
72: #ifndef OPENSSL_NO_HW_SUREWARE
73:
74: #ifdef FLAT_INC
75: #include "sureware.h"
76: #else
77: #include "vendor_defns/sureware.h"
78: #endif
79:
80: #define SUREWARE_LIB_NAME "sureware engine"
81: #include "e_sureware_err.c"
82:
83: static int surewarehk_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void));
84: static int surewarehk_destroy(ENGINE *e);
85: static int surewarehk_init(ENGINE *e);
86: static int surewarehk_finish(ENGINE *e);
87: static int surewarehk_modexp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
88: const BIGNUM *m, BN_CTX *ctx);
89:
90:
91: #ifndef OPENSSL_NO_RSA
92: static int surewarehk_rsa_priv_dec(int flen,const unsigned char *from,unsigned char *to,
93: RSA *rsa,int padding);
94: static int surewarehk_rsa_sign(int flen,const unsigned char *from,unsigned char *to,
95: RSA *rsa,int padding);
96: #endif
97:
98:
99: static int surewarehk_rand_bytes(unsigned char *buf, int num);
100: static void surewarehk_rand_seed(const void *buf, int num);
101: static void surewarehk_rand_add(const void *buf, int num, double entropy);
102:
103:
104: static EVP_PKEY *surewarehk_load_privkey(ENGINE *e, const char *key_id,
105: UI_METHOD *ui_method, void *callback_data);
106: static EVP_PKEY *surewarehk_load_pubkey(ENGINE *e, const char *key_id,
107: UI_METHOD *ui_method, void *callback_data);
108: static void surewarehk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
109: int idx,long argl, void *argp);
110: #if 0
111: static void surewarehk_dh_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
112: int idx,long argl, void *argp);
113: #endif
114:
115: #ifndef OPENSSL_NO_RSA
116:
117: static int surewarehk_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
118: const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
119: {
120: return surewarehk_modexp(r, a, p, m, ctx);
121: }
122:
123:
124: static RSA_METHOD surewarehk_rsa =
125: {
126: "SureWare RSA method",
127: NULL,
128: NULL,
129: surewarehk_rsa_sign,
130: surewarehk_rsa_priv_dec,
131: NULL,
132: surewarehk_mod_exp_mont,
133: NULL,
134: NULL,
135: 0,
136: NULL,
137: NULL,
138: NULL,
139: NULL
140: };
141: #endif
142:
143: #ifndef OPENSSL_NO_DH
144:
145:
146: static int surewarehk_modexp_dh(const DH *dh, BIGNUM *r, const BIGNUM *a,
147: const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
148: {
149: return surewarehk_modexp(r, a, p, m, ctx);
150: }
151:
152: static DH_METHOD surewarehk_dh =
153: {
154: "SureWare DH method",
155: NULL,
156: NULL,
157: surewarehk_modexp_dh,
158: NULL,
159: NULL,
160: 0,
161: NULL,
162: NULL
163: };
164: #endif
165:
166: static RAND_METHOD surewarehk_rand =
167: {
168:
169: surewarehk_rand_seed,
170: surewarehk_rand_bytes,
171: NULL,
172: surewarehk_rand_add,
173: surewarehk_rand_bytes,
174: NULL,
175: };
176:
177: #ifndef OPENSSL_NO_DSA
178:
179: static DSA_SIG * surewarehk_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa);
180: static int surewarehk_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1,
181: BIGNUM *p1, BIGNUM *a2, BIGNUM *p2, BIGNUM *m,
182: BN_CTX *ctx, BN_MONT_CTX *in_mont)
183: {
184: BIGNUM t;
185: int to_return = 0;
186: BN_init(&t);
187:
188: if (!surewarehk_modexp(rr,a1,p1,m,ctx)) goto end;
189:
190: if (!surewarehk_modexp(&t,a2,p2,m,ctx)) goto end;
191:
192: if (!BN_mod_mul(rr,rr,&t,m,ctx)) goto end;
193: to_return = 1;
194: end:
195: BN_free(&t);
196: return to_return;
197: }
198:
199: static DSA_METHOD surewarehk_dsa =
200: {
201: "SureWare DSA method",
202: surewarehk_dsa_do_sign,
203: NULL,
204: NULL,
205: surewarehk_dsa_mod_exp,
206: NULL,
207: NULL,
208: NULL,
209: 0,
210: NULL,
211: NULL,
212: NULL
213: };
214: #endif
215:
216: static const char *engine_sureware_id = "sureware";
217: static const char *engine_sureware_name = "SureWare hardware engine support";
218:
219:
220:
221:
222:
223: static int bind_sureware(ENGINE *e)
224: {
225: #ifndef OPENSSL_NO_RSA
226: const RSA_METHOD *meth1;
227: #endif
228: #ifndef OPENSSL_NO_DSA
229: const DSA_METHOD *meth2;
230: #endif
231: #ifndef OPENSSL_NO_DH
232: const DH_METHOD *meth3;
233: #endif
234:
235: if(!ENGINE_set_id(e, engine_sureware_id) ||
236: !ENGINE_set_name(e, engine_sureware_name) ||
237: #ifndef OPENSSL_NO_RSA
238: !ENGINE_set_RSA(e, &surewarehk_rsa) ||
239: #endif
240: #ifndef OPENSSL_NO_DSA
241: !ENGINE_set_DSA(e, &surewarehk_dsa) ||
242: #endif
243: #ifndef OPENSSL_NO_DH
244: !ENGINE_set_DH(e, &surewarehk_dh) ||
245: #endif
246: !ENGINE_set_RAND(e, &surewarehk_rand) ||
247: !ENGINE_set_destroy_function(e, surewarehk_destroy) ||
248: !ENGINE_set_init_function(e, surewarehk_init) ||
249: !ENGINE_set_finish_function(e, surewarehk_finish) ||
250: !ENGINE_set_ctrl_function(e, surewarehk_ctrl) ||
251: !ENGINE_set_load_privkey_function(e, surewarehk_load_privkey) ||
252: !ENGINE_set_load_pubkey_function(e, surewarehk_load_pubkey))
253: return 0;
254:
255: #ifndef OPENSSL_NO_RSA
256:
257:
258:
259:
260:
261:
262:
263: meth1 = RSA_PKCS1_SSLeay();
264: if (meth1)
265: {
266: surewarehk_rsa.rsa_pub_enc = meth1->rsa_pub_enc;
267: surewarehk_rsa.rsa_pub_dec = meth1->rsa_pub_dec;
268: }
269: #endif
270:
271: #ifndef OPENSSL_NO_DSA
272:
273:
274: meth2 = DSA_OpenSSL();
275: if (meth2)
276: {
277: surewarehk_dsa.dsa_do_verify = meth2->dsa_do_verify;
278: }
279: #endif
280:
281: #ifndef OPENSSL_NO_DH
282:
283: meth3 = DH_OpenSSL();
284: if (meth3)
285: {
286: surewarehk_dh.generate_key = meth3->generate_key;
287: surewarehk_dh.compute_key = meth3->compute_key;
288: }
289: #endif
290:
291:
292: ERR_load_SUREWARE_strings();
293: return 1;
294: }
295:
296: #ifndef OPENSSL_NO_DYNAMIC_ENGINE
297: static int bind_helper(ENGINE *e, const char *id)
298: {
299: if(id && (strcmp(id, engine_sureware_id) != 0))
300: return 0;
301: if(!bind_sureware(e))
302: return 0;
303: return 1;
304: }
305: IMPLEMENT_DYNAMIC_CHECK_FN()
306: IMPLEMENT_DYNAMIC_BIND_FN(bind_helper)
307: #else
308: static ENGINE *engine_sureware(void)
309: {
310: ENGINE *ret = ENGINE_new();
311: if(!ret)
312: return NULL;
313: if(!bind_sureware(ret))
314: {
315: ENGINE_free(ret);
316: return NULL;
317: }
318: return ret;
319: }
320:
321: void ENGINE_load_sureware(void)
322: {
323:
324: ENGINE *toadd = engine_sureware();
325: if(!toadd) return;
326: ENGINE_add(toadd);
327: ENGINE_free(toadd);
328: ERR_clear_error();
329: }
330: #endif
331:
332:
333:
334:
335:
336:
337: static DSO *surewarehk_dso = NULL;
338: #ifndef OPENSSL_NO_RSA
339: static int rsaHndidx = -1;
340: #endif
341: #ifndef OPENSSL_NO_DSA
342: static int dsaHndidx = -1;
343: #endif
344:
345:
346:
347: static SureWareHook_Init_t *p_surewarehk_Init = NULL;
348: static SureWareHook_Finish_t *p_surewarehk_Finish = NULL;
349: static SureWareHook_Rand_Bytes_t *p_surewarehk_Rand_Bytes = NULL;
350: static SureWareHook_Rand_Seed_t *p_surewarehk_Rand_Seed = NULL;
351: static SureWareHook_Load_Privkey_t *p_surewarehk_Load_Privkey = NULL;
352: static SureWareHook_Info_Pubkey_t *p_surewarehk_Info_Pubkey = NULL;
353: static SureWareHook_Load_Rsa_Pubkey_t *p_surewarehk_Load_Rsa_Pubkey = NULL;
354: static SureWareHook_Load_Dsa_Pubkey_t *p_surewarehk_Load_Dsa_Pubkey = NULL;
355: static SureWareHook_Free_t *p_surewarehk_Free=NULL;
356: static SureWareHook_Rsa_Priv_Dec_t *p_surewarehk_Rsa_Priv_Dec=NULL;
357: static SureWareHook_Rsa_Sign_t *p_surewarehk_Rsa_Sign=NULL;
358: static SureWareHook_Dsa_Sign_t *p_surewarehk_Dsa_Sign=NULL;
359: static SureWareHook_Mod_Exp_t *p_surewarehk_Mod_Exp=NULL;
360:
361:
362: static const char *surewarehk_LIBNAME = "SureWareHook";
363: static const char *n_surewarehk_Init = "SureWareHook_Init";
364: static const char *n_surewarehk_Finish = "SureWareHook_Finish";
365: static const char *n_surewarehk_Rand_Bytes="SureWareHook_Rand_Bytes";
366: static const char *n_surewarehk_Rand_Seed="SureWareHook_Rand_Seed";
367: static const char *n_surewarehk_Load_Privkey="SureWareHook_Load_Privkey";
368: static const char *n_surewarehk_Info_Pubkey="SureWareHook_Info_Pubkey";
369: static const char *n_surewarehk_Load_Rsa_Pubkey="SureWareHook_Load_Rsa_Pubkey";
370: static const char *n_surewarehk_Load_Dsa_Pubkey="SureWareHook_Load_Dsa_Pubkey";
371: static const char *n_surewarehk_Free="SureWareHook_Free";
372: static const char *n_surewarehk_Rsa_Priv_Dec="SureWareHook_Rsa_Priv_Dec";
373: static const char *n_surewarehk_Rsa_Sign="SureWareHook_Rsa_Sign";
374: static const char *n_surewarehk_Dsa_Sign="SureWareHook_Dsa_Sign";
375: static const char *n_surewarehk_Mod_Exp="SureWareHook_Mod_Exp";
376: static BIO *logstream = NULL;
377:
378:
379:
380:
381:
382:
383: static int threadsafe=1;
384: static int surewarehk_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void))
385: {
386: int to_return = 1;
387:
388: switch(cmd)
389: {
390: case ENGINE_CTRL_SET_LOGSTREAM:
391: {
392: BIO *bio = (BIO *)p;
393: CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
394: if (logstream)
395: {
396: BIO_free(logstream);
397: logstream = NULL;
398: }
399: if (CRYPTO_add(&bio->references,1,CRYPTO_LOCK_BIO) > 1)
400: logstream = bio;
401: else
402: SUREWAREerr(SUREWARE_F_SUREWAREHK_CTRL,SUREWARE_R_BIO_WAS_FREED);
403: }
404: CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
405: break;
406:
407:
408:
409:
410:
411: case ENGINE_CTRL_CHIL_NO_LOCKING:
412: CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
413: threadsafe = 0;
414: CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
415: break;
416:
417:
418: default:
419: SUREWAREerr(SUREWARE_F_SUREWAREHK_CTRL,
420: ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED);
421: to_return = 0;
422: break;
423: }
424:
425: return to_return;
426: }
427:
428:
429: static int surewarehk_destroy(ENGINE *e)
430: {
431: ERR_unload_SUREWARE_strings();
432: return 1;
433: }
434:
435:
436: static int surewarehk_init(ENGINE *e)
437: {
438: char msg[64]="ENGINE_init";
439: SureWareHook_Init_t *p1=NULL;
440: SureWareHook_Finish_t *p2=NULL;
441: SureWareHook_Rand_Bytes_t *p3=NULL;
442: SureWareHook_Rand_Seed_t *p4=NULL;
443: SureWareHook_Load_Privkey_t *p5=NULL;
444: SureWareHook_Load_Rsa_Pubkey_t *p6=NULL;
445: SureWareHook_Free_t *p7=NULL;
446: SureWareHook_Rsa_Priv_Dec_t *p8=NULL;
447: SureWareHook_Rsa_Sign_t *p9=NULL;
448: SureWareHook_Dsa_Sign_t *p12=NULL;
449: SureWareHook_Info_Pubkey_t *p13=NULL;
450: SureWareHook_Load_Dsa_Pubkey_t *p14=NULL;
451: SureWareHook_Mod_Exp_t *p15=NULL;
452:
453: if(surewarehk_dso != NULL)
454: {
455: SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_ALREADY_LOADED);
456: goto err;
457: }
458:
459: surewarehk_dso = DSO_load(NULL, surewarehk_LIBNAME, NULL, 0);
460: if(surewarehk_dso == NULL)
461: {
462: SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_DSO_FAILURE);
463: goto err;
464: }
465: if(!(p1=(SureWareHook_Init_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Init)) ||
466: !(p2=(SureWareHook_Finish_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Finish)) ||
467: !(p3=(SureWareHook_Rand_Bytes_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rand_Bytes)) ||
468: !(p4=(SureWareHook_Rand_Seed_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rand_Seed)) ||
469: !(p5=(SureWareHook_Load_Privkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Privkey)) ||
470: !(p6=(SureWareHook_Load_Rsa_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Rsa_Pubkey)) ||
471: !(p7=(SureWareHook_Free_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Free)) ||
472: !(p8=(SureWareHook_Rsa_Priv_Dec_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rsa_Priv_Dec)) ||
473: !(p9=(SureWareHook_Rsa_Sign_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rsa_Sign)) ||
474: !(p12=(SureWareHook_Dsa_Sign_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Dsa_Sign)) ||
475: !(p13=(SureWareHook_Info_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Info_Pubkey)) ||
476: !(p14=(SureWareHook_Load_Dsa_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Dsa_Pubkey)) ||
477: !(p15=(SureWareHook_Mod_Exp_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Mod_Exp)))
478: {
479: SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_DSO_FAILURE);
480: goto err;
481: }
482:
483: p_surewarehk_Init = p1;
484: p_surewarehk_Finish = p2;
485: p_surewarehk_Rand_Bytes = p3;
486: p_surewarehk_Rand_Seed = p4;
487: p_surewarehk_Load_Privkey = p5;
488: p_surewarehk_Load_Rsa_Pubkey = p6;
489: p_surewarehk_Free = p7;
490: p_surewarehk_Rsa_Priv_Dec = p8;
491: p_surewarehk_Rsa_Sign = p9;
492: p_surewarehk_Dsa_Sign = p12;
493: p_surewarehk_Info_Pubkey = p13;
494: p_surewarehk_Load_Dsa_Pubkey = p14;
495: p_surewarehk_Mod_Exp = p15;
496:
497: if(p_surewarehk_Init(msg,threadsafe)==SUREWAREHOOK_ERROR_UNIT_FAILURE)
498: {
499: SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,SUREWARE_R_UNIT_FAILURE);
500: goto err;
501: }
502: if(p_surewarehk_Init(msg,threadsafe)==SUREWAREHOOK_ERROR_UNIT_FAILURE)
503: {
504: SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,SUREWARE_R_UNIT_FAILURE);
505: goto err;
506: }
507:
508:
509: surewarehk_load_privkey(e,NULL,NULL,NULL);
510:
511:
512: #ifndef OPENSSL_NO_RSA
513: if (rsaHndidx == -1)
514: rsaHndidx = RSA_get_ex_new_index(0,
515: "SureWareHook RSA key handle",
516: