Merge branch 'vendor/OPENSSL'
authorPeter Avalos <pavalos@dragonflybsd.org>
Tue, 27 Mar 2012 23:47:37 +0000 (16:47 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Tue, 27 Mar 2012 23:47:37 +0000 (16:47 -0700)
1  2 
crypto/openssl/crypto/engine/eng_cryptodev.c

@@@ -32,9 -32,9 +32,9 @@@
  #include <openssl/bn.h>
  
  #if (defined(__unix__) || defined(unix)) && !defined(USG) && \
 -      (defined(OpenBSD) || defined(__FreeBSD__))
 +      (defined(OpenBSD) || defined(__FreeBSD__) || defined(__DragonFly__))
  #include <sys/param.h>
 -# if (OpenBSD >= 200112) || ((__FreeBSD_version >= 470101 && __FreeBSD_version < 500000) || __FreeBSD_version >= 500041)
 +# if (OpenBSD >= 200112) || ((__FreeBSD_version >= 470101 && __FreeBSD_version < 500000) || __FreeBSD_version >= 500041) || (__DragonFly_version >= 200500)
  #  define HAVE_CRYPTODEV
  # endif
  # if (OpenBSD >= 200110)
@@@ -79,8 -79,6 +79,6 @@@ struct dev_crypto_state 
        unsigned char digest_res[HASH_MAX_LEN];
        char *mac_data;
        int mac_len;
-       int copy;
  #endif
  };
  
@@@ -200,6 -198,7 +198,7 @@@ get_dev_crypto(void
  
        if ((fd = open_dev_crypto()) == -1)
                return (-1);
+ #ifndef CRIOGET_NOT_NEEDED
        if (ioctl(fd, CRIOGET, &retfd) == -1)
                return (-1);
  
                close(retfd);
                return (-1);
        }
+ #else
+         retfd = fd;
+ #endif
        return (retfd);
  }
  
+ static void put_dev_crypto(int fd)
+ {
+ #ifndef CRIOGET_NOT_NEEDED
+       close(fd);
+ #endif
+ }
  /* Caching version for asym operations */
  static int
  get_asym_dev_crypto(void)
@@@ -252,7 -261,7 +261,7 @@@ get_cryptodev_ciphers(const int **cnids
                    ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
                        nids[count++] = ciphers[i].nid;
        }
-       close(fd);
+       put_dev_crypto(fd);
  
        if (count > 0)
                *cnids = nids;
@@@ -291,7 -300,7 +300,7 @@@ get_cryptodev_digests(const int **cnids
                    ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
                        nids[count++] = digests[i].nid;
        }
-       close(fd);
+       put_dev_crypto(fd);
  
        if (count > 0)
                *cnids = nids;
@@@ -436,7 -445,7 +445,7 @@@ cryptodev_init_key(EVP_CIPHER_CTX *ctx
        sess->cipher = cipher;
  
        if (ioctl(state->d_fd, CIOCGSESSION, sess) == -1) {
-               close(state->d_fd);
+               put_dev_crypto(state->d_fd);
                state->d_fd = -1;
                return (0);
        }
@@@ -473,7 -482,7 +482,7 @@@ cryptodev_cleanup(EVP_CIPHER_CTX *ctx
        } else {
                ret = 1;
        }
-       close(state->d_fd);
+       put_dev_crypto(state->d_fd);
        state->d_fd = -1;
  
        return (ret);
@@@ -686,7 -695,7 +695,7 @@@ static int cryptodev_digest_init(EVP_MD
        sess->mac = digest;
  
        if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) {
-               close(state->d_fd);
+               put_dev_crypto(state->d_fd);
                state->d_fd = -1;
                printf("cryptodev_digest_init: Open session failed\n");
                return (0);
@@@ -758,14 -767,12 +767,12 @@@ static int cryptodev_digest_final(EVP_M
        if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) {
                /* if application doesn't support one buffer */
                memset(&cryp, 0, sizeof(cryp));
                cryp.ses = sess->ses;
                cryp.flags = 0;
                cryp.len = state->mac_len;
                cryp.src = state->mac_data;
                cryp.dst = NULL;
                cryp.mac = (caddr_t)md;
                if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {
                        printf("cryptodev_digest_final: digest failed\n");
                        return (0);
@@@ -786,6 -793,9 +793,9 @@@ static int cryptodev_digest_cleanup(EVP
        struct dev_crypto_state *state = ctx->md_data;
        struct session_op *sess = &state->d_sess;
  
+       if (state == NULL)
+         return 0;
        if (state->d_fd < 0) {
                printf("cryptodev_digest_cleanup: illegal input\n");
                return (0);
                state->mac_len = 0;
        }
  
-       if (state->copy)
-               return 1;
        if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) {
                printf("cryptodev_digest_cleanup: failed to close session\n");
                ret = 0;
        } else {
                ret = 1;
        }
-       close(state->d_fd);     
+       put_dev_crypto(state->d_fd);    
        state->d_fd = -1;
  
        return (ret);
@@@ -816,15 -823,39 +823,39 @@@ static int cryptodev_digest_copy(EVP_MD
  {
        struct dev_crypto_state *fstate = from->md_data;
        struct dev_crypto_state *dstate = to->md_data;
+       struct session_op *sess;
+       int digest;
  
-       memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
+       if (dstate == NULL || fstate == NULL)
+         return 1;
  
-       if (fstate->mac_len != 0) {
-               dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
-               memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
+               memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
+       sess = &dstate->d_sess;
+       digest = digest_nid_to_cryptodev(to->digest->type);
+       sess->mackey = dstate->dummy_mac_key;
+       sess->mackeylen = digest_key_length(to->digest->type);
+       sess->mac = digest;
+       dstate->d_fd = get_dev_crypto();
+       if (ioctl(dstate->d_fd, CIOCGSESSION, sess) < 0) {
+               put_dev_crypto(dstate->d_fd);
+               dstate->d_fd = -1;
+               printf("cryptodev_digest_init: Open session failed\n");
+               return (0);
        }
  
-       dstate->copy = 1;
+       if (fstate->mac_len != 0) {
+               if (fstate->mac_data != NULL)
+                       {
+                       dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
+                       memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
+                       dstate->mac_len = fstate->mac_len;
+                       }
+       }
  
        return 1;
  }
@@@ -1347,11 -1378,11 +1378,11 @@@ ENGINE_load_cryptodev(void
         * find out what asymmetric crypto algorithms we support
         */
        if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
-               close(fd);
+               put_dev_crypto(fd);
                ENGINE_free(engine);
                return;
        }
-       close(fd);
+       put_dev_crypto(fd);
  
        if (!ENGINE_set_id(engine, "cryptodev") ||
            !ENGINE_set_name(engine, "BSD cryptodev engine") ||