autoreg.cpp
上传用户:filter2008
上传日期:2013-02-01
资源大小:101k
文件大小:13k
源码类别:

CA认证

开发平台:

C/C++

  1. /****************************************************************************
  2. * library : pkcs_csp.dll
  3. * Purpose : It is an independent software module that actually performs 
  4. * cryptography algorithms for authentication, encoding, and encryption.
  5. * This DLL is interfaced on any PKCS#11 module.  
  6. *
  7. * Copyright (C) 2003 Ilex Syst鑝es Informatiques
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22. *
  23. * Contact :
  24. * Ilex 
  25. * 51 boulevard Voltaire
  26. * 92600 Asni鑢es-sur-Seine
  27. * pkizy@ilex.fr
  28. *
  29. * Author: Delouvrier Antoine
  30. *
  31. *******************************************************************************/
  32. /*
  33. %----------------------------------------------------------------------------
  34. % PROJECT : CSP_PKCS
  35. %
  36. % MODULE : autoreg
  37. %
  38. % VERSION : 1.00
  39. %
  40. % FILE : autoreg.cpp
  41. %
  42. % Allow to register the dll in the registry
  43. %----------------------------------------------------------------------------
  44. % Version 1.00
  45. % CPX-31/03/2003-Cr閍tion
  46. %----------------------------------------------------------------------------
  47. % You can find wincrypt.h in the CSPDK which is downloadable at the adress :
  48. % http://www.microsoft.com/downloads/details.aspx?FamilyId=0F436C75-2304-42BB-B81A-BA0C2C47BAC2&displaylang=en
  49. */ 
  50. #ifndef WIN32_LEAN_AND_MEAN
  51. #define WIN32_LEAN_AND_MEAN
  52. #endif
  53. #ifndef _WIN32_WINNT
  54. #define _WIN32_WINNT 0x0400
  55. #endif
  56. #ifdef _AFXDLL
  57. #include "stdafx.h"
  58. #else
  59. /*
  60. % Biblioth鑡ues ANSI ou syst鑝e
  61. %------------------------------
  62. */
  63. #include <windows.h>
  64. #endif
  65. #ifndef WINVER
  66. #define WINVER 0x0400
  67. #endif
  68. #include <wincrypt.h>
  69. #include <tchar.h>
  70. #include<stdio.h>
  71. /*
  72. % HEADER Files include
  73. %-----------------------
  74. */
  75. #include "cspdk.h"
  76. static HMODULE
  77. GetInstanceHandle(
  78.     void);
  79. static const TCHAR l_szProviderName[]= TEXT("pkcs_csp");
  80. static const DWORD
  81.     l_dwCspType= PROV_RSA_FULL;
  82. /*
  83. %--------------------------------------------------------------------------
  84. % DllUnregisterServer
  85. %
  86. %---------------------------------------------------------------------------
  87. */
  88. STDAPI
  89. DllUnregisterServer(
  90.     void)
  91. {
  92.     LONG nStatus;
  93.     DWORD dwDisp;
  94.     HRESULT hReturnStatus = NO_ERROR;
  95.     HKEY hProviders = NULL;
  96. #ifdef _AFXDLL
  97.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  98. #endif
  99.     //
  100.     // Delete the Registry key for this CSP.
  101.     //
  102.     nStatus = RegCreateKeyEx(
  103.                     HKEY_LOCAL_MACHINE,
  104.                     TEXT("SOFTWARE\Microsoft\Cryptography\Defaults\Provider"),
  105.                     0,
  106.                     TEXT(""),
  107.                     REG_OPTION_NON_VOLATILE,
  108.                     KEY_ALL_ACCESS,
  109.                     NULL,
  110.                     &hProviders,
  111.                     &dwDisp);
  112.     if (ERROR_SUCCESS == nStatus)
  113.     {
  114.         RegDeleteKey(hProviders, l_szProviderName);
  115.         RegCloseKey(hProviders);
  116.         hProviders = NULL;
  117.     }
  118.     return hReturnStatus;
  119. }
  120. /*
  121. %--------------------------------------------------------------------------
  122. % DllRegisterServer
  123. %
  124. %---------------------------------------------------------------------------
  125. */
  126. STDAPI
  127. DllRegisterServer(
  128.     void)
  129. {
  130.     TCHAR szModulePath[MAX_PATH];
  131.     BYTE pbSignature[136];  // Room for a 1024 bit signature, with padding.
  132.     OSVERSIONINFO osVer;
  133.     LPTSTR szFileName, szFileExt;
  134.     HINSTANCE hThisDll;
  135.     HRSRC hSigResource;
  136.     DWORD dwStatus;
  137.     LONG nStatus;
  138.     BOOL fStatus;
  139.     DWORD dwDisp;
  140.     DWORD dwIndex;
  141.     DWORD dwSigLength;
  142.     HRESULT hReturnStatus = NO_ERROR;
  143.     HKEY hProviders = NULL;
  144.     HKEY hMyCsp = NULL;
  145.     HKEY hCalais = NULL;
  146.     HKEY hVendor = NULL;
  147.     BOOL fSignatureFound = FALSE;
  148.     HANDLE hSigFile = INVALID_HANDLE_VALUE;
  149. #ifdef _AFXDLL
  150.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  151. #endif
  152.     //
  153.     // Figure out the file name and path.
  154.     //
  155.     hThisDll = GetInstanceHandle();
  156.     if (NULL == hThisDll)
  157.     {
  158.         hReturnStatus = HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
  159.         goto ErrorExit;
  160.     }
  161.     dwStatus = GetModuleFileName(
  162.                     hThisDll,
  163.                     szModulePath,
  164.                     sizeof(szModulePath) / sizeof(TCHAR));
  165.     if (0 == dwStatus)
  166.     {
  167.         hReturnStatus = HRESULT_FROM_WIN32(GetLastError());
  168.         goto ErrorExit;
  169.     }
  170.     szFileName = _tcsrchr(szModulePath, TEXT('\'));
  171.     if (NULL == szFileName)
  172.         szFileName = szModulePath;
  173.     else
  174.         szFileName += 1;
  175.     szFileExt = _tcsrchr(szFileName, TEXT('.'));
  176.     if (NULL == szFileExt)
  177.     {
  178.         hReturnStatus = HRESULT_FROM_WIN32(ERROR_INVALID_NAME);
  179.         goto ErrorExit;
  180.     }
  181.     else
  182.         szFileExt += 1;
  183.     //
  184.     // Create the Registry key for this CSP.
  185.     //
  186.     nStatus = RegCreateKeyEx(
  187.                     HKEY_LOCAL_MACHINE,
  188.                     TEXT("SOFTWARE\Microsoft\Cryptography\Defaults\Provider"),
  189.                     0,
  190.                     TEXT(""),
  191.                     REG_OPTION_NON_VOLATILE,
  192.                     KEY_ALL_ACCESS,
  193.                     NULL,
  194.                     &hProviders,
  195.                     &dwDisp);
  196.     if (ERROR_SUCCESS != nStatus)
  197.     {
  198.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  199.         goto ErrorExit;
  200.     }
  201.     nStatus = RegCreateKeyEx(
  202.                     hProviders,
  203.                     l_szProviderName,
  204.                     0,
  205.                     TEXT(""),
  206.                     REG_OPTION_NON_VOLATILE,
  207.                     KEY_ALL_ACCESS,
  208.                     NULL,
  209.                     &hMyCsp,
  210.                     &dwDisp);
  211.     if (ERROR_SUCCESS != nStatus)
  212.     {
  213.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  214.         goto ErrorExit;
  215.     }
  216.     nStatus = RegCloseKey(hProviders);
  217.     hProviders = NULL;
  218.     if (ERROR_SUCCESS != nStatus)
  219.     {
  220.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  221.         goto ErrorExit;
  222.     }
  223.     //
  224.     // Install the trivial registry values.
  225.     //
  226.     nStatus = RegSetValueEx(
  227.                     hMyCsp,
  228.                     TEXT("Image Path"),
  229.                     0,
  230.                     REG_SZ,
  231.                     (LPBYTE)szModulePath,
  232.                     (_tcslen(szModulePath) + 1) * sizeof(TCHAR));
  233.     if (ERROR_SUCCESS != nStatus)
  234.     {
  235.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  236.         goto ErrorExit;
  237.     }
  238.     nStatus = RegSetValueEx(
  239.                     hMyCsp,
  240.                     TEXT("Type"),
  241.                     0,
  242.                     REG_DWORD,
  243.                     (LPBYTE)&l_dwCspType,
  244.                     sizeof(DWORD));
  245.     if (ERROR_SUCCESS != nStatus)
  246.     {
  247.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  248.         goto ErrorExit;
  249.     }
  250.     //
  251.     // See if we're self-signed.  On NT5, CSP images can carry their own
  252.     // signatures.
  253.     //
  254.     hSigResource = FindResource(
  255.                         hThisDll,
  256.                         MAKEINTRESOURCE(CRYPT_SIG_RESOURCE_NUMBER),
  257.                         RT_RCDATA);
  258.     //
  259.     // Install the file signature.
  260.     //
  261.     ZeroMemory(&osVer, sizeof(OSVERSIONINFO));
  262.     osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  263.     fStatus = GetVersionEx(&osVer);
  264.     // ?BUGBUG? -- This works on Windows Millenium, too.
  265.     if (fStatus
  266.         && (VER_PLATFORM_WIN32_NT == osVer.dwPlatformId)
  267.         && (5 <= osVer.dwMajorVersion)
  268.         && (NULL != hSigResource))
  269.     {
  270.         //
  271.         // Signature in file flag is sufficient.
  272.         //
  273.         dwStatus = 0;
  274.         nStatus = RegSetValueEx(
  275.                         hMyCsp,
  276.                         TEXT("SigInFile"),
  277.                         0,
  278.                         REG_DWORD,
  279.                         (LPBYTE)&dwStatus,
  280.                         sizeof(DWORD));
  281.         if (ERROR_SUCCESS != nStatus)
  282.         {
  283.             hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  284.             goto ErrorExit;
  285.         }
  286.     }
  287.     else
  288.     {
  289.         //
  290.         // We have to install a signature entry.
  291.         // Try various techniques until one works.
  292.         //
  293.         for (dwIndex = 0; !fSignatureFound; dwIndex += 1)
  294.         {
  295.             switch (dwIndex)
  296.             {
  297.             //
  298.             // Look for an external *.sig file and load that into the registry.
  299.             //
  300.             case 0:
  301.                 _tcscpy(szFileExt, TEXT("sig"));
  302.                 hSigFile = CreateFile(
  303.                                 szModulePath,
  304.                                 GENERIC_READ,
  305.                                 FILE_SHARE_READ,
  306.                                 NULL,
  307.                                 OPEN_EXISTING,
  308.                                 FILE_ATTRIBUTE_NORMAL,
  309.                                 NULL);
  310.                 if (INVALID_HANDLE_VALUE == hSigFile)
  311.                     continue;
  312.                 dwSigLength = GetFileSize(hSigFile, NULL);
  313.                 if ((dwSigLength > sizeof(pbSignature))
  314.                     || (dwSigLength < 72))      // Accept a 512-bit signature
  315.                 {
  316.                     hReturnStatus = NTE_BAD_SIGNATURE;
  317.                     goto ErrorExit;
  318.                 }
  319.                 fStatus = ReadFile(
  320.                                 hSigFile,
  321.                                 pbSignature,
  322.                                 sizeof(pbSignature),
  323.                                 &dwSigLength,
  324.                                 NULL);
  325.                 if (!fStatus)
  326.                 {
  327.                     hReturnStatus = HRESULT_FROM_WIN32(GetLastError());
  328.                     goto ErrorExit;
  329.                 }
  330.                 fStatus = CloseHandle(hSigFile);
  331.                 hSigFile = NULL;
  332.                 if (!fStatus)
  333.                 {
  334.                     hReturnStatus = HRESULT_FROM_WIN32(GetLastError());
  335.                     goto ErrorExit;
  336.                 }
  337.                 fSignatureFound = TRUE;
  338.                 break;
  339.             //
  340.             // Other cases may be added in the future.
  341.             //
  342.             default:
  343.                 hReturnStatus = NTE_BAD_SIGNATURE;
  344.                 goto ErrorExit;
  345.             }
  346.             if (fSignatureFound)
  347.             {
  348.                 for (dwIndex = 0; dwIndex < dwSigLength; dwIndex += 1)
  349.                 {
  350.                     if (0 != pbSignature[dwIndex])
  351.                         break;
  352.                 }
  353.                 if (dwIndex >= dwSigLength)
  354.                     fSignatureFound = FALSE;
  355.             }
  356.         }
  357.         //
  358.         // We've found a signature somewhere!  Install it.
  359.         //
  360.         nStatus = RegSetValueEx(
  361.                         hMyCsp,
  362.                         TEXT("Signature"),
  363.                         0,
  364.                         REG_BINARY,
  365.                         pbSignature,
  366.                         dwSigLength);
  367.         if (ERROR_SUCCESS != nStatus)
  368.         {
  369.             hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  370.             goto ErrorExit;
  371.         }
  372.     }
  373.     nStatus = RegCloseKey(hMyCsp);
  374.     hMyCsp = NULL;
  375.     if (ERROR_SUCCESS != nStatus)
  376.     {
  377.         hReturnStatus = HRESULT_FROM_WIN32(nStatus);
  378.         goto ErrorExit;
  379.     }
  380.     return hReturnStatus;
  381.     //
  382.     // An error was detected.  Clean up any outstanding resources and
  383.     // return the error.
  384.     //
  385.     ErrorExit:
  386.     if (NULL != hVendor)
  387.         RegCloseKey(hVendor);
  388.     if (INVALID_HANDLE_VALUE != hSigFile)
  389.         CloseHandle(hSigFile);
  390.     if (NULL != hMyCsp)
  391.         RegCloseKey(hMyCsp);
  392.     if (NULL != hProviders)
  393.         RegCloseKey(hProviders);
  394.     DllUnregisterServer();
  395.     return hReturnStatus;
  396. }
  397. /*
  398. %--------------------------------------------------------------------------
  399. % GetInstanceHandle
  400. %
  401. %---------------------------------------------------------------------------
  402. */
  403. extern "C" HINSTANCE g_hModule;
  404. static HINSTANCE
  405. GetInstanceHandle(
  406.     void)
  407. {
  408. #ifdef _AFXDLL
  409.     return AfxGetInstanceHandle();
  410. #else
  411.     //  ?vendor?
  412.     // Make sure this returns your DLL instance handle.
  413.     return g_hModule;
  414. #endif
  415. }