Überprüfen, ob das System eine Digestmethode unterstützt

In diesem Thema wird beschrieben, wie Sie überprüfen, ob das System eine Digestmethode unterstützt.

XPS-Digitalsignaturen verwenden die Crypto-API, die Methoden bereitstellt, um zu überprüfen, ob das System eine bestimmte Digestmethode unterstützt. Um die CryptXmlEnumAlgorithmInfo-Funktion der Crypto-API zum Aufzählen der Digestmethoden zu verwenden, die vom System unterstützt werden, muss der Aufrufer eine Rückrufmethode und eine Datenstruktur bereitstellen. Die CryptXmlEnumAlgorithmInfo-Funktion gibt die Enumerationsdaten über die Rückrufmethode an den Aufrufer zurück.

Die in diesem Beispiel verwendete Datenstruktur wird im folgenden Codebeispiel gezeigt und enthält die folgenden Felder:

Feld Beschreibung
userDigestAlgorithm Ein LPWSTR-Feld, das auf die Zeichenfolge verweist, die den URI des zu überprüfenden Digestalgorithmus enthält.
userDigestAlgorithmSupported Ein boolescher Wert, der angibt, ob der Digestalgorithmus vom Zertifikat unterstützt wird.

 

struct DigestMethodData
{
    LPCWSTR userDigestAlgorithm; 
    BOOL    userDigestAlgorithmSupported;
};

Die Crypto-API-Methode, die die Digestmethoden aufzählt, verwendet eine Rückrufmethode, um Daten an den Aufrufer zurückzugeben. CryptXmlEnumAlgorithmInfo zählt die Digestmethoden auf, die vom System unterstützt werden, und ruft die Rückrufmethode für jede aufgezählte Digestmethode auf, bis die Rückrufmethode FALSE zurückgibt oder alle vom System unterstützten Digestmethoden aufgezählt werden. Die Rückrufmethode in diesem Beispiel vergleicht die Digestmethode, die von CryptXmlEnumAlgorithmInfo übergeben wird, mit der Digestmethode, die von der aufrufenden Methode bereitgestellt wird.

BOOL WINAPI 
EnumDigestMethodCallback (
    __in   const CRYPT_XML_ALGORITHM_INFO *certMethodInfo,
    __inout_opt  void                     *userArg
)
{
    // MAX_ALG_ID_LEN is used to set the maximum length of the 
    // algorithm URI in the string comparison. The URI is not 
    // likely to be longer than 128 characters so a fixed-size
    // buffer is used in this example.
    // To make this function more robust, consider
    // setting this value dynamically.
    static const  size_t MAX_ALG_ID_LEN = 128;
    DigestMethodData   *certificateAlgorithmData = 
        (DigestMethodData*)userArg;

    if (NULL != userArg) {
        // Assign user data to local data structure
        certificateAlgorithmData = (DigestMethodData*)userArg;
    } else {
        // Unable to continue this enumeration without 
        //  data from calling method.
        return FALSE;
    }
    
    // For each algorithm in the enumeration, check to see 
    //  if the URI of the current supported algorithm matches 
    //  the URI passed in userArg.
    int cmpResult = 0;
    cmpResult = wcsncmp( 
        certMethodInfo->wszAlgorithmURI, 
        certificateAlgorithmData->userDigestAlgorithm, 
        MAX_ALG_ID_LEN );

    if ( 0 == cmpResult )
    {
        // This is a match...
        //  set supported value to true
        certificateAlgorithmData->userDigestAlgorithmSupported = TRUE;
        //  ...and return FALSE to stop any further enumeration
        return FALSE;
    } 
    else
    {
        // no match was found
        // return TRUE to continue enumeration
        return TRUE;
    }
}

Im folgenden Codebeispiel wird die Überprüfungsfunktionalität in einer einzelnen Methode umschlossen, die einen booleschen Wert zurückgibt, der angibt, ob das System die Digestmethode unterstützt.

BOOL 
SupportsDigestAlgorithm (
    __in LPCWSTR digestMethodToCheck
)
{
    HRESULT  hr = S_OK;

    // Initialize the structure that will hold information about the 
    //  digest method to check
    DigestMethodData  certificateAlgorithmData;

    certificateAlgorithmData.userDigestAlgorithmSupported = FALSE;
    certificateAlgorithmData.userDigestAlgorithm = digestMethodToCheck;

    // Enumerate the algorithms that are supported on the system, 
    //  the callback method compares each supported algorithm to the one
    //  passed in digestMethodToCheck and returns true in the
    //  certificateAlgorithmData.userDigestAlgorithmSupported field if
    //  the provided digest algorithm is supported by system.
    //
    // Note that CRYPT_XML_GROUP_ID_HASH is set to enumerate 
    //  digest methods
    hr = CryptXmlEnumAlgorithmInfo(
        CRYPT_XML_GROUP_ID_HASH,       // NOTE: CRYPT_XML_GROUP_ID_HASH
        CRYPT_XML_FLAG_DISABLE_EXTENSIONS,
        (void*)&certificateAlgorithmData,
        EnumDigestMethodCallback);

    return certificateAlgorithmData.userDigestAlgorithmSupported;
}

Nächste Schritte

Laden eines Zertifikats aus einer Datei

Überprüfen, ob ein Zertifikat eine Signaturmethode unterstützt

Einbetten von Zertifikatketten in ein Dokument

In diesem Beispiel verwendet

CryptXmlEnumAlgorithmInfo

Weitere Informationen

Kryptografie-API

Kryptografiefunktionen

XPS-Digitalsignatur-API-Fehler

XPS-Dokumentfehler

XML Paper Specification