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