Commit 500384b0 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

advapi32: Test and implement SystemFunction024/025.

parent 6fad2cba
...@@ -618,8 +618,8 @@ ...@@ -618,8 +618,8 @@
@ stdcall SystemFunction021(ptr ptr ptr) SystemFunction013 @ stdcall SystemFunction021(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction022(ptr ptr ptr) SystemFunction012 @ stdcall SystemFunction022(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction023(ptr ptr ptr) SystemFunction013 @ stdcall SystemFunction023(ptr ptr ptr) SystemFunction013
@ stub SystemFunction024 @ stdcall SystemFunction024(ptr ptr ptr)
@ stub SystemFunction025 @ stdcall SystemFunction025(ptr ptr ptr)
@ stub SystemFunction026 @ stub SystemFunction026
@ stub SystemFunction027 @ stub SystemFunction027
@ stub SystemFunction028 @ stub SystemFunction028
......
...@@ -348,3 +348,59 @@ NTSTATUS WINAPI SystemFunction013(const LPBYTE in, const LPBYTE key, LPBYTE out) ...@@ -348,3 +348,59 @@ NTSTATUS WINAPI SystemFunction013(const LPBYTE in, const LPBYTE key, LPBYTE out)
CRYPT_DESunhash(out+8, key+7, in+8); CRYPT_DESunhash(out+8, key+7, in+8);
return STATUS_SUCCESS; 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;
}
...@@ -70,6 +70,8 @@ descrypt pSystemFunction019; ...@@ -70,6 +70,8 @@ descrypt pSystemFunction019;
descrypt pSystemFunction021; descrypt pSystemFunction021;
descrypt pSystemFunction023; descrypt pSystemFunction023;
descrypt pSystemFunction024;
descrypt pSystemFunction025;
fnSystemFunction032 pSystemFunction032; fnSystemFunction032 pSystemFunction032;
static void test_SystemFunction006(void) static void test_SystemFunction006(void)
...@@ -423,6 +425,57 @@ static void test_SystemFunction_decrypt(descrypt func, int num) ...@@ -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); 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) START_TEST(crypt_lmhash)
{ {
HMODULE module; HMODULE module;
...@@ -494,5 +547,13 @@ START_TEST(crypt_lmhash) ...@@ -494,5 +547,13 @@ START_TEST(crypt_lmhash)
test_SystemFunction_decrypt(pSystemFunction021, 21); test_SystemFunction_decrypt(pSystemFunction021, 21);
test_SystemFunction_decrypt(pSystemFunction023, 23); 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 ); FreeLibrary( module );
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment