Retrieving Thumbprint same as the thumbprint seen using the DigitalSignature tab in properties

812 Views Asked by At

i have been searching a lot windows api for getting thumbprint of digital Certificate. I tried to use CryptHashCertificate() However, my thumbprint doesn't seem to match the thumbprint seen using the DigitalSignature tab in properties. After that I tried OpenSSL but it requires 'pem' file as input. And My input will be exe, dll, msi. Finally I got the solution from X509Certificate2 but as it from .Net it will have dependency. So my question Is there any way to get thumbprint from windows libraries like wincrypt? Edit: How I used CryptHashCertificate()-

 WCHAR szFileName[MAX_PATH]; 
 _swprintf(szFileName,_T("C:\\vsgraphicsremoteengine.exe"));
HCERTSTORE hStore = NULL;
HCRYPTMSG hMsg = NULL; 
PCCERT_CONTEXT pCertContext = NULL;
BOOL fResult;   
DWORD dwEncoding, dwContentType, dwFormatType;
PCMSG_SIGNER_INFO pSignerInfo = NULL;
PCMSG_SIGNER_INFO pCounterSignerInfo = NULL;
DWORD dwSignerInfo;
CERT_INFO CertInfo;     
SPROG_PUBLISHERINFO ProgPubInfo;
SYSTEMTIME st;

ZeroMemory(&ProgPubInfo, sizeof(ProgPubInfo));
__try
{      

    // Get message handle and store handle from the signed file.
    fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
                               szFileName,
                               CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
                               CERT_QUERY_FORMAT_FLAG_BINARY,
                               0,
                               &dwEncoding,
                               &dwContentType,
                               &dwFormatType,
                               &hStore,
                               &hMsg,
                               NULL);
    if (!fResult)
    {
        _tprintf(_T("CryptQueryObject failed with %x\n"), GetLastError());
        __leave;
    }

    // Get signer information size.
    fResult = CryptMsgGetParam(hMsg, 
                               CMSG_SIGNER_INFO_PARAM, 
                               0, 
                               NULL, 
                               &dwSignerInfo);
    if (!fResult)
    {
        _tprintf(_T("CryptMsgGetParam failed with %x\n"), GetLastError());
        __leave;
    }

    // Allocate memory for signer information.
    pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo);
    if (!pSignerInfo)
    {
        _tprintf(_T("Unable to allocate memory for Signer Info.\n"));
        __leave;
    }

    // Get Signer Information.
    fResult = CryptMsgGetParam(hMsg, 
                               CMSG_SIGNER_INFO_PARAM, 
                               0, 
                               (PVOID)pSignerInfo, 
                               &dwSignerInfo);
    if (!fResult)
    {
        _tprintf(_T("CryptMsgGetParam failed with %x\n"), GetLastError());
        __leave;
    }

    // Get program name and publisher information from 
    // signer info structure.
    if (GetProgAndPublisherInfo(pSignerInfo, &ProgPubInfo))
    {
        if (ProgPubInfo.lpszProgramName != NULL)
        {
            wprintf(L"Program Name : %s\n",
                ProgPubInfo.lpszProgramName);
        }

        if (ProgPubInfo.lpszPublisherLink != NULL)
        {
            wprintf(L"Publisher Link : %s\n",
                ProgPubInfo.lpszPublisherLink);
        }

        if (ProgPubInfo.lpszMoreInfoLink != NULL)
        {
            wprintf(L"MoreInfo Link : %s\n",
                ProgPubInfo.lpszMoreInfoLink);
        }
    }

    _tprintf(_T("\n"));

    // Search for the signer certificate in the temporary 
    // certificate store.
    CertInfo.Issuer = pSignerInfo->Issuer;
    CertInfo.SerialNumber = pSignerInfo->SerialNumber;

    pCertContext = CertFindCertificateInStore(hStore,
                                              ENCODING,
                                              0,
                                              CERT_FIND_SUBJECT_CERT,
                                              (PVOID)&CertInfo,
                                              NULL);
    if (!pCertContext)
    {
        _tprintf(_T("CertFindCertificateInStore failed with %x\n"),
            GetLastError());
        __leave;
    }

    // Print Signer certificate information.
    _tprintf(_T("Signer Certificate:\n\n"));        
    PrintCertificateInfo(pCertContext);
    _tprintf(_T("\n"));

    // Get the timestamp certificate signerinfo structure.
    if (GetTimeStampSignerInfo(pSignerInfo, &pCounterSignerInfo))
    {
        // Search for Timestamp certificate in the temporary
        // certificate store.
        CertInfo.Issuer = pCounterSignerInfo->Issuer;
        CertInfo.SerialNumber = pCounterSignerInfo->SerialNumber;

        pCertContext = CertFindCertificateInStore(hStore,
                                            ENCODING,
                                            0,
                                            CERT_FIND_SUBJECT_CERT,
                                            (PVOID)&CertInfo,
                                            NULL);
        if (!pCertContext)
        {
            _tprintf(_T("CertFindCertificateInStore failed with %x\n"),
                GetLastError());
            __leave;
        }            
      DWORD cbData;
      BYTE  *pbData;
      if(CryptHashCertificate(NULL, CALG_SHA1, 0, pCertContext->pbCertEncoded,
                                pCertContext->cbCertEncoded, NULL, &cbData))
      {
           _tprintf(_T("The function succeeded.\n"));
      }
      else
      {
           _tprintf(_T("The function Failed.\n"));
      }
        pbData = (BYTE*)malloc(cbData);
        CryptHashCertificate(NULL, CALG_SHA1, 0, pCertContext->pbCertEncoded,
                                pCertContext->cbCertEncoded, pbData, &cbData);
        _tprintf(_T("ThumbPrint:"));
         for (DWORD n = 0; n < cbData; n++)
         {
                _tprintf(_T("%02x "), pbData[n]);
        }

Image for thumbprint on windows 7

0

There are 0 best solutions below