Public Function SignVerify(
sFilePath As String, _
ByVal Flags As FLAGS_SignVerify, _
SignResult As SignResult_TYPE) As Boolean
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Providers\Trust
CryptCATAdminAcquireContext2 hCatAdmin, VarPtr(DRIVER_ACTION_VERIFY), StrPtr(BCRYPT_SHA256_ALGORITHM), 0&, 0&
RedirResult = ToggleWow64FSRedirection(False, sFilePath)
hFile = CreateFile(StrPtr(sFilePath), GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
If RedirResult Then ToggleWow64FSRedirection True
CryptCATAdminCalcHashFromFileHandle2(hCatAdmin, hFile, HashSize, aFileHash(0), 0&)
CatalogContext = CryptCATAdminEnumCatalogFromHash(hCatAdmin, aFileHash(0), HashSize, 0&, ByVal 0&)
If CryptCATCatalogInfoFromContext(CatalogContext, CatalogInfo, 0&) Then
где: WINTRUST_DATA -> dwUnionChoice устанавливаем как WTD_CHOICE_FILE (для проверки внутренней подписи), или WTD_CHOICE_CATALOG (для внешней).
в зависимости от того, нужно или нет получать hWVTStateData, откуда мы сможем извлечь инфу о цепочке сертификатов в подписи.WINTRUST_DATA -> dwStateAction (WTD_STATEACTION_VERIFY или WTD_STATEACTION_IGNORE)
Здесь устанавливаются специфические флаги проверки, такие как:WINTRUST_DATA -> dwProvFlags
WTD_SAFER_FLAG – тихий режим
WTD_REVOCATION_CHECK_CHAIN – необходимость проверки на отзыв (управляется флагом SV_CheckRevocation)
WTD_LIFETIME_SIGNING_FLAG – разрешение проходить валидацию с просроченным сертификатам даже без подписи сервера времени (управляется флагом SV_AllowExpired) (подробнее см. раздел 1.3. Теория, п.3).
ReturnVal = WinVerifyTrust(INVALID_HANDLE_VALUE, ActionGuid, VarPtr(WintrustData))
SignVerify "", SV_CacheFree, SignResult
pProvData = WTHelperProvDataFromStateData(StateData)
pCPSigner = WTHelperGetProvSignerFromChain(pProvData, idxSign, 0&, 0&)
memcpy MsgSigner, ByVal CPSigner(0).psSigner, LenB(MsgSigner)
.Algorithm = StringFromPtrA(MsgSigner.HashAlgorithm.pszObjId)
ReDim CPCERT(CPSigner(idxSign).csCertChain - 1)
GetMem4 ByVal ArrPtr(CPCERT()), lpSA
GetMem4 ByVal lpSA + 12, lpOldPt
GetMem4 CPSigner(idxSign).pasCertChain, ByVal lpSA + 12
For i = 0 To CPSigner(idxSign).csCertChain - 1
Signature(idxSign).Certificate(i) = CertDuplicateCertificateContext(CPCERT(i).pCert)
Next
idxRoot = UBound(Signature(0).Certificate)
pCertificate = Signature(0).Certificate(idxRoot)
idxSigner = 0
pCertificate = Signature(0).Certificate(idxSigner)
CertGetCertificateContextProperty (pCertContext, ID, buf(0), bufSize)
memcpy Certificate, ByVal pCertificate, LenB(Certificate)
pCertInfo = Certificate.pCertInfo
memcpy out_CertInfo, ByVal pCertInfo, LenB(out_CertInfo)
CERT_INFO -> SignatureAlgorithm -> pszObjId
CertNameToStr X509_ASN_ENCODING Or PKCS_7_ASN_ENCODING, VarPtr(Blob), CERT_X500_NAME_STR, StrPtr(sName), BufferSize
Детальнее см. раздел 1.4.5.C=RU, PostalCode=115093, S=Moscow, L=Moscow, STREET="Street Serpukhovsko B, 44", O=RIVER SOLUTIONS, CN=RIVER SOLUTIONS
{
byte TypeData – тип данных
byte cbData – размер данных в байтах
byte[] RawData – сырые данные
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?