<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>