diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index c11e57ed6a6..2c136c9ccd5 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -618,8 +618,8 @@ @ 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 fb01b5bfee7..77583d17e36 100644 --- a/dlls/advapi32/crypt_lmhash.c +++ b/dlls/advapi32/crypt_lmhash.c @@ -348,3 +348,59 @@ NTSTATUS WINAPI SystemFunction013(const LPBYTE in, const LPBYTE key, LPBYTE out) 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 c0b4b966512..a6741f6ac9c 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(descrypt func, int num) 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 ); }