Comprobar que el sistema admite un método de síntesis
En este tema se describe cómo comprobar que el sistema admite un método de resumen.
Las firmas digitales XPS usan Crypto API, que proporciona métodos para comprobar que el sistema admite un método de síntesis específico. Para usar la funciónCryptXmlEnumAlgorithmInfode la Crypto API para enumerar los métodos de resumen admitidos por el sistema, el autor de la llamada debe proporcionar un método de devolución de llamada y una estructura de datos. La función CryptXmlEnumAlgorithmInfo devuelve los datos de enumeración al autor de la llamada mediante el método de devolución de llamada.
La estructura de datos usada en este ejemplo se muestra en el ejemplo de código siguiente y contiene los siguientes campos:
Campo | Descripción |
---|---|
userDigestAlgorithm | Un campoLPWSTR que apunta a la cadena que contiene el URI del algoritmo de resumen que se va a comprobar. |
userDigestAlgorithmSupported | Un valorbooleano que indica si el certificado admite el algoritmo de síntesis. |
struct DigestMethodData
{
LPCWSTR userDigestAlgorithm;
BOOL userDigestAlgorithmSupported;
};
El método Crypto API que enumera los métodos de resumen usa un método de devolución de llamada para devolver datos al autor de la llamada. CryptXmlEnumAlgorithmInfo enumera los métodos de resumen admitidos por el sistema y llama al método de devolución de llamada para cada método de resumen que enumera, hasta que el método de devolución de llamada devuelve FALSE o hasta que se enumeran todos los métodos de resumen admitidos por el sistema. El método de devolución de llamada de este ejemplo compara el método de resumen que pasa CryptXmlEnumAlgorithmInfo con el método de síntesis proporcionado por el método de llamada.
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;
}
}
El ejemplo de código siguiente encapsula la funcionalidad de validación en un único método, que devuelve un valor booleano que indica si el sistema admite el método de síntesis.
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;
}
Temas relacionados
-
Pasos siguientes
-
Se usa en este ejemplo
-
CryptXmlEnumAlgorithmInfo
-
Para obtener más información