diff options
Diffstat (limited to 'src/lib/libcrypto/engine/hw_atalla.c')
-rw-r--r-- | src/lib/libcrypto/engine/hw_atalla.c | 283 |
1 files changed, 207 insertions, 76 deletions
diff --git a/src/lib/libcrypto/engine/hw_atalla.c b/src/lib/libcrypto/engine/hw_atalla.c index 3bb992a193..696cfcf156 100644 --- a/src/lib/libcrypto/engine/hw_atalla.c +++ b/src/lib/libcrypto/engine/hw_atalla.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
5 | /* ==================================================================== | 5 | /* ==================================================================== |
6 | * Copyright (c) 1999 The OpenSSL Project. All rights reserved. | 6 | * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions | 9 | * modification, are permitted provided that the following conditions |
@@ -60,11 +60,10 @@ | |||
60 | #include <openssl/crypto.h> | 60 | #include <openssl/crypto.h> |
61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
62 | #include <openssl/dso.h> | 62 | #include <openssl/dso.h> |
63 | #include "engine_int.h" | ||
64 | #include <openssl/engine.h> | 63 | #include <openssl/engine.h> |
65 | 64 | ||
66 | #ifndef NO_HW | 65 | #ifndef OPENSSL_NO_HW |
67 | #ifndef NO_HW_ATALLA | 66 | #ifndef OPENSSL_NO_HW_ATALLA |
68 | 67 | ||
69 | #ifdef FLAT_INC | 68 | #ifdef FLAT_INC |
70 | #include "atalla.h" | 69 | #include "atalla.h" |
@@ -72,19 +71,27 @@ | |||
72 | #include "vendor_defns/atalla.h" | 71 | #include "vendor_defns/atalla.h" |
73 | #endif | 72 | #endif |
74 | 73 | ||
75 | static int atalla_init(void); | 74 | #define ATALLA_LIB_NAME "atalla engine" |
76 | static int atalla_finish(void); | 75 | #include "hw_atalla_err.c" |
76 | |||
77 | static int atalla_destroy(ENGINE *e); | ||
78 | static int atalla_init(ENGINE *e); | ||
79 | static int atalla_finish(ENGINE *e); | ||
80 | static int atalla_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)()); | ||
77 | 81 | ||
78 | /* BIGNUM stuff */ | 82 | /* BIGNUM stuff */ |
79 | static int atalla_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 83 | static int atalla_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
80 | const BIGNUM *m, BN_CTX *ctx); | 84 | const BIGNUM *m, BN_CTX *ctx); |
81 | 85 | ||
86 | #ifndef OPENSSL_NO_RSA | ||
82 | /* RSA stuff */ | 87 | /* RSA stuff */ |
83 | static int atalla_rsa_mod_exp(BIGNUM *r0, BIGNUM *I, RSA *rsa); | 88 | static int atalla_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa); |
89 | #endif | ||
84 | /* This function is aliased to mod_exp (with the mont stuff dropped). */ | 90 | /* This function is aliased to mod_exp (with the mont stuff dropped). */ |
85 | static int atalla_mod_exp_mont(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 91 | static int atalla_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
86 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); | 92 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); |
87 | 93 | ||
94 | #ifndef OPENSSL_NO_DSA | ||
88 | /* DSA stuff */ | 95 | /* DSA stuff */ |
89 | static int atalla_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1, | 96 | static int atalla_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1, |
90 | BIGNUM *p1, BIGNUM *a2, BIGNUM *p2, BIGNUM *m, | 97 | BIGNUM *p1, BIGNUM *a2, BIGNUM *p2, BIGNUM *m, |
@@ -92,13 +99,27 @@ static int atalla_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1, | |||
92 | static int atalla_mod_exp_dsa(DSA *dsa, BIGNUM *r, BIGNUM *a, | 99 | static int atalla_mod_exp_dsa(DSA *dsa, BIGNUM *r, BIGNUM *a, |
93 | const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, | 100 | const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, |
94 | BN_MONT_CTX *m_ctx); | 101 | BN_MONT_CTX *m_ctx); |
102 | #endif | ||
95 | 103 | ||
104 | #ifndef OPENSSL_NO_DH | ||
96 | /* DH stuff */ | 105 | /* DH stuff */ |
97 | /* This function is alised to mod_exp (with the DH and mont dropped). */ | 106 | /* This function is alised to mod_exp (with the DH and mont dropped). */ |
98 | static int atalla_mod_exp_dh(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 107 | static int atalla_mod_exp_dh(const DH *dh, BIGNUM *r, |
108 | const BIGNUM *a, const BIGNUM *p, | ||
99 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); | 109 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); |
110 | #endif | ||
100 | 111 | ||
112 | /* The definitions for control commands specific to this engine */ | ||
113 | #define ATALLA_CMD_SO_PATH ENGINE_CMD_BASE | ||
114 | static const ENGINE_CMD_DEFN atalla_cmd_defns[] = { | ||
115 | {ATALLA_CMD_SO_PATH, | ||
116 | "SO_PATH", | ||
117 | "Specifies the path to the 'atasi' shared library", | ||
118 | ENGINE_CMD_FLAG_STRING}, | ||
119 | {0, NULL, NULL, 0} | ||
120 | }; | ||
101 | 121 | ||
122 | #ifndef OPENSSL_NO_RSA | ||
102 | /* Our internal RSA_METHOD that we provide pointers to */ | 123 | /* Our internal RSA_METHOD that we provide pointers to */ |
103 | static RSA_METHOD atalla_rsa = | 124 | static RSA_METHOD atalla_rsa = |
104 | { | 125 | { |
@@ -116,7 +137,9 @@ static RSA_METHOD atalla_rsa = | |||
116 | NULL, | 137 | NULL, |
117 | NULL | 138 | NULL |
118 | }; | 139 | }; |
140 | #endif | ||
119 | 141 | ||
142 | #ifndef OPENSSL_NO_DSA | ||
120 | /* Our internal DSA_METHOD that we provide pointers to */ | 143 | /* Our internal DSA_METHOD that we provide pointers to */ |
121 | static DSA_METHOD atalla_dsa = | 144 | static DSA_METHOD atalla_dsa = |
122 | { | 145 | { |
@@ -131,7 +154,9 @@ static DSA_METHOD atalla_dsa = | |||
131 | 0, /* flags */ | 154 | 0, /* flags */ |
132 | NULL /* app_data */ | 155 | NULL /* app_data */ |
133 | }; | 156 | }; |
157 | #endif | ||
134 | 158 | ||
159 | #ifndef OPENSSL_NO_DH | ||
135 | /* Our internal DH_METHOD that we provide pointers to */ | 160 | /* Our internal DH_METHOD that we provide pointers to */ |
136 | static DH_METHOD atalla_dh = | 161 | static DH_METHOD atalla_dh = |
137 | { | 162 | { |
@@ -144,36 +169,44 @@ static DH_METHOD atalla_dh = | |||
144 | 0, | 169 | 0, |
145 | NULL | 170 | NULL |
146 | }; | 171 | }; |
172 | #endif | ||
147 | 173 | ||
148 | /* Our ENGINE structure. */ | 174 | /* Constants used when creating the ENGINE */ |
149 | static ENGINE engine_atalla = | 175 | static const char *engine_atalla_id = "atalla"; |
150 | { | 176 | static const char *engine_atalla_name = "Atalla hardware engine support"; |
151 | "atalla", | 177 | |
152 | "Atalla hardware engine support", | 178 | /* This internal function is used by ENGINE_atalla() and possibly by the |
153 | &atalla_rsa, | 179 | * "dynamic" ENGINE support too */ |
154 | &atalla_dsa, | 180 | static int bind_helper(ENGINE *e) |
155 | &atalla_dh, | ||
156 | NULL, | ||
157 | atalla_mod_exp, | ||
158 | NULL, | ||
159 | atalla_init, | ||
160 | atalla_finish, | ||
161 | NULL, /* no ctrl() */ | ||
162 | NULL, /* no load_privkey() */ | ||
163 | NULL, /* no load_pubkey() */ | ||
164 | 0, /* no flags */ | ||
165 | 0, 0, /* no references */ | ||
166 | NULL, NULL /* unlinked */ | ||
167 | }; | ||
168 | |||
169 | /* As this is only ever called once, there's no need for locking | ||
170 | * (indeed - the lock will already be held by our caller!!!) */ | ||
171 | ENGINE *ENGINE_atalla() | ||
172 | { | 181 | { |
173 | RSA_METHOD *meth1; | 182 | #ifndef OPENSSL_NO_RSA |
174 | DSA_METHOD *meth2; | 183 | const RSA_METHOD *meth1; |
175 | DH_METHOD *meth3; | 184 | #endif |
185 | #ifndef OPENSSL_NO_DSA | ||
186 | const DSA_METHOD *meth2; | ||
187 | #endif | ||
188 | #ifndef OPENSSL_NO_DH | ||
189 | const DH_METHOD *meth3; | ||
190 | #endif | ||
191 | if(!ENGINE_set_id(e, engine_atalla_id) || | ||
192 | !ENGINE_set_name(e, engine_atalla_name) || | ||
193 | #ifndef OPENSSL_NO_RSA | ||
194 | !ENGINE_set_RSA(e, &atalla_rsa) || | ||
195 | #endif | ||
196 | #ifndef OPENSSL_NO_DSA | ||
197 | !ENGINE_set_DSA(e, &atalla_dsa) || | ||
198 | #endif | ||
199 | #ifndef OPENSSL_NO_DH | ||
200 | !ENGINE_set_DH(e, &atalla_dh) || | ||
201 | #endif | ||
202 | !ENGINE_set_destroy_function(e, atalla_destroy) || | ||
203 | !ENGINE_set_init_function(e, atalla_init) || | ||
204 | !ENGINE_set_finish_function(e, atalla_finish) || | ||
205 | !ENGINE_set_ctrl_function(e, atalla_ctrl) || | ||
206 | !ENGINE_set_cmd_defns(e, atalla_cmd_defns)) | ||
207 | return 0; | ||
176 | 208 | ||
209 | #ifndef OPENSSL_NO_RSA | ||
177 | /* We know that the "PKCS1_SSLeay()" functions hook properly | 210 | /* We know that the "PKCS1_SSLeay()" functions hook properly |
178 | * to the atalla-specific mod_exp and mod_exp_crt so we use | 211 | * to the atalla-specific mod_exp and mod_exp_crt so we use |
179 | * those functions. NB: We don't use ENGINE_openssl() or | 212 | * those functions. NB: We don't use ENGINE_openssl() or |
@@ -186,19 +219,50 @@ ENGINE *ENGINE_atalla() | |||
186 | atalla_rsa.rsa_pub_dec = meth1->rsa_pub_dec; | 219 | atalla_rsa.rsa_pub_dec = meth1->rsa_pub_dec; |
187 | atalla_rsa.rsa_priv_enc = meth1->rsa_priv_enc; | 220 | atalla_rsa.rsa_priv_enc = meth1->rsa_priv_enc; |
188 | atalla_rsa.rsa_priv_dec = meth1->rsa_priv_dec; | 221 | atalla_rsa.rsa_priv_dec = meth1->rsa_priv_dec; |
222 | #endif | ||
189 | 223 | ||
224 | #ifndef OPENSSL_NO_DSA | ||
190 | /* Use the DSA_OpenSSL() method and just hook the mod_exp-ish | 225 | /* Use the DSA_OpenSSL() method and just hook the mod_exp-ish |
191 | * bits. */ | 226 | * bits. */ |
192 | meth2 = DSA_OpenSSL(); | 227 | meth2 = DSA_OpenSSL(); |
193 | atalla_dsa.dsa_do_sign = meth2->dsa_do_sign; | 228 | atalla_dsa.dsa_do_sign = meth2->dsa_do_sign; |
194 | atalla_dsa.dsa_sign_setup = meth2->dsa_sign_setup; | 229 | atalla_dsa.dsa_sign_setup = meth2->dsa_sign_setup; |
195 | atalla_dsa.dsa_do_verify = meth2->dsa_do_verify; | 230 | atalla_dsa.dsa_do_verify = meth2->dsa_do_verify; |
231 | #endif | ||
196 | 232 | ||
233 | #ifndef OPENSSL_NO_DH | ||
197 | /* Much the same for Diffie-Hellman */ | 234 | /* Much the same for Diffie-Hellman */ |
198 | meth3 = DH_OpenSSL(); | 235 | meth3 = DH_OpenSSL(); |
199 | atalla_dh.generate_key = meth3->generate_key; | 236 | atalla_dh.generate_key = meth3->generate_key; |
200 | atalla_dh.compute_key = meth3->compute_key; | 237 | atalla_dh.compute_key = meth3->compute_key; |
201 | return &engine_atalla; | 238 | #endif |
239 | |||
240 | /* Ensure the atalla error handling is set up */ | ||
241 | ERR_load_ATALLA_strings(); | ||
242 | return 1; | ||
243 | } | ||
244 | |||
245 | static ENGINE *engine_atalla(void) | ||
246 | { | ||
247 | ENGINE *ret = ENGINE_new(); | ||
248 | if(!ret) | ||
249 | return NULL; | ||
250 | if(!bind_helper(ret)) | ||
251 | { | ||
252 | ENGINE_free(ret); | ||
253 | return NULL; | ||
254 | } | ||
255 | return ret; | ||
256 | } | ||
257 | |||
258 | void ENGINE_load_atalla(void) | ||
259 | { | ||
260 | /* Copied from eng_[openssl|dyn].c */ | ||
261 | ENGINE *toadd = engine_atalla(); | ||
262 | if(!toadd) return; | ||
263 | ENGINE_add(toadd); | ||
264 | ENGINE_free(toadd); | ||
265 | ERR_clear_error(); | ||
202 | } | 266 | } |
203 | 267 | ||
204 | /* This is a process-global DSO handle used for loading and unloading | 268 | /* This is a process-global DSO handle used for loading and unloading |
@@ -214,8 +278,32 @@ static tfnASI_GetHardwareConfig *p_Atalla_GetHardwareConfig = NULL; | |||
214 | static tfnASI_RSAPrivateKeyOpFn *p_Atalla_RSAPrivateKeyOpFn = NULL; | 278 | static tfnASI_RSAPrivateKeyOpFn *p_Atalla_RSAPrivateKeyOpFn = NULL; |
215 | static tfnASI_GetPerformanceStatistics *p_Atalla_GetPerformanceStatistics = NULL; | 279 | static tfnASI_GetPerformanceStatistics *p_Atalla_GetPerformanceStatistics = NULL; |
216 | 280 | ||
281 | /* These are the static string constants for the DSO file name and the function | ||
282 | * symbol names to bind to. Regrettably, the DSO name on *nix appears to be | ||
283 | * "atasi.so" rather than something more consistent like "libatasi.so". At the | ||
284 | * time of writing, I'm not sure what the file name on win32 is but clearly | ||
285 | * native name translation is not possible (eg libatasi.so on *nix, and | ||
286 | * atasi.dll on win32). For the purposes of testing, I have created a symbollic | ||
287 | * link called "libatasi.so" so that we can use native name-translation - a | ||
288 | * better solution will be needed. */ | ||
289 | static const char def_ATALLA_LIBNAME[] = "atasi"; | ||
290 | static const char *ATALLA_LIBNAME = def_ATALLA_LIBNAME; | ||
291 | static const char *ATALLA_F1 = "ASI_GetHardwareConfig"; | ||
292 | static const char *ATALLA_F2 = "ASI_RSAPrivateKeyOpFn"; | ||
293 | static const char *ATALLA_F3 = "ASI_GetPerformanceStatistics"; | ||
294 | |||
295 | /* Destructor (complements the "ENGINE_atalla()" constructor) */ | ||
296 | static int atalla_destroy(ENGINE *e) | ||
297 | { | ||
298 | /* Unload the atalla error strings so any error state including our | ||
299 | * functs or reasons won't lead to a segfault (they simply get displayed | ||
300 | * without corresponding string data because none will be found). */ | ||
301 | ERR_unload_ATALLA_strings(); | ||
302 | return 1; | ||
303 | } | ||
304 | |||
217 | /* (de)initialisation functions. */ | 305 | /* (de)initialisation functions. */ |
218 | static int atalla_init() | 306 | static int atalla_init(ENGINE *e) |
219 | { | 307 | { |
220 | tfnASI_GetHardwareConfig *p1; | 308 | tfnASI_GetHardwareConfig *p1; |
221 | tfnASI_RSAPrivateKeyOpFn *p2; | 309 | tfnASI_RSAPrivateKeyOpFn *p2; |
@@ -226,7 +314,7 @@ static int atalla_init() | |||
226 | 314 | ||
227 | if(atalla_dso != NULL) | 315 | if(atalla_dso != NULL) |
228 | { | 316 | { |
229 | ENGINEerr(ENGINE_F_ATALLA_INIT,ENGINE_R_ALREADY_LOADED); | 317 | ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_ALREADY_LOADED); |
230 | goto err; | 318 | goto err; |
231 | } | 319 | } |
232 | /* Attempt to load libatasi.so/atasi.dll/whatever. Needs to be | 320 | /* Attempt to load libatasi.so/atasi.dll/whatever. Needs to be |
@@ -236,11 +324,10 @@ static int atalla_init() | |||
236 | * drivers really use - for now a symbollic link needs to be | 324 | * drivers really use - for now a symbollic link needs to be |
237 | * created on the host system from libatasi.so to atasi.so on | 325 | * created on the host system from libatasi.so to atasi.so on |
238 | * unix variants. */ | 326 | * unix variants. */ |
239 | atalla_dso = DSO_load(NULL, ATALLA_LIBNAME, NULL, | 327 | atalla_dso = DSO_load(NULL, ATALLA_LIBNAME, NULL, 0); |
240 | DSO_FLAG_NAME_TRANSLATION); | ||
241 | if(atalla_dso == NULL) | 328 | if(atalla_dso == NULL) |
242 | { | 329 | { |
243 | ENGINEerr(ENGINE_F_ATALLA_INIT,ENGINE_R_DSO_FAILURE); | 330 | ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_NOT_LOADED); |
244 | goto err; | 331 | goto err; |
245 | } | 332 | } |
246 | if(!(p1 = (tfnASI_GetHardwareConfig *)DSO_bind_func( | 333 | if(!(p1 = (tfnASI_GetHardwareConfig *)DSO_bind_func( |
@@ -250,7 +337,7 @@ static int atalla_init() | |||
250 | !(p3 = (tfnASI_GetPerformanceStatistics *)DSO_bind_func( | 337 | !(p3 = (tfnASI_GetPerformanceStatistics *)DSO_bind_func( |
251 | atalla_dso, ATALLA_F3))) | 338 | atalla_dso, ATALLA_F3))) |
252 | { | 339 | { |
253 | ENGINEerr(ENGINE_F_ATALLA_INIT,ENGINE_R_DSO_FAILURE); | 340 | ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_NOT_LOADED); |
254 | goto err; | 341 | goto err; |
255 | } | 342 | } |
256 | /* Copy the pointers */ | 343 | /* Copy the pointers */ |
@@ -261,7 +348,7 @@ static int atalla_init() | |||
261 | * running. */ | 348 | * running. */ |
262 | if(p1(0L, config_buf) != 0) | 349 | if(p1(0L, config_buf) != 0) |
263 | { | 350 | { |
264 | ENGINEerr(ENGINE_F_ATALLA_INIT,ENGINE_R_UNIT_FAILURE); | 351 | ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_UNIT_FAILURE); |
265 | goto err; | 352 | goto err; |
266 | } | 353 | } |
267 | /* Everything's fine. */ | 354 | /* Everything's fine. */ |
@@ -275,16 +362,16 @@ err: | |||
275 | return 0; | 362 | return 0; |
276 | } | 363 | } |
277 | 364 | ||
278 | static int atalla_finish() | 365 | static int atalla_finish(ENGINE *e) |
279 | { | 366 | { |
280 | if(atalla_dso == NULL) | 367 | if(atalla_dso == NULL) |
281 | { | 368 | { |
282 | ENGINEerr(ENGINE_F_ATALLA_FINISH,ENGINE_R_NOT_LOADED); | 369 | ATALLAerr(ATALLA_F_ATALLA_FINISH,ATALLA_R_NOT_LOADED); |
283 | return 0; | 370 | return 0; |
284 | } | 371 | } |
285 | if(!DSO_free(atalla_dso)) | 372 | if(!DSO_free(atalla_dso)) |
286 | { | 373 | { |
287 | ENGINEerr(ENGINE_F_ATALLA_FINISH,ENGINE_R_DSO_FAILURE); | 374 | ATALLAerr(ATALLA_F_ATALLA_FINISH,ATALLA_R_UNIT_FAILURE); |
288 | return 0; | 375 | return 0; |
289 | } | 376 | } |
290 | atalla_dso = NULL; | 377 | atalla_dso = NULL; |
@@ -294,7 +381,32 @@ static int atalla_finish() | |||
294 | return 1; | 381 | return 1; |
295 | } | 382 | } |
296 | 383 | ||
297 | static int atalla_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 384 | static int atalla_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)()) |
385 | { | ||
386 | int initialised = ((atalla_dso == NULL) ? 0 : 1); | ||
387 | switch(cmd) | ||
388 | { | ||
389 | case ATALLA_CMD_SO_PATH: | ||
390 | if(p == NULL) | ||
391 | { | ||
392 | ATALLAerr(ATALLA_F_ATALLA_CTRL,ERR_R_PASSED_NULL_PARAMETER); | ||
393 | return 0; | ||
394 | } | ||
395 | if(initialised) | ||
396 | { | ||
397 | ATALLAerr(ATALLA_F_ATALLA_CTRL,ATALLA_R_ALREADY_LOADED); | ||
398 | return 0; | ||
399 | } | ||
400 | ATALLA_LIBNAME = (const char *)p; | ||
401 | return 1; | ||
402 | default: | ||
403 | break; | ||
404 | } | ||
405 | ATALLAerr(ATALLA_F_ATALLA_CTRL,ATALLA_R_CTRL_COMMAND_NOT_IMPLEMENTED); | ||
406 | return 0; | ||
407 | } | ||
408 | |||
409 | static int atalla_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, | ||
298 | const BIGNUM *m, BN_CTX *ctx) | 410 | const BIGNUM *m, BN_CTX *ctx) |
299 | { | 411 | { |
300 | /* I need somewhere to store temporary serialised values for | 412 | /* I need somewhere to store temporary serialised values for |
@@ -313,26 +425,27 @@ static int atalla_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | |||
313 | to_return = 0; /* expect failure */ | 425 | to_return = 0; /* expect failure */ |
314 | 426 | ||
315 | if(!atalla_dso) | 427 | if(!atalla_dso) |
316 | { | 428 | { |
317 | ENGINEerr(ENGINE_F_ATALLA_MOD_EXP,ENGINE_R_NOT_LOADED); | 429 | ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_NOT_LOADED); |
318 | goto err; | 430 | goto err; |
319 | } | 431 | } |
320 | /* Prepare the params */ | 432 | /* Prepare the params */ |
433 | BN_CTX_start(ctx); | ||
321 | modulus = BN_CTX_get(ctx); | 434 | modulus = BN_CTX_get(ctx); |
322 | exponent = BN_CTX_get(ctx); | 435 | exponent = BN_CTX_get(ctx); |
323 | argument = BN_CTX_get(ctx); | 436 | argument = BN_CTX_get(ctx); |
324 | result = BN_CTX_get(ctx); | 437 | result = BN_CTX_get(ctx); |
325 | if(!modulus || !exponent || !argument || !result) | 438 | if (!result) |
326 | { | 439 | { |
327 | ENGINEerr(ENGINE_F_ATALLA_MOD_EXP,ENGINE_R_BN_CTX_FULL); | 440 | ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_BN_CTX_FULL); |
328 | goto err; | 441 | goto err; |
329 | } | 442 | } |
330 | if(!bn_wexpand(modulus, m->top) || !bn_wexpand(exponent, m->top) || | 443 | if(!bn_wexpand(modulus, m->top) || !bn_wexpand(exponent, m->top) || |
331 | !bn_wexpand(argument, m->top) || !bn_wexpand(result, m->top)) | 444 | !bn_wexpand(argument, m->top) || !bn_wexpand(result, m->top)) |
332 | { | 445 | { |
333 | ENGINEerr(ENGINE_F_ATALLA_MOD_EXP,ENGINE_R_BN_EXPAND_FAIL); | 446 | ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_BN_EXPAND_FAIL); |
334 | goto err; | 447 | goto err; |
335 | } | 448 | } |
336 | /* Prepare the key-data */ | 449 | /* Prepare the key-data */ |
337 | memset(&keydata, 0,sizeof keydata); | 450 | memset(&keydata, 0,sizeof keydata); |
338 | numbytes = BN_num_bytes(m); | 451 | numbytes = BN_num_bytes(m); |
@@ -352,36 +465,34 @@ static int atalla_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | |||
352 | if(p_Atalla_RSAPrivateKeyOpFn(&keydata, (unsigned char *)result->d, | 465 | if(p_Atalla_RSAPrivateKeyOpFn(&keydata, (unsigned char *)result->d, |
353 | (unsigned char *)argument->d, | 466 | (unsigned char *)argument->d, |
354 | keydata.modulus.len) != 0) | 467 | keydata.modulus.len) != 0) |
355 | { | 468 | { |
356 | ENGINEerr(ENGINE_F_ATALLA_MOD_EXP,ENGINE_R_REQUEST_FAILED); | 469 | ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_REQUEST_FAILED); |
357 | goto err; | 470 | goto err; |
358 | } | 471 | } |
359 | /* Convert the response */ | 472 | /* Convert the response */ |
360 | BN_bin2bn((unsigned char *)result->d, numbytes, r); | 473 | BN_bin2bn((unsigned char *)result->d, numbytes, r); |
361 | to_return = 1; | 474 | to_return = 1; |
362 | err: | 475 | err: |
363 | if(modulus) ctx->tos--; | 476 | BN_CTX_end(ctx); |
364 | if(exponent) ctx->tos--; | ||
365 | if(argument) ctx->tos--; | ||
366 | if(result) ctx->tos--; | ||
367 | return to_return; | 477 | return to_return; |
368 | } | 478 | } |
369 | 479 | ||
370 | static int atalla_rsa_mod_exp(BIGNUM *r0, BIGNUM *I, RSA *rsa) | 480 | #ifndef OPENSSL_NO_RSA |
481 | static int atalla_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa) | ||
371 | { | 482 | { |
372 | BN_CTX *ctx = NULL; | 483 | BN_CTX *ctx = NULL; |
373 | int to_return = 0; | 484 | int to_return = 0; |
374 | 485 | ||
375 | if(!atalla_dso) | 486 | if(!atalla_dso) |
376 | { | 487 | { |
377 | ENGINEerr(ENGINE_F_ATALLA_RSA_MOD_EXP,ENGINE_R_NOT_LOADED); | 488 | ATALLAerr(ATALLA_F_ATALLA_RSA_MOD_EXP,ATALLA_R_NOT_LOADED); |
378 | goto err; | 489 | goto err; |
379 | } | 490 | } |
380 | if((ctx = BN_CTX_new()) == NULL) | 491 | if((ctx = BN_CTX_new()) == NULL) |
381 | goto err; | 492 | goto err; |
382 | if(!rsa->d || !rsa->n) | 493 | if(!rsa->d || !rsa->n) |
383 | { | 494 | { |
384 | ENGINEerr(ENGINE_F_ATALLA_RSA_MOD_EXP,ENGINE_R_MISSING_KEY_COMPONENTS); | 495 | ATALLAerr(ATALLA_F_ATALLA_RSA_MOD_EXP,ATALLA_R_MISSING_KEY_COMPONENTS); |
385 | goto err; | 496 | goto err; |
386 | } | 497 | } |
387 | to_return = atalla_mod_exp(r0, I, rsa->d, rsa->n, ctx); | 498 | to_return = atalla_mod_exp(r0, I, rsa->d, rsa->n, ctx); |
@@ -390,7 +501,9 @@ err: | |||
390 | BN_CTX_free(ctx); | 501 | BN_CTX_free(ctx); |
391 | return to_return; | 502 | return to_return; |
392 | } | 503 | } |
504 | #endif | ||
393 | 505 | ||
506 | #ifndef OPENSSL_NO_DSA | ||
394 | /* This code was liberated and adapted from the commented-out code in | 507 | /* This code was liberated and adapted from the commented-out code in |
395 | * dsa_ossl.c. Because of the unoptimised form of the Atalla acceleration | 508 | * dsa_ossl.c. Because of the unoptimised form of the Atalla acceleration |
396 | * (it doesn't have a CRT form for RSA), this function means that an | 509 | * (it doesn't have a CRT form for RSA), this function means that an |
@@ -418,27 +531,45 @@ end: | |||
418 | return to_return; | 531 | return to_return; |
419 | } | 532 | } |
420 | 533 | ||
421 | |||
422 | static int atalla_mod_exp_dsa(DSA *dsa, BIGNUM *r, BIGNUM *a, | 534 | static int atalla_mod_exp_dsa(DSA *dsa, BIGNUM *r, BIGNUM *a, |
423 | const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, | 535 | const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, |
424 | BN_MONT_CTX *m_ctx) | 536 | BN_MONT_CTX *m_ctx) |
425 | { | 537 | { |
426 | return atalla_mod_exp(r, a, p, m, ctx); | 538 | return atalla_mod_exp(r, a, p, m, ctx); |
427 | } | 539 | } |
540 | #endif | ||
428 | 541 | ||
429 | /* This function is aliased to mod_exp (with the mont stuff dropped). */ | 542 | /* This function is aliased to mod_exp (with the mont stuff dropped). */ |
430 | static int atalla_mod_exp_mont(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 543 | static int atalla_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
431 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) | 544 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) |
432 | { | 545 | { |
433 | return atalla_mod_exp(r, a, p, m, ctx); | 546 | return atalla_mod_exp(r, a, p, m, ctx); |
434 | } | 547 | } |
435 | 548 | ||
549 | #ifndef OPENSSL_NO_DH | ||
436 | /* This function is aliased to mod_exp (with the dh and mont dropped). */ | 550 | /* This function is aliased to mod_exp (with the dh and mont dropped). */ |
437 | static int atalla_mod_exp_dh(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 551 | static int atalla_mod_exp_dh(const DH *dh, BIGNUM *r, |
552 | const BIGNUM *a, const BIGNUM *p, | ||
438 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) | 553 | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) |
439 | { | 554 | { |
440 | return atalla_mod_exp(r, a, p, m, ctx); | 555 | return atalla_mod_exp(r, a, p, m, ctx); |
441 | } | 556 | } |
557 | #endif | ||
558 | |||
559 | /* This stuff is needed if this ENGINE is being compiled into a self-contained | ||
560 | * shared-library. */ | ||
561 | #ifdef ENGINE_DYNAMIC_SUPPORT | ||
562 | static int bind_fn(ENGINE *e, const char *id) | ||
563 | { | ||
564 | if(id && (strcmp(id, engine_atalla_id) != 0)) | ||
565 | return 0; | ||
566 | if(!bind_helper(e)) | ||
567 | return 0; | ||
568 | return 1; | ||
569 | } | ||
570 | IMPLEMENT_DYNAMIC_CHECK_FN() | ||
571 | IMPLEMENT_DYNAMIC_BIND_FN(bind_fn) | ||
572 | #endif /* ENGINE_DYNAMIC_SUPPORT */ | ||
442 | 573 | ||
443 | #endif /* !NO_HW_ATALLA */ | 574 | #endif /* !OPENSSL_NO_HW_ATALLA */ |
444 | #endif /* !NO_HW */ | 575 | #endif /* !OPENSSL_NO_HW */ |