#undef UNICODE // ## Not Yet #include #include #include #include #include #define MS_DSS_TYPE "DSS Signature" #define MS_DH_TYPE "DSS Signature with Diffie-Hellman Key Exachange" #define PROVPATH "SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\" #define PROVPATH_LEN sizeof(PROVPATH) #define TYPEPATH "SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type " #define TYPEPATH_LEN sizeof(TYPEPATH) #define IMAGEPATH "dssbase.dll" #define IMAGEPATH_LEN sizeof(IMAGEPATH) BOOL SetCSPInfo( LPSTR pszProvider, LPSTR pszImagePath, BYTE *pbSig, DWORD cbSig, DWORD dwProvType, LPSTR pszTypeName ) { DWORD dwIgn; HKEY hKey = 0; HKEY hTypeKey = 0; DWORD cbProv; BYTE *pszProv = NULL; CHAR pszTypeString[32]; DWORD cbType; BYTE *pszType = NULL; DWORD err; BOOL fRet = FALSE; cbProv = PROVPATH_LEN + strlen(pszProvider); if (NULL == (pszProv = (LPSTR)LocalAlloc(LMEM_ZEROINIT, cbProv))) goto Ret; strcpy(pszProv, PROVPATH); strcat(pszProv, pszProvider); // // Create or open in local machine for provider: // Microsoft Base Cryptographic Provider v1.0 // if (ERROR_SUCCESS != (err = RegCreateKeyEx(HKEY_LOCAL_MACHINE, (const char *)pszProv, 0L, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwIgn))) goto Ret; // // Set Image path to: scp.dll // if (ERROR_SUCCESS != (err = RegSetValueEx(hKey, "Image Path", 0L, REG_SZ, pszImagePath, strlen(pszImagePath) + 1))) goto Ret; // // Set Type to: Type 003 // if (ERROR_SUCCESS != (err = RegSetValueEx(hKey, "Type", 0L, REG_DWORD, (LPTSTR)&dwProvType, sizeof(DWORD)))) goto Ret; // // Place signature // if (ERROR_SUCCESS != (err = RegSetValueEx(hKey, "Signature", 0L, REG_BINARY, pbSig, cbSig))) goto Ret; // // Create or open in local machine for provider type: // memset(pszTypeString, 0, sizeof(pszTypeString)); sprintf(pszTypeString, "%.3d", dwProvType); cbType = TYPEPATH_LEN + strlen(pszTypeString); if (NULL == (pszType = (LPSTR)LocalAlloc(LMEM_ZEROINIT, cbType))) goto Ret; strcpy(pszType, TYPEPATH); strcat(pszType, pszTypeString); if (ERROR_SUCCESS != (err = RegCreateKeyEx(HKEY_LOCAL_MACHINE, (const char *) pszType, 0L, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hTypeKey, &dwIgn))) goto Ret; if (ERROR_SUCCESS != (err = RegSetValueEx(hTypeKey, "Name", 0L, REG_SZ, pszProvider, strlen(pszProvider) + 1))) goto Ret; if (ERROR_SUCCESS != (err = RegSetValueEx(hTypeKey, "TypeName", 0L, REG_SZ, pszTypeName, strlen(pszTypeName) + 1))) goto Ret; fRet = TRUE; Ret: if (hKey) RegCloseKey(hKey); if (hTypeKey) RegCloseKey(hTypeKey); if (pszProv) LocalFree(pszProv); if (pszType) LocalFree(pszType); return fRet; } int __cdecl main(int cArg, char *rgszArg[]) { DWORD err; DWORD dwValue; HANDLE hFileSig = INVALID_HANDLE_VALUE; DWORD NumBytesRead; DWORD lpdwFileSizeHigh; LPVOID lpvAddress = NULL; DWORD NumBytes; BOOL fRet = FALSE; // // Just to open scp.dll signature file. This file was created by // sign.exe. // if (INVALID_HANDLE_VALUE == (hFileSig = CreateFile("dssbase.sig", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0))) { printf("Install failed: Unable to open dssbase.sig: %x\n", GetLastError()); goto Ret; } if ((NumBytes = GetFileSize((HANDLE) hFileSig, &lpdwFileSizeHigh)) == 0xffffffff) { printf("Install failed: Getting size of file dssbase.sig: %x\n", GetLastError()); goto Ret; } if ((lpvAddress = VirtualAlloc(NULL, NumBytes, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) { printf("Install failed: Alloc to read dssbase.sig: %x\n", GetLastError()); goto Ret; } if (!ReadFile((HANDLE) hFileSig, lpvAddress, NumBytes, &NumBytesRead, 0)) { printf("Install failed: Reading dssbase.sig: %x\n", GetLastError()); goto Ret; } if (NumBytesRead != NumBytes) { printf("Install failed: Bytes read doesn't match file size\n"); goto Ret; } // // install the default DSS provider // Type 003 // if (!SetCSPInfo(MS_DEF_DSS_PROV, IMAGEPATH, lpvAddress, NumBytesRead, PROV_DSS, MS_DSS_TYPE)) { printf("Unable to install dssbase.dll"); goto Ret; } // // install the default DSS/DH provider // Type 013 // if (!SetCSPInfo(MS_DEF_DSS_DH_PROV, IMAGEPATH, lpvAddress, NumBytesRead, PROV_DSS_DH, MS_DH_TYPE)) { printf("Unable to install dssbase.dll"); goto Ret; } printf("Installed: %s\n", IMAGEPATH); fRet = TRUE; Ret: if (lpvAddress) VirtualFree(lpvAddress, 0, MEM_RELEASE); if (INVALID_HANDLE_VALUE != hFileSig) CloseHandle(hFileSig); return fRet; }