/
githubmirror
/
xmlsec
Обзор
Документация
Войти
/
githubmirror
/
xmlsec
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/mscrypto/digests.c
728 строк
31 KB
lsh123
(xmlsec-core) Added xmlSecMemEqual to compare two buffers in constant time and upgraded the code to use it (#1191)
30 май 2026, 05:26
Не верифицирован
30 май 2026, 05:26
0fb64f6
Код
Авторство
О чём код?
/** * XML Security Library (http://www.aleksey.com/xmlsec). * * This is free software; see the Copyright file in the source distribution for precise wording. * * Copyright (C) 2003-2026 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved. * Copyright (C) 2003 Cordys R&D BV, All rights reserved. * Copyright (c) 2005-2006 Cryptocom LTD (http://www.cryptocom.ru). */ /** * @addtogroup xmlsec_mscrypto_crypto * @brief Digests transforms implementation for MSCrypto. */ #include "globals.h" #include <string.h> #ifndef XMLSEC_NO_GOST #include "csp_calg.h" #endif #include <xmlsec/xmlsec.h> #include <xmlsec/buffer.h> #include <xmlsec/keys.h> #include <xmlsec/transforms.h> #include <xmlsec/errors.h> #include <xmlsec/mscrypto/crypto.h> #include "private.h" #include "../cast_helpers.h" #define MSCRYPTO_MAX_HASH_SIZE 256 typedef struct _xmlSecMSCryptoDigestCtx xmlSecMSCryptoDigestCtx, *xmlSecMSCryptoDigestCtxPtr; struct _xmlSecMSCryptoDigestCtx { HCRYPTPROV provider; ALG_ID alg_id; const xmlSecMSCryptoProviderInfo * providers; HCRYPTHASH mscHash; unsigned char dgst[MSCRYPTO_MAX_HASH_SIZE]; xmlSecSize dgstSize; /* dgst size in bytes */ }; /****************************************************************************** * * MSCrypto Digest transforms * *****************************************************************************/ XMLSEC_TRANSFORM_DECLARE(MSCryptoDigest, xmlSecMSCryptoDigestCtx) #define xmlSecMSCryptoDigestSize XMLSEC_TRANSFORM_SIZE(MSCryptoDigest) static int xmlSecMSCryptoDigestInitialize (xmlSecTransformPtr transform); static void xmlSecMSCryptoDigestFinalize (xmlSecTransformPtr transform); static int xmlSecMSCryptoDigestVerify (xmlSecTransformPtr transform, const xmlSecByte* data, xmlSecSize dataSize, xmlSecTransformCtxPtr transformCtx); static int xmlSecMSCryptoDigestExecute (xmlSecTransformPtr transform, int last, xmlSecTransformCtxPtr transformCtx); static int xmlSecMSCryptoDigestCheckId (xmlSecTransformPtr transform); /* Ordered list of providers to search for algorithm implementation using * xmlSecMSCryptoFindProvider() function * * MUST END with { NULL, 0 } !!! */ #ifndef XMLSEC_NO_SHA1 static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Sha1[] = { { XMLSEC_CRYPTO_MS_ENH_RSA_AES_PROV, PROV_RSA_AES}, { XMLSEC_CRYPTO_MS_ENH_RSA_AES_PROV_PROTOTYPE, PROV_RSA_AES }, { MS_STRONG_PROV, PROV_RSA_FULL }, { MS_ENHANCED_PROV, PROV_RSA_FULL }, { MS_DEF_PROV, PROV_RSA_FULL }, { NULL, 0 } }; #endif /* XMLSEC_NO_SHA1*/ static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Sha2[] = { { XMLSEC_CRYPTO_MS_ENH_RSA_AES_PROV, PROV_RSA_AES}, { XMLSEC_CRYPTO_MS_ENH_RSA_AES_PROV_PROTOTYPE, PROV_RSA_AES }, { NULL, 0 } }; #ifndef XMLSEC_NO_MD5 static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Md5[] = { { MS_STRONG_PROV, PROV_RSA_FULL }, { MS_ENHANCED_PROV, PROV_RSA_FULL }, { MS_DEF_PROV, PROV_RSA_FULL }, { NULL, 0 } }; #endif /* XMLSEC_NO_MD5*/ #ifndef XMLSEC_NO_GOST static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Gost[] = { { MAGPRO_CSP, PROV_MAGPRO_GOST }, { CRYPTOPRO_CSP, PROV_CRYPTOPRO_GOST }, { NULL, 0 } }; #endif /* XMLSEC_NO_GOST*/ #ifndef XMLSEC_NO_GOST2012 static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Gost2012_256[] = { { CRYPTOPRO_CSP_256, PROV_GOST_2012_256 }, { NULL, 0 } }; static xmlSecMSCryptoProviderInfo xmlSecMSCryptoProviderInfo_Gost2012_512[] = { { CRYPTOPRO_CSP_512, PROV_GOST_2012_512 }, { NULL, 0 } }; #endif /* XMLSEC_NO_GOST2012*/ static int xmlSecMSCryptoDigestCheckId(xmlSecTransformPtr transform) { #ifndef XMLSEC_NO_MD5 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformMd5Id)) { return(1); } #endif /* XMLSEC_NO_MD5 */ #ifndef XMLSEC_NO_SHA1 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha1Id)) { return(1); } #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA256 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha256Id)) { return(1); } #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha384Id)) { return(1); } #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha512Id)) { return(1); } #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_GOST if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_94Id)) { return(1); } #endif /* XMLSEC_NO_GOST*/ #ifndef XMLSEC_NO_GOST2012 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_2012_256Id)) { return(1); } if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_2012_512Id)) { return(1); } #endif /* XMLSEC_NO_GOST2012*/ return(0); } static int xmlSecMSCryptoDigestInitialize(xmlSecTransformPtr transform) { xmlSecMSCryptoDigestCtxPtr ctx; xmlSecAssert2(xmlSecMSCryptoDigestCheckId(transform), -1); xmlSecAssert2(xmlSecTransformCheckSize(transform, xmlSecMSCryptoDigestSize), -1); ctx = xmlSecMSCryptoDigestGetCtx(transform); xmlSecAssert2(ctx != NULL, -1); /* initialize context */ memset(ctx, 0, sizeof(xmlSecMSCryptoDigestCtx)); #ifndef XMLSEC_NO_MD5 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformMd5Id)) { ctx->alg_id = CALG_MD5; ctx->providers = xmlSecMSCryptoProviderInfo_Md5; } else #endif /* XMLSEC_NO_MD5 */ #ifndef XMLSEC_NO_SHA1 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha1Id)) { ctx->alg_id = CALG_SHA1; ctx->providers = xmlSecMSCryptoProviderInfo_Sha1; } else #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA256 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha256Id)) { ctx->alg_id = CALG_SHA_256; ctx->providers = xmlSecMSCryptoProviderInfo_Sha2; } else #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha384Id)) { ctx->alg_id = CALG_SHA_384; ctx->providers = xmlSecMSCryptoProviderInfo_Sha2; } else #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformSha512Id)) { ctx->alg_id = CALG_SHA_512; ctx->providers = xmlSecMSCryptoProviderInfo_Sha2; } else #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_GOST if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_94Id)) { ctx->alg_id = CALG_MAGPRO_HASH_R3411_94; ctx->providers = xmlSecMSCryptoProviderInfo_Gost; } else #endif /* XMLSEC_NO_GOST*/ #ifndef XMLSEC_NO_GOST2012 if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_2012_256Id)) { ctx->alg_id = CALG_GR3411_2012_256; ctx->providers = xmlSecMSCryptoProviderInfo_Gost2012_256; } else if(xmlSecTransformCheckId(transform, xmlSecMSCryptoTransformGostR3411_2012_512Id)) { ctx->alg_id = CALG_GR3411_2012_512; ctx->providers = xmlSecMSCryptoProviderInfo_Gost2012_512; } else #endif /* XMLSEC_NO_GOST2012*/ { xmlSecInvalidTransfromError(transform) return(-1); } ctx->provider = xmlSecMSCryptoFindProvider(ctx->providers, NULL, CRYPT_VERIFYCONTEXT, TRUE); if(ctx->provider == 0) { xmlSecInternalError("xmlSecMSCryptoFindProvider", xmlSecTransformGetName(transform)); return(-1); } return(0); } static void xmlSecMSCryptoDigestFinalize(xmlSecTransformPtr transform) { xmlSecMSCryptoDigestCtxPtr ctx; xmlSecAssert(xmlSecMSCryptoDigestCheckId(transform)); xmlSecAssert(xmlSecTransformCheckSize(transform, xmlSecMSCryptoDigestSize)); ctx = xmlSecMSCryptoDigestGetCtx(transform); xmlSecAssert(ctx != NULL); if(ctx->mscHash != 0) { CryptDestroyHash(ctx->mscHash); } if(ctx->provider != 0) { CryptReleaseContext(ctx->provider, 0); } memset(ctx, 0, sizeof(xmlSecMSCryptoDigestCtx)); } static int xmlSecMSCryptoDigestVerify(xmlSecTransformPtr transform, const xmlSecByte* data, xmlSecSize dataSize, xmlSecTransformCtxPtr transformCtx) { xmlSecMSCryptoDigestCtxPtr ctx; int ret; xmlSecAssert2(xmlSecMSCryptoDigestCheckId(transform), -1); xmlSecAssert2(xmlSecTransformCheckSize(transform, xmlSecMSCryptoDigestSize), -1); xmlSecAssert2(transform->operation == xmlSecTransformOperationVerify, -1); xmlSecAssert2(transform->status == xmlSecTransformStatusFinished, -1); xmlSecAssert2(data != NULL, -1); xmlSecAssert2(transformCtx != NULL, -1); ctx = xmlSecMSCryptoDigestGetCtx(transform); xmlSecAssert2(ctx != NULL, -1); xmlSecAssert2(ctx->dgstSize > 0, -1); if(dataSize != ctx->dgstSize) { xmlSecInvalidSizeError("Digest", dataSize, ctx->dgstSize, xmlSecTransformGetName(transform)); transform->status = xmlSecTransformStatusFail; return(0); } ret = xmlSecMemEqual(ctx->dgst, data, ctx->dgstSize); if(ret < 0) { xmlSecInternalError("xmlSecMemEqual", xmlSecTransformGetName(transform)); return(-1); } if(ret == 0) { xmlSecInvalidDataError("data and digest do not match", xmlSecTransformGetName(transform)); transform->status = xmlSecTransformStatusFail; return(0); } transform->status = xmlSecTransformStatusOk; return(0); } static int xmlSecMSCryptoDigestExecute(xmlSecTransformPtr transform, int last, xmlSecTransformCtxPtr transformCtx) { xmlSecMSCryptoDigestCtxPtr ctx; xmlSecBufferPtr in, out; int ret; xmlSecAssert2(xmlSecMSCryptoDigestCheckId(transform), -1); xmlSecAssert2((transform->operation == xmlSecTransformOperationSign) || (transform->operation == xmlSecTransformOperationVerify), -1); xmlSecAssert2(xmlSecTransformCheckSize(transform, xmlSecMSCryptoDigestSize), -1); xmlSecAssert2(transformCtx != NULL, -1); in = &(transform->inBuf); xmlSecAssert2(in != NULL, -1); out = &(transform->outBuf); xmlSecAssert2(out != NULL, -1); ctx = xmlSecMSCryptoDigestGetCtx(transform); xmlSecAssert2(ctx != NULL, -1); if(transform->status == xmlSecTransformStatusNone) { ret = CryptCreateHash(ctx->provider, ctx->alg_id, 0, 0, &(ctx->mscHash)); if((ret == 0) || (ctx->mscHash == 0)) { xmlSecMSCryptoError("CryptCreateHash", xmlSecTransformGetName(transform)); return(-1); } transform->status = xmlSecTransformStatusWorking; } if (transform->status == xmlSecTransformStatusWorking) { xmlSecSize inSize; inSize = xmlSecBufferGetSize(in); if(inSize > 0) { DWORD dwInSize; XMLSEC_SAFE_CAST_SIZE_TO_ULONG(inSize, dwInSize, return(-1), xmlSecTransformGetName(transform)); ret = CryptHashData(ctx->mscHash, xmlSecBufferGetData(in), dwInSize, 0); if(ret == 0) { xmlSecMSCryptoError2("CryptHashData", xmlSecTransformGetName(transform), "size=" XMLSEC_SIZE_FMT, inSize); return(-1); } ret = xmlSecBufferRemoveHead(in, inSize); if(ret < 0) { xmlSecInternalError2("xmlSecBufferRemoveHead", xmlSecTransformGetName(transform), "size=" XMLSEC_SIZE_FMT, inSize); return(-1); } } if(last) { DWORD retLen = MSCRYPTO_MAX_HASH_SIZE; ret = CryptGetHashParam(ctx->mscHash, HP_HASHVAL, ctx->dgst, &retLen, 0); if (ret == 0) { xmlSecMSCryptoError("CryptGetHashParam(HP_HASHVAL)", xmlSecTransformGetName(transform)); return(-1); } xmlSecAssert2(retLen > 0, -1); XMLSEC_SAFE_CAST_ULONG_TO_SIZE(retLen, ctx->dgstSize, return(-1), xmlSecTransformGetName(transform)); /* copy result to output */ if(transform->operation == xmlSecTransformOperationSign) { ret = xmlSecBufferAppend(out, ctx->dgst, ctx->dgstSize); if(ret < 0) { xmlSecInternalError2("xmlSecBufferAppend", xmlSecTransformGetName(transform), "size=" XMLSEC_SIZE_FMT, ctx->dgstSize); return(-1); } } transform->status = xmlSecTransformStatusFinished; } } else if(transform->status == xmlSecTransformStatusFinished) { /* the only way we can get here is if there is no input */ xmlSecAssert2(xmlSecBufferGetSize(in) == 0, -1); } else { xmlSecInvalidTransfromStatusError(transform); return(-1); } return(0); } #ifndef XMLSEC_NO_MD5 /****************************************************************************** * * MD5 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoMd5Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameMd5, /* const xmlChar* name; */ xmlSecHrefMd5, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief SHA-1 digest transform klass. * @return pointer to SHA-1 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformMd5GetKlass(void) { return(&xmlSecMSCryptoMd5Klass); } #endif /* XMLSEC_NO_MD5 */ #ifndef XMLSEC_NO_SHA1 /****************************************************************************** * * SHA1 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoSha1Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameSha1, /* const xmlChar* name; */ xmlSecHrefSha1, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief SHA-1 digest transform klass. * @return pointer to SHA-1 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformSha1GetKlass(void) { return(&xmlSecMSCryptoSha1Klass); } #endif /* XMLSEC_NO_SHA1 */ #ifndef XMLSEC_NO_SHA256 /****************************************************************************** * * SHA256 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoSha256Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameSha256, /* const xmlChar* name; */ xmlSecHrefSha256, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief SHA-256 digest transform klass. * @return pointer to SHA-256 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformSha256GetKlass(void) { return(&xmlSecMSCryptoSha256Klass); } #endif /* XMLSEC_NO_SHA256 */ #ifndef XMLSEC_NO_SHA384 /****************************************************************************** * * SHA384 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoSha384Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameSha384, /* const xmlChar* name; */ xmlSecHrefSha384, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief SHA-384 digest transform klass. * @return pointer to SHA-384 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformSha384GetKlass(void) { return(&xmlSecMSCryptoSha384Klass); } #endif /* XMLSEC_NO_SHA384 */ #ifndef XMLSEC_NO_SHA512 /****************************************************************************** * * SHA512 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoSha512Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameSha512, /* const xmlChar* name; */ xmlSecHrefSha512, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief SHA-512 digest transform klass. * @return pointer to SHA-512 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformSha512GetKlass(void) { return(&xmlSecMSCryptoSha512Klass); } #endif /* XMLSEC_NO_SHA512 */ #ifndef XMLSEC_NO_GOST /****************************************************************************** * * GOSTR3411_94 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoGostR3411_94Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameGostR3411_94, /* const xmlChar* name; */ xmlSecHrefGostR3411_94, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief GOSTR3411_94 digest transform klass. * @return pointer to GOSTR3411_94 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformGostR3411_94GetKlass(void) { return(&xmlSecMSCryptoGostR3411_94Klass); } /****************************************************************************** * * GOSTR3411-2012/256 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoGostR3411_2012_256Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameGostR3411_2012_256, /* const xmlChar* name; */ xmlSecHrefGostR3411_2012_256, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief GOSTR3411_2012_256 digest transform klass. * @return pointer to GOSTR3411_2012_256 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformGostR3411_2012_256GetKlass(void) { return(&xmlSecMSCryptoGostR3411_2012_256Klass); } /****************************************************************************** * * GOSTR3411-2012/512 * *****************************************************************************/ static xmlSecTransformKlass xmlSecMSCryptoGostR3411_2012_512Klass = { /* klass/object sizes */ sizeof(xmlSecTransformKlass), /* size_t klassSize */ xmlSecMSCryptoDigestSize, /* size_t objSize */ xmlSecNameGostR3411_2012_512, /* const xmlChar* name; */ xmlSecHrefGostR3411_2012_512, /* const xmlChar* href; */ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */ xmlSecMSCryptoDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */ xmlSecMSCryptoDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */ NULL, /* xmlSecTransformNodeReadMethod readNode; */ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ NULL, /* xmlSecTransformSetKeyMethod setKey; */ xmlSecMSCryptoDigestVerify, /* xmlSecTransformVerifyMethod verify; */ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ NULL, /* xmlSecTransformPopXmlMethod popXml; */ xmlSecMSCryptoDigestExecute, /* xmlSecTransformExecuteMethod execute; */ NULL, /* void* reserved0; */ NULL, /* void* reserved1; */ }; /** * @brief GOSTR3411_2012_512 digest transform klass. * @return pointer to GOSTR3411_2012_512 digest transform klass. */ xmlSecTransformId xmlSecMSCryptoTransformGostR3411_2012_512GetKlass(void) { return(&xmlSecMSCryptoGostR3411_2012_512Klass); } #endif /* XMLSEC_NO_GOST*/