advapi32: Test and implement SystemFunction024/025.

This commit is contained in:
Mike McCormack 2006-05-21 17:52:12 +09:00 committed by Alexandre Julliard
parent 6fad2cbaff
commit 500384b0ea
3 changed files with 119 additions and 2 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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 );
}