summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/engine/eng_cryptodev.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/engine/eng_cryptodev.c')
-rw-r--r--src/lib/libcrypto/engine/eng_cryptodev.c71
1 files changed, 51 insertions, 20 deletions
diff --git a/src/lib/libcrypto/engine/eng_cryptodev.c b/src/lib/libcrypto/engine/eng_cryptodev.c
index 10b3856b4e..a7abac1a7b 100644
--- a/src/lib/libcrypto/engine/eng_cryptodev.c
+++ b/src/lib/libcrypto/engine/eng_cryptodev.c
@@ -79,8 +79,6 @@ struct dev_crypto_state {
79 unsigned char digest_res[HASH_MAX_LEN]; 79 unsigned char digest_res[HASH_MAX_LEN];
80 char *mac_data; 80 char *mac_data;
81 int mac_len; 81 int mac_len;
82
83 int copy;
84#endif 82#endif
85}; 83};
86 84
@@ -199,6 +197,7 @@ get_dev_crypto(void)
199 197
200 if ((fd = open_dev_crypto()) == -1) 198 if ((fd = open_dev_crypto()) == -1)
201 return (-1); 199 return (-1);
200#ifndef CRIOGET_NOT_NEEDED
202 if (ioctl(fd, CRIOGET, &retfd) == -1) 201 if (ioctl(fd, CRIOGET, &retfd) == -1)
203 return (-1); 202 return (-1);
204 203
@@ -207,9 +206,19 @@ get_dev_crypto(void)
207 close(retfd); 206 close(retfd);
208 return (-1); 207 return (-1);
209 } 208 }
209#else
210 retfd = fd;
211#endif
210 return (retfd); 212 return (retfd);
211} 213}
212 214
215static void put_dev_crypto(int fd)
216{
217#ifndef CRIOGET_NOT_NEEDED
218 close(fd);
219#endif
220}
221
213/* Caching version for asym operations */ 222/* Caching version for asym operations */
214static int 223static int
215get_asym_dev_crypto(void) 224get_asym_dev_crypto(void)
@@ -251,7 +260,7 @@ get_cryptodev_ciphers(const int **cnids)
251 ioctl(fd, CIOCFSESSION, &sess.ses) != -1) 260 ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
252 nids[count++] = ciphers[i].nid; 261 nids[count++] = ciphers[i].nid;
253 } 262 }
254 close(fd); 263 put_dev_crypto(fd);
255 264
256 if (count > 0) 265 if (count > 0)
257 *cnids = nids; 266 *cnids = nids;
@@ -290,7 +299,7 @@ get_cryptodev_digests(const int **cnids)
290 ioctl(fd, CIOCFSESSION, &sess.ses) != -1) 299 ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
291 nids[count++] = digests[i].nid; 300 nids[count++] = digests[i].nid;
292 } 301 }
293 close(fd); 302 put_dev_crypto(fd);
294 303
295 if (count > 0) 304 if (count > 0)
296 *cnids = nids; 305 *cnids = nids;
@@ -435,7 +444,7 @@ cryptodev_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
435 sess->cipher = cipher; 444 sess->cipher = cipher;
436 445
437 if (ioctl(state->d_fd, CIOCGSESSION, sess) == -1) { 446 if (ioctl(state->d_fd, CIOCGSESSION, sess) == -1) {
438 close(state->d_fd); 447 put_dev_crypto(state->d_fd);
439 state->d_fd = -1; 448 state->d_fd = -1;
440 return (0); 449 return (0);
441 } 450 }
@@ -472,7 +481,7 @@ cryptodev_cleanup(EVP_CIPHER_CTX *ctx)
472 } else { 481 } else {
473 ret = 1; 482 ret = 1;
474 } 483 }
475 close(state->d_fd); 484 put_dev_crypto(state->d_fd);
476 state->d_fd = -1; 485 state->d_fd = -1;
477 486
478 return (ret); 487 return (ret);
@@ -685,7 +694,7 @@ static int cryptodev_digest_init(EVP_MD_CTX *ctx)
685 sess->mac = digest; 694 sess->mac = digest;
686 695
687 if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) { 696 if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) {
688 close(state->d_fd); 697 put_dev_crypto(state->d_fd);
689 state->d_fd = -1; 698 state->d_fd = -1;
690 printf("cryptodev_digest_init: Open session failed\n"); 699 printf("cryptodev_digest_init: Open session failed\n");
691 return (0); 700 return (0);
@@ -757,14 +766,12 @@ static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md)
757 if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) { 766 if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) {
758 /* if application doesn't support one buffer */ 767 /* if application doesn't support one buffer */
759 memset(&cryp, 0, sizeof(cryp)); 768 memset(&cryp, 0, sizeof(cryp));
760
761 cryp.ses = sess->ses; 769 cryp.ses = sess->ses;
762 cryp.flags = 0; 770 cryp.flags = 0;
763 cryp.len = state->mac_len; 771 cryp.len = state->mac_len;
764 cryp.src = state->mac_data; 772 cryp.src = state->mac_data;
765 cryp.dst = NULL; 773 cryp.dst = NULL;
766 cryp.mac = (caddr_t)md; 774 cryp.mac = (caddr_t)md;
767
768 if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) { 775 if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {
769 printf("cryptodev_digest_final: digest failed\n"); 776 printf("cryptodev_digest_final: digest failed\n");
770 return (0); 777 return (0);
@@ -785,6 +792,9 @@ static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)
785 struct dev_crypto_state *state = ctx->md_data; 792 struct dev_crypto_state *state = ctx->md_data;
786 struct session_op *sess = &state->d_sess; 793 struct session_op *sess = &state->d_sess;
787 794
795 if (state == NULL)
796 return 0;
797
788 if (state->d_fd < 0) { 798 if (state->d_fd < 0) {
789 printf("cryptodev_digest_cleanup: illegal input\n"); 799 printf("cryptodev_digest_cleanup: illegal input\n");
790 return (0); 800 return (0);
@@ -796,16 +806,13 @@ static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)
796 state->mac_len = 0; 806 state->mac_len = 0;
797 } 807 }
798 808
799 if (state->copy)
800 return 1;
801
802 if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) { 809 if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) {
803 printf("cryptodev_digest_cleanup: failed to close session\n"); 810 printf("cryptodev_digest_cleanup: failed to close session\n");
804 ret = 0; 811 ret = 0;
805 } else { 812 } else {
806 ret = 1; 813 ret = 1;
807 } 814 }
808 close(state->d_fd); 815 put_dev_crypto(state->d_fd);
809 state->d_fd = -1; 816 state->d_fd = -1;
810 817
811 return (ret); 818 return (ret);
@@ -815,15 +822,39 @@ static int cryptodev_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)
815{ 822{
816 struct dev_crypto_state *fstate = from->md_data; 823 struct dev_crypto_state *fstate = from->md_data;
817 struct dev_crypto_state *dstate = to->md_data; 824 struct dev_crypto_state *dstate = to->md_data;
825 struct session_op *sess;
826 int digest;
818 827
819 memcpy(dstate, fstate, sizeof(struct dev_crypto_state)); 828 if (dstate == NULL || fstate == NULL)
829 return 1;
820 830
821 if (fstate->mac_len != 0) { 831 memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
822 dstate->mac_data = OPENSSL_malloc(fstate->mac_len); 832
823 memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len); 833 sess = &dstate->d_sess;
834
835 digest = digest_nid_to_cryptodev(to->digest->type);
836
837 sess->mackey = dstate->dummy_mac_key;
838 sess->mackeylen = digest_key_length(to->digest->type);
839 sess->mac = digest;
840
841 dstate->d_fd = get_dev_crypto();
842
843 if (ioctl(dstate->d_fd, CIOCGSESSION, sess) < 0) {
844 put_dev_crypto(dstate->d_fd);
845 dstate->d_fd = -1;
846 printf("cryptodev_digest_init: Open session failed\n");
847 return (0);
824 } 848 }
825 849
826 dstate->copy = 1; 850 if (fstate->mac_len != 0) {
851 if (fstate->mac_data != NULL)
852 {
853 dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
854 memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
855 dstate->mac_len = fstate->mac_len;
856 }
857 }
827 858
828 return 1; 859 return 1;
829} 860}
@@ -1346,11 +1377,11 @@ ENGINE_load_cryptodev(void)
1346 * find out what asymmetric crypto algorithms we support 1377 * find out what asymmetric crypto algorithms we support
1347 */ 1378 */
1348 if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) { 1379 if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
1349 close(fd); 1380 put_dev_crypto(fd);
1350 ENGINE_free(engine); 1381 ENGINE_free(engine);
1351 return; 1382 return;
1352 } 1383 }
1353 close(fd); 1384 put_dev_crypto(fd);
1354 1385
1355 if (!ENGINE_set_id(engine, "cryptodev") || 1386 if (!ENGINE_set_id(engine, "cryptodev") ||
1356 !ENGINE_set_name(engine, "BSD cryptodev engine") || 1387 !ENGINE_set_name(engine, "BSD cryptodev engine") ||