Module: wine Branch: refs/heads/master Commit: 500384b0ea4d4c3aa8ad464ee9d530ae6090afa2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=500384b0ea4d4c3aa8ad464e...
Author: Mike McCormack mike@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 ); }