[PATCH 2/2] bcrypt: Move macOS support to a new file.

Hans Leidekker hans at codeweavers.com
Wed Jul 18 04:20:12 CDT 2018


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/bcrypt/Makefile.in   |   1 +
 dlls/bcrypt/bcrypt_main.c | 180 --------------------------------------
 dlls/bcrypt/macos.c       | 216 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 217 insertions(+), 180 deletions(-)
 create mode 100644 dlls/bcrypt/macos.c

diff --git a/dlls/bcrypt/Makefile.in b/dlls/bcrypt/Makefile.in
index 63a731fa9d..dd6d4a7664 100644
--- a/dlls/bcrypt/Makefile.in
+++ b/dlls/bcrypt/Makefile.in
@@ -6,6 +6,7 @@ EXTRAINCL = $(GNUTLS_CFLAGS)
 C_SRCS = \
 	bcrypt_main.c \
 	gnutls.c \
+	macos.c \
 	md2.c \
 	sha256.c \
 	sha512.c
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index e35f00aa2c..851767de5e 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -815,186 +815,6 @@ void buffer_append_asn1_r_s( struct buffer *buffer, BYTE *r, DWORD r_len, BYTE *
 }
 #endif
 
-#if defined(HAVE_COMMONCRYPTO_COMMONCRYPTOR_H) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
-NTSTATUS key_set_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags )
-{
-    if (!strcmpW( prop, BCRYPT_CHAINING_MODE ))
-    {
-        if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_ECB, size ))
-        {
-            key->u.s.mode = MODE_ID_ECB;
-            return STATUS_SUCCESS;
-        }
-        else if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_CBC, size ))
-        {
-            key->u.s.mode = MODE_ID_CBC;
-            return STATUS_SUCCESS;
-        }
-        else
-        {
-            FIXME( "unsupported mode %s\n", debugstr_wn( (WCHAR *)value, size ) );
-            return STATUS_NOT_IMPLEMENTED;
-        }
-    }
-
-    FIXME( "unsupported key property %s\n", debugstr_w(prop) );
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-static ULONG get_block_size( struct algorithm *alg )
-{
-    ULONG ret = 0, size = sizeof(ret);
-    get_alg_property( alg, BCRYPT_BLOCK_LENGTH, (UCHAR *)&ret, sizeof(ret), &size );
-    return ret;
-}
-
-NTSTATUS key_symmetric_init( struct key *key, struct algorithm *alg, const UCHAR *secret, ULONG secret_len )
-{
-    UCHAR *buffer;
-
-    switch (alg->id)
-    {
-    case ALG_ID_AES:
-        switch (alg->mode)
-        {
-        case MODE_ID_ECB:
-        case MODE_ID_CBC:
-            break;
-        default:
-            FIXME( "mode %u not supported\n", alg->mode );
-            return STATUS_NOT_SUPPORTED;
-        }
-        break;
-
-    default:
-        FIXME( "algorithm %u not supported\n", alg->id );
-        return STATUS_NOT_SUPPORTED;
-    }
-
-    if (!(key->u.s.block_size = get_block_size( alg ))) return STATUS_INVALID_PARAMETER;
-    if (!(buffer = heap_alloc( secret_len ))) return STATUS_NO_MEMORY;
-    memcpy( buffer, secret, secret_len );
-
-    key->alg_id          = alg->id;
-    key->u.s.mode        = alg->mode;
-    key->u.s.ref_encrypt = NULL;        /* initialized on first use */
-    key->u.s.ref_decrypt = NULL;
-    key->u.s.secret      = buffer;
-    key->u.s.secret_len  = secret_len;
-
-    return STATUS_SUCCESS;
-}
-
-static CCMode get_cryptor_mode( struct key *key )
-{
-    switch (key->u.s.mode)
-    {
-    case MODE_ID_ECB: return kCCModeECB;
-    case MODE_ID_CBC: return kCCModeCBC;
-    default:
-        FIXME( "unsupported mode %u\n", key->u.s.mode );
-        return 0;
-    }
-}
-
-NTSTATUS key_symmetric_set_params( struct key *key, UCHAR *iv, ULONG iv_len )
-{
-    CCCryptorStatus status;
-    CCMode mode;
-
-    if (!(mode = get_cryptor_mode( key ))) return STATUS_NOT_SUPPORTED;
-
-    if (key->u.s.ref_encrypt)
-    {
-        CCCryptorRelease( key->u.s.ref_encrypt );
-        key->u.s.ref_encrypt = NULL;
-    }
-    if (key->u.s.ref_decrypt)
-    {
-        CCCryptorRelease( key->u.s.ref_decrypt );
-        key->u.s.ref_decrypt = NULL;
-    }
-
-    if ((status = CCCryptorCreateWithMode( kCCEncrypt, mode, kCCAlgorithmAES128, ccNoPadding, iv, key->u.s.secret,
-                                           key->u.s.secret_len, NULL, 0, 0, 0, &key->u.s.ref_encrypt )) != kCCSuccess)
-    {
-        WARN( "CCCryptorCreateWithMode failed %d\n", status );
-        return STATUS_INTERNAL_ERROR;
-    }
-    if ((status = CCCryptorCreateWithMode( kCCDecrypt, mode, kCCAlgorithmAES128, ccNoPadding, iv, key->u.s.secret,
-                                           key->u.s.secret_len, NULL, 0, 0, 0, &key->u.s.ref_decrypt )) != kCCSuccess)
-    {
-        WARN( "CCCryptorCreateWithMode failed %d\n", status );
-        CCCryptorRelease( key->u.s.ref_encrypt );
-        key->u.s.ref_encrypt = NULL;
-        return STATUS_INTERNAL_ERROR;
-    }
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS key_symmetric_set_auth_data( struct key *key, UCHAR *auth_data, ULONG len )
-{
-    FIXME( "not implemented on Mac\n" );
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS key_symmetric_encrypt( struct key *key, const UCHAR *input, ULONG input_len, UCHAR *output,
-                                ULONG output_len  )
-{
-    CCCryptorStatus status;
-
-    if ((status = CCCryptorUpdate( key->u.s.ref_encrypt, input, input_len, output, output_len, NULL  )) != kCCSuccess)
-    {
-        WARN( "CCCryptorUpdate failed %d\n", status );
-        return STATUS_INTERNAL_ERROR;
-    }
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS key_symmetric_decrypt( struct key *key, const UCHAR *input, ULONG input_len, UCHAR *output,
-                                ULONG output_len )
-{
-    CCCryptorStatus status;
-
-    if ((status = CCCryptorUpdate( key->u.s.ref_decrypt, input, input_len, output, output_len, NULL  )) != kCCSuccess)
-    {
-        WARN( "CCCryptorUpdate failed %d\n", status );
-        return STATUS_INTERNAL_ERROR;
-    }
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS key_symmetric_get_tag( struct key *key, UCHAR *tag, ULONG len )
-{
-    FIXME( "not implemented on Mac\n" );
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, const UCHAR *pubkey, ULONG pubkey_len )
-{
-    FIXME( "not implemented on Mac\n" );
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS key_asymmetric_verify( struct key *key, void *padding, UCHAR *hash, ULONG hash_len, UCHAR *signature,
-                                ULONG signature_len, DWORD flags )
-{
-    FIXME( "not implemented on Mac\n" );
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS key_destroy( struct key *key )
-{
-    if (key->u.s.ref_encrypt) CCCryptorRelease( key->u.s.ref_encrypt );
-    if (key->u.s.ref_decrypt) CCCryptorRelease( key->u.s.ref_decrypt );
-    heap_free( key->u.s.secret );
-    heap_free( key );
-    return STATUS_SUCCESS;
-}
-#endif
 
 #if defined(HAVE_GNUTLS_CIPHER_INIT) || defined(HAVE_COMMONCRYPTO_COMMONCRYPTOR_H) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
 BOOL key_is_symmetric( struct key *key )
diff --git a/dlls/bcrypt/macos.c b/dlls/bcrypt/macos.c
new file mode 100644
index 0000000000..94d5dbd0d3
--- /dev/null
+++ b/dlls/bcrypt/macos.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2009 Henri Verbeet for CodeWeavers
+ * Copyright 2018 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H
+#include <AvailabilityMacros.h>
+#include <CommonCrypto/CommonCryptor.h>
+#endif
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
+#include "ntsecapi.h"
+#include "bcrypt.h"
+
+#include "bcrypt_internal.h"
+
+#include "wine/debug.h"
+#include "wine/heap.h"
+#include "wine/library.h"
+#include "wine/unicode.h"
+
+#if defined(HAVE_COMMONCRYPTO_COMMONCRYPTOR_H) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+WINE_DEFAULT_DEBUG_CHANNEL(bcrypt);
+
+NTSTATUS key_set_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags )
+{
+    if (!strcmpW( prop, BCRYPT_CHAINING_MODE ))
+    {
+        if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_ECB, size ))
+        {
+            key->u.s.mode = MODE_ID_ECB;
+            return STATUS_SUCCESS;
+        }
+        else if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_CBC, size ))
+        {
+            key->u.s.mode = MODE_ID_CBC;
+            return STATUS_SUCCESS;
+        }
+        else
+        {
+            FIXME( "unsupported mode %s\n", debugstr_wn( (WCHAR *)value, size ) );
+            return STATUS_NOT_IMPLEMENTED;
+        }
+    }
+
+    FIXME( "unsupported key property %s\n", debugstr_w(prop) );
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+static ULONG get_block_size( struct algorithm *alg )
+{
+    ULONG ret = 0, size = sizeof(ret);
+    get_alg_property( alg, BCRYPT_BLOCK_LENGTH, (UCHAR *)&ret, sizeof(ret), &size );
+    return ret;
+}
+
+NTSTATUS key_symmetric_init( struct key *key, struct algorithm *alg, const UCHAR *secret, ULONG secret_len )
+{
+    switch (alg->id)
+    {
+    case ALG_ID_AES:
+        switch (alg->mode)
+        {
+        case MODE_ID_ECB:
+        case MODE_ID_CBC:
+            break;
+        default:
+            FIXME( "mode %u not supported\n", alg->mode );
+            return STATUS_NOT_SUPPORTED;
+        }
+        break;
+
+    default:
+        FIXME( "algorithm %u not supported\n", alg->id );
+        return STATUS_NOT_SUPPORTED;
+    }
+
+    if (!(key->u.s.block_size = get_block_size( alg ))) return STATUS_INVALID_PARAMETER;
+    if (!(key->u.s.secret = heap_alloc( secret_len ))) return STATUS_NO_MEMORY;
+    memcpy( key->u.s.secret, secret, secret_len );
+    key->u.s.secret_len = secret_len;
+
+    key->alg_id          = alg->id;
+    key->u.s.mode        = alg->mode;
+    key->u.s.ref_encrypt = NULL;        /* initialized on first use */
+    key->u.s.ref_decrypt = NULL;
+
+    return STATUS_SUCCESS;
+}
+
+static CCMode get_cryptor_mode( struct key *key )
+{
+    switch (key->u.s.mode)
+    {
+    case MODE_ID_ECB: return kCCModeECB;
+    case MODE_ID_CBC: return kCCModeCBC;
+    default:
+        FIXME( "unsupported mode %u\n", key->u.s.mode );
+        return 0;
+    }
+}
+
+NTSTATUS key_symmetric_set_params( struct key *key, UCHAR *iv, ULONG iv_len )
+{
+    CCCryptorStatus status;
+    CCMode mode;
+
+    if (!(mode = get_cryptor_mode( key ))) return STATUS_NOT_SUPPORTED;
+
+    if (key->u.s.ref_encrypt)
+    {
+        CCCryptorRelease( key->u.s.ref_encrypt );
+        key->u.s.ref_encrypt = NULL;
+    }
+    if (key->u.s.ref_decrypt)
+    {
+        CCCryptorRelease( key->u.s.ref_decrypt );
+        key->u.s.ref_decrypt = NULL;
+    }
+
+    if ((status = CCCryptorCreateWithMode( kCCEncrypt, mode, kCCAlgorithmAES128, ccNoPadding, iv, key->u.s.secret,
+                                           key->u.s.secret_len, NULL, 0, 0, 0, &key->u.s.ref_encrypt )) != kCCSuccess)
+    {
+        WARN( "CCCryptorCreateWithMode failed %d\n", status );
+        return STATUS_INTERNAL_ERROR;
+    }
+    if ((status = CCCryptorCreateWithMode( kCCDecrypt, mode, kCCAlgorithmAES128, ccNoPadding, iv, key->u.s.secret,
+                                           key->u.s.secret_len, NULL, 0, 0, 0, &key->u.s.ref_decrypt )) != kCCSuccess)
+    {
+        WARN( "CCCryptorCreateWithMode failed %d\n", status );
+        CCCryptorRelease( key->u.s.ref_encrypt );
+        key->u.s.ref_encrypt = NULL;
+        return STATUS_INTERNAL_ERROR;
+    }
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS key_symmetric_set_auth_data( struct key *key, UCHAR *auth_data, ULONG len )
+{
+    FIXME( "not implemented on Mac\n" );
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS key_symmetric_encrypt( struct key *key, const UCHAR *input, ULONG input_len, UCHAR *output, ULONG output_len  )
+{
+    CCCryptorStatus status;
+    if ((status = CCCryptorUpdate( key->u.s.ref_encrypt, input, input_len, output, output_len, NULL  )) != kCCSuccess)
+    {
+        WARN( "CCCryptorUpdate failed %d\n", status );
+        return STATUS_INTERNAL_ERROR;
+    }
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS key_symmetric_decrypt( struct key *key, const UCHAR *input, ULONG input_len, UCHAR *output, ULONG output_len )
+{
+    CCCryptorStatus status;
+    if ((status = CCCryptorUpdate( key->u.s.ref_decrypt, input, input_len, output, output_len, NULL  )) != kCCSuccess)
+    {
+        WARN( "CCCryptorUpdate failed %d\n", status );
+        return STATUS_INTERNAL_ERROR;
+    }
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS key_symmetric_get_tag( struct key *key, UCHAR *tag, ULONG len )
+{
+    FIXME( "not implemented on Mac\n" );
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, const UCHAR *pubkey, ULONG pubkey_len )
+{
+    FIXME( "not implemented on Mac\n" );
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS key_asymmetric_verify( struct key *key, void *padding, UCHAR *hash, ULONG hash_len, UCHAR *signature,
+                                ULONG signature_len, DWORD flags )
+{
+    FIXME( "not implemented on Mac\n" );
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS key_destroy( struct key *key )
+{
+    if (key->u.s.ref_encrypt) CCCryptorRelease( key->u.s.ref_encrypt );
+    if (key->u.s.ref_decrypt) CCCryptorRelease( key->u.s.ref_decrypt );
+    heap_free( key->u.s.secret );
+    heap_free( key );
+    return STATUS_SUCCESS;
+}
+#endif
-- 
2.11.0




More information about the wine-devel mailing list