Mike McCormack : advapi32: Implement and test SystemFunction005.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 16 06:24:30 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 9b3d8a3527352e9ad2927b608987246b53dddd9b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=9b3d8a3527352e9ad2927b608987246b53dddd9b

Author: Mike McCormack <mike at codeweavers.com>
Date:   Mon May 15 22:03:41 2006 +0900

advapi32: Implement and test SystemFunction005.

---

 dlls/advapi32/advapi32.spec        |    2 +
 dlls/advapi32/crypt_lmhash.c       |   61 +++++++++++++++++++++++++++++++++++
 dlls/advapi32/tests/crypt_lmhash.c |   63 ++++++++++++++++++++++++++++++++++++
 3 files changed, 125 insertions(+), 1 deletions(-)

diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 9f815f5..abdab0b 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -599,7 +599,7 @@ # @ stub StopTraceW
 @ stdcall SystemFunction002(ptr ptr ptr)
 @ stdcall SystemFunction003(ptr ptr)
 @ stdcall SystemFunction004(ptr ptr ptr)
-@ stub SystemFunction005
+@ stdcall SystemFunction005(ptr ptr ptr)
 @ stdcall SystemFunction006(ptr ptr)
 @ stdcall SystemFunction007(ptr ptr)
 @ stdcall SystemFunction008(ptr ptr ptr)
diff --git a/dlls/advapi32/crypt_lmhash.c b/dlls/advapi32/crypt_lmhash.c
index 7070154..4760e97 100644
--- a/dlls/advapi32/crypt_lmhash.c
+++ b/dlls/advapi32/crypt_lmhash.c
@@ -219,3 +219,64 @@ NTSTATUS WINAPI SystemFunction004(const 
 
     return STATUS_SUCCESS;
 }
+
+/******************************************************************************
+ * SystemFunction005  [ADVAPI32.@]
+ *
+ * Decrypts a block of data with DES in ECB mode
+ *
+ * PARAMS
+ *   data    [I] data to decrypt
+ *   key     [I] key data (up to 7 bytes)
+ *   output  [O] buffer to receive decrypted data
+ *
+ * RETURNS
+ *  Success: STATUS_SUCCESS
+ *  Failure: STATUS_BUFFER_TOO_SMALL     if the output buffer is too small
+ *  Failure: STATUS_INVALID_PARAMETER_2  if the key is zero length
+ *
+ */
+NTSTATUS WINAPI SystemFunction005(const struct ustring *in,
+                                  const struct ustring *key,
+                                  struct ustring *out)
+{
+    union {
+         unsigned char uc[8];
+         unsigned int  ui[2];
+    } data;
+    unsigned char deskey[7];
+    int ofs, crypt_len;
+
+    if (key->Length<=0)
+        return STATUS_INVALID_PARAMETER_2;
+
+    if (key->Length<sizeof deskey)
+    {
+        memset(deskey, 0, sizeof deskey);
+        memcpy(deskey, key->Buffer, key->Length);
+    }
+    else
+        memcpy(deskey, key->Buffer, sizeof deskey);
+
+    CRYPT_DESunhash(data.uc, deskey, in->Buffer);
+
+    if (data.ui[1] != 1)
+        return STATUS_UNKNOWN_REVISION;
+
+    crypt_len = data.ui[0];
+    if (crypt_len > out->MaximumLength)
+        return STATUS_BUFFER_TOO_SMALL;
+
+    for (ofs=0; (ofs+8)<crypt_len; ofs+=8)
+        CRYPT_DESunhash(out->Buffer+ofs, deskey, in->Buffer+ofs+8);
+
+    if (ofs<crypt_len)
+    {
+        CRYPT_DESunhash(data.uc, deskey, in->Buffer+ofs+8);
+        memcpy(out->Buffer+ofs, data.uc, crypt_len-ofs);
+    }
+
+    out->Length = crypt_len;
+
+    return STATUS_SUCCESS;
+}
diff --git a/dlls/advapi32/tests/crypt_lmhash.c b/dlls/advapi32/tests/crypt_lmhash.c
index 2edb843..866bbde 100644
--- a/dlls/advapi32/tests/crypt_lmhash.c
+++ b/dlls/advapi32/tests/crypt_lmhash.c
@@ -38,6 +38,7 @@ typedef NTSTATUS (WINAPI *fnSystemFuncti
 typedef NTSTATUS (WINAPI *fnSystemFunction002)(const LPBYTE, const LPBYTE, LPBYTE);
 typedef NTSTATUS (WINAPI *fnSystemFunction003)(const LPBYTE, LPBYTE);
 typedef NTSTATUS (WINAPI *fnSystemFunction004)(const struct ustring *, const struct ustring *, struct ustring *);
+typedef NTSTATUS (WINAPI *fnSystemFunction005)(const struct ustring *, const struct ustring *, struct ustring *);
 typedef VOID (WINAPI *fnSystemFunction006)( PCSTR passwd, PSTR lmhash );
 typedef NTSTATUS (WINAPI *fnSystemFunction008)(const LPBYTE, const LPBYTE, LPBYTE);
 typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, struct ustring *);
