[ADVAPI32][SERVICES] Use the session key provided by SystemFunction028 to encrypt...
authorEric Kohl <eric.kohl@reactos.org>
Wed, 19 Sep 2018 10:28:58 +0000 (12:28 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Wed, 19 Sep 2018 10:30:33 +0000 (12:30 +0200)
base/system/services/config.c
dll/win32/advapi32/service/scm.c

index 4d1f247..a4b809b 100644 (file)
@@ -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;
index efa19f2..b28055a 100644 (file)
@@ -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;