Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1320 lines
32 KiB

/**********************************************************************/
/** Microsoft Passport **/
/** Copyright(c) Microsoft Corporation, 1999 - 2001 **/
/**********************************************************************/
/*
admin.cpp
DCOM object for pmconfig -- admin utility to call to configure passport
FILE HISTORY:
*/// Admin.cpp : Implementation of CAdmin
#include "stdafx.h"
#include "Passport.h"
#include "Admin.h"
#include "keycrypto.h"
#include <time.h>
#define MAX_CCDPASSWORD_LEN 256
#include "keyver.h"
#define PASSPORT_KEY L"SOFTWARE\\Microsoft\\Passport"
#define KEYDATA_KEY PASSPORT_KEY L"\\KeyData"
#define KEYTIMES_KEY PASSPORT_KEY L"\\KeyTimes"
#define SITES_KEY PASSPORT_KEY L"\\Sites"
#define NEXUS_KEY PASSPORT_KEY L"\\Nexus"
#define KEYDATA_SUBKEY L"KeyData"
#define KEYTIMES_SUBKEY L"KeyTimes"
/////////////////////////////////////////////////////////////////////////////
// CAdmin
//===========================================================================
//
// InterfaceSupportsErrorInfo
//
STDMETHODIMP CAdmin::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IPassportAdmin,
&IID_IPassportAdminEx,
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i], riid))
{
return S_OK;
}
}
return S_FALSE;
}
//===========================================================================
//
// get_IsValid
//
STDMETHODIMP CAdmin::get_IsValid(VARIANT_BOOL *pVal)
{
*pVal = g_config->isValid() ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
//===========================================================================
//
// get_ErrorDescription
//
STDMETHODIMP CAdmin::get_ErrorDescription(BSTR *pVal)
{
if (g_config->isValid())
{
*pVal = SysAllocString(L"Passport Object OK");
}
else
{
*pVal = SysAllocString(g_config->getFailureString());
}
return S_OK;
}
//===========================================================================
//
// addKey
//
STDMETHODIMP CAdmin::addKey(BSTR keyMaterial, int version, long expires, VARIANT_BOOL *ok)
{
HRESULT hr = S_OK;
*ok = VARIANT_FALSE;
// Must be the appropriate length
if (SysStringLen(keyMaterial) != CKeyCrypto::RAWKEY_SIZE)
{
AtlReportError(CLSID_Admin, L"Key must be 24 characters", IID_IPassportAdmin, E_FAIL);
return E_FAIL;
}
// Must be an appropriate version
if (version > KEY_VERSION_MAX || version < KEY_VERSION_MIN)
{
AtlReportError(CLSID_Admin, L"Key version must be <36 and > 0", IID_IPassportAdmin, E_FAIL);
return E_FAIL;
}
BYTE original[CKeyCrypto::RAWKEY_SIZE];
DATA_BLOB iBlob;
iBlob.cbData = sizeof(original);
iBlob.pbData = &(original[0]);
for (int i = 0; i < CKeyCrypto::RAWKEY_SIZE; i++)
{
original[i] = static_cast<BYTE>(keyMaterial[i] & 0xFF);
}
// Try to encrypt it
CKeyCrypto kc;
DATA_BLOB oBlob = {0};
if (kc.encryptKey(&iBlob, &oBlob) != S_OK)
{
AtlReportError(CLSID_Admin,
L"Failed to encrypt key, couldn't find valid network card?",
IID_IPassportAdmin,
E_FAIL);
return E_FAIL;
}
// Now add it to registry
LONG lResult;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
char szKeyNum[2];
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEYDATA_KEY, 0, KEY_WRITE, &hkDataKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyData key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEYTIMES_KEY, 0, KEY_WRITE, &hkTimeKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegSetValueExA(hkDataKey, szKeyNum, 0, REG_BINARY, oBlob.pbData, oBlob.cbData);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyData key to registry.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
if (expires != 0)
{
DWORD dwTime = expires;
lResult = RegSetValueExA(hkTimeKey, szKeyNum, 0, REG_DWORD, (LPBYTE) &dwTime, sizeof(DWORD));
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyTime value to registry.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
else
{
RegDeleteValueA(hkTimeKey, szKeyNum);
}
*ok = VARIANT_TRUE;
Cleanup:
if (hkDataKey)
{
RegCloseKey(hkDataKey);
}
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
if(oBlob.pbData)
{
LocalFree(oBlob.pbData);
}
if (*ok == VARIANT_TRUE)
{
if (g_pAlert)
{
g_pAlert->report(PassportAlertInterface::INFORMATION_TYPE, PM_NEWKEY_INSTALLED);
}
}
return hr;
}
//===========================================================================
//
// addKeyEx
//
STDMETHODIMP CAdmin::addKeyEx(BSTR keyMaterial, int version, long expires, VARIANT vSiteName, VARIANT_BOOL *ok)
{
HRESULT hr = S_OK;
LPSTR szSiteName = NULL;
LONG lResult;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
HKEY hkSites = NULL, hkPassport = NULL;
char szKeyNum[2];
BYTE original[CKeyCrypto::RAWKEY_SIZE];
DATA_BLOB iBlob;
DATA_BLOB oBlob = {0};
CKeyCrypto kc;
int i;
*ok = VARIANT_FALSE;
USES_CONVERSION;
// Must be the appropriate length
if (SysStringLen(keyMaterial) != CKeyCrypto::RAWKEY_SIZE)
{
AtlReportError(CLSID_Admin, L"Key must be 24 characters", IID_IPassportAdminEx, E_FAIL);
return E_FAIL;
}
// Must be an appropriate version
if (version > KEY_VERSION_MAX || version < KEY_VERSION_MIN)
{
AtlReportError(CLSID_Admin, L"Key version must be < 36 and > 0", IID_IPassportAdminEx, E_FAIL);
return E_FAIL;
}
if(vSiteName.vt == VT_ERROR && vSiteName.scode == DISP_E_PARAMNOTFOUND)
{
szSiteName = NULL;
}
else if(vSiteName.vt == VT_BSTR)
{
szSiteName = W2A(vSiteName.bstrVal);
}
else
{
hr = E_INVALIDARG;
goto Cleanup;
}
for (i = 0; i < CKeyCrypto::RAWKEY_SIZE; i++)
{
original[i] = static_cast<BYTE>(keyMaterial[i] & 0xFF);
}
iBlob.cbData = sizeof(original);
iBlob.pbData = &(original[0]);
// Try to encrypt it
if (kc.encryptKey(&iBlob, &oBlob) != S_OK)
{
AtlReportError(CLSID_Admin,
L"Failed to encrypt key, couldn't find valid network card?",
IID_IPassportAdminEx,
E_FAIL);
return E_FAIL;
}
// Get the root key.
if(szSiteName)
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SITES_KEY,
0,
KEY_ALL_ACCESS,
&hkSites);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Site not found. Please add the site before installing the key.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
lResult = RegOpenKeyExA(hkSites,
szSiteName,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Site not found. Please add the site before installing the key.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
}
else
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
PASSPORT_KEY,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Passport key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
// Now add it to registry
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
lResult = RegOpenKeyEx(hkPassport, KEYDATA_SUBKEY, 0, KEY_WRITE, &hkDataKey);
if (lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyData key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegOpenKeyEx(hkPassport, KEYTIMES_SUBKEY, 0, KEY_WRITE, &hkTimeKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegSetValueExA(hkDataKey, szKeyNum, 0, REG_BINARY, oBlob.pbData, oBlob.cbData);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyData key to registry.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
if (expires != 0)
{
DWORD dwTime = expires;
lResult = RegSetValueExA(hkTimeKey, szKeyNum, 0, REG_DWORD, (LPBYTE) &dwTime, sizeof(DWORD));
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyTime value to registry.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
else
{
RegDeleteValueA(hkTimeKey, szKeyNum);
}
*ok = VARIANT_TRUE;
Cleanup:
if (hkPassport)
{
RegCloseKey(hkPassport);
}
if (hkDataKey)
{
RegCloseKey(hkDataKey);
}
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
if (hkSites)
{
RegCloseKey(hkSites);
}
if (oBlob.pbData)
{
::LocalFree(oBlob.pbData);
}
if (*ok == VARIANT_TRUE)
{
if (g_pAlert)
{
g_pAlert->report(PassportAlertInterface::INFORMATION_TYPE, PM_NEWKEY_INSTALLED);
}
}
return hr;
}
//===========================================================================
//
// deleteKey
//
STDMETHODIMP CAdmin::deleteKey(int version)
{
HRESULT hr = S_OK, lResult;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
char szKeyNum[2];
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEYDATA_KEY, 0, KEY_WRITE, &hkDataKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyData key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEYTIMES_KEY, 0, KEY_WRITE, &hkTimeKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
RegDeleteValueA(hkTimeKey, szKeyNum);
RegDeleteValueA(hkDataKey, szKeyNum);
Cleanup:
if (hkDataKey)
{
RegCloseKey(hkDataKey);
}
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
return hr;
}
//===========================================================================
//
// deleteKeyEx
//
STDMETHODIMP CAdmin::deleteKeyEx(
int version,
VARIANT vSiteName
)
{
HRESULT hr = S_OK, lResult;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
HKEY hkPassport = NULL, hkSites = NULL;
char szKeyNum[2];
LPSTR szSiteName = NULL;
USES_CONVERSION;
if(vSiteName.vt == VT_ERROR && vSiteName.scode == DISP_E_PARAMNOTFOUND)
{
szSiteName = NULL;
}
else if(vSiteName.vt == VT_BSTR)
{
szSiteName = W2A(vSiteName.bstrVal);
}
else
{
hr = E_INVALIDARG;
goto Cleanup;
}
if(szSiteName)
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SITES_KEY,
0,
KEY_ALL_ACCESS,
&hkSites);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Sites key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
lResult = RegOpenKeyExA(hkSites,
szSiteName,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find site key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
}
else
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
PASSPORT_KEY,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Passport key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
lResult = RegOpenKeyEx(hkPassport, KEYDATA_SUBKEY, 0, KEY_WRITE, &hkDataKey);
if (lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyData key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegOpenKeyEx(hkPassport, KEYTIMES_SUBKEY, 0, KEY_WRITE, &hkTimeKey);
if (lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
RegDeleteValueA(hkTimeKey, szKeyNum);
RegDeleteValueA(hkDataKey, szKeyNum);
Cleanup:
if (hkPassport)
{
RegCloseKey(hkPassport);
}
if (hkSites)
{
RegCloseKey(hkSites);
}
if (hkDataKey)
{
RegCloseKey(hkDataKey);
}
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
return hr;
}
//===========================================================================
//
// setKeyTime
//
STDMETHODIMP CAdmin::setKeyTime(int version, int fromNow)
{
HRESULT hr = S_OK, lResult;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
char szKeyNum[2];
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEYTIMES_KEY, 0, KEY_WRITE, &hkTimeKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
if (fromNow == 0)
{
RegDeleteValueA(hkTimeKey, szKeyNum);
}
else
{
time_t now;
time(&now);
now += fromNow;
DWORD dwT = now;
lResult = RegSetValueExA(hkTimeKey, szKeyNum, 0, REG_DWORD, (LPBYTE) &dwT, sizeof(DWORD));
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyTime key to registry.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
Cleanup:
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
return hr;
}
//===========================================================================
//
// setKeyTimeEx
//
STDMETHODIMP CAdmin::setKeyTimeEx(
int version,
int fromNow,
VARIANT vSiteName
)
{
HRESULT hr = S_OK, lResult;
LPSTR szSiteName = NULL;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
HKEY hkSites = NULL, hkPassport = NULL;
char szKeyNum[2];
USES_CONVERSION;
if(vSiteName.vt == VT_ERROR && vSiteName.scode == DISP_E_PARAMNOTFOUND)
{
szSiteName = NULL;
}
else if(vSiteName.vt == VT_BSTR)
{
szSiteName = W2A(vSiteName.bstrVal);
}
else
{
hr = E_INVALIDARG;
goto Cleanup;
}
if(szSiteName)
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SITES_KEY,
0,
KEY_ALL_ACCESS,
&hkSites);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Sites key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
lResult = RegOpenKeyExA(hkSites,
szSiteName,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find site key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
}
else
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
PASSPORT_KEY,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Passport key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
lResult = RegOpenKeyEx(hkPassport, KEYTIMES_SUBKEY, 0, KEY_WRITE, &hkTimeKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find KeyTimes key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
szKeyNum[0] = KeyVerI2C(version);
szKeyNum[1] = '\0';
if (fromNow == 0)
{
RegDeleteValueA(hkTimeKey, szKeyNum);
}
else
{
time_t now;
time(&now);
now += fromNow;
DWORD dwT = now;
lResult = RegSetValueExA(hkTimeKey, szKeyNum, 0, REG_DWORD, (LPBYTE) &dwT, sizeof(DWORD));
if (lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write KeyTime key to registry.",
IID_IPassportAdminEx,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
Cleanup:
if (hkSites)
{
RegCloseKey(hkSites);
}
if (hkPassport)
{
RegCloseKey(hkPassport);
}
if (hkTimeKey)
{
RegCloseKey(hkTimeKey);
}
return hr;
}
//===========================================================================
//
// get_currentKeyVersion
//
STDMETHODIMP CAdmin::get_currentKeyVersion(int *pVal)
{
if (!g_config || !g_config->isValid()) // Guarantees config is non-null
{
*pVal = -1;
return S_OK;
}
CRegistryConfig* crc = g_config->checkoutRegistryConfig();
*pVal = crc->getCurrentCryptVersion();
crc->Release();
return S_OK;
}
//===========================================================================
//
// getCurrentKeyVersionEx
//
STDMETHODIMP CAdmin::getCurrentKeyVersionEx(
VARIANT vSiteName,
int *pVal
)
{
HRESULT hr;
LPSTR szSiteName;
CRegistryConfig* crc = NULL;
USES_CONVERSION;
if(vSiteName.vt == VT_ERROR && vSiteName.scode == DISP_E_PARAMNOTFOUND)
{
szSiteName = NULL;
}
else if(vSiteName.vt == VT_BSTR)
{
szSiteName = W2A(vSiteName.bstrVal);
}
else
{
hr = E_INVALIDARG;
goto Cleanup;
}
if (!g_config || !g_config->isValid()) // Guarantees config is non-null
{
*pVal = -1;
hr = S_OK;
goto Cleanup;
}
crc = g_config->checkoutRegistryConfigBySite(szSiteName);
if(szSiteName && crc == NULL)
{
AtlReportError(CLSID_Admin,
L"Couldn't find site key in registry. Reinstall Passport.",
IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
if(crc == NULL)
{
hr = E_FAIL;
goto Cleanup;
}
*pVal = crc->getCurrentCryptVersion();
hr = S_OK;
Cleanup:
if(crc)
{
crc->Release();
}
return S_OK;
}
//===========================================================================
//
// putCurrentKeyVersionEx
//
STDMETHODIMP CAdmin::put_currentKeyVersion(int Val)
{
HRESULT hr = S_OK, lResult;
HKEY hkKey = NULL;
DWORD dwCK = Val;
if (Val < KEY_VERSION_MIN || Val > KEY_VERSION_MAX)
{
hr = E_INVALIDARG;
goto Cleanup;
}
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, PASSPORT_KEY, 0, KEY_WRITE, &hkKey);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Passport key in registry. Reinstall Passport.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
lResult = RegSetValueExA(hkKey, "CurrentKey", 0, REG_DWORD, (LPBYTE) &dwCK, sizeof(DWORD));
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write CurrentKey value to registry.",
IID_IPassportAdmin,
E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
Cleanup:
if (hkKey)
{
RegCloseKey(hkKey);
}
return hr;
}
//===========================================================================
//
// putCurrentKeyVersionEx
//
STDMETHODIMP CAdmin::putCurrentKeyVersionEx(
int Val,
VARIANT vSiteName
)
{
HRESULT hr = S_OK, lResult;
LPSTR szSiteName;
HKEY hkPassport = NULL, hkSites = NULL;
DWORD dwCK = Val;
USES_CONVERSION;
if (Val < KEY_VERSION_MIN || Val > KEY_VERSION_MAX)
{
hr = E_INVALIDARG;
goto Cleanup;
}
if(vSiteName.vt == VT_ERROR && vSiteName.scode == DISP_E_PARAMNOTFOUND)
szSiteName = NULL;
else if(vSiteName.vt == VT_BSTR)
szSiteName = W2A(vSiteName.bstrVal);
else
{
hr = E_INVALIDARG;
goto Cleanup;
}
if(szSiteName)
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SITES_KEY,
0,
KEY_ALL_ACCESS,
&hkSites);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Sites key in registry. Reinstall Passport.", IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
lResult = RegOpenKeyExA(hkSites,
szSiteName,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find site key in registry. Reinstall Passport.", IID_IPassportAdminEx,
PP_E_SITE_NOT_EXISTS);
hr = PP_E_SITE_NOT_EXISTS;
goto Cleanup;
}
}
else
{
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
PASSPORT_KEY,
0,
KEY_ALL_ACCESS,
&hkPassport);
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't find Passport key in registry. Reinstall Passport.", IID_IPassportAdminEx, E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
}
lResult = RegSetValueExA(hkPassport, "CurrentKey", 0,
REG_DWORD, (LPBYTE) &dwCK, sizeof(DWORD));
if(lResult != ERROR_SUCCESS)
{
AtlReportError(CLSID_Admin,
L"Couldn't write CurrentKey value to registry.", IID_IPassportAdminEx, E_FAIL);
hr = E_FAIL;
goto Cleanup;
}
Cleanup:
if (hkPassport)
RegCloseKey(hkPassport);
if (hkSites)
RegCloseKey(hkSites);
return hr;
}
//===========================================================================
//
// Refresh
//
STDMETHODIMP CAdmin::Refresh(
VARIANT_BOOL bWait,
VARIANT_BOOL* pbSuccess
)
{
HRESULT hr;
if(pbSuccess == NULL)
{
hr = E_INVALIDARG;
goto Cleanup;
}
*pbSuccess = (g_config->UpdateNow(TRUE) ? VARIANT_TRUE : VARIANT_FALSE);
hr = S_OK;
Cleanup:
return hr;
}
//===========================================================================
//
// setNexusPassword
//
STDMETHODIMP CAdmin::setNexusPassword(
BSTR bstrPwd
)
{
HRESULT hr;
BYTE original[CKeyCrypto::RAWKEY_SIZE];
DATA_BLOB iBlob;
DATA_BLOB oBlob = {0};
CKeyCrypto kc;
long lResult;
HKEY hkNexus = NULL;
USES_CONVERSION;
ZeroMemory(original, sizeof(original));
strncpy((char*) original, W2A(bstrPwd), sizeof(original));
original[sizeof(original) - 1] = '\0';
iBlob.cbData = sizeof(original);
iBlob.pbData = &(original[0]);
hr = kc.encryptKey(&iBlob, &oBlob);
if(hr != S_OK)
{
goto Cleanup;
}
//
// Now we have an encrypted key, put it in the registry.
//
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
NEXUS_KEY,
0,
KEY_SET_VALUE,
&hkNexus);
if(lResult != ERROR_SUCCESS)
{
hr = E_FAIL;
goto Cleanup;
}
lResult = RegSetValueEx(hkNexus,
TEXT("CCDPassword"),
0,
REG_BINARY,
oBlob.pbData,
oBlob.cbData
);
if(lResult != ERROR_SUCCESS)
{
hr = E_FAIL;
goto Cleanup;
}
hr = S_OK;
Cleanup:
if(hkNexus)
RegCloseKey(hkNexus);
if (oBlob.pbData)
::LocalFree(oBlob.pbData);
return hr;
}
//===========================================================================
//
// Helper routine to create/set the CCDPassword registry value
//
HRESULT SetCCDPassword(VOID)
{
HRESULT hr;
LPSTR szString = "La3b$7Q@93P*JX";
BYTE szResult[MAX_CCDPASSWORD_LEN];
BYTE szInput[CKeyCrypto::RAWKEY_SIZE] = {0};
DATA_BLOB iBlob, oBlob = {0};
CKeyCrypto kc;
LONG lResult;
HKEY hKey;
strncpy((char *) szInput, szString, sizeof(szInput));
szInput[sizeof(szInput) - 1] = '\0';
iBlob.cbData = sizeof(szInput);
iBlob.pbData = (LPBYTE) szInput;
hr = kc.encryptKey(&iBlob, &oBlob);
//
// Setup restricts size of string to be less than 256
//
if (hr == S_OK)
{
if (oBlob.cbData >= MAX_CCDPASSWORD_LEN)
{
hr = E_INVALIDARG;
}
else
{
memcpy(szResult, oBlob.pbData, oBlob.cbData);
}
}
if (oBlob.pbData)
{
LocalFree(oBlob.pbData);
}
if (hr != S_OK)
{
return hr;
}
//
// Password's encrypted, now set it in the registry
//
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
NEXUS_KEY,
0,
KEY_SET_VALUE,
&hKey);
if (lResult != ERROR_SUCCESS)
{
hr = E_FAIL;
return hr;
}
lResult = RegSetValueExA(hKey,
"CCDPassword",
0,
REG_BINARY,
szResult,
oBlob.cbData);
if(lResult != ERROR_SUCCESS)
{
hr = E_FAIL;
}
RegCloseKey(hKey);
return hr;
}