https://git.reactos.org/?p=reactos.git;a=commitdiff;h=76588be0d1a4b271dc489…
commit 76588be0d1a4b271dc489a838967bee0a45f4c99
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Wed Sep 19 12:28:58 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Wed Sep 19 12:30:33 2018 +0200
[ADVAPI32][SERVICES] Use the session key provided by SystemFunction028 to encrypt and
decrypt the service passwords.
---
base/system/services/config.c | 20 +++++++++++++++++---
dll/win32/advapi32/service/scm.c | 21 ++++++++++++++++++---
2 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/base/system/services/config.c b/base/system/services/config.c
index 4d1f2471c6..a4b809b76f 100644
--- a/base/system/services/config.c
+++ b/base/system/services/config.c
@@ -29,6 +29,11 @@ SystemFunction005(
const struct ustring *key,
struct ustring *out);
+NTSTATUS
+WINAPI
+SystemFunction028(
+ IN PVOID ContextHandle,
+ OUT LPBYTE SessionKey);
/* FUNCTIONS *****************************************************************/
@@ -699,17 +704,26 @@ ScmDecryptPassword(
_Out_ PWSTR *pClearTextPassword)
{
struct ustring inData, keyData, outData;
- PCHAR pszKey = "TestEncryptionKey";
+ BYTE SessionKey[16];
PWSTR pBuffer;
NTSTATUS Status;
+ /* Get the session key */
+ Status = SystemFunction028(NULL,
+ SessionKey);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SystemFunction028 failed (Status 0x%08lx)\n", Status);
+ return RtlNtStatusToDosError(Status);
+ }
+
inData.Length = dwPasswordSize;
inData.MaximumLength = inData.Length;
inData.Buffer = pPassword;
- keyData.Length = strlen(pszKey);
+ keyData.Length = sizeof(SessionKey);
keyData.MaximumLength = keyData.Length;
- keyData.Buffer = (unsigned char *)pszKey;
+ keyData.Buffer = SessionKey;
outData.Length = 0;
outData.MaximumLength = 0;
diff --git a/dll/win32/advapi32/service/scm.c b/dll/win32/advapi32/service/scm.c
index efa19f2b35..b28055a968 100644
--- a/dll/win32/advapi32/service/scm.c
+++ b/dll/win32/advapi32/service/scm.c
@@ -19,6 +19,12 @@ SystemFunction004(
const struct ustring *key,
struct ustring *out);
+NTSTATUS
+WINAPI
+SystemFunction028(
+ IN PVOID ContextHandle,
+ OUT LPBYTE SessionKey);
+
/* FUNCTIONS *****************************************************************/
handle_t __RPC_USER
@@ -169,17 +175,26 @@ ScmEncryptPassword(
_Out_ PDWORD pEncryptedPasswordSize)
{
struct ustring inData, keyData, outData;
- PCHAR pszKey = "TestEncryptionKey";
+ BYTE SessionKey[16];
PBYTE pBuffer;
NTSTATUS Status;
+ /* Get the session key */
+ Status = SystemFunction028(NULL,
+ SessionKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SystemFunction028 failed (Status 0x%08lx)\n", Status);
+ return RtlNtStatusToDosError(Status);
+ }
+
inData.Length = (wcslen(pClearTextPassword) + 1) * sizeof(WCHAR);
inData.MaximumLength = inData.Length;
inData.Buffer = (unsigned char *)pClearTextPassword;
- keyData.Length = strlen(pszKey);
+ keyData.Length = sizeof(SessionKey);
keyData.MaximumLength = keyData.Length;
- keyData.Buffer = (unsigned char *)pszKey;
+ keyData.Buffer = SessionKey;
outData.Length = 0;
outData.MaximumLength = 0;