@@ -46,6 +47,7 @@ fnSystemFunction001 pSystemFunction001;
 fnSystemFunction002 pSystemFunction002;
 fnSystemFunction003 pSystemFunction003;
 fnSystemFunction004 pSystemFunction004;
+fnSystemFunction004 pSystemFunction005;
 fnSystemFunction006 pSystemFunction006;
 fnSystemFunction008 pSystemFunction008;
 fnSystemFunction032 pSystemFunction032;
@@ -274,6 +276,63 @@ static void test_SystemFunction004(void)
     ok(!memcmp(output, inbuf, sizeof output), "crypted data wrong\n");
 }
 
+static void test_SystemFunction005(void)
+{
+    char output[0x40], result[0x40];
+    int r;
+    struct ustring in, key, out, res;
+    char *datastr = "twinkle twinkle little star";
+    char *keystr = "byolnim";
+
+    in.Buffer = (unsigned char *) datastr;
+    in.Length = strlen(datastr);
+    in.MaximumLength = 0;
+
+    key.Buffer = (unsigned char *)keystr;
+    key.Length = strlen(keystr);
+    key.MaximumLength = 0;
+
+    out.Buffer = (unsigned char *)output;
+    out.Length = out.MaximumLength = sizeof output;
+
+    r = pSystemFunction004(&in, &key, &out);
+    ok(r == STATUS_SUCCESS, "function failed\n");
+
+    memset(result, 0, sizeof result);
+    res.Buffer = (unsigned char *)result;
+    res.Length = 0;
+    res.MaximumLength = sizeof result;
+
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_SUCCESS, "function failed\n");
+
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_SUCCESS, "function failed\n");
+
+    ok(res.Length == in.Length, "Length wrong\n");
+    ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n");
+
+    out.Length = 0;
+    out.MaximumLength = 0;
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_SUCCESS, "function failed\n");
+
+    ok(res.Length == in.Length, "Length wrong\n");
+    ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n");
+
+    res.MaximumLength = 0;
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_BUFFER_TOO_SMALL, "function failed\n");
+
+    key.Length = 1;
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_UNKNOWN_REVISION, "function failed\n");
+
+    key.Length = 0;
+    r = pSystemFunction005(&out, &key, &res);
+    ok(r == STATUS_INVALID_PARAMETER_2, "function failed\n");
+}
+
 START_TEST(crypt_lmhash)
 {
     HMODULE module;
@@ -296,6 +355,10 @@ START_TEST(crypt_lmhash)
     if (pSystemFunction004)
         test_SystemFunction004();
 
+    pSystemFunction005 = (fnSystemFunction005)GetProcAddress( module, "SystemFunction005" );
+    if (pSystemFunction005)
+        test_SystemFunction005();
+
     pSystemFunction006 = (fnSystemFunction006)GetProcAddress( module, "SystemFunction006" );
     if (pSystemFunction006) 
         test_SystemFunction006();




More information about the wine-cvs mailing list