Mike McCormack : advapi32: Test and implement SystemFunction024/025.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 22 05:19:31 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 500384b0ea4d4c3aa8ad464ee9d530ae6090afa2
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=500384b0ea4d4c3aa8ad464ee9d530ae6090afa2
Author: Mike McCormack <mike at codeweavers.com>
Date: Sun May 21 17:52:12 2006 +0900
advapi32: Test and implement SystemFunction024/025.
---
dlls/advapi32/advapi32.spec | 4 +-
dlls/advapi32/crypt_lmhash.c | 56 +++++++++++++++++++++++++++++++++
dlls/advapi32/tests/crypt_lmhash.c | 61 ++++++++++++++++++++++++++++++++++++
3 files changed, 119 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index c11e57e..2c136c9 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -618,8 +618,8 @@ # @ stub StopTraceW
@ stdcall SystemFunction021(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction022(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction023(ptr ptr ptr) SystemFunction013
-@ stub SystemFunction024
-@ stub SystemFunction025
+@ stdcall SystemFunction024(ptr ptr ptr)
+@ stdcall SystemFunction025(ptr ptr ptr)
@ stub SystemFunction026
@ stub SystemFunction027
@ stub SystemFunction028
diff --git a/dlls/advapi32/crypt_lmhash.c b/dlls/advapi32/crypt_lmhash.c
index fb01b5b..77583d1 100644
--- a/dlls/advapi32/crypt_lmhash.c
+++ b/dlls/advapi32/crypt_lmhash.c
@@ -348,3 +348,59 @@ NTSTATUS WINAPI SystemFunction013(const
CRYPT_DESunhash(out+8, key+7, in+8);
return STATUS_SUCCESS;
}
+
+/******************************************************************************
+ * SystemFunction024 [ADVAPI32.@]
+ *
+ * Encrypts two DES blocks with a 32 bit key...
+ *
+ * PARAMS
+ * data [I] data to encrypt (16 bytes)
+ * key [I] key data (4 bytes)
+ * output [O] buffer to receive encrypted data (16 bytes)
+ *
+ * RETURNS
+ * Success: STATUS_SUCCESS
+ */
+NTSTATUS WINAPI SystemFunction024(const LPBYTE in, const LPBYTE key, LPBYTE out)
+{
+ BYTE deskey[0x10];
+
+ memcpy(deskey, key, 4);
+ memcpy(deskey+4, key, 4);
+ memcpy(deskey+8, key, 4);
+ memcpy(deskey+12, key, 4);
+
+ CRYPT_DEShash(out, deskey, in);
+ CRYPT_DEShash(out+8, deskey+7, in+8);
+
+ return STATUS_SUCCESS;
+}
+
+/******************************************************************************
+ * SystemFunction025 [ADVAPI32.@]
+ *
+ * Decrypts two DES blocks with a 32 bit key...
+ *
+ * PARAMS
+ * data [I] data to encrypt (16 bytes)
+ * key [I] key data (4 bytes)
+ * output [O] buffer to receive encrypted data (16 bytes)
+ *
+ * RETURNS
+ * Success: STATUS_SUCCESS
+ */
+NTSTATUS WINAPI SystemFunction025(const LPBYTE in, const LPBYTE key, LPBYTE out)
+{
+ BYTE deskey[0x10];
+
+ memcpy(deskey, key, 4);
+ memcpy(deskey+4, key, 4);
+ memcpy(deskey+8, key, 4);
+ memcpy(deskey+12, key, 4);
+
+ CRYPT_DESunhash(out, deskey, in);
+ CRYPT_DESunhash(out+8, deskey+7, in+8);
+
+ return STATUS_SUCCESS;
+}
diff --git a/dlls/advapi32/tests/crypt_lmhash.c b/dlls/advapi32/tests/crypt_lmhash.c
index c0b4b96..a6741f6 100644
--- a/dlls/advapi32/tests/crypt_lmhash.c
+++ b/dlls/advapi32/tests/crypt_lmhash.c
@@ -70,6 +70,8 @@ descrypt pSystemFunction019;
descrypt pSystemFunction021;
descrypt pSystemFunction023;
+descrypt pSystemFunction024;
+descrypt pSystemFunction025;
fnSystemFunction032 pSystemFunction032;
static void test_SystemFunction006(void)
@@ -423,6 +425,57 @@ static void test_SystemFunction_decrypt(
ok( !memcmp(des_plaintext, output, sizeof des_plaintext), "plaintext wrong (%d)\n", num);
}
+static void test_SystemFunction024(void)
+{
+ unsigned char key[0x10], output[0x20];
+ int r;
+
+ memset(output, 0, sizeof output);
+ memset(key, 0, sizeof key);
+
+ /* two keys are generated using 4 bytes, repeated 4 times ... */
+ memcpy(key, "foo", 4);
+
+ r = pSystemFunction024(des_plaintext, key, output);
+ ok( r == STATUS_SUCCESS, "wrong error code\n");
+
+ memcpy(key, "foo", 4);
+ memcpy(key+4, "foo", 4);
+ memcpy(key+8, "foo", 4);
+ memcpy(key+12, "foo", 4);
+
+ r = pSystemFunction022(des_plaintext, key, output+0x10);
+ ok( r == STATUS_SUCCESS, "wrong error code\n");
+
+ ok( !memcmp( output, output+0x10, 0x10), "ciphertext wrong\n");
+}
+
+static void test_SystemFunction025(void)
+{
+ unsigned char key[0x10], output[0x20];
+ int r;
+
+ memset(output, 0, sizeof output);
+ memset(key, 0, sizeof key);
+
+ /* two keys are generated using 4 bytes, repeated 4 times ... */
+ memcpy(key, "foo", 4);
+
+ /* decrypts output of function 025 */
+ r = pSystemFunction025(des_ciphertext, key, output);
+ ok( r == STATUS_SUCCESS, "wrong error code\n");
+
+ memcpy(key, "foo", 4);
+ memcpy(key+4, "foo", 4);
+ memcpy(key+8, "foo", 4);
+ memcpy(key+12, "foo", 4);
+
+ r = pSystemFunction023(des_ciphertext, key, output+0x10);
+ ok( r == STATUS_SUCCESS, "wrong error code\n");
+
+ ok( !memcmp( output, output+0x10, 0x10), "plaintext wrong\n");
+}
+
START_TEST(crypt_lmhash)
{
HMODULE module;
@@ -494,5 +547,13 @@ START_TEST(crypt_lmhash)
test_SystemFunction_decrypt(pSystemFunction021, 21);
test_SystemFunction_decrypt(pSystemFunction023, 23);
+ pSystemFunction024 = (descrypt) GetProcAddress( module, "SystemFunction024");
+ if (pSystemFunction024)
+ test_SystemFunction024();
+
+ pSystemFunction025 = (descrypt) GetProcAddress( module, "SystemFunction025");
+ if (pSystemFunction025)
+ test_SystemFunction025();
+
FreeLibrary( module );
}
More information about the wine-cvs
mailing list