<div dir="ltr"><div><div><div>Hi<br></div><div><br>I don't believe it's possible to use Nettle in Wine right now, due to its copyright license:<br><br>"Nettle is dual licenced under the GNU General Public License version 2
or later, and the GNU Lesser General Public License version 3 or later.
When using Nettle, you must comply fully with all conditions of at least
one of these licenses." (<a href="http://www.lysator.liu.se/~nisse/nettle/nettle.html#Copyright" target="_blank">http://www.lysator.liu.se/~nisse/nettle/nettle.html#Copyright</a>)<br><br></div>Wine is only LGPLv2+, which isn't compatible with either.<br><br></div><div>Besides, why not GnuTLS or Mozilla's NSS?<br></div><div><br></div>Regards<br></div>Damjan<br><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 11, 2016 at 12:25 PM, Hans Leidekker <span dir="ltr"><<a href="mailto:hans@codeweavers.com" target="_blank">hans@codeweavers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">v2: Load Nettle dynamically.<br>
<br>
Signed-off-by: Hans Leidekker <<a href="mailto:hans@codeweavers.com" target="_blank">hans@codeweavers.com</a>><br>
---<br>
 <a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a>              |  13 +++<br>
 dlls/bcrypt/Makefile.in   |   1 +<br>
 dlls/bcrypt/bcrypt_main.c | 199 ++++++++++++++++++++++++++++++++++++++++++++--<br>
 3 files changed, 208 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a> b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
index 2b1dd81..32b09ad 100644<br>
--- a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
+++ b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
@@ -60,6 +60,7 @@ AC_ARG_WITH(ldap,      AS_HELP_STRING([--without-ldap],[do not use LDAP]),<br>
             [if test "x$withval" = "xno"; then ac_cv_header_ldap_h=no; ac_cv_header_lber_h=no; fi])<br>
 AC_ARG_WITH(mpg123,    AS_HELP_STRING([--without-mpg123],[do not use the mpg123 library]))<br>
 AC_ARG_WITH(netapi,    AS_HELP_STRING([--without-netapi],[do not use the Samba NetAPI library]))<br>
