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.
313 lines
10 KiB
313 lines
10 KiB
/*
|
|
* REG.c Registry functions
|
|
*
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <cryptdlg.h>
|
|
#include <wab.h>
|
|
#include "demand.h"
|
|
#include "data.h"
|
|
#include "reg.h"
|
|
#include "smimetst.h"
|
|
#include "receipt.h"
|
|
|
|
|
|
// Options
|
|
TCHAR szSenderEmail[CCH_OPTION_STRING] = "";
|
|
TCHAR szSenderName[CCH_OPTION_STRING] = "";
|
|
SBinary SenderEntryID = {0};
|
|
TCHAR szRecipientEmail[CCH_OPTION_STRING] = "";
|
|
TCHAR szRecipientName[CCH_OPTION_STRING] = "";
|
|
SBinary RecipientEntryID = {0};
|
|
TCHAR szOutputFile[CCH_OPTION_STRING] = "c:\\SMimeTst.eml";
|
|
TCHAR szInputFile[CCH_OPTION_STRING] = "";
|
|
CRYPT_HASH_BLOB SignHash = {0, NULL};
|
|
DWORD CMyNames = 0;
|
|
PCERT_NAME_BLOB RgMyNames = {0};
|
|
|
|
|
|
const TCHAR szRegKey[] = "Software\\Microsoft\\SMimeTest";
|
|
|
|
DWORD SaveMailListKeys(HKEY);
|
|
DWORD GetMailListKeys(HKEY);
|
|
|
|
|
|
DWORD RegSaveLong(HKEY hKey, LPTSTR szName, ULONG lData) {
|
|
DWORD dwErr;
|
|
|
|
dwErr = RegSetValueEx(hKey, szName, 0, REG_DWORD, (LPBYTE)&lData, sizeof(lData));
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
DWORD RegSaveShort(HKEY hKey, LPTSTR szName, USHORT sData) {
|
|
return(RegSaveLong(hKey, szName, (ULONG)sData));
|
|
}
|
|
|
|
DWORD RegSaveBinary(HKEY hKey, LPTSTR szName, LPBYTE pData, ULONG cbData) {
|
|
DWORD dwErr;
|
|
|
|
dwErr = RegSetValueEx(hKey, szName, 0, REG_BINARY, pData, cbData);
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
DWORD RegSaveString(HKEY hKey, LPTSTR szName, LPTSTR pszData) {
|
|
DWORD dwErr;
|
|
|
|
dwErr = RegSetValueEx(hKey, szName, 0, REG_SZ, (LPBYTE)pszData, lstrlen(pszData) + 1);
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
|
|
DWORD RegGetShort(HKEY hKey, LPTSTR szName, USHORT * psData) {
|
|
DWORD dwData = 0;
|
|
DWORD cbData = sizeof(dwData);
|
|
DWORD dwErr;
|
|
DWORD dwType = 0;
|
|
|
|
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)&dwData, &cbData);
|
|
|
|
*psData = (USHORT)dwData;
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
DWORD RegGetLong(HKEY hKey, LPTSTR szName, ULONG * plData) {
|
|
DWORD dwErr;
|
|
DWORD cbData = sizeof(*plData);
|
|
DWORD dwType = 0;
|
|
|
|
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)plData, &cbData);
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
|
|
DWORD RegGetBinary(HKEY hKey, LPTSTR szName, LPBYTE * ppData, ULONG * lpcbData) {
|
|
DWORD dwErr;
|
|
DWORD dwType = 0;
|
|
DWORD cbData = 0;
|
|
LPBYTE pData = NULL;
|
|
|
|
if (*ppData) {
|
|
LocalFree(*ppData);
|
|
*ppData = NULL;
|
|
*lpcbData = 0;
|
|
}
|
|
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, pData, &cbData);
|
|
if ((dwErr == ERROR_SUCCESS) && (cbData > 0)) {
|
|
pData = (LPBYTE)LocalAlloc(LPTR, cbData);
|
|
*lpcbData = cbData;
|
|
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, pData, lpcbData);
|
|
*ppData = pData;
|
|
}
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
DWORD RegGetString(HKEY hKey, LPTSTR szName, LPTSTR pszData) {
|
|
DWORD dwErr;
|
|
DWORD dwType = 0;
|
|
DWORD cbData = CCH_OPTION_STRING;
|
|
TCHAR szExpanded[CCH_OPTION_STRING];
|
|
|
|
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)pszData, &cbData);
|
|
if ((REG_EXPAND_SZ == dwType) && (cbData > 0)) {
|
|
ExpandEnvironmentStrings(pszData, szExpanded, cbData);
|
|
lstrcpy(pszData, szExpanded);
|
|
}
|
|
return(dwErr);
|
|
}
|
|
|
|
void SaveOptions(void) {
|
|
HKEY hKey = NULL;
|
|
DWORD dwErr;
|
|
DWORD dwDisposition;
|
|
|
|
if (! (dwErr = RegCreateKeyEx(HKEY_CURRENT_USER, szRegKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition))) {
|
|
RegSaveString(hKey, "Sender Email", szSenderEmail);
|
|
RegSaveString(hKey, "Sender Name", szSenderName);
|
|
if (SenderEntryID.lpb) {
|
|
RegSaveBinary(hKey, "Sender EntryID", (LPBYTE)SenderEntryID.lpb, SenderEntryID.cb);
|
|
} else {
|
|
RegDeleteValue(hKey, "Sender EntryID");
|
|
}
|
|
RegSaveString(hKey, "Recipient Email", szRecipientEmail);
|
|
RegSaveString(hKey, "Recipient Name", szRecipientName);
|
|
if (RecipientEntryID.lpb) {
|
|
RegSaveBinary(hKey, "Recipient EntryID", (LPBYTE)RecipientEntryID.lpb, RecipientEntryID.cb);
|
|
} else {
|
|
RegDeleteValue(hKey, "Recipient EntryID");
|
|
}
|
|
RegSaveString(hKey, "Output File", szOutputFile);
|
|
RegSaveString(hKey, "Input File", szInputFile);
|
|
|
|
RegSaveBinary(hKey, "Signing Hash", SignHash.pbData, SignHash.cbData);
|
|
|
|
if (CMyNames > 0) {
|
|
CRYPT_SEQUENCE_OF_ANY any = {CMyNames, RgMyNames};
|
|
DWORD cb;
|
|
BOOL f;
|
|
LPBYTE pb;
|
|
|
|
f = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_SEQUENCE_OF_ANY,
|
|
&any, CRYPT_ENCODE_ALLOC_FLAG, NULL,
|
|
&pb, &cb);
|
|
RegSaveBinary(hKey, "My Names", pb, cb);
|
|
LocalFree(pb);
|
|
}
|
|
else {
|
|
RegDeleteValue(hKey, "My Names");
|
|
}
|
|
|
|
SaveMailListKeys(hKey);
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
void GetOptions(void) {
|
|
HKEY hKey = NULL;
|
|
DWORD dwErr;
|
|
|
|
if (! (dwErr = RegOpenKeyEx(HKEY_CURRENT_USER, szRegKey, 0, KEY_READ, &hKey))) {
|
|
RegGetString(hKey, "Sender Email", szSenderEmail);
|
|
RegGetString(hKey, "Sender Name", szSenderName);
|
|
RegGetBinary(hKey, "Sender EntryID", &SenderEntryID.lpb, &SenderEntryID.cb);
|
|
RegGetString(hKey, "Recipient Email", szRecipientEmail);
|
|
RegGetString(hKey, "Recipient Name", szRecipientName);
|
|
RegGetBinary(hKey, "Recipient EntryID", &RecipientEntryID.lpb, &RecipientEntryID.cb);
|
|
RegGetString(hKey, "Output File", szOutputFile);
|
|
RegGetString(hKey, "Input File", szInputFile);
|
|
|
|
RegGetBinary(hKey, "Signing Hash", &SignHash.pbData, &SignHash.cbData);
|
|
|
|
{
|
|
DWORD cb = 0;
|
|
PCRYPT_SEQUENCE_OF_ANY pany;
|
|
LPBYTE pb = NULL;
|
|
|
|
RegGetBinary(hKey, "My Names", &pb, &cb);
|
|
|
|
if (cb > 0) {
|
|
CryptDecodeObjectEx(X509_ASN_ENCODING, X509_SEQUENCE_OF_ANY,
|
|
pb, cb, CRYPT_ENCODE_ALLOC_FLAG, NULL,
|
|
&pany, &cb);
|
|
RgMyNames = (PCERT_NAME_BLOB) LocalAlloc(0, cb);
|
|
memcpy(RgMyNames, pany->rgValue, cb);
|
|
CMyNames = pany->cValue;
|
|
LocalFree(pany);
|
|
}
|
|
if (pb != NULL) LocalFree(pb);
|
|
}
|
|
|
|
GetMailListKeys(hKey);
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
|
|
void CleanupOptions(void) {
|
|
if (SenderEntryID.lpb) {
|
|
LocalFree(SenderEntryID.lpb);
|
|
SenderEntryID.lpb = NULL;
|
|
}
|
|
if (RecipientEntryID.lpb) {
|
|
LocalFree(RecipientEntryID.lpb);
|
|
RecipientEntryID.lpb = NULL;
|
|
}
|
|
if (RgMyNames != NULL) {
|
|
LocalFree(RgMyNames);
|
|
RgMyNames = 0;
|
|
}
|
|
}
|
|
|
|
//// OptionsDlgProc
|
|
//
|
|
// Description: This is the dialog proc function which controls the preset
|
|
// options for a user. These options are stored in the registry code and
|
|
// are on a per-user basis.
|
|
//
|
|
|
|
BOOL OptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
PCCERT_CONTEXT pccert;
|
|
char rgch[256];
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
// Fill in the fields from the options
|
|
SetDlgItemText(hwnd, IDC_SENDER_EMAIL, szSenderEmail);
|
|
// SetDlgItemText(hwnd, IDC_SENDER_NAME, szSenderName);
|
|
SetDlgItemText(hwnd, IDC_RECIPIENT_EMAIL, szRecipientEmail);
|
|
// SetDlgItemText(hwnd, IDC_RECIPIENT_NAME, szRecipientName);
|
|
if (HCertStoreMy == NULL) {
|
|
HCertStoreMy = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING,
|
|
NULL, CERT_SYSTEM_STORE_CURRENT_USER,
|
|
L"MY");
|
|
if (HCertStoreMy == NULL) {
|
|
break;
|
|
}
|
|
}
|
|
if (SignHash.cbData != 0) {
|
|
pccert = CertFindCertificateInStore(HCertStoreMy,
|
|
X509_ASN_ENCODING, 0,
|
|
CERT_FIND_SHA1_HASH,
|
|
&SignHash, NULL);
|
|
GetFriendlyNameOfCertA(pccert, rgch, sizeof(rgch));
|
|
SetDlgItemText(hwnd, IDC_O_CERT_NAME, rgch);
|
|
CertFreeCertificateContext(pccert);
|
|
}
|
|
if (CMyNames > 0) {
|
|
FormatNames(CMyNames, RgMyNames, hwnd, IDC_O_MY_NAMES);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND :
|
|
switch (wParam) {
|
|
case IDOK:
|
|
GetDlgItemText(hwnd, IDC_SENDER_EMAIL, szSenderEmail, CCH_OPTION_STRING);
|
|
// GetDlgItemText(hwnd, IDC_SENDER_NAME, szSenderName, CCH_OPTION_STRING);
|
|
GetDlgItemText(hwnd, IDC_RECIPIENT_EMAIL, szRecipientEmail, CCH_OPTION_STRING);
|
|
// GetDlgItemText(hwnd, IDC_RECIPIENT_NAME, szRecipientName, CCH_OPTION_STRING);
|
|
if (!ParseNames(&CMyNames, &RgMyNames, hwnd, IDC_O_MY_NAMES)) {
|
|
return FALSE;
|
|
}
|
|
EndDialog(hwnd, 0);
|
|
break;
|
|
|
|
case IDC_O_CERT_CHOOSE:
|
|
pccert = NULL;
|
|
if (SignHash.cbData != 0) {
|
|
pccert = CertFindCertificateInStore(HCertStoreMy,
|
|
X509_ASN_ENCODING, 0,
|
|
CERT_FIND_SHA1_HASH,
|
|
&SignHash, NULL);
|
|
}
|
|
if (DoCertDialog(hwnd, "Choose Signature Certificate",
|
|
HCertStoreMy, &pccert, FILTER_NONE)) {
|
|
SignHash.pbData = RgbSignHash;
|
|
SignHash.cbData = sizeof(RgbSignHash);
|
|
CertGetCertificateContextProperty(pccert, CERT_SHA1_HASH_PROP_ID,
|
|
SignHash.pbData,
|
|
&SignHash.cbData);
|
|
GetFriendlyNameOfCertA(pccert, rgch, sizeof(rgch));
|
|
SetDlgItemText(hwnd, IDC_O_CERT_NAME, rgch);
|
|
}
|
|
|
|
CertFreeCertificateContext(pccert);
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|