OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
eng_cryptodev.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002 Bob Beck <[email protected]>
3  * Copyright (c) 2002 Theo de Raadt
4  * Copyright (c) 2002 Markus Friedl
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  */
28 
29 #include <openssl/objects.h>
30 #include <openssl/engine.h>
31 #include <openssl/evp.h>
32 #include <openssl/bn.h>
33 
34 #if (defined(__unix__) || defined(unix)) && !defined(USG) && \
35  (defined(OpenBSD) || defined(__FreeBSD__))
36 #include <sys/param.h>
37 # if (OpenBSD >= 200112) || ((__FreeBSD_version >= 470101 && __FreeBSD_version < 500000) || __FreeBSD_version >= 500041)
38 # define HAVE_CRYPTODEV
39 # endif
40 # if (OpenBSD >= 200110)
41 # define HAVE_SYSLOG_R
42 # endif
43 #endif
44 
45 #ifndef HAVE_CRYPTODEV
46 
47 void
49 {
50  /* This is a NOP on platforms without /dev/crypto */
51  return;
52 }
53 
54 #else
55 
56 #include <sys/types.h>
57 #include <crypto/cryptodev.h>
58 #include <crypto/dh/dh.h>
59 #include <crypto/dsa/dsa.h>
60 #include <crypto/err/err.h>
61 #include <crypto/rsa/rsa.h>
62 #include <sys/ioctl.h>
63 #include <errno.h>
64 #include <stdio.h>
65 #include <unistd.h>
66 #include <fcntl.h>
67 #include <stdarg.h>
68 #include <syslog.h>
69 #include <errno.h>
70 #include <string.h>
71 
72 struct dev_crypto_state {
73  struct session_op d_sess;
74  int d_fd;
75 
76 #ifdef USE_CRYPTODEV_DIGESTS
77  char dummy_mac_key[HASH_MAX_LEN];
78 
79  unsigned char digest_res[HASH_MAX_LEN];
80  char *mac_data;
81  int mac_len;
82 #endif
83 };
84 
85 static u_int32_t cryptodev_asymfeat = 0;
86 
87 static int get_asym_dev_crypto(void);
88 static int open_dev_crypto(void);
89 static int get_dev_crypto(void);
90 static int get_cryptodev_ciphers(const int **cnids);
91 #ifdef USE_CRYPTODEV_DIGESTS
92 static int get_cryptodev_digests(const int **cnids);
93 #endif
94 static int cryptodev_usable_ciphers(const int **nids);
95 static int cryptodev_usable_digests(const int **nids);
96 static int cryptodev_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
97  const unsigned char *in, size_t inl);
98 static int cryptodev_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
99  const unsigned char *iv, int enc);
100 static int cryptodev_cleanup(EVP_CIPHER_CTX *ctx);
101 static int cryptodev_engine_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
102  const int **nids, int nid);
103 static int cryptodev_engine_digests(ENGINE *e, const EVP_MD **digest,
104  const int **nids, int nid);
105 static int bn2crparam(const BIGNUM *a, struct crparam *crp);
106 static int crparam2bn(struct crparam *crp, BIGNUM *a);
107 static void zapparams(struct crypt_kop *kop);
108 static int cryptodev_asym(struct crypt_kop *kop, int rlen, BIGNUM *r,
109  int slen, BIGNUM *s);
110 
111 static int cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a,
112  const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
113 static int cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I,
114  RSA *rsa, BN_CTX *ctx);
115 static int cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
116 static int cryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a,
117  const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
118 static int cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g,
119  BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p,
120  BN_CTX *ctx, BN_MONT_CTX *mont);
121 static DSA_SIG *cryptodev_dsa_do_sign(const unsigned char *dgst,
122  int dlen, DSA *dsa);
123 static int cryptodev_dsa_verify(const unsigned char *dgst, int dgst_len,
124  DSA_SIG *sig, DSA *dsa);
125 static int cryptodev_mod_exp_dh(const DH *dh, BIGNUM *r, const BIGNUM *a,
126  const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,
127  BN_MONT_CTX *m_ctx);
128 static int cryptodev_dh_compute_key(unsigned char *key,
129  const BIGNUM *pub_key, DH *dh);
130 static int cryptodev_ctrl(ENGINE *e, int cmd, long i, void *p,
131  void (*f)(void));
132 void ENGINE_load_cryptodev(void);
133 
134 static const ENGINE_CMD_DEFN cryptodev_defns[] = {
135  { 0, NULL, NULL, 0 }
136 };
137 
138 static struct {
139  int id;
140  int nid;
141  int ivmax;
142  int keylen;
143 } ciphers[] = {
144  { CRYPTO_ARC4, NID_rc4, 0, 16, },
145  { CRYPTO_DES_CBC, NID_des_cbc, 8, 8, },
146  { CRYPTO_3DES_CBC, NID_des_ede3_cbc, 8, 24, },
147  { CRYPTO_AES_CBC, NID_aes_128_cbc, 16, 16, },
148  { CRYPTO_AES_CBC, NID_aes_192_cbc, 16, 24, },
149  { CRYPTO_AES_CBC, NID_aes_256_cbc, 16, 32, },
150  { CRYPTO_BLF_CBC, NID_bf_cbc, 8, 16, },
151  { CRYPTO_CAST_CBC, NID_cast5_cbc, 8, 16, },
152  { CRYPTO_SKIPJACK_CBC, NID_undef, 0, 0, },
153  { 0, NID_undef, 0, 0, },
154 };
155 
156 #ifdef USE_CRYPTODEV_DIGESTS
157 static struct {
158  int id;
159  int nid;
160  int keylen;
161 } digests[] = {
162  { CRYPTO_MD5_HMAC, NID_hmacWithMD5, 16},
163  { CRYPTO_SHA1_HMAC, NID_hmacWithSHA1, 20},
164  { CRYPTO_RIPEMD160_HMAC, NID_ripemd160, 16/*?*/},
165  { CRYPTO_MD5_KPDK, NID_undef, 0},
166  { CRYPTO_SHA1_KPDK, NID_undef, 0},
167  { CRYPTO_MD5, NID_md5, 16},
168  { CRYPTO_SHA1, NID_sha1, 20},
169  { 0, NID_undef, 0},
170 };
171 #endif
172 
173 /*
174  * Return a fd if /dev/crypto seems usable, 0 otherwise.
175  */
176 static int
177 open_dev_crypto(void)
178 {
179  static int fd = -1;
180 
181  if (fd == -1) {
182  if ((fd = open("/dev/crypto", O_RDWR, 0)) == -1)
183  return (-1);
184  /* close on exec */
185  if (fcntl(fd, F_SETFD, 1) == -1) {
186  close(fd);
187  fd = -1;
188  return (-1);
189  }
190  }
191  return (fd);
192 }
193 
194 static int
195 get_dev_crypto(void)
196 {
197  int fd, retfd;
198 
199  if ((fd = open_dev_crypto()) == -1)
200  return (-1);
201 #ifndef CRIOGET_NOT_NEEDED
202  if (ioctl(fd, CRIOGET, &retfd) == -1)
203  return (-1);
204 
205  /* close on exec */
206  if (fcntl(retfd, F_SETFD, 1) == -1) {
207  close(retfd);
208  return (-1);
209  }
210 #else
211  retfd = fd;
212 #endif
213  return (retfd);
214 }
215 
216 static void put_dev_crypto(int fd)
217 {
218 #ifndef CRIOGET_NOT_NEEDED
219  close(fd);
220 #endif
221 }
222 
223 /* Caching version for asym operations */
224 static int
225 get_asym_dev_crypto(void)
226 {
227  static int fd = -1;
228 
229  if (fd == -1)
230  fd = get_dev_crypto();
231  return fd;
232 }
233 
234 /*
235  * Find out what ciphers /dev/crypto will let us have a session for.
236  * XXX note, that some of these openssl doesn't deal with yet!
237  * returning them here is harmless, as long as we return NULL
238  * when asked for a handler in the cryptodev_engine_ciphers routine
239  */
240 static int
241 get_cryptodev_ciphers(const int **cnids)
242 {
243  static int nids[CRYPTO_ALGORITHM_MAX];
244  struct session_op sess;
245  int fd, i, count = 0;
246 
247  if ((fd = get_dev_crypto()) < 0) {
248  *cnids = NULL;
249  return (0);
250  }
251  memset(&sess, 0, sizeof(sess));
252  sess.key = (caddr_t)"123456789abcdefghijklmno";
253 
254  for (i = 0; ciphers[i].id && count < CRYPTO_ALGORITHM_MAX; i++) {
255  if (ciphers[i].nid == NID_undef)
256  continue;
257  sess.cipher = ciphers[i].id;
258  sess.keylen = ciphers[i].keylen;
259  sess.mac = 0;
260  if (ioctl(fd, CIOCGSESSION, &sess) != -1 &&
261  ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
262  nids[count++] = ciphers[i].nid;
263  }
264  put_dev_crypto(fd);
265 
266  if (count > 0)
267  *cnids = nids;
268  else
269  *cnids = NULL;
270  return (count);
271 }
272 
273 #ifdef USE_CRYPTODEV_DIGESTS
274 /*
275  * Find out what digests /dev/crypto will let us have a session for.
276  * XXX note, that some of these openssl doesn't deal with yet!
277  * returning them here is harmless, as long as we return NULL
278  * when asked for a handler in the cryptodev_engine_digests routine
279  */
280 static int
281 get_cryptodev_digests(const int **cnids)
282 {
283  static int nids[CRYPTO_ALGORITHM_MAX];
284  struct session_op sess;
285  int fd, i, count = 0;
286 
287  if ((fd = get_dev_crypto()) < 0) {
288  *cnids = NULL;
289  return (0);
290  }
291  memset(&sess, 0, sizeof(sess));
292  sess.mackey = (caddr_t)"123456789abcdefghijklmno";
293  for (i = 0; digests[i].id && count < CRYPTO_ALGORITHM_MAX; i++) {
294  if (digests[i].nid == NID_undef)
295  continue;
296  sess.mac = digests[i].id;
297  sess.mackeylen = digests[i].keylen;
298  sess.cipher = 0;
299  if (ioctl(fd, CIOCGSESSION, &sess) != -1 &&
300  ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
301  nids[count++] = digests[i].nid;
302  }
303  put_dev_crypto(fd);
304 
305  if (count > 0)
306  *cnids = nids;
307  else
308  *cnids = NULL;
309  return (count);
310 }
311 #endif /* 0 */
312 
313 /*
314  * Find the useable ciphers|digests from dev/crypto - this is the first
315  * thing called by the engine init crud which determines what it
316  * can use for ciphers from this engine. We want to return
317  * only what we can do, anythine else is handled by software.
318  *
319  * If we can't initialize the device to do anything useful for
320  * any reason, we want to return a NULL array, and 0 length,
321  * which forces everything to be done is software. By putting
322  * the initalization of the device in here, we ensure we can
323  * use this engine as the default, and if for whatever reason
324  * /dev/crypto won't do what we want it will just be done in
325  * software
326  *
327  * This can (should) be greatly expanded to perhaps take into
328  * account speed of the device, and what we want to do.
329  * (although the disabling of particular alg's could be controlled
330  * by the device driver with sysctl's.) - this is where we
331  * want most of the decisions made about what we actually want
332  * to use from /dev/crypto.
333  */
334 static int
335 cryptodev_usable_ciphers(const int **nids)
336 {
337  return (get_cryptodev_ciphers(nids));
338 }
339 
340 static int
341 cryptodev_usable_digests(const int **nids)
342 {
343 #ifdef USE_CRYPTODEV_DIGESTS
344  return (get_cryptodev_digests(nids));
345 #else
346  /*
347  * XXXX just disable all digests for now, because it sucks.
348  * we need a better way to decide this - i.e. I may not
349  * want digests on slow cards like hifn on fast machines,
350  * but might want them on slow or loaded machines, etc.
351  * will also want them when using crypto cards that don't
352  * suck moose gonads - would be nice to be able to decide something
353  * as reasonable default without having hackery that's card dependent.
354  * of course, the default should probably be just do everything,
355  * with perhaps a sysctl to turn algoritms off (or have them off
356  * by default) on cards that generally suck like the hifn.
357  */
358  *nids = NULL;
359  return (0);
360 #endif
361 }
362 
363 static int
364 cryptodev_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
365  const unsigned char *in, size_t inl)
366 {
367  struct crypt_op cryp;
368  struct dev_crypto_state *state = ctx->cipher_data;
369  struct session_op *sess = &state->d_sess;
370  const void *iiv;
371  unsigned char save_iv[EVP_MAX_IV_LENGTH];
372 
373  if (state->d_fd < 0)
374  return (0);
375  if (!inl)
376  return (1);
377  if ((inl % ctx->cipher->block_size) != 0)
378  return (0);
379 
380  memset(&cryp, 0, sizeof(cryp));
381 
382  cryp.ses = sess->ses;
383  cryp.flags = 0;
384  cryp.len = inl;
385  cryp.src = (caddr_t) in;
386  cryp.dst = (caddr_t) out;
387  cryp.mac = 0;
388 
389  cryp.op = ctx->encrypt ? COP_ENCRYPT : COP_DECRYPT;
390 
391  if (ctx->cipher->iv_len) {
392  cryp.iv = (caddr_t) ctx->iv;
393  if (!ctx->encrypt) {
394  iiv = in + inl - ctx->cipher->iv_len;
395  memcpy(save_iv, iiv, ctx->cipher->iv_len);
396  }
397  } else
398  cryp.iv = NULL;
399 
400  if (ioctl(state->d_fd, CIOCCRYPT, &cryp) == -1) {
401  /* XXX need better errror handling
402  * this can fail for a number of different reasons.
403  */
404  return (0);
405  }
406 
407  if (ctx->cipher->iv_len) {
408  if (ctx->encrypt)
409  iiv = out + inl - ctx->cipher->iv_len;
410  else
411  iiv = save_iv;
412  memcpy(ctx->iv, iiv, ctx->cipher->iv_len);
413  }
414  return (1);
415 }
416 
417 static int
418 cryptodev_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
419  const unsigned char *iv, int enc)
420 {
421  struct dev_crypto_state *state = ctx->cipher_data;
422  struct session_op *sess = &state->d_sess;
423  int cipher = -1, i;
424 
425  for (i = 0; ciphers[i].id; i++)
426  if (ctx->cipher->nid == ciphers[i].nid &&
427  ctx->cipher->iv_len <= ciphers[i].ivmax &&
428  ctx->key_len == ciphers[i].keylen) {
429  cipher = ciphers[i].id;
430  break;
431  }
432 
433  if (!ciphers[i].id) {
434  state->d_fd = -1;
435  return (0);
436  }
437 
438  memset(sess, 0, sizeof(struct session_op));
439 
440  if ((state->d_fd = get_dev_crypto()) < 0)
441  return (0);
442 
443  sess->key = (caddr_t)key;
444  sess->keylen = ctx->key_len;
445  sess->cipher = cipher;
446 
447  if (ioctl(state->d_fd, CIOCGSESSION, sess) == -1) {
448  put_dev_crypto(state->d_fd);
449  state->d_fd = -1;
450  return (0);
451  }
452  return (1);
453 }
454 
455 /*
456  * free anything we allocated earlier when initting a
457  * session, and close the session.
458  */
459 static int
460 cryptodev_cleanup(EVP_CIPHER_CTX *ctx)
461 {
462  int ret = 0;
463  struct dev_crypto_state *state = ctx->cipher_data;
464  struct session_op *sess = &state->d_sess;
465 
466  if (state->d_fd < 0)
467  return (0);
468 
469  /* XXX if this ioctl fails, someting's wrong. the invoker
470  * may have called us with a bogus ctx, or we could
471  * have a device that for whatever reason just doesn't
472  * want to play ball - it's not clear what's right
473  * here - should this be an error? should it just
474  * increase a counter, hmm. For right now, we return
475  * 0 - I don't believe that to be "right". we could
476  * call the gorpy openssl lib error handlers that
477  * print messages to users of the library. hmm..
478  */
479 
480  if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) == -1) {
481  ret = 0;
482  } else {
483  ret = 1;
484  }
485  put_dev_crypto(state->d_fd);
486  state->d_fd = -1;
487 
488  return (ret);
489 }
490 
491 /*
492  * libcrypto EVP stuff - this is how we get wired to EVP so the engine
493  * gets called when libcrypto requests a cipher NID.
494  */
495 
496 /* RC4 */
497 const EVP_CIPHER cryptodev_rc4 = {
498  NID_rc4,
499  1, 16, 0,
501  cryptodev_init_key,
502  cryptodev_cipher,
503  cryptodev_cleanup,
504  sizeof(struct dev_crypto_state),
505  NULL,
506  NULL,
507  NULL
508 };
509 
510 /* DES CBC EVP */
511 const EVP_CIPHER cryptodev_des_cbc = {
512  NID_des_cbc,
513  8, 8, 8,
515  cryptodev_init_key,
516  cryptodev_cipher,
517  cryptodev_cleanup,
518  sizeof(struct dev_crypto_state),
521  NULL
522 };
523 
524 /* 3DES CBC EVP */
525 const EVP_CIPHER cryptodev_3des_cbc = {
527  8, 24, 8,
529  cryptodev_init_key,
530  cryptodev_cipher,
531  cryptodev_cleanup,
532  sizeof(struct dev_crypto_state),
535  NULL
536 };
537 
538 const EVP_CIPHER cryptodev_bf_cbc = {
539  NID_bf_cbc,
540  8, 16, 8,
542  cryptodev_init_key,
543  cryptodev_cipher,
544  cryptodev_cleanup,
545  sizeof(struct dev_crypto_state),
548  NULL
549 };
550 
551 const EVP_CIPHER cryptodev_cast_cbc = {
553  8, 16, 8,
555  cryptodev_init_key,
556  cryptodev_cipher,
557  cryptodev_cleanup,
558  sizeof(struct dev_crypto_state),
561  NULL
562 };
563 
564 const EVP_CIPHER cryptodev_aes_cbc = {
566  16, 16, 16,
568  cryptodev_init_key,
569  cryptodev_cipher,
570  cryptodev_cleanup,
571  sizeof(struct dev_crypto_state),
574  NULL
575 };
576 
577 const EVP_CIPHER cryptodev_aes_192_cbc = {
579  16, 24, 16,
581  cryptodev_init_key,
582  cryptodev_cipher,
583  cryptodev_cleanup,
584  sizeof(struct dev_crypto_state),
587  NULL
588 };
589 
590 const EVP_CIPHER cryptodev_aes_256_cbc = {
592  16, 32, 16,
594  cryptodev_init_key,
595  cryptodev_cipher,
596  cryptodev_cleanup,
597  sizeof(struct dev_crypto_state),
600  NULL
601 };
602 
603 /*
604  * Registered by the ENGINE when used to find out how to deal with
605  * a particular NID in the ENGINE. this says what we'll do at the
606  * top level - note, that list is restricted by what we answer with
607  */
608 static int
609 cryptodev_engine_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
610  const int **nids, int nid)
611 {
612  if (!cipher)
613  return (cryptodev_usable_ciphers(nids));
614 
615  switch (nid) {
616  case NID_rc4:
617  *cipher = &cryptodev_rc4;
618  break;
619  case NID_des_ede3_cbc:
620  *cipher = &cryptodev_3des_cbc;
621  break;
622  case NID_des_cbc:
623  *cipher = &cryptodev_des_cbc;
624  break;
625  case NID_bf_cbc:
626  *cipher = &cryptodev_bf_cbc;
627  break;
628  case NID_cast5_cbc:
629  *cipher = &cryptodev_cast_cbc;
630  break;
631  case NID_aes_128_cbc:
632  *cipher = &cryptodev_aes_cbc;
633  break;
634  case NID_aes_192_cbc:
635  *cipher = &cryptodev_aes_192_cbc;
636  break;
637  case NID_aes_256_cbc:
638  *cipher = &cryptodev_aes_256_cbc;
639  break;
640  default:
641  *cipher = NULL;
642  break;
643  }
644  return (*cipher != NULL);
645 }
646 
647 
648 #ifdef USE_CRYPTODEV_DIGESTS
649 
650 /* convert digest type to cryptodev */
651 static int
652 digest_nid_to_cryptodev(int nid)
653 {
654  int i;
655 
656  for (i = 0; digests[i].id; i++)
657  if (digests[i].nid == nid)
658  return (digests[i].id);
659  return (0);
660 }
661 
662 
663 static int
664 digest_key_length(int nid)
665 {
666  int i;
667 
668  for (i = 0; digests[i].id; i++)
669  if (digests[i].nid == nid)
670  return digests[i].keylen;
671  return (0);
672 }
673 
674 
675 static int cryptodev_digest_init(EVP_MD_CTX *ctx)
676 {
677  struct dev_crypto_state *state = ctx->md_data;
678  struct session_op *sess = &state->d_sess;
679  int digest;
680 
681  if ((digest = digest_nid_to_cryptodev(ctx->digest->type)) == NID_undef){
682  printf("cryptodev_digest_init: Can't get digest \n");
683  return (0);
684  }
685 
686  memset(state, 0, sizeof(struct dev_crypto_state));
687 
688  if ((state->d_fd = get_dev_crypto()) < 0) {
689  printf("cryptodev_digest_init: Can't get Dev \n");
690  return (0);
691  }
692 
693  sess->mackey = state->dummy_mac_key;
694  sess->mackeylen = digest_key_length(ctx->digest->type);
695  sess->mac = digest;
696 
697  if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) {
698  put_dev_crypto(state->d_fd);
699  state->d_fd = -1;
700  printf("cryptodev_digest_init: Open session failed\n");
701  return (0);
702  }
703 
704  return (1);
705 }
706 
707 static int cryptodev_digest_update(EVP_MD_CTX *ctx, const void *data,
708  size_t count)
709 {
710  struct crypt_op cryp;
711  struct dev_crypto_state *state = ctx->md_data;
712  struct session_op *sess = &state->d_sess;
713 
714  if (!data || state->d_fd < 0) {
715  printf("cryptodev_digest_update: illegal inputs \n");
716  return (0);
717  }
718 
719  if (!count) {
720  return (0);
721  }
722 
723  if (!(ctx->flags & EVP_MD_CTX_FLAG_ONESHOT)) {
724  /* if application doesn't support one buffer */
725  state->mac_data = OPENSSL_realloc(state->mac_data, state->mac_len + count);
726 
727  if (!state->mac_data) {
728  printf("cryptodev_digest_update: realloc failed\n");
729  return (0);
730  }
731 
732  memcpy(state->mac_data + state->mac_len, data, count);
733  state->mac_len += count;
734 
735  return (1);
736  }
737 
738  memset(&cryp, 0, sizeof(cryp));
739 
740  cryp.ses = sess->ses;
741  cryp.flags = 0;
742  cryp.len = count;
743  cryp.src = (caddr_t) data;
744  cryp.dst = NULL;
745  cryp.mac = (caddr_t) state->digest_res;
746  if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {
747  printf("cryptodev_digest_update: digest failed\n");
748  return (0);
749  }
750  return (1);
751 }
752 
753 
754 static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md)
755 {
756  struct crypt_op cryp;
757  struct dev_crypto_state *state = ctx->md_data;
758  struct session_op *sess = &state->d_sess;
759 
760  int ret = 1;
761 
762  if (!md || state->d_fd < 0) {
763  printf("cryptodev_digest_final: illegal input\n");
764  return(0);
765  }
766 
767  if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) {
768  /* if application doesn't support one buffer */
769  memset(&cryp, 0, sizeof(cryp));
770  cryp.ses = sess->ses;
771  cryp.flags = 0;
772  cryp.len = state->mac_len;
773  cryp.src = state->mac_data;
774  cryp.dst = NULL;
775  cryp.mac = (caddr_t)md;
776  if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {
777  printf("cryptodev_digest_final: digest failed\n");
778  return (0);
779  }
780 
781  return 1;
782  }
783 
784  memcpy(md, state->digest_res, ctx->digest->md_size);
785 
786  return (ret);
787 }
788 
789 
790 static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)
791 {
792  int ret = 1;
793  struct dev_crypto_state *state = ctx->md_data;
794  struct session_op *sess = &state->d_sess;
795 
796  if (state == NULL)
797  return 0;
798 
799  if (state->d_fd < 0) {
800  printf("cryptodev_digest_cleanup: illegal input\n");
801  return (0);
802  }
803 
804  if (state->mac_data) {
805  OPENSSL_free(state->mac_data);
806  state->mac_data = NULL;
807  state->mac_len = 0;
808  }
809 
810  if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) {
811  printf("cryptodev_digest_cleanup: failed to close session\n");
812  ret = 0;
813  } else {
814  ret = 1;
815  }
816  put_dev_crypto(state->d_fd);
817  state->d_fd = -1;
818 
819  return (ret);
820 }
821 
822 static int cryptodev_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)
823 {
824  struct dev_crypto_state *fstate = from->md_data;
825  struct dev_crypto_state *dstate = to->md_data;
826  struct session_op *sess;
827  int digest;
828 
829  if (dstate == NULL || fstate == NULL)
830  return 1;
831 
832  memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
833 
834  sess = &dstate->d_sess;
835 
836  digest = digest_nid_to_cryptodev(to->digest->type);
837 
838  sess->mackey = dstate->dummy_mac_key;
839  sess->mackeylen = digest_key_length(to->digest->type);
840  sess->mac = digest;
841 
842  dstate->d_fd = get_dev_crypto();
843 
844  if (ioctl(dstate->d_fd, CIOCGSESSION, sess) < 0) {
845  put_dev_crypto(dstate->d_fd);
846  dstate->d_fd = -1;
847  printf("cryptodev_digest_init: Open session failed\n");
848  return (0);
849  }
850 
851  if (fstate->mac_len != 0) {
852  if (fstate->mac_data != NULL)
853  {
854  dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
855  memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
856  dstate->mac_len = fstate->mac_len;
857  }
858  }
859 
860  return 1;
861 }
862 
863 
864 const EVP_MD cryptodev_sha1 = {
865  NID_sha1,
866  NID_undef,
869  cryptodev_digest_init,
870  cryptodev_digest_update,
871  cryptodev_digest_final,
872  cryptodev_digest_copy,
873  cryptodev_digest_cleanup,
875  SHA_CBLOCK,
876  sizeof(struct dev_crypto_state),
877 };
878 
879 const EVP_MD cryptodev_md5 = {
880  NID_md5,
881  NID_undef,
882  16 /* MD5_DIGEST_LENGTH */,
884  cryptodev_digest_init,
885  cryptodev_digest_update,
886  cryptodev_digest_final,
887  cryptodev_digest_copy,
888  cryptodev_digest_cleanup,
890  64 /* MD5_CBLOCK */,
891  sizeof(struct dev_crypto_state),
892 };
893 
894 #endif /* USE_CRYPTODEV_DIGESTS */
895 
896 
897 static int
898 cryptodev_engine_digests(ENGINE *e, const EVP_MD **digest,
899  const int **nids, int nid)
900 {
901  if (!digest)
902  return (cryptodev_usable_digests(nids));
903 
904  switch (nid) {
905 #ifdef USE_CRYPTODEV_DIGESTS
906  case NID_md5:
907  *digest = &cryptodev_md5;
908  break;
909  case NID_sha1:
910  *digest = &cryptodev_sha1;
911  break;
912  default:
913 #endif /* USE_CRYPTODEV_DIGESTS */
914  *digest = NULL;
915  break;
916  }
917  return (*digest != NULL);
918 }
919 
920 /*
921  * Convert a BIGNUM to the representation that /dev/crypto needs.
922  * Upon completion of use, the caller is responsible for freeing
923  * crp->crp_p.
924  */
925 static int
926 bn2crparam(const BIGNUM *a, struct crparam *crp)
927 {
928  int i, j, k;
929  ssize_t bytes, bits;
930  u_char *b;
931 
932  crp->crp_p = NULL;
933  crp->crp_nbits = 0;
934 
935  bits = BN_num_bits(a);
936  bytes = (bits + 7) / 8;
937 
938  b = malloc(bytes);
939  if (b == NULL)
940  return (1);
941  memset(b, 0, bytes);
942 
943  crp->crp_p = (caddr_t) b;
944  crp->crp_nbits = bits;
945 
946  for (i = 0, j = 0; i < a->top; i++) {
947  for (k = 0; k < BN_BITS2 / 8; k++) {
948  if ((j + k) >= bytes)
949  return (0);
950  b[j + k] = a->d[i] >> (k * 8);
951  }
952  j += BN_BITS2 / 8;
953  }
954  return (0);
955 }
956 
957 /* Convert a /dev/crypto parameter to a BIGNUM */
958 static int
959 crparam2bn(struct crparam *crp, BIGNUM *a)
960 {
961  u_int8_t *pd;
962  int i, bytes;
963 
964  bytes = (crp->crp_nbits + 7) / 8;
965 
966  if (bytes == 0)
967  return (-1);
968 
969  if ((pd = (u_int8_t *) malloc(bytes)) == NULL)
970  return (-1);
971 
972  for (i = 0; i < bytes; i++)
973  pd[i] = crp->crp_p[bytes - i - 1];
974 
975  BN_bin2bn(pd, bytes, a);
976  free(pd);
977 
978  return (0);
979 }
980 
981 static void
982 zapparams(struct crypt_kop *kop)
983 {
984  int i;
985 
986  for (i = 0; i < kop->crk_iparams + kop->crk_oparams; i++) {
987  if (kop->crk_param[i].crp_p)
988  free(kop->crk_param[i].crp_p);
989  kop->crk_param[i].crp_p = NULL;
990  kop->crk_param[i].crp_nbits = 0;
991  }
992 }
993 
994 static int
995 cryptodev_asym(struct crypt_kop *kop, int rlen, BIGNUM *r, int slen, BIGNUM *s)
996 {
997  int fd, ret = -1;
998 
999  if ((fd = get_asym_dev_crypto()) < 0)
1000  return (ret);
1001 
1002  if (r) {
1003  kop->crk_param[kop->crk_iparams].crp_p = calloc(rlen, sizeof(char));
1004  kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8;
1005  kop->crk_oparams++;
1006  }
1007  if (s) {
1008  kop->crk_param[kop->crk_iparams+1].crp_p = calloc(slen, sizeof(char));
1009  kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8;
1010  kop->crk_oparams++;
1011  }
1012 
1013  if (ioctl(fd, CIOCKEY, kop) == 0) {
1014  if (r)
1015  crparam2bn(&kop->crk_param[kop->crk_iparams], r);
1016  if (s)
1017  crparam2bn(&kop->crk_param[kop->crk_iparams+1], s);
1018  ret = 0;
1019  }
1020 
1021  return (ret);
1022 }
1023 
1024 static int
1025 cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
1026  const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
1027 {
1028  struct crypt_kop kop;
1029  int ret = 1;
1030 
1031  /* Currently, we know we can do mod exp iff we can do any
1032  * asymmetric operations at all.
1033  */
1034  if (cryptodev_asymfeat == 0) {
1035  ret = BN_mod_exp(r, a, p, m, ctx);
1036  return (ret);
1037  }
1038 
1039  memset(&kop, 0, sizeof kop);
1040  kop.crk_op = CRK_MOD_EXP;
1041 
1042  /* inputs: a^p % m */
1043  if (bn2crparam(a, &kop.crk_param[0]))
1044  goto err;
1045  if (bn2crparam(p, &kop.crk_param[1]))
1046  goto err;
1047  if (bn2crparam(m, &kop.crk_param[2]))
1048  goto err;
1049  kop.crk_iparams = 3;
1050 
1051  if (cryptodev_asym(&kop, BN_num_bytes(m), r, 0, NULL)) {
1052  const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
1053  printf("OCF asym process failed, Running in software\n");
1054  ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont);
1055 
1056  } else if (ECANCELED == kop.crk_status) {
1057  const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
1058  printf("OCF hardware operation cancelled. Running in Software\n");
1059  ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont);
1060  }
1061  /* else cryptodev operation worked ok ==> ret = 1*/
1062 
1063 err:
1064  zapparams(&kop);
1065  return (ret);
1066 }
1067 
1068 static int
1069 cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
1070 {
1071  int r;
1072  ctx = BN_CTX_new();
1073  r = cryptodev_bn_mod_exp(r0, I, rsa->d, rsa->n, ctx, NULL);
1074  BN_CTX_free(ctx);
1075  return (r);
1076 }
1077 
1078 static int
1079 cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
1080 {
1081  struct crypt_kop kop;
1082  int ret = 1;
1083 
1084  if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) {
1085  /* XXX 0 means failure?? */
1086  return (0);
1087  }
1088 
1089  memset(&kop, 0, sizeof kop);
1090  kop.crk_op = CRK_MOD_EXP_CRT;
1091  /* inputs: rsa->p rsa->q I rsa->dmp1 rsa->dmq1 rsa->iqmp */
1092  if (bn2crparam(rsa->p, &kop.crk_param[0]))
1093  goto err;
1094  if (bn2crparam(rsa->q, &kop.crk_param[1]))
1095  goto err;
1096  if (bn2crparam(I, &kop.crk_param[2]))
1097  goto err;
1098  if (bn2crparam(rsa->dmp1, &kop.crk_param[3]))
1099  goto err;
1100  if (bn2crparam(rsa->dmq1, &kop.crk_param[4]))
1101  goto err;
1102  if (bn2crparam(rsa->iqmp, &kop.crk_param[5]))
1103  goto err;
1104  kop.crk_iparams = 6;
1105 
1106  if (cryptodev_asym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL)) {
1107  const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
1108  printf("OCF asym process failed, running in Software\n");
1109  ret = (*meth->rsa_mod_exp)(r0, I, rsa, ctx);
1110 
1111  } else if (ECANCELED == kop.crk_status) {
1112  const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
1113  printf("OCF hardware operation cancelled. Running in Software\n");
1114  ret = (*meth->rsa_mod_exp)(r0, I, rsa, ctx);
1115  }
1116  /* else cryptodev operation worked ok ==> ret = 1*/
1117 
1118 err:
1119  zapparams(&kop);
1120  return (ret);
1121 }
1122 
1123 static RSA_METHOD cryptodev_rsa = {
1124  "cryptodev RSA method",
1125  NULL, /* rsa_pub_enc */
1126  NULL, /* rsa_pub_dec */
1127  NULL, /* rsa_priv_enc */
1128  NULL, /* rsa_priv_dec */
1129  NULL,
1130  NULL,
1131  NULL, /* init */
1132  NULL, /* finish */
1133  0, /* flags */
1134  NULL, /* app_data */
1135  NULL, /* rsa_sign */
1136  NULL /* rsa_verify */
1137 };
1138 
1139 static int
1140 cryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
1141  const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
1142 {
1143  return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx));
1144 }
1145 
1146 static int
1147 cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g,
1148  BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p,
1149  BN_CTX *ctx, BN_MONT_CTX *mont)
1150 {
1151  BIGNUM t2;
1152  int ret = 0;
1153 
1154  BN_init(&t2);
1155 
1156  /* v = ( g^u1 * y^u2 mod p ) mod q */
1157  /* let t1 = g ^ u1 mod p */
1158  ret = 0;
1159 
1160  if (!dsa->meth->bn_mod_exp(dsa,t1,dsa->g,u1,dsa->p,ctx,mont))
1161  goto err;
1162 
1163  /* let t2 = y ^ u2 mod p */
1164  if (!dsa->meth->bn_mod_exp(dsa,&t2,dsa->pub_key,u2,dsa->p,ctx,mont))
1165  goto err;
1166  /* let u1 = t1 * t2 mod p */
1167  if (!BN_mod_mul(u1,t1,&t2,dsa->p,ctx))
1168  goto err;
1169 
1170  BN_copy(t1,u1);
1171 
1172  ret = 1;
1173 err:
1174  BN_free(&t2);
1175  return(ret);
1176 }
1177 
1178 static DSA_SIG *
1179 cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
1180 {
1181  struct crypt_kop kop;
1182  BIGNUM *r = NULL, *s = NULL;
1183  DSA_SIG *dsaret = NULL;
1184 
1185  if ((r = BN_new()) == NULL)
1186  goto err;
1187  if ((s = BN_new()) == NULL) {
1188  BN_free(r);
1189  goto err;
1190  }
1191 
1192  memset(&kop, 0, sizeof kop);
1193  kop.crk_op = CRK_DSA_SIGN;
1194 
1195  /* inputs: dgst dsa->p dsa->q dsa->g dsa->priv_key */
1196  kop.crk_param[0].crp_p = (caddr_t)dgst;
1197  kop.crk_param[0].crp_nbits = dlen * 8;
1198  if (bn2crparam(dsa->p, &kop.crk_param[1]))
1199  goto err;
1200  if (bn2crparam(dsa->q, &kop.crk_param[2]))
1201  goto err;
1202  if (bn2crparam(dsa->g, &kop.crk_param[3]))
1203  goto err;
1204  if (bn2crparam(dsa->priv_key, &kop.crk_param[4]))
1205  goto err;
1206  kop.crk_iparams = 5;
1207 
1208  if (cryptodev_asym(&kop, BN_num_bytes(dsa->q), r,
1209  BN_num_bytes(dsa->q), s) == 0) {
1210  dsaret = DSA_SIG_new();
1211  dsaret->r = r;
1212  dsaret->s = s;
1213  } else {
1214  const DSA_METHOD *meth = DSA_OpenSSL();
1215  BN_free(r);
1216  BN_free(s);
1217  dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa);
1218  }
1219 err:
1220  kop.crk_param[0].crp_p = NULL;
1221  zapparams(&kop);
1222  return (dsaret);
1223 }
1224 
1225 static int
1226 cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
1227  DSA_SIG *sig, DSA *dsa)
1228 {
1229  struct crypt_kop kop;
1230  int dsaret = 1;
1231 
1232  memset(&kop, 0, sizeof kop);
1233  kop.crk_op = CRK_DSA_VERIFY;
1234 
1235  /* inputs: dgst dsa->p dsa->q dsa->g dsa->pub_key sig->r sig->s */
1236  kop.crk_param[0].crp_p = (caddr_t)dgst;
1237  kop.crk_param[0].crp_nbits = dlen * 8;
1238  if (bn2crparam(dsa->p, &kop.crk_param[1]))
1239  goto err;
1240  if (bn2crparam(dsa->q, &kop.crk_param[2]))
1241  goto err;
1242  if (bn2crparam(dsa->g, &kop.crk_param[3]))
1243  goto err;
1244  if (bn2crparam(dsa->pub_key, &kop.crk_param[4]))
1245  goto err;
1246  if (bn2crparam(sig->r, &kop.crk_param[5]))
1247  goto err;
1248  if (bn2crparam(sig->s, &kop.crk_param[6]))
1249  goto err;
1250  kop.crk_iparams = 7;
1251 
1252  if (cryptodev_asym(&kop, 0, NULL, 0, NULL) == 0) {
1253 /*OCF success value is 0, if not zero, change dsaret to fail*/
1254  if(0 != kop.crk_status) dsaret = 0;
1255  } else {
1256  const DSA_METHOD *meth = DSA_OpenSSL();
1257 
1258  dsaret = (meth->dsa_do_verify)(dgst, dlen, sig, dsa);
1259  }
1260 err:
1261  kop.crk_param[0].crp_p = NULL;
1262  zapparams(&kop);
1263  return (dsaret);
1264 }
1265 
1266 static DSA_METHOD cryptodev_dsa = {
1267  "cryptodev DSA method",
1268  NULL,
1269  NULL, /* dsa_sign_setup */
1270  NULL,
1271  NULL, /* dsa_mod_exp */
1272  NULL,
1273  NULL, /* init */
1274  NULL, /* finish */
1275  0, /* flags */
1276  NULL /* app_data */
1277 };
1278 
1279 static int
1280 cryptodev_mod_exp_dh(const DH *dh, BIGNUM *r, const BIGNUM *a,
1281  const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,
1282  BN_MONT_CTX *m_ctx)
1283 {
1284  return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx));
1285 }
1286 
1287 static int
1288 cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
1289 {
1290  struct crypt_kop kop;
1291  int dhret = 1;
1292  int fd, keylen;
1293 
1294  if ((fd = get_asym_dev_crypto()) < 0) {
1295  const DH_METHOD *meth = DH_OpenSSL();
1296 
1297  return ((meth->compute_key)(key, pub_key, dh));
1298  }
1299 
1300  keylen = BN_num_bits(dh->p);
1301 
1302  memset(&kop, 0, sizeof kop);
1303  kop.crk_op = CRK_DH_COMPUTE_KEY;
1304 
1305  /* inputs: dh->priv_key pub_key dh->p key */
1306  if (bn2crparam(dh->priv_key, &kop.crk_param[0]))
1307  goto err;
1308  if (bn2crparam(pub_key, &kop.crk_param[1]))
1309  goto err;
1310  if (bn2crparam(dh->p, &kop.crk_param[2]))
1311  goto err;
1312  kop.crk_iparams = 3;
1313 
1314  kop.crk_param[3].crp_p = (caddr_t) key;
1315  kop.crk_param[3].crp_nbits = keylen * 8;
1316  kop.crk_oparams = 1;
1317 
1318  if (ioctl(fd, CIOCKEY, &kop) == -1) {
1319  const DH_METHOD *meth = DH_OpenSSL();
1320 
1321  dhret = (meth->compute_key)(key, pub_key, dh);
1322  }
1323 err:
1324  kop.crk_param[3].crp_p = NULL;
1325  zapparams(&kop);
1326  return (dhret);
1327 }
1328 
1329 static DH_METHOD cryptodev_dh = {
1330  "cryptodev DH method",
1331  NULL, /* cryptodev_dh_generate_key */
1332  NULL,
1333  NULL,
1334  NULL,
1335  NULL,
1336  0, /* flags */
1337  NULL /* app_data */
1338 };
1339 
1340 /*
1341  * ctrl right now is just a wrapper that doesn't do much
1342  * but I expect we'll want some options soon.
1343  */
1344 static int
1345 cryptodev_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void))
1346 {
1347 #ifdef HAVE_SYSLOG_R
1348  struct syslog_data sd = SYSLOG_DATA_INIT;
1349 #endif
1350 
1351  switch (cmd) {
1352  default:
1353 #ifdef HAVE_SYSLOG_R
1354  syslog_r(LOG_ERR, &sd,
1355  "cryptodev_ctrl: unknown command %d", cmd);
1356 #else
1357  syslog(LOG_ERR, "cryptodev_ctrl: unknown command %d", cmd);
1358 #endif
1359  break;
1360  }
1361  return (1);
1362 }
1363 
1364 void
1366 {
1367  ENGINE *engine = ENGINE_new();
1368  int fd;
1369 
1370  if (engine == NULL)
1371  return;
1372  if ((fd = get_dev_crypto()) < 0) {
1373  ENGINE_free(engine);
1374  return;
1375  }
1376 
1377  /*
1378  * find out what asymmetric crypto algorithms we support
1379  */
1380  if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
1381  put_dev_crypto(fd);
1382  ENGINE_free(engine);
1383  return;
1384  }
1385  put_dev_crypto(fd);
1386 
1387  if (!ENGINE_set_id(engine, "cryptodev") ||
1388  !ENGINE_set_name(engine, "BSD cryptodev engine") ||
1389  !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) ||
1390  !ENGINE_set_digests(engine, cryptodev_engine_digests) ||
1391  !ENGINE_set_ctrl_function(engine, cryptodev_ctrl) ||
1392  !ENGINE_set_cmd_defns(engine, cryptodev_defns)) {
1393  ENGINE_free(engine);
1394  return;
1395  }
1396 
1397  if (ENGINE_set_RSA(engine, &cryptodev_rsa)) {
1398  const RSA_METHOD *rsa_meth = RSA_PKCS1_SSLeay();
1399 
1400  cryptodev_rsa.bn_mod_exp = rsa_meth->bn_mod_exp;
1401  cryptodev_rsa.rsa_mod_exp = rsa_meth->rsa_mod_exp;
1402  cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc;
1403  cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec;
1404  cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_enc;
1405  cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec;
1406  if (cryptodev_asymfeat & CRF_MOD_EXP) {
1407  cryptodev_rsa.bn_mod_exp = cryptodev_bn_mod_exp;
1408  if (cryptodev_asymfeat & CRF_MOD_EXP_CRT)
1409  cryptodev_rsa.rsa_mod_exp =
1410  cryptodev_rsa_mod_exp;
1411  else
1412  cryptodev_rsa.rsa_mod_exp =
1413  cryptodev_rsa_nocrt_mod_exp;
1414  }
1415  }
1416 
1417  if (ENGINE_set_DSA(engine, &cryptodev_dsa)) {
1418  const DSA_METHOD *meth = DSA_OpenSSL();
1419 
1420  memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD));
1421  if (cryptodev_asymfeat & CRF_DSA_SIGN)
1422  cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign;
1423  if (cryptodev_asymfeat & CRF_MOD_EXP) {
1424  cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp;
1425  cryptodev_dsa.dsa_mod_exp = cryptodev_dsa_dsa_mod_exp;
1426  }
1427  if (cryptodev_asymfeat & CRF_DSA_VERIFY)
1428  cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify;
1429  }
1430 
1431  if (ENGINE_set_DH(engine, &cryptodev_dh)){
1432  const DH_METHOD *dh_meth = DH_OpenSSL();
1433 
1434  cryptodev_dh.generate_key = dh_meth->generate_key;
1435  cryptodev_dh.compute_key = dh_meth->compute_key;
1436  cryptodev_dh.bn_mod_exp = dh_meth->bn_mod_exp;
1437  if (cryptodev_asymfeat & CRF_MOD_EXP) {
1438  cryptodev_dh.bn_mod_exp = cryptodev_mod_exp_dh;
1439  if (cryptodev_asymfeat & CRF_DH_COMPUTE_KEY)
1440  cryptodev_dh.compute_key =
1441  cryptodev_dh_compute_key;
1442  }
1443  }
1444 
1445  ENGINE_add(engine);
1446  ENGINE_free(engine);
1447  ERR_clear_error();
1448 }
1449 
1450 #endif /* HAVE_CRYPTODEV */