Sdílet prostřednictvím


Ověřit, že systém podporuje metodu digestu

Toto téma popisuje, jak ověřit, že systém podporuje metodu digest.

Digitální podpisy XPS používají rozhraní Crypto API, které poskytuje metody pro ověření, že systém podporuje konkrétní metodu digestu. Chcete-li použít funkci CryptXmlEnumAlgorithmInfo rozhraní Crypto API ke zjištění metod shrnutí podporovaných systémem, volající musí poskytnout zpětnou volací metodu a datovou strukturu. CryptXmlEnumAlgorithmInfo funkce předává data výčtu zpět volajícímu metodou zpětného volání.

Datová struktura použitá v tomto příkladu je znázorněna v následujícím příkladu kódu a obsahuje následující pole:

Pole Popis
uživatelskýDigestAlgoritmus Pole LPWSTR, které odkazuje na řetězec obsahující URI digestního algoritmu, který se má zkontrolovat.
podporovaný algoritmus shrnutí uživatele Logická hodnota označující, zda je algoritmus digest podporován certifikátem.

 

struct DigestMethodData
{
    LPCWSTR userDigestAlgorithm; 
    BOOL    userDigestAlgorithmSupported;
};

Kryptografická metoda rozhraní API, která vyčísluje metody hash, používá metodu zpětného volání k vrácení dat volajícímu. CryptXmlEnumAlgorithmInfo vyjmenovává metody souhrnu, které jsou podporovány systémem, a volá funkci zpětného volání pro každou metodu souhrnu, kterou vyjmenuje, dokud funkce zpětného volání nevrátí FALSE nebo dokud nejsou vyjmenovány všechny metody souhrnu podporované systémem. Metoda zpětného volání v tomto příkladu porovnává metodu digest předávanou metodou CryptXmlEnumAlgorithmInfo s metodou digest poskytovanou volající metodou.

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;
    }
}

Následující ukázka kódu zabalí funkci ověření do jedné metody, která vrátí logickou hodnotu, která označuje, zda systém podporuje metodu digest.

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;
}

další kroky

načtení certifikátu ze souboru

Ověřte, zda certifikát podporuje způsob podepisování

Vložit řetězce certifikátů do dokumentu

použitá v tomto příkladu

CryptXmlEnumAlgorithmInfo

Další informace

rozhraní kryptografie API

Kryptografické funkce

Chyby rozhraní API digitálního podpisu XPS

chyby dokumentu XPS

specifikace papíru XML