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
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;
|
|
}
|