设为首页 加入收藏

TOP

C++ 验证微软数字签名(一)
2013-04-24 12:13:49 】 浏览:1203
Tags:  验证 微软 数字签名

  C++(www.cppentry.com) 验证微软数字签名

  BOOL CheckFileTrust( LPCWSTR lpFileName )

  {

  BOOL bRet = FALSE;

  WINTRUST_DATA wd = { 0 };

  WINTRUST_FILE_INFO wfi = { 0 };

  WINTRUST_CATALOG_INFO wci = { 0 };

  CATALOG_INFO ci = { 0 };

  HCATADMIN hCatAdmin = NULL;

  if ( !CryptCATAdminAcquireContext( &hCatAdmin, NULL, 0 ) )

  {

  return FALSE;

  }

  HANDLE hFile = CreateFileW( lpFileName, GENERIC_READ, FILE_SHARE_READ,

  NULL, OPEN_EXISTING, 0, NULL );

  if ( INVALID_HANDLE_VALUE == hFile )

  {

  CryptCATAdminReleaseContext( hCatAdmin, 0 );

  return FALSE;

  }

  DWORD dwCnt = 100;

  BYTE byHash[100];

  CryptCATAdminCalcHashFromFileHandle( hFile, &dwCnt, byHash, 0 );

  CloseHandle( hFile );

  LPWSTR pszMemberTag = new WCHAR[dwCnt * 2 + 1];

  for ( DWORD dw = 0; dw < dwCnt; ++dw )

  {

  wsprintfW( &pszMemberTag[dw * 2], L"%02X", byHash[dw] );

  }

  HCATINFO hCatInfo = CryptCATAdminEnumCatalogFromHash( hCatAdmin,

  byHash, dwCnt, 0, NULL );

  if ( NULL == hCatInfo )

  {

  wfi.cbStruct       = sizeof( WINTRUST_FILE_INFO );

  wfi.pcwszFilePath  = lpFileName;

  wfi.hFile          = NULL;

  wfi.pgKnownSubject = NULL;

  wd.cbStruct            = sizeof( WINTRUST_DATA );

  wd.dwUnionChoice       = WTD_CHOICE_FILE;

  wd.pFile               = &wfi;

  wd.dwUIChoice          = WTD_UI_NONE;

  wd.fdwRevocationChecks = WTD_REVOKE_NONE;

  wd.dwStateAction       = WTD_STATEACTION_IGNORE;

  wd.dwProvFlags         = WTD_SAFER_FLAG;

  wd.hWVTStateData       = NULL;

  wd.pwszURLReference    = NULL;

  }

  else

  {

  CryptCATCatalogInfoFromContext( hCatInfo, &ci, 0 );

  wci.cbStruct             = sizeof( WINTRUST_CATALOG_INFO );

  wci.pcwszCatalogFilePath = ci.wszCatalogFile;

  wci.pcwszMemberFilePath  = lpFileName;

  wci.pcwszMemberTag       = pszMemberTag;

  wd.cbStruct            = sizeof( WINTRUST_DATA );

  wd.dwUnionChoice       = WTD_CHOICE_CATALOG;

  wd.pCatalog            = &wci;

  wd.dwUIChoice          = WTD_UI_NONE;

  wd.fdwRevocationChecks = WTD_STATEACTION_VERIFY;

  wd.dwProvFlags         = 0;

  wd.hWVTStateData       = NULL;

  wd.pwszURLReference    = NULL;

  }

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇?й????? 下一篇JNI对HAL的封装

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目