advapi32: Implement and test SystemFunction(012-023).

This commit is contained in:
Mike McCormack 2006-05-21 17:28:11 +09:00 committed by Alexandre Julliard
parent b4899f0712
commit 6fad2cbaff
3 changed files with 167 additions and 12 deletions

View File

@ -606,18 +606,18 @@
@ stdcall SystemFunction009(ptr ptr ptr)
@ stdcall SystemFunction010(ptr ptr ptr)
@ stub SystemFunction011
@ stub SystemFunction012
@ stub SystemFunction013
@ stub SystemFunction014
@ stub SystemFunction015
@ stub SystemFunction016
@ stub SystemFunction017
@ stub SystemFunction018
@ stub SystemFunction019
@ stub SystemFunction020
@ stub SystemFunction021
@ stub SystemFunction022
@ stub SystemFunction023
@ stdcall SystemFunction012(ptr ptr ptr)
@ stdcall SystemFunction013(ptr ptr ptr)
@ stdcall SystemFunction014(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction015(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction016(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction017(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction018(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction019(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction020(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction021(ptr ptr ptr) SystemFunction013
@ stdcall SystemFunction022(ptr ptr ptr) SystemFunction012
@ stdcall SystemFunction023(ptr ptr ptr) SystemFunction013
@ stub SystemFunction024
@ stub SystemFunction025
@ stub SystemFunction026

View File

@ -290,3 +290,61 @@ NTSTATUS WINAPI SystemFunction005(const struct ustring *in,
return STATUS_SUCCESS;
}
/******************************************************************************
* SystemFunction012 [ADVAPI32.@]
* SystemFunction014 [ADVAPI32.@]
* SystemFunction016 [ADVAPI32.@]
* SystemFunction018 [ADVAPI32.@]
* SystemFunction020 [ADVAPI32.@]
* SystemFunction022 [ADVAPI32.@]
*
* Encrypts two DES blocks with two keys
*
* PARAMS
* data [I] data to encrypt (16 bytes)
* key [I] key data (two lots of 7 bytes)
* output [O] buffer to receive encrypted data (16 bytes)
*
* RETURNS
* Success: STATUS_SUCCESS
* Failure: STATUS_UNSUCCESSFUL if the input or output buffer is NULL
*/
NTSTATUS WINAPI SystemFunction012(const LPBYTE in, const LPBYTE key, LPBYTE out)
{
if (!in || !out)
return STATUS_UNSUCCESSFUL;
CRYPT_DEShash(out, key, in);
CRYPT_DEShash(out+8, key+7, in+8);
return STATUS_SUCCESS;
}
/******************************************************************************
* SystemFunction013 [ADVAPI32.@]
* SystemFunction015 [ADVAPI32.@]
* SystemFunction017 [ADVAPI32.@]
* SystemFunction019 [ADVAPI32.@]
* SystemFunction021 [ADVAPI32.@]
* SystemFunction023 [ADVAPI32.@]
*
* Decrypts two DES blocks with two keys
*
* PARAMS
* data [I] data to decrypt (16 bytes)
* key [I] key data (two lots of 7 bytes)
* output [O] buffer to receive decrypted data (16 bytes)
*
* RETURNS
* Success: STATUS_SUCCESS
* Failure: STATUS_UNSUCCESSFUL if the input or output buffer is NULL
*/
NTSTATUS WINAPI SystemFunction013(const LPBYTE in, const LPBYTE key, LPBYTE out)
{
if (!in || !out)
return STATUS_UNSUCCESSFUL;
CRYPT_DESunhash(out, key, in);
CRYPT_DESunhash(out+8, key+7, in+8);
return STATUS_SUCCESS;
}

View File

@ -42,6 +42,7 @@ typedef NTSTATUS (WINAPI *fnSystemFunction005)(const struct ustring *, const str
typedef VOID (WINAPI *fnSystemFunction006)( PCSTR passwd, PSTR lmhash );
typedef NTSTATUS (WINAPI *fnSystemFunction008)(const LPBYTE, const LPBYTE, LPBYTE);
typedef NTSTATUS (WINAPI *fnSystemFunction009)(const LPBYTE, const LPBYTE, LPBYTE);
typedef int (WINAPI *descrypt)(unsigned char *, unsigned char *, unsigned char *);
typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, struct ustring *);
fnSystemFunction001 pSystemFunction001;
@ -52,6 +53,23 @@ fnSystemFunction004 pSystemFunction005;
fnSystemFunction006 pSystemFunction006;
fnSystemFunction008 pSystemFunction008;
fnSystemFunction008 pSystemFunction009;
/* encrypt two blocks */
descrypt pSystemFunction012;
descrypt pSystemFunction014;
descrypt pSystemFunction016;
descrypt pSystemFunction018;
descrypt pSystemFunction020;
descrypt pSystemFunction022;
/* decrypt two blocks */
descrypt pSystemFunction013;
descrypt pSystemFunction015;
descrypt pSystemFunction017;
descrypt pSystemFunction019;
descrypt pSystemFunction021;
descrypt pSystemFunction023;
fnSystemFunction032 pSystemFunction032;
static void test_SystemFunction006(void)
@ -355,6 +373,56 @@ static void test_SystemFunction009(void)
ok(!memcmp(output, expected, sizeof expected), "response wrong\n");
}
static unsigned char des_key[] = {
0xff, 0x37, 0x50, 0xbc, 0xc2, 0xb2, 0x24,
0xff, 0x37, 0x50, 0xbc, 0xc2, 0xb2, 0x24,
};
static unsigned char des_plaintext[] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0
};
static unsigned char des_ciphertext[] = {
0xc3, 0x37, 0xcd, 0x5c, 0xbd, 0x44, 0xfc, 0x97,
0xc3, 0x37, 0xcd, 0x5c, 0xbd, 0x44, 0xfc, 0x97, 0
};
/* test functions that encrypt two DES blocks */
static void test_SystemFunction_encrypt(descrypt func, int num)
{
unsigned char output[0x11];
int r;
if (!func)
return;
r = func(NULL, NULL, NULL);
ok( r == STATUS_UNSUCCESSFUL, "wrong error code\n");
memset(output, 0, sizeof output);
r = func(des_plaintext, des_key, output);
ok( r == STATUS_SUCCESS, "wrong error code\n");
ok( !memcmp(des_ciphertext, output, sizeof des_ciphertext), "ciphertext wrong (%d)\n", num);
}
/* test functions that decrypt two DES blocks */
static void test_SystemFunction_decrypt(descrypt func, int num)
{
unsigned char output[0x11];
int r;
if (!func)
return;
r = func(NULL, NULL, NULL);
ok( r == STATUS_UNSUCCESSFUL, "wrong error code\n");
memset(output, 0, sizeof output);
r = func(des_ciphertext, des_key, output);
ok( r == STATUS_SUCCESS, "wrong error code\n");
ok( !memcmp(des_plaintext, output, sizeof des_plaintext), "plaintext wrong (%d)\n", num);
}
START_TEST(crypt_lmhash)
{
HMODULE module;
@ -397,5 +465,34 @@ START_TEST(crypt_lmhash)
if (pSystemFunction032)
test_SystemFunction032();
pSystemFunction012 = (descrypt) GetProcAddress( module, "SystemFunction012");
pSystemFunction013 = (descrypt) GetProcAddress( module, "SystemFunction013");
pSystemFunction014 = (descrypt) GetProcAddress( module, "SystemFunction014");
pSystemFunction015 = (descrypt) GetProcAddress( module, "SystemFunction015");
pSystemFunction016 = (descrypt) GetProcAddress( module, "SystemFunction016");
pSystemFunction017 = (descrypt) GetProcAddress( module, "SystemFunction017");
pSystemFunction018 = (descrypt) GetProcAddress( module, "SystemFunction018");
pSystemFunction019 = (descrypt) GetProcAddress( module, "SystemFunction019");
pSystemFunction020 = (descrypt) GetProcAddress( module, "SystemFunction020");
pSystemFunction021 = (descrypt) GetProcAddress( module, "SystemFunction021");
pSystemFunction022 = (descrypt) GetProcAddress( module, "SystemFunction022");
pSystemFunction023 = (descrypt) GetProcAddress( module, "SystemFunction023");
/* these all encrypt two DES blocks */
test_SystemFunction_encrypt(pSystemFunction012, 12);
test_SystemFunction_encrypt(pSystemFunction014, 14);
test_SystemFunction_encrypt(pSystemFunction016, 16);
test_SystemFunction_encrypt(pSystemFunction018, 18);
test_SystemFunction_encrypt(pSystemFunction020, 20);
test_SystemFunction_encrypt(pSystemFunction022, 22);
/* these all decrypt two DES blocks */
test_SystemFunction_decrypt(pSystemFunction013, 13);
test_SystemFunction_decrypt(pSystemFunction015, 15);
test_SystemFunction_decrypt(pSystemFunction017, 17);
test_SystemFunction_decrypt(pSystemFunction019, 19);
test_SystemFunction_decrypt(pSystemFunction021, 21);
test_SystemFunction_decrypt(pSystemFunction023, 23);
FreeLibrary( module );
}