+AC_ARG_WITH(nettle,    AS_HELP_STRING([--without-nettle],[do not use Nettle]))<br>
 AC_ARG_WITH(openal,    AS_HELP_STRING([--without-openal],[do not use OpenAL]),<br>
             [if test "x$withval" = "xno"; then ac_cv_header_AL_al_h=no; ac_cv_header_OpenAL_al_h=no; fi])<br>
 AC_ARG_WITH(opencl,    AS_HELP_STRING([--without-opencl],[do not use OpenCL]),<br>
@@ -1274,6 +1275,18 @@ fi<br>
 WINE_WARNING_WITH(gnutls,[test "x$ac_cv_lib_soname_gnutls" = "x"],<br>
                  [libgnutls ${notice_platform}development files not found, no schannel support.])<br>
<br>
+dnl **** Check for libnettle ***<br>
+if test "x$with_nettle" != "xno"<br>
+then<br>
+    WINE_PACKAGE_FLAGS(NETTLE,[nettle],,,,<br>
+        [AC_CHECK_HEADER([nettle/sha2.h],<br>
+            [WINE_CHECK_SONAME(nettle,nettle_sha512_init,,[NETTLE_CFLAGS=""],[$NETTLE_LIBS])],<br>
+            [NETTLE_CFLAGS=""])])<br>
+fi<br>
+WINE_WARNING_WITH(nettle,[test "x$ac_cv_lib_soname_nettle" = "x" -a \<br>
+                               "x$ac_cv_header_CommonCrypto_CommonDigest_h" != "xyes"],<br>
+                 [libnettle ${notice_platform}development files not found, no crypto support (bcrypt).])<br>
+<br>
 dnl **** Check which curses lib to use ***<br>
 CURSES_LIBS=""<br>
 if test "$ac_cv_header_ncurses_h" = "yes"<br>
diff --git a/dlls/bcrypt/Makefile.in b/dlls/bcrypt/Makefile.in<br>
index 87e1429..e83cbab 100644<br>
--- a/dlls/bcrypt/Makefile.in<br>
+++ b/dlls/bcrypt/Makefile.in<br>
@@ -1,5 +1,6 @@<br>
 MODULE    = bcrypt.dll<br>
 IMPORTS   = advapi32<br>
+EXTRAINCL = $(NETTLE_CFLAGS)<br>
<br>
 C_SRCS = \<br>
        bcrypt_main.c<br>
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c<br>
index 9cc5227..e66a70f 100644<br>
--- a/dlls/bcrypt/bcrypt_main.c<br>
+++ b/dlls/bcrypt/bcrypt_main.c<br>
@@ -18,10 +18,14 @@<br>
  */<br>
<br>
 #include "config.h"<br>
+#include "wine/port.h"<br>
<br>
 #include <stdarg.h><br>
 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H<br>
 #include <CommonCrypto/CommonDigest.h><br>
+#elif defined(SONAME_LIBNETTLE)<br>
+#include <nettle/sha1.h><br>
+#include <nettle/sha2.h><br>
 #endif<br>
<br>
 #include "ntstatus.h"<br>
@@ -32,10 +36,73 @@<br>
 #include "bcrypt.h"<br>
<br>
 #include "wine/debug.h"<br>
+#include "wine/library.h"<br>
 #include "wine/unicode.h"<br>
<br>
 WINE_DEFAULT_DEBUG_CHANNEL(bcrypt);<br>
<br>
+static HINSTANCE instance;<br>
+<br>
+#if defined(SONAME_LIBNETTLE) && !defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H)<br>
+WINE_DECLARE_DEBUG_CHANNEL(winediag);<br>
+<br>
+static void *libnettle_handle;<br>
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f<br>
+MAKE_FUNCPTR(nettle_sha1_init);<br>
+MAKE_FUNCPTR(nettle_sha256_init);<br>
+MAKE_FUNCPTR(nettle_sha384_init);<br>
+MAKE_FUNCPTR(nettle_sha512_init);<br>
+MAKE_FUNCPTR(nettle_sha1_update);<br>
+MAKE_FUNCPTR(nettle_sha256_update);<br>
+MAKE_FUNCPTR(nettle_sha512_update);<br>
+MAKE_FUNCPTR(nettle_sha1_digest);<br>
+MAKE_FUNCPTR(nettle_sha256_digest);<br>
+MAKE_FUNCPTR(nettle_sha384_digest);<br>
+MAKE_FUNCPTR(nettle_sha512_digest);<br>
+#undef MAKE_FUNCPTR<br>
+<br>
+static BOOL nettle_init(void)<br>
+{<br>
+    if (!(libnettle_handle = wine_dlopen( SONAME_LIBNETTLE, RTLD_NOW, NULL, 0 )))<br>
+    {<br>
+        ERR_(winediag)( "failed to load libnettle, no crypto support\n" );<br>
+        return FALSE;<br>
+    }<br>
+<br>
+#define LOAD_FUNCPTR(f) \<br>
+    if (!(p##f = wine_dlsym( libnettle_handle, #f, NULL, 0 ))) \<br>
+    { \<br>
+        ERR( "failed to load %s\n", #f ); \<br>
+        goto fail; \<br>
+    }<br>
+<br>
+    LOAD_FUNCPTR(nettle_sha1_init)<br>
+    LOAD_FUNCPTR(nettle_sha256_init)<br>
+    LOAD_FUNCPTR(nettle_sha384_init)<br>
+    LOAD_FUNCPTR(nettle_sha512_init)<br>
+    LOAD_FUNCPTR(nettle_sha1_update)<br>
+    LOAD_FUNCPTR(nettle_sha256_update)<br>
+    LOAD_FUNCPTR(nettle_sha512_update)<br>
+    LOAD_FUNCPTR(nettle_sha1_digest)<br>
+    LOAD_FUNCPTR(nettle_sha256_digest)<br>
+    LOAD_FUNCPTR(nettle_sha384_digest)<br>
+    LOAD_FUNCPTR(nettle_sha512_digest)<br>
+#undef LOAD_FUNCPTR<br>
+    return TRUE;<br>
+<br>
+fail:<br>
+    wine_dlclose( libnettle_handle, NULL, 0 );<br>
+    libnettle_handle = NULL;<br>
+    return FALSE;<br>
+}<br>
+<br>
+static void nettle_deinit(void)<br>
+{<br>
+    wine_dlclose( libnettle_handle, NULL, 0 );<br>
+    libnettle_handle = NULL;<br>
+}<br>
+#endif /* SONAME_LIBNETTLE && !HAVE_COMMONCRYPTO_COMMONDIGEST_H */<br>
+<br>
 NTSTATUS WINAPI BCryptEnumAlgorithms(ULONG dwAlgOperations, ULONG *pAlgCount,<br>
                                      BCRYPT_ALGORITHM_IDENTIFIER **ppAlgList, ULONG dwFlags)<br>
 {<br>
@@ -203,7 +270,7 @@ static NTSTATUS hash_init( struct hash *hash )<br>
     return STATUS_SUCCESS;<br>
 }<br>
<br>
-static void hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
+static NTSTATUS hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
 {<br>
     switch (hash->alg_id)<br>
     {<br>
@@ -225,8 +292,9 @@ static void hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
<br>
     default:<br>
         ERR( "unhandled id %u\n", hash->alg_id );<br>
-        break;<br>
+        return STATUS_NOT_IMPLEMENTED;<br>
     }<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 static NTSTATUS hash_finish( struct hash *hash, UCHAR *output, ULONG size )<br>
@@ -255,6 +323,105 @@ static NTSTATUS hash_finish( struct hash *hash, UCHAR *output, ULONG size )<br>
     }<br>
     return STATUS_SUCCESS;<br>
 }<br>
+#elif defined(SONAME_LIBNETTLE)<br>
+struct hash<br>
+{<br>
+    struct object hdr;<br>
+    enum alg_id   alg_id;<br>
+    union<br>
+    {<br>
+        struct sha1_ctx   sha1_ctx;<br>
+        struct sha256_ctx sha256_ctx;<br>
+        struct sha512_ctx sha512_ctx;<br>
+    } u;<br>
+};<br>
+<br>
+static NTSTATUS hash_init( struct hash *hash )<br>
+{<br>
+    if (!libnettle_handle) return STATUS_NOT_IMPLEMENTED;<br>
+<br>
+    switch (hash->alg_id)<br>
+    {<br>
+    case ALG_ID_SHA1:<br>
+        pnettle_sha1_init( &hash->u.sha1_ctx );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA256:<br>
+        pnettle_sha256_init( &hash->u.sha256_ctx );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA384:<br>
+        pnettle_sha384_init( &hash->u.sha512_ctx );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA512:<br>
+        pnettle_sha512_init( &hash->u.sha512_ctx );<br>
+        break;<br>
+<br>
+    default:<br>
+        ERR( "unhandled id %u\n", hash->alg_id );<br>
+        return STATUS_NOT_IMPLEMENTED;<br>
+    }<br>
+    return STATUS_SUCCESS;<br>
+}<br>
+<br>
+static NTSTATUS hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
+{<br>
+    if (!libnettle_handle) return STATUS_NOT_IMPLEMENTED;<br>
+<br>
+    switch (hash->alg_id)<br>
+    {<br>
+    case ALG_ID_SHA1:<br>
+        pnettle_sha1_update( &hash->u.sha1_ctx, size, input );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA256:<br>
+        pnettle_sha256_update( &hash->u.sha256_ctx, size, input );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA384:<br>
+        pnettle_sha512_update( &hash->u.sha512_ctx, size, input );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA512:<br>
+        pnettle_sha512_update( &hash->u.sha512_ctx, size, input );<br>
+        break;<br>
+<br>
+    default:<br>
+        ERR( "unhandled id %u\n", hash->alg_id );<br>
+        return STATUS_NOT_IMPLEMENTED;<br>
+    }<br>
+    return STATUS_SUCCESS;<br>
+}<br>
+<br>
+static NTSTATUS hash_finish( struct hash *hash, UCHAR *output, ULONG size )<br>
+{<br>
+    if (!libnettle_handle) return STATUS_NOT_IMPLEMENTED;<br>
+<br>
+    switch (hash->alg_id)<br>
+    {<br>
+    case ALG_ID_SHA1:<br>
+        pnettle_sha1_digest( &hash->u.sha1_ctx, size, output );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA256:<br>
+        pnettle_sha256_digest( &hash->u.sha256_ctx, size, output );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA384:<br>
+        pnettle_sha384_digest( &hash->u.sha512_ctx, size, output );<br>
+        break;<br>
+<br>
+    case ALG_ID_SHA512:<br>
+        pnettle_sha512_digest( &hash->u.sha512_ctx, size, output );<br>
+        break;<br>
+<br>
+    default:<br>
+        ERR( "unhandled id %u\n", hash->alg_id );<br>
+        return STATUS_NOT_IMPLEMENTED;<br>
+    }<br>
+    return STATUS_SUCCESS;<br>
+}<br>
 #else<br>
 struct hash<br>
 {<br>
@@ -268,9 +435,10 @@ static NTSTATUS hash_init( struct hash *hash )<br>
     return STATUS_NOT_IMPLEMENTED;<br>
 }<br>
<br>
-static void hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
+static NTSTATUS hash_update( struct hash *hash, UCHAR *input, ULONG size )<br>
 {<br>
     ERR( "support for hashes not available at build time\n" );<br>
+    return STATUS_NOT_IMPLEMENTED;<br>
 }<br>
<br>
 static NTSTATUS hash_finish( struct hash *hash, UCHAR *output, ULONG size )<br>
@@ -484,8 +652,7 @@ NTSTATUS WINAPI BCryptHashData( BCRYPT_HASH_HANDLE handle, UCHAR *input, ULONG s<br>
     if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE;<br>
     if (!input) return STATUS_INVALID_PARAMETER;<br>
<br>
-    hash_update( hash, input, size );<br>
-    return STATUS_SUCCESS;<br>
+    return hash_update( hash, input, size );<br>
 }<br>
<br>
 NTSTATUS WINAPI BCryptFinishHash( BCRYPT_HASH_HANDLE handle, UCHAR *output, ULONG size, ULONG flags )<br>
@@ -499,3 +666,25 @@ NTSTATUS WINAPI BCryptFinishHash( BCRYPT_HASH_HANDLE handle, UCHAR *output, ULON<br>
<br>
     return hash_finish( hash, output, size );<br>
 }<br>
+<br>
+BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )<br>
+{<br>
+    switch (reason)<br>
+    {<br>
+    case DLL_PROCESS_ATTACH:<br>
+        instance = hinst;<br>
+        DisableThreadLibraryCalls( hinst );<br>
+#if defined(SONAME_LIBNETTLE) && !defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H)<br>
+        nettle_init();<br>
+#endif<br>
+        break;<br>
+<br>
+    case DLL_PROCESS_DETACH:<br>
+        if (reserved) break;<br>
+#if defined(SONAME_LIBNETTLE) && !defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H)<br>
+        nettle_deinit();<br>
+#endif<br>
+        break;<br>
+    }<br>
+    return TRUE;<br>
+}<br>
<span><font color="#888888">--<br>
2.6.4<br>
<br>
<br>
<br>
</font></span></blockquote></div><br></div></div>