1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for RtlEncrypt/DecryptMemory
5 * PROGRAMMER: Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8 #include "precomp.h"
9
10 #include <ntsecapi.h>
11
12 static const CHAR TestData[32] = "This is some test Message!!!";
13
TestEncrypt(ULONG OptionFlags)14 void TestEncrypt(ULONG OptionFlags)
15 {
16 CHAR DECLSPEC_ALIGN(8) Buffer[32];
17 NTSTATUS Status;
18
19 /* Size must be aligned to 8 bytes (aka RTL_ENCRYPT_MEMORY_SIZE) */
20 RtlCopyMemory(Buffer, TestData, sizeof(Buffer));
21 Status = RtlEncryptMemory(Buffer, 7, OptionFlags);
22 ok_ntstatus(Status, STATUS_INVALID_PARAMETER);
23
24 /* Buffer can be unaligned */
25 RtlCopyMemory(Buffer, TestData, sizeof(Buffer));
26 Status = RtlEncryptMemory(&Buffer[1], 8, OptionFlags);
27 ok_ntstatus(Status, STATUS_SUCCESS);
28 Status = RtlDecryptMemory(&Buffer[1], 8, OptionFlags);
29 ok_ntstatus(Status, STATUS_SUCCESS);
30 ok(RtlEqualMemory(Buffer, TestData, sizeof(Buffer)) == 1,
31 "OptionFlags=%lu, Buffer='%s', TestData='%s'\n",
32 OptionFlags, Buffer, TestData);
33
34 RtlCopyMemory(Buffer, TestData, sizeof(Buffer));
35 Status = RtlEncryptMemory(Buffer, sizeof(Buffer), OptionFlags);
36 ok_ntstatus(Status, STATUS_SUCCESS);
37 ok_int(RtlEqualMemory(Buffer, TestData, sizeof(Buffer)), 0);
38 Status = RtlDecryptMemory(Buffer, sizeof(Buffer), OptionFlags);
39 ok_ntstatus(Status, STATUS_SUCCESS);
40 ok_int(RtlEqualMemory(Buffer, TestData, sizeof(Buffer)), 1);
41 }
42
TestCrossProcessDecrypt(PSTR Param)43 void TestCrossProcessDecrypt(PSTR Param)
44 {
45 UCHAR Buffer[32] = { 0 };
46 ULONG OptionFlags;
47 PSTR StrData;
48 ULONG i;
49 NTSTATUS Status;
50
51 OptionFlags = Param[3] == '1' ? RTL_ENCRYPT_OPTION_CROSS_PROCESS : RTL_ENCRYPT_OPTION_SAME_LOGON;
52
53 /* Convert the HEX string to binary ('-cp<1|2>:<data>') */
54 StrData = Param + 5;
55 for (i = 0; i < sizeof(Buffer); i++)
56 {
57 UINT x;
58 sscanf(&StrData[2 * i], "%02X", &x);
59 Buffer[i] = (UCHAR)x;
60 }
61
62 /* Decrypt the data */
63 Status = RtlDecryptMemory(Buffer, sizeof(Buffer), OptionFlags);
64 ok_ntstatus(Status, STATUS_SUCCESS);
65 ok_int(RtlEqualMemory(Buffer, TestData, sizeof(Buffer)), 1);
66 }
67
TestCrossProcessEncrypt(ULONG OptionFlags)68 void TestCrossProcessEncrypt(ULONG OptionFlags)
69 {
70 UCHAR Buffer[32];
71 CHAR CmdLine[MAX_PATH];
72 PSTR StrBuffer;
73 NTSTATUS Status;
74 ULONG i;
75 INT result;
76
77 /* Encrypt the test string */
78 RtlCopyMemory(Buffer, TestData, sizeof(Buffer));
79 Status = RtlEncryptMemory(Buffer, sizeof(Buffer), OptionFlags);
80 ok_ntstatus(Status, STATUS_SUCCESS);
81
82 /* Start building a command line */
83 sprintf(CmdLine, "advapi32_apitest.exe RtlEncryptMemory -cp%lu:", OptionFlags);
84 StrBuffer = CmdLine + strlen(CmdLine);
85
86 /* Convert encrypted data into a hex string */
87 for (i = 0; i < sizeof(Buffer); i++)
88 {
89 sprintf(&StrBuffer[2 * i], "%02X", Buffer[i]);
90 }
91
92 result = system(CmdLine);
93 ok_int(result, 0);
94 }
95
START_TEST(RtlEncryptMemory)96 START_TEST(RtlEncryptMemory)
97 {
98 CHAR Buffer[8] = { 0 };
99 PSTR CommandLine, Param;
100 NTSTATUS Status;
101
102 /* Check recursive call */
103 CommandLine = GetCommandLineA();
104 Param = strstr(CommandLine, "-cp");
105 if (Param != NULL)
106 {
107 TestCrossProcessDecrypt(Param);
108 return;
109 }
110
111 TestEncrypt(RTL_ENCRYPT_OPTION_SAME_PROCESS);
112 TestEncrypt(RTL_ENCRYPT_OPTION_CROSS_PROCESS);
113 TestEncrypt(RTL_ENCRYPT_OPTION_SAME_LOGON);
114
115 Status = RtlEncryptMemory(Buffer, sizeof(Buffer), 4);
116 ok_ntstatus(Status, STATUS_INVALID_PARAMETER);
117
118 TestCrossProcessEncrypt(RTL_ENCRYPT_OPTION_CROSS_PROCESS);
119 TestCrossProcessEncrypt(RTL_ENCRYPT_OPTION_SAME_LOGON);
120 }
121