advapi32: Implement and test SystemFunction005.
This commit is contained in:
parent
b96d630022
commit
9b3d8a3527
|
@ -599,7 +599,7 @@
|
||||||
@ stdcall SystemFunction002(ptr ptr ptr)
|
@ stdcall SystemFunction002(ptr ptr ptr)
|
||||||
@ stdcall SystemFunction003(ptr ptr)
|
@ stdcall SystemFunction003(ptr ptr)
|
||||||
@ stdcall SystemFunction004(ptr ptr ptr)
|
@ stdcall SystemFunction004(ptr ptr ptr)
|
||||||
@ stub SystemFunction005
|
@ stdcall SystemFunction005(ptr ptr ptr)
|
||||||
@ stdcall SystemFunction006(ptr ptr)
|
@ stdcall SystemFunction006(ptr ptr)
|
||||||
@ stdcall SystemFunction007(ptr ptr)
|
@ stdcall SystemFunction007(ptr ptr)
|
||||||
@ stdcall SystemFunction008(ptr ptr ptr)
|
@ stdcall SystemFunction008(ptr ptr ptr)
|
||||||
|
|
|
@ -219,3 +219,64 @@ NTSTATUS WINAPI SystemFunction004(const struct ustring *in,
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* SystemFunction005 [ADVAPI32.@]
|
||||||
|
*
|
||||||
|
* Decrypts a block of data with DES in ECB mode
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* data [I] data to decrypt
|
||||||
|
* key [I] key data (up to 7 bytes)
|
||||||
|
* output [O] buffer to receive decrypted data
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: STATUS_SUCCESS
|
||||||
|
* Failure: STATUS_BUFFER_TOO_SMALL if the output buffer is too small
|
||||||
|
* Failure: STATUS_INVALID_PARAMETER_2 if the key is zero length
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NTSTATUS WINAPI SystemFunction005(const struct ustring *in,
|
||||||
|
const struct ustring *key,
|
||||||
|
struct ustring *out)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
unsigned char uc[8];
|
||||||
|
unsigned int ui[2];
|
||||||
|
} data;
|
||||||
|
unsigned char deskey[7];
|
||||||
|
int ofs, crypt_len;
|
||||||
|
|
||||||
|
if (key->Length<=0)
|
||||||
|
return STATUS_INVALID_PARAMETER_2;
|
||||||
|
|
||||||
|
if (key->Length<sizeof deskey)
|
||||||
|
{
|
||||||
|
memset(deskey, 0, sizeof deskey);
|
||||||
|
memcpy(deskey, key->Buffer, key->Length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
memcpy(deskey, key->Buffer, sizeof deskey);
|
||||||
|
|
||||||
|
CRYPT_DESunhash(data.uc, deskey, in->Buffer);
|
||||||
|
|
||||||
|
if (data.ui[1] != 1)
|
||||||
|
return STATUS_UNKNOWN_REVISION;
|
||||||
|
|
||||||
|
crypt_len = data.ui[0];
|
||||||
|
if (crypt_len > out->MaximumLength)
|
||||||
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
|
for (ofs=0; (ofs+8)<crypt_len; ofs+=8)
|
||||||
|
CRYPT_DESunhash(out->Buffer+ofs, deskey, in->Buffer+ofs+8);
|
||||||
|
|
||||||
|
if (ofs<crypt_len)
|
||||||
|
{
|
||||||
|
CRYPT_DESunhash(data.uc, deskey, in->Buffer+ofs+8);
|
||||||
|
memcpy(out->Buffer+ofs, data.uc, crypt_len-ofs);
|
||||||
|
}
|
||||||
|
|
||||||
|
out->Length = crypt_len;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ typedef NTSTATUS (WINAPI *fnSystemFunction001)(const LPBYTE, const LPBYTE, LPBYT
|
||||||
typedef NTSTATUS (WINAPI *fnSystemFunction002)(const LPBYTE, const LPBYTE, LPBYTE);
|
typedef NTSTATUS (WINAPI *fnSystemFunction002)(const LPBYTE, const LPBYTE, LPBYTE);
|
||||||
typedef NTSTATUS (WINAPI *fnSystemFunction003)(const LPBYTE, LPBYTE);
|
typedef NTSTATUS (WINAPI *fnSystemFunction003)(const LPBYTE, LPBYTE);
|
||||||
typedef NTSTATUS (WINAPI *fnSystemFunction004)(const struct ustring *, const struct ustring *, struct ustring *);
|
typedef NTSTATUS (WINAPI *fnSystemFunction004)(const struct ustring *, const struct ustring *, struct ustring *);
|
||||||
|
typedef NTSTATUS (WINAPI *fnSystemFunction005)(const struct ustring *, const struct ustring *, struct ustring *);
|
||||||
typedef VOID (WINAPI *fnSystemFunction006)( PCSTR passwd, PSTR lmhash );
|
typedef VOID (WINAPI *fnSystemFunction006)( PCSTR passwd, PSTR lmhash );
|
||||||
typedef NTSTATUS (WINAPI *fnSystemFunction008)(const LPBYTE, const LPBYTE, LPBYTE);
|
typedef NTSTATUS (WINAPI *fnSystemFunction008)(const LPBYTE, const LPBYTE, LPBYTE);
|
||||||
typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, struct ustring *);
|
typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, struct ustring *);
|
||||||
|
@ -46,6 +47,7 @@ fnSystemFunction001 pSystemFunction001;
|
||||||
fnSystemFunction002 pSystemFunction002;
|
fnSystemFunction002 pSystemFunction002;
|
||||||
fnSystemFunction003 pSystemFunction003;
|
fnSystemFunction003 pSystemFunction003;
|
||||||
fnSystemFunction004 pSystemFunction004;
|
fnSystemFunction004 pSystemFunction004;
|
||||||
|
fnSystemFunction004 pSystemFunction005;
|
||||||
fnSystemFunction006 pSystemFunction006;
|
fnSystemFunction006 pSystemFunction006;
|
||||||
fnSystemFunction008 pSystemFunction008;
|
fnSystemFunction008 pSystemFunction008;
|
||||||
fnSystemFunction032 pSystemFunction032;
|
fnSystemFunction032 pSystemFunction032;
|
||||||
|
@ -274,6 +276,63 @@ static void test_SystemFunction004(void)
|
||||||
ok(!memcmp(output, inbuf, sizeof output), "crypted data wrong\n");
|
ok(!memcmp(output, inbuf, sizeof output), "crypted data wrong\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_SystemFunction005(void)
|
||||||
|
{
|
||||||
|
char output[0x40], result[0x40];
|
||||||
|
int r;
|
||||||
|
struct ustring in, key, out, res;
|
||||||
|
char *datastr = "twinkle twinkle little star";
|
||||||
|
char *keystr = "byolnim";
|
||||||
|
|
||||||
|
in.Buffer = (unsigned char *) datastr;
|
||||||
|
in.Length = strlen(datastr);
|
||||||
|
in.MaximumLength = 0;
|
||||||
|
|
||||||
|
key.Buffer = (unsigned char *)keystr;
|
||||||
|
key.Length = strlen(keystr);
|
||||||
|
key.MaximumLength = 0;
|
||||||
|
|
||||||
|
out.Buffer = (unsigned char *)output;
|
||||||
|
out.Length = out.MaximumLength = sizeof output;
|
||||||
|
|
||||||
|
r = pSystemFunction004(&in, &key, &out);
|
||||||
|
ok(r == STATUS_SUCCESS, "function failed\n");
|
||||||
|
|
||||||
|
memset(result, 0, sizeof result);
|
||||||
|
res.Buffer = (unsigned char *)result;
|
||||||
|
res.Length = 0;
|
||||||
|
res.MaximumLength = sizeof result;
|
||||||
|
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_SUCCESS, "function failed\n");
|
||||||
|
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_SUCCESS, "function failed\n");
|
||||||
|
|
||||||
|
ok(res.Length == in.Length, "Length wrong\n");
|
||||||
|
ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n");
|
||||||
|
|
||||||
|
out.Length = 0;
|
||||||
|
out.MaximumLength = 0;
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_SUCCESS, "function failed\n");
|
||||||
|
|
||||||
|
ok(res.Length == in.Length, "Length wrong\n");
|
||||||
|
ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n");
|
||||||
|
|
||||||
|
res.MaximumLength = 0;
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_BUFFER_TOO_SMALL, "function failed\n");
|
||||||
|
|
||||||
|
key.Length = 1;
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_UNKNOWN_REVISION, "function failed\n");
|
||||||
|
|
||||||
|
key.Length = 0;
|
||||||
|
r = pSystemFunction005(&out, &key, &res);
|
||||||
|
ok(r == STATUS_INVALID_PARAMETER_2, "function failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(crypt_lmhash)
|
START_TEST(crypt_lmhash)
|
||||||
{
|
{
|
||||||
HMODULE module;
|
HMODULE module;
|
||||||
|
@ -296,6 +355,10 @@ START_TEST(crypt_lmhash)
|
||||||
if (pSystemFunction004)
|
if (pSystemFunction004)
|
||||||
test_SystemFunction004();
|
test_SystemFunction004();
|
||||||
|
|
||||||
|
pSystemFunction005 = (fnSystemFunction005)GetProcAddress( module, "SystemFunction005" );
|
||||||
|
if (pSystemFunction005)
|
||||||
|
test_SystemFunction005();
|
||||||
|
|
||||||
pSystemFunction006 = (fnSystemFunction006)GetProcAddress( module, "SystemFunction006" );
|
pSystemFunction006 = (fnSystemFunction006)GetProcAddress( module, "SystemFunction006" );
|
||||||
if (pSystemFunction006)
|
if (pSystemFunction006)
|
||||||
test_SystemFunction006();
|
test_SystemFunction006();
|
||||||
|
|
Loading…
Reference in New Issue