e_sureware.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. /* Written by Corinne Dive-Reclus(cdive@baltimore.com)
  2. *
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in
  13. * the documentation and/or other materials provided with the
  14. * distribution.
  15. *
  16. * 3. All advertising materials mentioning features or use of this
  17. * software must display the following acknowledgment:
  18. * "This product includes software developed by the OpenSSL Project
  19. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  20. *
  21. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  22. * endorse or promote products derived from this software without
  23. * prior written permission. For written permission, please contact
  24. * licensing@OpenSSL.org.
  25. *
  26. * 5. Products derived from this software may not be called "OpenSSL"
  27. * nor may "OpenSSL" appear in their names without prior written
  28. * permission of the OpenSSL Project.
  29. *
  30. * 6. Redistributions of any form whatsoever must retain the following
  31. * acknowledgment:
  32. * "This product includes software developed by the OpenSSL Project
  33. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  34. *
  35. * Written by Corinne Dive-Reclus(cdive@baltimore.com)
  36. *
  37. * Copyright@2001 Baltimore Technologies Ltd.
  38. * All right Reserved.
  39. * *
  40. * THIS FILE IS PROVIDED BY BALTIMORE TECHNOLOGIES ``AS IS'' AND *
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
  43. * ARE DISCLAIMED. IN NO EVENT SHALL BALTIMORE TECHNOLOGIES BE LIABLE *
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
  50. * SUCH DAMAGE. *
  51. ====================================================================*/
  52. #include <stdio.h>
  53. #include <string.h>
  54. #include <openssl/crypto.h>
  55. #include <openssl/pem.h>
  56. #include <openssl/dso.h>
  57. #include <openssl/engine.h>
  58. #ifndef OPENSSL_NO_HW
  59. #ifndef OPENSSL_NO_HW_SUREWARE
  60. #ifdef FLAT_INC
  61. #include "sureware.h"
  62. #else
  63. #include "vendor_defns/sureware.h"
  64. #endif
  65. #define SUREWARE_LIB_NAME "sureware engine"
  66. #include "e_sureware_err.c"
  67. static int surewarehk_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)());
  68. static int surewarehk_destroy(ENGINE *e);
  69. static int surewarehk_init(ENGINE *e);
  70. static int surewarehk_finish(ENGINE *e);
  71. static int surewarehk_modexp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  72. const BIGNUM *m, BN_CTX *ctx);
  73. /* RSA stuff */
  74. static int surewarehk_rsa_priv_dec(int flen,const unsigned char *from,unsigned char *to,
  75. RSA *rsa,int padding);
  76. static int surewarehk_rsa_sign(int flen,const unsigned char *from,unsigned char *to,
  77. RSA *rsa,int padding);
  78. /* RAND stuff */
  79. static int surewarehk_rand_bytes(unsigned char *buf, int num);
  80. static void surewarehk_rand_seed(const void *buf, int num);
  81. static void surewarehk_rand_add(const void *buf, int num, double entropy);
  82. /* KM stuff */
  83. static EVP_PKEY *surewarehk_load_privkey(ENGINE *e, const char *key_id,
  84. UI_METHOD *ui_method, void *callback_data);
  85. static EVP_PKEY *surewarehk_load_pubkey(ENGINE *e, const char *key_id,
  86. UI_METHOD *ui_method, void *callback_data);
  87. static void surewarehk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
  88. int idx,long argl, void *argp);
  89. #if 0
  90. static void surewarehk_dh_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
  91. int idx,long argl, void *argp);
  92. #endif
  93. #ifndef OPENSSL_NO_RSA
  94. /* This function is aliased to mod_exp (with the mont stuff dropped). */
  95. static int surewarehk_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  96. const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
  97. {
  98. return surewarehk_modexp(r, a, p, m, ctx);
  99. }
  100. /* Our internal RSA_METHOD that we provide pointers to */
  101. static RSA_METHOD surewarehk_rsa =
  102. {
  103. "SureWare RSA method",
  104. NULL, /* pub_enc*/
  105. NULL, /* pub_dec*/
  106. surewarehk_rsa_sign, /* our rsa_sign is OpenSSL priv_enc*/
  107. surewarehk_rsa_priv_dec, /* priv_dec*/
  108. NULL, /*mod_exp*/
  109. surewarehk_mod_exp_mont, /*mod_exp_mongomery*/
  110. NULL, /* init*/
  111. NULL, /* finish*/
  112. 0, /* RSA flag*/
  113. NULL,
  114. NULL, /* OpenSSL sign*/
  115. NULL /* OpenSSL verify*/
  116. };
  117. #endif
  118. #ifndef OPENSSL_NO_DH
  119. /* Our internal DH_METHOD that we provide pointers to */
  120. /* This function is aliased to mod_exp (with the dh and mont dropped). */
  121. static int surewarehk_modexp_dh(const DH *dh, BIGNUM *r, const BIGNUM *a,
  122. const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
  123. {
  124. return surewarehk_modexp(r, a, p, m, ctx);
  125. }
  126. static DH_METHOD surewarehk_dh =
  127. {
  128. "SureWare DH method",
  129. NULL,/*gen_key*/
  130. NULL,/*agree,*/
  131. surewarehk_modexp_dh, /*dh mod exp*/
  132. NULL, /* init*/
  133. NULL, /* finish*/
  134. 0, /* flags*/
  135. NULL
  136. };
  137. #endif
  138. static RAND_METHOD surewarehk_rand =
  139. {
  140. /* "SureWare RAND method", */
  141. surewarehk_rand_seed,
  142. surewarehk_rand_bytes,
  143. NULL,/*cleanup*/
  144. surewarehk_rand_add,
  145. surewarehk_rand_bytes,
  146. NULL,/*rand_status*/
  147. };
  148. #ifndef OPENSSL_NO_DSA
  149. /* DSA stuff */
  150. static DSA_SIG * surewarehk_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa);
  151. static int surewarehk_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1,
  152. BIGNUM *p1, BIGNUM *a2, BIGNUM *p2, BIGNUM *m,
  153. BN_CTX *ctx, BN_MONT_CTX *in_mont)
  154. {
  155. BIGNUM t;
  156. int to_return = 0;
  157. BN_init(&t);
  158. /* let rr = a1 ^ p1 mod m */
  159. if (!surewarehk_modexp(rr,a1,p1,m,ctx)) goto end;
  160. /* let t = a2 ^ p2 mod m */
  161. if (!surewarehk_modexp(&t,a2,p2,m,ctx)) goto end;
  162. /* let rr = rr * t mod m */
  163. if (!BN_mod_mul(rr,rr,&t,m,ctx)) goto end;
  164. to_return = 1;
  165. end:
  166. BN_free(&t);
  167. return to_return;
  168. }
  169. static DSA_METHOD surewarehk_dsa =
  170. {
  171. "SureWare DSA method",
  172. surewarehk_dsa_do_sign,
  173. NULL,/*sign setup*/
  174. NULL,/*verify,*/
  175. surewarehk_dsa_mod_exp,/*mod exp*/
  176. NULL,/*bn mod exp*/
  177. NULL, /*init*/
  178. NULL,/*finish*/
  179. 0,
  180. NULL,
  181. };
  182. #endif
  183. static const char *engine_sureware_id = "sureware";
  184. static const char *engine_sureware_name = "SureWare hardware engine support";
  185. /* Now, to our own code */
  186. /* As this is only ever called once, there's no need for locking
  187. * (indeed - the lock will already be held by our caller!!!) */
  188. static int bind_sureware(ENGINE *e)
  189. {
  190. #ifndef OPENSSL_NO_RSA
  191. const RSA_METHOD *meth1;
  192. #endif
  193. #ifndef OPENSSL_NO_DSA
  194. const DSA_METHOD *meth2;
  195. #endif
  196. #ifndef OPENSSL_NO_DH
  197. const DH_METHOD *meth3;
  198. #endif
  199. if(!ENGINE_set_id(e, engine_sureware_id) ||
  200. !ENGINE_set_name(e, engine_sureware_name) ||
  201. #ifndef OPENSSL_NO_RSA
  202. !ENGINE_set_RSA(e, &surewarehk_rsa) ||
  203. #endif
  204. #ifndef OPENSSL_NO_DSA
  205. !ENGINE_set_DSA(e, &surewarehk_dsa) ||
  206. #endif
  207. #ifndef OPENSSL_NO_DH
  208. !ENGINE_set_DH(e, &surewarehk_dh) ||
  209. #endif
  210. !ENGINE_set_RAND(e, &surewarehk_rand) ||
  211. !ENGINE_set_destroy_function(e, surewarehk_destroy) ||
  212. !ENGINE_set_init_function(e, surewarehk_init) ||
  213. !ENGINE_set_finish_function(e, surewarehk_finish) ||
  214. !ENGINE_set_ctrl_function(e, surewarehk_ctrl) ||
  215. !ENGINE_set_load_privkey_function(e, surewarehk_load_privkey) ||
  216. !ENGINE_set_load_pubkey_function(e, surewarehk_load_pubkey))
  217. return 0;
  218. #ifndef OPENSSL_NO_RSA
  219. /* We know that the "PKCS1_SSLeay()" functions hook properly
  220. * to the cswift-specific mod_exp and mod_exp_crt so we use
  221. * those functions. NB: We don't use ENGINE_openssl() or
  222. * anything "more generic" because something like the RSAref
  223. * code may not hook properly, and if you own one of these
  224. * cards then you have the right to do RSA operations on it
  225. * anyway! */
  226. meth1 = RSA_PKCS1_SSLeay();
  227. if (meth1)
  228. {
  229. surewarehk_rsa.rsa_pub_enc = meth1->rsa_pub_enc;
  230. surewarehk_rsa.rsa_pub_dec = meth1->rsa_pub_dec;
  231. }
  232. #endif
  233. #ifndef OPENSSL_NO_DSA
  234. /* Use the DSA_OpenSSL() method and just hook the mod_exp-ish
  235. * bits. */
  236. meth2 = DSA_OpenSSL();
  237. if (meth2)
  238. {
  239. surewarehk_dsa.dsa_do_verify = meth2->dsa_do_verify;
  240. }
  241. #endif
  242. #ifndef OPENSSL_NO_DH
  243. /* Much the same for Diffie-Hellman */
  244. meth3 = DH_OpenSSL();
  245. if (meth3)
  246. {
  247. surewarehk_dh.generate_key = meth3->generate_key;
  248. surewarehk_dh.compute_key = meth3->compute_key;
  249. }
  250. #endif
  251. /* Ensure the sureware error handling is set up */
  252. ERR_load_SUREWARE_strings();
  253. return 1;
  254. }
  255. #ifndef OPENSSL_NO_DYNAMIC_ENGINE
  256. static int bind_helper(ENGINE *e, const char *id)
  257. {
  258. if(id && (strcmp(id, engine_sureware_id) != 0))
  259. return 0;
  260. if(!bind_sureware(e))
  261. return 0;
  262. return 1;
  263. }
  264. IMPLEMENT_DYNAMIC_CHECK_FN()
  265. IMPLEMENT_DYNAMIC_BIND_FN(bind_helper)
  266. #else
  267. static ENGINE *engine_sureware(void)
  268. {
  269. ENGINE *ret = ENGINE_new();
  270. if(!ret)
  271. return NULL;
  272. if(!bind_sureware(ret))
  273. {
  274. ENGINE_free(ret);
  275. return NULL;
  276. }
  277. return ret;
  278. }
  279. void ENGINE_load_sureware(void)
  280. {
  281. /* Copied from eng_[openssl|dyn].c */
  282. ENGINE *toadd = engine_sureware();
  283. if(!toadd) return;
  284. ENGINE_add(toadd);
  285. ENGINE_free(toadd);
  286. ERR_clear_error();
  287. }
  288. #endif
  289. /* This is a process-global DSO handle used for loading and unloading
  290. * the SureWareHook library. NB: This is only set (or unset) during an
  291. * init() or finish() call (reference counts permitting) and they're
  292. * operating with global locks, so this should be thread-safe
  293. * implicitly. */
  294. static DSO *surewarehk_dso = NULL;
  295. #ifndef OPENSSL_NO_RSA
  296. static int rsaHndidx = -1; /* Index for KM handle. Not really used yet. */
  297. #endif
  298. #ifndef OPENSSL_NO_DSA
  299. static int dsaHndidx = -1; /* Index for KM handle. Not really used yet. */
  300. #endif
  301. /* These are the function pointers that are (un)set when the library has
  302. * successfully (un)loaded. */
  303. static SureWareHook_Init_t *p_surewarehk_Init = NULL;
  304. static SureWareHook_Finish_t *p_surewarehk_Finish = NULL;
  305. static SureWareHook_Rand_Bytes_t *p_surewarehk_Rand_Bytes = NULL;
  306. static SureWareHook_Rand_Seed_t *p_surewarehk_Rand_Seed = NULL;
  307. static SureWareHook_Load_Privkey_t *p_surewarehk_Load_Privkey = NULL;
  308. static SureWareHook_Info_Pubkey_t *p_surewarehk_Info_Pubkey = NULL;
  309. static SureWareHook_Load_Rsa_Pubkey_t *p_surewarehk_Load_Rsa_Pubkey = NULL;
  310. static SureWareHook_Load_Dsa_Pubkey_t *p_surewarehk_Load_Dsa_Pubkey = NULL;
  311. static SureWareHook_Free_t *p_surewarehk_Free=NULL;
  312. static SureWareHook_Rsa_Priv_Dec_t *p_surewarehk_Rsa_Priv_Dec=NULL;
  313. static SureWareHook_Rsa_Sign_t *p_surewarehk_Rsa_Sign=NULL;
  314. static SureWareHook_Dsa_Sign_t *p_surewarehk_Dsa_Sign=NULL;
  315. static SureWareHook_Mod_Exp_t *p_surewarehk_Mod_Exp=NULL;
  316. /* Used in the DSO operations. */
  317. static const char *surewarehk_LIBNAME = "SureWareHook";
  318. static const char *n_surewarehk_Init = "SureWareHook_Init";
  319. static const char *n_surewarehk_Finish = "SureWareHook_Finish";
  320. static const char *n_surewarehk_Rand_Bytes="SureWareHook_Rand_Bytes";
  321. static const char *n_surewarehk_Rand_Seed="SureWareHook_Rand_Seed";
  322. static const char *n_surewarehk_Load_Privkey="SureWareHook_Load_Privkey";
  323. static const char *n_surewarehk_Info_Pubkey="SureWareHook_Info_Pubkey";
  324. static const char *n_surewarehk_Load_Rsa_Pubkey="SureWareHook_Load_Rsa_Pubkey";
  325. static const char *n_surewarehk_Load_Dsa_Pubkey="SureWareHook_Load_Dsa_Pubkey";
  326. static const char *n_surewarehk_Free="SureWareHook_Free";
  327. static const char *n_surewarehk_Rsa_Priv_Dec="SureWareHook_Rsa_Priv_Dec";
  328. static const char *n_surewarehk_Rsa_Sign="SureWareHook_Rsa_Sign";
  329. static const char *n_surewarehk_Dsa_Sign="SureWareHook_Dsa_Sign";
  330. static const char *n_surewarehk_Mod_Exp="SureWareHook_Mod_Exp";
  331. static BIO *logstream = NULL;
  332. /* SureWareHook library functions and mechanics - these are used by the
  333. * higher-level functions further down. NB: As and where there's no
  334. * error checking, take a look lower down where these functions are
  335. * called, the checking and error handling is probably down there.
  336. */
  337. static int threadsafe=1;
  338. static int surewarehk_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
  339. {
  340. int to_return = 1;
  341. switch(cmd)
  342. {
  343. case ENGINE_CTRL_SET_LOGSTREAM:
  344. {
  345. BIO *bio = (BIO *)p;
  346. CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
  347. if (logstream)
  348. {
  349. BIO_free(logstream);
  350. logstream = NULL;
  351. }
  352. if (CRYPTO_add(&bio->references,1,CRYPTO_LOCK_BIO) > 1)
  353. logstream = bio;
  354. else
  355. SUREWAREerr(SUREWARE_F_SUREWAREHK_CTRL,SUREWARE_R_BIO_WAS_FREED);
  356. }
  357. CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
  358. break;
  359. /* This will prevent the initialisation function from "installing"
  360. * the mutex-handling callbacks, even if they are available from
  361. * within the library (or were provided to the library from the
  362. * calling application). This is to remove any baggage for
  363. * applications not using multithreading. */
  364. case ENGINE_CTRL_CHIL_NO_LOCKING:
  365. CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
  366. threadsafe = 0;
  367. CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
  368. break;
  369. /* The command isn't understood by this engine */
  370. default:
  371. SUREWAREerr(SUREWARE_F_SUREWAREHK_CTRL,
  372. ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED);
  373. to_return = 0;
  374. break;
  375. }
  376. return to_return;
  377. }
  378. /* Destructor (complements the "ENGINE_surewarehk()" constructor) */
  379. static int surewarehk_destroy(ENGINE *e)
  380. {
  381. ERR_unload_SUREWARE_strings();
  382. return 1;
  383. }
  384. /* (de)initialisation functions. */
  385. static int surewarehk_init(ENGINE *e)
  386. {
  387. char msg[64]="ENGINE_init";
  388. SureWareHook_Init_t *p1=NULL;
  389. SureWareHook_Finish_t *p2=NULL;
  390. SureWareHook_Rand_Bytes_t *p3=NULL;
  391. SureWareHook_Rand_Seed_t *p4=NULL;
  392. SureWareHook_Load_Privkey_t *p5=NULL;
  393. SureWareHook_Load_Rsa_Pubkey_t *p6=NULL;
  394. SureWareHook_Free_t *p7=NULL;
  395. SureWareHook_Rsa_Priv_Dec_t *p8=NULL;
  396. SureWareHook_Rsa_Sign_t *p9=NULL;
  397. SureWareHook_Dsa_Sign_t *p12=NULL;
  398. SureWareHook_Info_Pubkey_t *p13=NULL;
  399. SureWareHook_Load_Dsa_Pubkey_t *p14=NULL;
  400. SureWareHook_Mod_Exp_t *p15=NULL;
  401. if(surewarehk_dso != NULL)
  402. {
  403. SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_ALREADY_LOADED);
  404. goto err;
  405. }
  406. /* Attempt to load libsurewarehk.so/surewarehk.dll/whatever. */
  407. surewarehk_dso = DSO_load(NULL, surewarehk_LIBNAME, NULL, 0);
  408. if(surewarehk_dso == NULL)
  409. {
  410. SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_DSO_FAILURE);
  411. goto err;
  412. }
  413. if(!(p1=(SureWareHook_Init_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Init)) ||
  414. !(p2=(SureWareHook_Finish_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Finish)) ||
  415. !(p3=(SureWareHook_Rand_Bytes_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rand_Bytes)) ||
  416. !(p4=(SureWareHook_Rand_Seed_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rand_Seed)) ||
  417. !(p5=(SureWareHook_Load_Privkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Privkey)) ||
  418. !(p6=(SureWareHook_Load_Rsa_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Rsa_Pubkey)) ||
  419. !(p7=(SureWareHook_Free_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Free)) ||
  420. !(p8=(SureWareHook_Rsa_Priv_Dec_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rsa_Priv_Dec)) ||
  421. !(p9=(SureWareHook_Rsa_Sign_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Rsa_Sign)) ||
  422. !(p12=(SureWareHook_Dsa_Sign_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Dsa_Sign)) ||
  423. !(p13=(SureWareHook_Info_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Info_Pubkey)) ||
  424. !(p14=(SureWareHook_Load_Dsa_Pubkey_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Load_Dsa_Pubkey)) ||
  425. !(p15=(SureWareHook_Mod_Exp_t*)DSO_bind_func(surewarehk_dso, n_surewarehk_Mod_Exp)))
  426. {
  427. SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,ENGINE_R_DSO_FAILURE);
  428. goto err;
  429. }
  430. /* Copy the pointers */
  431. p_surewarehk_Init = p1;
  432. p_surewarehk_Finish = p2;
  433. p_surewarehk_Rand_Bytes = p3;
  434. p_surewarehk_Rand_Seed = p4;
  435. p_surewarehk_Load_Privkey = p5;
  436. p_surewarehk_Load_Rsa_Pubkey = p6;
  437. p_surewarehk_Free = p7;
  438. p_surewarehk_Rsa_Priv_Dec = p8;
  439. p_surewarehk_Rsa_Sign = p9;
  440. p_surewarehk_Dsa_Sign = p12;
  441. p_surewarehk_Info_Pubkey = p13;
  442. p_surewarehk_Load_Dsa_Pubkey = p14;
  443. p_surewarehk_Mod_Exp = p15;
  444. /* Contact the hardware and initialises it. */
  445. if(p_surewarehk_Init(msg,threadsafe)==SUREWAREHOOK_ERROR_UNIT_FAILURE)
  446. {
  447. SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,SUREWARE_R_UNIT_FAILURE);
  448. goto err;
  449. }
  450. if(p_surewarehk_Init(msg,threadsafe)==SUREWAREHOOK_ERROR_UNIT_FAILURE)
  451. {
  452. SUREWAREerr(SUREWARE_F_SUREWAREHK_INIT,SUREWARE_R_UNIT_FAILURE);
  453. goto err;
  454. }
  455. /* try to load the default private key, if failed does not return a failure but
  456. wait for an explicit ENGINE_load_privakey */
  457. surewarehk_load_privkey(e,NULL,NULL,NULL);
  458. /* Everything's fine. */
  459. #ifndef OPENSSL_NO_RSA
  460. if (rsaHndidx == -1)
  461. rsaHndidx = RSA_get_ex_new_index(0,
  462. "SureWareHook RSA key handle",
  463. NULL, NULL, surewarehk_ex_free);
  464. #endif
  465. #ifndef OPENSSL_NO_DSA
  466. if (dsaHndidx == -1)
  467. dsaHndidx = DSA_get_ex_new_index(0,
  468. "SureWareHook DSA key handle",
  469. NULL, NULL, surewarehk_ex_free);
  470. #endif
  471. return 1;
  472. err:
  473. if(surewarehk_dso)
  474. DSO_free(surewarehk_dso);
  475. surewarehk_dso = NULL;
  476. p_surewarehk_Init = NULL;
  477. p_surewarehk_Finish = NULL;
  478. p_surewarehk_Rand_Bytes = NULL;
  479. p_surewarehk_Rand_Seed = NULL;
  480. p_surewarehk_Load_Privkey = NULL;
  481. p_surewarehk_Load_Rsa_Pubkey = NULL;
  482. p_surewarehk_Free = NULL;
  483. p_surewarehk_Rsa_Priv_Dec = NULL;
  484. p_surewarehk_Rsa_Sign = NULL;
  485. p_surewarehk_Dsa_Sign = NULL;
  486. p_surewarehk_Info_Pubkey = NULL;
  487. p_surewarehk_Load_Dsa_Pubkey = NULL;
  488. p_surewarehk_Mod_Exp = NULL;
  489. return 0;
  490. }
  491. static int surewarehk_finish(ENGINE *e)
  492. {
  493. int to_return = 1;
  494. if(surewarehk_dso == NULL)
  495. {
  496. SUREWAREerr(SUREWARE_F_SUREWAREHK_FINISH,ENGINE_R_NOT_LOADED);
  497. to_return = 0;
  498. goto err;
  499. }
  500. p_surewarehk_Finish();
  501. if(!DSO_free(surewarehk_dso))
  502. {
  503. SUREWAREerr(SUREWARE_F_SUREWAREHK_FINISH,ENGINE_R_DSO_FAILURE);
  504. to_return = 0;
  505. goto err;
  506. }
  507. err:
  508. if (logstream)
  509. BIO_free(logstream);
  510. surewarehk_dso = NULL;
  511. p_surewarehk_Init = NULL;
  512. p_surewarehk_Finish = NULL;
  513. p_surewarehk_Rand_Bytes = NULL;
  514. p_surewarehk_Rand_Seed = NULL;
  515. p_surewarehk_Load_Privkey = NULL;
  516. p_surewarehk_Load_Rsa_Pubkey = NULL;
  517. p_surewarehk_Free = NULL;
  518. p_surewarehk_Rsa_Priv_Dec = NULL;
  519. p_surewarehk_Rsa_Sign = NULL;
  520. p_surewarehk_Dsa_Sign = NULL;
  521. p_surewarehk_Info_Pubkey = NULL;
  522. p_surewarehk_Load_Dsa_Pubkey = NULL;
  523. p_surewarehk_Mod_Exp = NULL;
  524. return to_return;
  525. }
  526. static void surewarehk_error_handling(char *const msg,int func,int ret)
  527. {
  528. switch (ret)
  529. {
  530. case SUREWAREHOOK_ERROR_UNIT_FAILURE:
  531. ENGINEerr(func,SUREWARE_R_UNIT_FAILURE);
  532. break;
  533. case SUREWAREHOOK_ERROR_FALLBACK:
  534. ENGINEerr(func,SUREWARE_R_REQUEST_FALLBACK);
  535. break;
  536. case SUREWAREHOOK_ERROR_DATA_SIZE:
  537. ENGINEerr(func,SUREWARE_R_SIZE_TOO_LARGE_OR_TOO_SMALL);
  538. break;
  539. case SUREWAREHOOK_ERROR_INVALID_PAD:
  540. ENGINEerr(func,RSA_R_PADDING_CHECK_FAILED);
  541. break;
  542. default:
  543. ENGINEerr(func,SUREWARE_R_REQUEST_FAILED);
  544. break;
  545. case 1:/*nothing*/
  546. msg[0]='\0';
  547. }
  548. if (*msg)
  549. {
  550. ERR_add_error_data(1,msg);
  551. if (logstream)
  552. {
  553. CRYPTO_w_lock(CRYPTO_LOCK_BIO);
  554. BIO_write(logstream, msg, strlen(msg));
  555. CRYPTO_w_unlock(CRYPTO_LOCK_BIO);
  556. }
  557. }
  558. }
  559. static int surewarehk_rand_bytes(unsigned char *buf, int num)
  560. {
  561. int ret=0;
  562. char msg[64]="ENGINE_rand_bytes";
  563. if(!p_surewarehk_Rand_Bytes)
  564. {
  565. SUREWAREerr(SUREWARE_F_SUREWAREHK_RAND_BYTES,ENGINE_R_NOT_INITIALISED);
  566. }
  567. else
  568. {
  569. ret = p_surewarehk_Rand_Bytes(msg,buf, num);
  570. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RAND_BYTES,ret);
  571. }
  572. return ret==1 ? 1 : 0;
  573. }
  574. static void surewarehk_rand_seed(const void *buf, int num)
  575. {
  576. int ret=0;
  577. char msg[64]="ENGINE_rand_seed";
  578. if(!p_surewarehk_Rand_Seed)
  579. {
  580. SUREWAREerr(SUREWARE_F_SUREWAREHK_RAND_SEED,ENGINE_R_NOT_INITIALISED);
  581. }
  582. else
  583. {
  584. ret = p_surewarehk_Rand_Seed(msg,buf, num);
  585. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RAND_SEED,ret);
  586. }
  587. }
  588. static void surewarehk_rand_add(const void *buf, int num, double entropy)
  589. {
  590. surewarehk_rand_seed(buf,num);
  591. }
  592. static EVP_PKEY* sureware_load_public(ENGINE *e,const char *key_id,char *hptr,unsigned long el,char keytype)
  593. {
  594. EVP_PKEY *res = NULL;
  595. #ifndef OPENSSL_NO_RSA
  596. RSA *rsatmp = NULL;
  597. #endif
  598. #ifndef OPENSSL_NO_DSA
  599. DSA *dsatmp=NULL;
  600. #endif
  601. char msg[64]="sureware_load_public";
  602. int ret=0;
  603. if(!p_surewarehk_Load_Rsa_Pubkey || !p_surewarehk_Load_Dsa_Pubkey)
  604. {
  605. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBLIC_KEY,ENGINE_R_NOT_INITIALISED);
  606. goto err;
  607. }
  608. switch (keytype)
  609. {
  610. #ifndef OPENSSL_NO_RSA
  611. case 1: /*RSA*/
  612. /* set private external reference */
  613. rsatmp = RSA_new_method(e);
  614. RSA_set_ex_data(rsatmp,rsaHndidx,hptr);
  615. rsatmp->flags |= RSA_FLAG_EXT_PKEY;
  616. /* set public big nums*/
  617. rsatmp->e = BN_new();
  618. rsatmp->n = BN_new();
  619. bn_expand2(rsatmp->e, el/sizeof(BN_ULONG));
  620. bn_expand2(rsatmp->n, el/sizeof(BN_ULONG));
  621. if (!rsatmp->e || rsatmp->e->dmax!=(int)(el/sizeof(BN_ULONG))||
  622. !rsatmp->n || rsatmp->n->dmax!=(int)(el/sizeof(BN_ULONG)))
  623. goto err;
  624. ret=p_surewarehk_Load_Rsa_Pubkey(msg,key_id,el,
  625. (unsigned long *)rsatmp->n->d,
  626. (unsigned long *)rsatmp->e->d);
  627. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_LOAD_PUBLIC_KEY,ret);
  628. if (ret!=1)
  629. {
  630. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVATE_KEY,ENGINE_R_FAILED_LOADING_PUBLIC_KEY);
  631. goto err;
  632. }
  633. /* normalise pub e and pub n */
  634. rsatmp->e->top=el/sizeof(BN_ULONG);
  635. bn_fix_top(rsatmp->e);
  636. rsatmp->n->top=el/sizeof(BN_ULONG);
  637. bn_fix_top(rsatmp->n);
  638. /* create an EVP object: engine + rsa key */
  639. res = EVP_PKEY_new();
  640. EVP_PKEY_assign_RSA(res, rsatmp);
  641. break;
  642. #endif
  643. #ifndef OPENSSL_NO_DSA
  644. case 2:/*DSA*/
  645. /* set private/public external reference */
  646. dsatmp = DSA_new_method(e);
  647. DSA_set_ex_data(dsatmp,dsaHndidx,hptr);
  648. /*dsatmp->flags |= DSA_FLAG_EXT_PKEY;*/
  649. /* set public key*/
  650. dsatmp->pub_key = BN_new();
  651. dsatmp->p = BN_new();
  652. dsatmp->q = BN_new();
  653. dsatmp->g = BN_new();
  654. bn_expand2(dsatmp->pub_key, el/sizeof(BN_ULONG));
  655. bn_expand2(dsatmp->p, el/sizeof(BN_ULONG));
  656. bn_expand2(dsatmp->q, 20/sizeof(BN_ULONG));
  657. bn_expand2(dsatmp->g, el/sizeof(BN_ULONG));
  658. if (!dsatmp->pub_key || dsatmp->pub_key->dmax!=(int)(el/sizeof(BN_ULONG))||
  659. !dsatmp->p || dsatmp->p->dmax!=(int)(el/sizeof(BN_ULONG)) ||
  660. !dsatmp->q || dsatmp->q->dmax!=20/sizeof(BN_ULONG) ||
  661. !dsatmp->g || dsatmp->g->dmax!=(int)(el/sizeof(BN_ULONG)))
  662. goto err;
  663. ret=p_surewarehk_Load_Dsa_Pubkey(msg,key_id,el,
  664. (unsigned long *)dsatmp->pub_key->d,
  665. (unsigned long *)dsatmp->p->d,
  666. (unsigned long *)dsatmp->q->d,
  667. (unsigned long *)dsatmp->g->d);
  668. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_LOAD_PUBLIC_KEY,ret);
  669. if (ret!=1)
  670. {
  671. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVATE_KEY,ENGINE_R_FAILED_LOADING_PUBLIC_KEY);
  672. goto err;
  673. }
  674. /* set parameters */
  675. /* normalise pubkey and parameters in case of */
  676. dsatmp->pub_key->top=el/sizeof(BN_ULONG);
  677. bn_fix_top(dsatmp->pub_key);
  678. dsatmp->p->top=el/sizeof(BN_ULONG);
  679. bn_fix_top(dsatmp->p);
  680. dsatmp->q->top=20/sizeof(BN_ULONG);
  681. bn_fix_top(dsatmp->q);
  682. dsatmp->g->top=el/sizeof(BN_ULONG);
  683. bn_fix_top(dsatmp->g);
  684. /* create an EVP object: engine + rsa key */
  685. res = EVP_PKEY_new();
  686. EVP_PKEY_assign_DSA(res, dsatmp);
  687. break;
  688. #endif
  689. default:
  690. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVATE_KEY,ENGINE_R_FAILED_LOADING_PRIVATE_KEY);
  691. goto err;
  692. }
  693. return res;
  694. err:
  695. if (res)
  696. EVP_PKEY_free(res);
  697. #ifndef OPENSSL_NO_RSA
  698. if (rsatmp)
  699. RSA_free(rsatmp);
  700. #endif
  701. #ifndef OPENSSL_NO_DSA
  702. if (dsatmp)
  703. DSA_free(dsatmp);
  704. #endif
  705. return NULL;
  706. }
  707. static EVP_PKEY *surewarehk_load_privkey(ENGINE *e, const char *key_id,
  708. UI_METHOD *ui_method, void *callback_data)
  709. {
  710. EVP_PKEY *res = NULL;
  711. int ret=0;
  712. unsigned long el=0;
  713. char *hptr=NULL;
  714. char keytype=0;
  715. char msg[64]="ENGINE_load_privkey";
  716. if(!p_surewarehk_Load_Privkey)
  717. {
  718. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVATE_KEY,ENGINE_R_NOT_INITIALISED);
  719. }
  720. else
  721. {
  722. ret=p_surewarehk_Load_Privkey(msg,key_id,&hptr,&el,&keytype);
  723. if (ret!=1)
  724. {
  725. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVATE_KEY,ENGINE_R_FAILED_LOADING_PRIVATE_KEY);
  726. ERR_add_error_data(1,msg);
  727. }
  728. else
  729. res=sureware_load_public(e,key_id,hptr,el,keytype);
  730. }
  731. return res;
  732. }
  733. static EVP_PKEY *surewarehk_load_pubkey(ENGINE *e, const char *key_id,
  734. UI_METHOD *ui_method, void *callback_data)
  735. {
  736. EVP_PKEY *res = NULL;
  737. int ret=0;
  738. unsigned long el=0;
  739. char *hptr=NULL;
  740. char keytype=0;
  741. char msg[64]="ENGINE_load_pubkey";
  742. if(!p_surewarehk_Info_Pubkey)
  743. {
  744. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBLIC_KEY,ENGINE_R_NOT_INITIALISED);
  745. }
  746. else
  747. {
  748. /* call once to identify if DSA or RSA */
  749. ret=p_surewarehk_Info_Pubkey(msg,key_id,&el,&keytype);
  750. if (ret!=1)
  751. {
  752. SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBLIC_KEY,ENGINE_R_FAILED_LOADING_PUBLIC_KEY);
  753. ERR_add_error_data(1,msg);
  754. }
  755. else
  756. res=sureware_load_public(e,key_id,hptr,el,keytype);
  757. }
  758. return res;
  759. }
  760. /* This cleans up an RSA/DSA KM key(do not destroy the key into the hardware)
  761. , called when ex_data is freed */
  762. static void surewarehk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
  763. int idx,long argl, void *argp)
  764. {
  765. if(!p_surewarehk_Free)
  766. {
  767. SUREWAREerr(SUREWARE_F_SUREWAREHK_EX_FREE,ENGINE_R_NOT_INITIALISED);
  768. }
  769. else
  770. p_surewarehk_Free((char *)item,0);
  771. }
  772. #if 0
  773. /* not currently used (bug?) */
  774. /* This cleans up an DH KM key (destroys the key into hardware),
  775. called when ex_data is freed */
  776. static void surewarehk_dh_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,
  777. int idx,long argl, void *argp)
  778. {
  779. if(!p_surewarehk_Free)
  780. {
  781. SUREWAREerr(SUREWARE_F_SUREWAREHK_EX_FREE,ENGINE_R_NOT_INITIALISED);
  782. }
  783. else
  784. p_surewarehk_Free((char *)item,1);
  785. }
  786. #endif
  787. /*
  788. * return number of decrypted bytes
  789. */
  790. #ifndef OPENSSL_NO_RSA
  791. static int surewarehk_rsa_priv_dec(int flen,const unsigned char *from,unsigned char *to,
  792. RSA *rsa,int padding)
  793. {
  794. int ret=0,tlen;
  795. char *buf=NULL,*hptr=NULL;
  796. char msg[64]="ENGINE_rsa_priv_dec";
  797. if (!p_surewarehk_Rsa_Priv_Dec)
  798. {
  799. SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ENGINE_R_NOT_INITIALISED);
  800. }
  801. /* extract ref to private key */
  802. else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx)))
  803. {
  804. SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_MISSING_KEY_COMPONENTS);
  805. goto err;
  806. }
  807. /* analyse what padding we can do into the hardware */
  808. if (padding==RSA_PKCS1_PADDING)
  809. {
  810. /* do it one shot */
  811. ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD);
  812. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret);
  813. if (ret!=1)
  814. goto err;
  815. ret=tlen;
  816. }
  817. else /* do with no padding into hardware */
  818. {
  819. ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_NO_PAD);
  820. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret);
  821. if (ret!=1)
  822. goto err;
  823. /* intermediate buffer for padding */
  824. if ((buf=OPENSSL_malloc(tlen)) == NULL)
  825. {
  826. RSAerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ERR_R_MALLOC_FAILURE);
  827. goto err;
  828. }
  829. memcpy(buf,to,tlen);/* transfert to into buf */
  830. switch (padding) /* check padding in software */
  831. {
  832. #ifndef OPENSSL_NO_SHA
  833. case RSA_PKCS1_OAEP_PADDING:
  834. ret=RSA_padding_check_PKCS1_OAEP(to,tlen,(unsigned char *)buf,tlen,tlen,NULL,0);
  835. break;
  836. #endif
  837. case RSA_SSLV23_PADDING:
  838. ret=RSA_padding_check_SSLv23(to,tlen,(unsigned char *)buf,flen,tlen);
  839. break;
  840. case RSA_NO_PADDING:
  841. ret=RSA_padding_check_none(to,tlen,(unsigned char *)buf,flen,tlen);
  842. break;
  843. default:
  844. RSAerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,RSA_R_UNKNOWN_PADDING_TYPE);
  845. goto err;
  846. }
  847. if (ret < 0)
  848. RSAerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,RSA_R_PADDING_CHECK_FAILED);
  849. }
  850. err:
  851. if (buf)
  852. {
  853. OPENSSL_cleanse(buf,tlen);
  854. OPENSSL_free(buf);
  855. }
  856. return ret;
  857. }
  858. /*
  859. * Does what OpenSSL rsa_priv_enc does.
  860. */
  861. static int surewarehk_rsa_sign(int flen,const unsigned char *from,unsigned char *to,
  862. RSA *rsa,int padding)
  863. {
  864. int ret=0,tlen;
  865. char *hptr=NULL;
  866. char msg[64]="ENGINE_rsa_sign";
  867. if (!p_surewarehk_Rsa_Sign)
  868. {
  869. SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_ENC,ENGINE_R_NOT_INITIALISED);
  870. }
  871. /* extract ref to private key */
  872. else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx)))
  873. {
  874. SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_ENC,SUREWARE_R_MISSING_KEY_COMPONENTS);
  875. }
  876. else
  877. {
  878. switch (padding)
  879. {
  880. case RSA_PKCS1_PADDING: /* do it in one shot */
  881. ret=p_surewarehk_Rsa_Sign(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD);
  882. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_ENC,ret);
  883. break;
  884. case RSA_NO_PADDING:
  885. default:
  886. RSAerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_ENC,RSA_R_UNKNOWN_PADDING_TYPE);
  887. }
  888. }
  889. return ret==1 ? tlen : ret;
  890. }
  891. #endif
  892. #ifndef OPENSSL_NO_DSA
  893. /* DSA sign and verify */
  894. static DSA_SIG * surewarehk_dsa_do_sign(const unsigned char *from, int flen, DSA *dsa)
  895. {
  896. int ret=0;
  897. char *hptr=NULL;
  898. DSA_SIG *psign=NULL;
  899. char msg[64]="ENGINE_dsa_do_sign";
  900. if (!p_surewarehk_Dsa_Sign)
  901. {
  902. SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ENGINE_R_NOT_INITIALISED);
  903. }
  904. /* extract ref to private key */
  905. else if (!(hptr=DSA_get_ex_data(dsa, dsaHndidx)))
  906. {
  907. SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,SUREWARE_R_MISSING_KEY_COMPONENTS);
  908. }
  909. else
  910. {
  911. if((psign = DSA_SIG_new()) == NULL)
  912. {
  913. SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ERR_R_MALLOC_FAILURE);
  914. goto err;
  915. }
  916. psign->r=BN_new();
  917. psign->s=BN_new();
  918. bn_expand2(psign->r, 20/sizeof(BN_ULONG));
  919. bn_expand2(psign->s, 20/sizeof(BN_ULONG));
  920. if (!psign->r || psign->r->dmax!=20/sizeof(BN_ULONG) ||
  921. !psign->s || psign->s->dmax!=20/sizeof(BN_ULONG))
  922. goto err;
  923. ret=p_surewarehk_Dsa_Sign(msg,flen,from,
  924. (unsigned long *)psign->r->d,
  925. (unsigned long *)psign->s->d,
  926. hptr);
  927. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ret);
  928. }
  929. psign->r->top=20/sizeof(BN_ULONG);
  930. bn_fix_top(psign->r);
  931. psign->s->top=20/sizeof(BN_ULONG);
  932. bn_fix_top(psign->s);
  933. err:
  934. if (psign)
  935. {
  936. DSA_SIG_free(psign);
  937. psign=NULL;
  938. }
  939. return psign;
  940. }
  941. #endif
  942. static int surewarehk_modexp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  943. const BIGNUM *m, BN_CTX *ctx)
  944. {
  945. int ret=0;
  946. char msg[64]="ENGINE_modexp";
  947. if (!p_surewarehk_Mod_Exp)
  948. {
  949. SUREWAREerr(SUREWARE_F_SUREWAREHK_MOD_EXP,ENGINE_R_NOT_INITIALISED);
  950. }
  951. else
  952. {
  953. bn_expand2(r,m->top);
  954. if (r && r->dmax==m->top)
  955. {
  956. /* do it*/
  957. ret=p_surewarehk_Mod_Exp(msg,
  958. m->top*sizeof(BN_ULONG),
  959. (unsigned long *)m->d,
  960. p->top*sizeof(BN_ULONG),
  961. (unsigned long *)p->d,
  962. a->top*sizeof(BN_ULONG),
  963. (unsigned long *)a->d,
  964. (unsigned long *)r->d);
  965. surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_MOD_EXP,ret);
  966. if (ret==1)
  967. {
  968. /* normalise result */
  969. r->top=m->top;
  970. bn_fix_top(r);
  971. }
  972. }
  973. }
  974. return ret;
  975. }
  976. #endif /* !OPENSSL_NO_HW_SureWare */
  977. #endif /* !OPENSSL_NO_HW */