Überprüfen der digitalen Signatur einer Datei unter Windows.

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Überprüfen der digitalen Signatur einer Datei unter Windows.

Beitrag von BartSimpson »

Code: Alles auswählen

bool CT_API_Manipulationsschutz::BibliothekOK(const QString &datei)
{
#ifndef QT_NO_DEBUG
	DWORD Fehlercode;
#endif
	QString Datei=datei;
	Datei.replace("/","\\");
	
	WINTRUST_FILE_INFO Dateiinformationen;
	//alle Felder auf 0 setzen.
	memset(&Dateiinformationen,0,sizeof(Dateiinformationen));
	Dateiinformationen.cbStruct=sizeof(WINTRUST_FILE_INFO);
	Dateiinformationen.pcwszFilePath=(LPCWSTR)Datei.utf16();
	Dateiinformationen.hFile=NULL;
	Dateiinformationen.pgKnownSubject=NULL;

	GUID ArtDerPruefung=WINTRUST_ACTION_GENERIC_VERIFY_V2;
	WINTRUST_DATA ParameterFuerDieUeberpruefung;
	memset(&ParameterFuerDieUeberpruefung,0,sizeof(ParameterFuerDieUeberpruefung));
	ParameterFuerDieUeberpruefung.cbStruct=sizeof(ParameterFuerDieUeberpruefung);

	ParameterFuerDieUeberpruefung.pPolicyCallbackData=NULL;
	ParameterFuerDieUeberpruefung.pSIPClientData=NULL;
	//Kein Dialog anzeigen
	ParameterFuerDieUeberpruefung.dwUIChoice=WTD_UI_NONE;
	//Auf zurückgezogne Zertifikate testen
	ParameterFuerDieUeberpruefung.fdwRevocationChecks=WTD_REVOKE_WHOLECHAIN;
	//ParameterFuerDieUeberpruefung.fdwRevocationChecks=WTD_REVOKE_NONE;
	//Zert ist eingebettet.
	ParameterFuerDieUeberpruefung.dwUnionChoice=WTD_CHOICE_FILE;
	ParameterFuerDieUeberpruefung.dwStateAction=WTD_STATEACTION_IGNORE;
	ParameterFuerDieUeberpruefung.hWVTStateData=NULL;
	ParameterFuerDieUeberpruefung.pwszURLReference=NULL;
	ParameterFuerDieUeberpruefung.pwszURLReference=NULL;
	ParameterFuerDieUeberpruefung.dwUIContext=WTD_UICONTEXT_EXECUTE;
	//Welche Datei??
	ParameterFuerDieUeberpruefung.pFile=&Dateiinformationen;
	LONG Ergebnis=WinVerifyTrust(NULL,&ArtDerPruefung,&ParameterFuerDieUeberpruefung);
	//Ab an die Auswertung
	switch(Ergebnis)
	{
		case ERROR_SUCCESS:
#ifndef QT_NO_DEBUG
							qDebug("Signatur der Datei %s gültig.",qPrintable(Datei));
#endif
							return true;
							break;
		case TRUST_E_NOSIGNATURE:
#ifndef QT_NO_DEBUG
							Fehlercode=GetLastError();
							if(TRUST_E_NOSIGNATURE == Fehlercode || TRUST_E_SUBJECT_FORM_UNKNOWN == Fehlercode || TRUST_E_PROVIDER_UNKNOWN == Fehlercode)
								qDebug("Die Datei %s ist nicht signiert.",qPrintable(Datei));
							else
								qDebug("Die Signatur der Datei %s ist ungültig",qPrintable(Datei));
#endif
							return false;
							break;
		case TRUST_E_EXPLICIT_DISTRUST:
#ifndef QT_NO_DEBUG
							qDebug("Die Signatur von %s ist vorhanden, aber das Zertifikat wurde gesperrt.",qPrintable(Datei));
#endif
							return false;
							break;
		case TRUST_E_SUBJECT_NOT_TRUSTED:
#ifndef QT_NO_DEBUG
							qDebug("In %s ist eine Signatur vorhanden, aber dieser wird nicht vertraut.",qPrintable(Datei));
#endif
							return false;
							break;
		case CRYPT_E_SECURITY_SETTINGS:
#ifndef QT_NO_DEBUG
							qDebug("Dem Herrausgeber des Zertifikates für %s wird nicht vertraut oder der Zeitstemple ist ungültig.",qPrintable(Datei));
#endif
							return false;
							break;
	}
#ifndef QT_NO_DEBUG
	qDebug("Die Datei %s konnte aus unbekannten Gründen nicht verifiziert werden.",qPrintable(Datei));
#endif
	return false;
}
Benötige Header:
#include <Windows.h>
#include <Wintrust.h>
#include <Softpub.h>
Benötige Bibliotheken:
Wintrust.lib
Antworten