Greetings!
Here is the incomplete patch to provide minimal support of GOST
digital signature and digests to OpenSSL-based version of the xmlsec.
Unfortunately, I didn't understand how to make it complete, though I
suppose I know what I've missed smth to make the library available to
sign...
I try to test verifying file tests/aleksey-xmldsig/enveloped-gost.xml
with the xmlsec cmdline utility but the
EVP_get_digestbyname("md_gost94") returns NULL, though the gost
openssl engine is loaded.
Can you show me what I'm missing?
Thank you!
On Fri, Sep 2, 2011 at 12:55 AM, Aleksey Sanin <[email protected]> wrote:
> There is GOST implementation for MS Crypto.
>
> Aleksey
>
>
> On 9/1/11 1:13 PM, Dmitry Belyavsky wrote:
>>
>> Greetings!
>>
>> What does the phrase from log
>>
>> Test: /aleksey-xmldsig-01/enveloped-gost (success)
>>
>> mean? Has it really been tested? If so, I've just completed my
>> mission... If not, how can I enable this test for OpenSSL?
>>
>> Thank you!
>> On Thu, Aug 18, 2011 at 11:11 PM, Aleksey Sanin<[email protected]>
>> wrote:
>>>
>>> Sorry, I already forgot file names :) You don't need key transport. You
>>> need
>>> actual
>>> key data implementation: see src/openssl/evp.c
>>>
>>> Aleksey
>>>
>>>
>>> On 8/18/11 12:08 PM, Dmitry Belyavsky wrote:
>>>>
>>>> Greetings!
>>>>
>>>> Sorry, I don't understand. The Gost algorithm is DSA-like, not
>>>> RSA-like. Why should I implement the rsa-like transport?..
>>>>
>>>> Thank you!
>>>>
>>>> On Thu, Aug 18, 2011 at 11:05 PM, Aleksey Sanin<[email protected]>
>>>> wrote:
>>>>>
>>>>> Yes. You don't need to do X509 certs but you need to define a key to
>>>>> use
>>>>> with the gost algorithm :)
>>>>>
>>>>> Aleksey
>>>>>
>>>>>
>>>>> On 8/18/11 12:03 PM, Dmitry Belyavsky wrote:
>>>>>>
>>>>>> Greetings!
>>>>>>
>>>>>> Do you mean smth similar to src/openssl/kt_rsa.c?
>>>>>> I hope I don't need it using the X509 cert format. Am I wrong?
>>>>>>
>>>>>> On Thu, Aug 18, 2011 at 10:43 PM, Aleksey Sanin<[email protected]>
>>>>>> wrote:
>>>>>>>
>>>>>>> You also need to implement key type for gost keys. Take a look at how
>>>>>>> RSA keys are done.
>>>>>>>
>>>>>>> Aleksey
>>>>>>>
>>>>>>>
>>>>>>> On 8/18/11 11:39 AM, Dmitry Belyavsky wrote:
>>>>>>>>
>>>>>>>> Greetings!
>>>>>>>>
>>>>>>>> I'm implementing the Russian GOST support to OpenSSL-builded XMLSec.
>>>>>>>> I
>>>>>>>> have some questions.
>>>>>>>>
>>>>>>>> 1. The support is expected to be in X.509 format only. I hope that
>>>>>>>> linking against OpenSSL 1.0 will work good enough after I implement
>>>>>>>> the necessary transforms. When I run make check, I get the
>>>>>>>> following:
>>>>>>>>
>>>>>>>>
>>>>>>>> Test: /aleksey-xmldsig-01/enveloped-gost (success)
>>>>>>>> /home/beldmit/xmlsec1-1.2.18/apps/xmlsec1 check-transforms --crypto
>>>>>>>> openssl --crypto-config /tmp/xmlsec-crypto-config
>>>>>>>> enveloped-signature
>>>>>>>> gostr34102001-gostr3411 gostr3411
>>>>>>>> Transforms "enveloped-signature" found
>>>>>>>> Transforms "gostr34102001-gostr3411" found
>>>>>>>> Transforms "gostr3411" found
>>>>>>>> /home/beldmit/xmlsec1-1.2.18/apps/xmlsec1 check-key-data --crypto
>>>>>>>> openssl --crypto-config /tmp/xmlsec-crypto-config gost
>>>>>>>> Error: key data "gost" not found
>>>>>>>>
>>>>>>>> How can I fix it?
>>>>>>>>
>>>>>>>> 2. I configure XMLSec with
>>>>>>>>
>>>>>>>> ./configure --with-openssl=/usr --with-pic=yes --enable-gost
>>>>>>>> But it seems to use static linking instead of using dynamic. How can
>>>>>>>> I
>>>>>>>> fix
>>>>>>>> it?
>>>>>>>>
>>>>>>>> Thank you!
>>>>>>>>
>>>>
>>
>>
>
--
SY, Dmitry Belyavsky
diff -ur ../tmp/xmlsec1-1.2.18//include/xmlsec/openssl/crypto.h xmlsec1-1.2.18/include/xmlsec/openssl/crypto.h
--- ../tmp/xmlsec1-1.2.18//include/xmlsec/openssl/crypto.h 2011-05-12 03:02:01.000000000 +0400
+++ xmlsec1-1.2.18/include/xmlsec/openssl/crypto.h 2011-08-06 15:55:09.000000000 +0400
@@ -186,6 +186,33 @@
/********************************************************************
*
+ * GOST2001 transform
+ *
+ *******************************************************************/
+#ifndef XMLSEC_NO_GOST
+
+/**
+ * xmlSecOpenSSLKeyDataGost2001Id:
+ *
+ * The GOST2001 key klass.
+ */
+#define xmlSecOpenSSLKeyDataGost2001Id \
+ xmlSecOpenSSLKeyDataGost2001GetKlass()
+XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId xmlSecOpenSSLKeyDataGost2001GetKlass (void);
+
+/**
+ * xmlSecOpenSSLTransformGost2001GostR3411_94Id:
+ *
+ * The GOST2001 GOSTR3411_94 signature transform klass.
+ */
+#define xmlSecOpenSSLTransformGost2001GostR3411_94Id \
+ xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass()
+XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass(void);
+
+#endif /* XMLSEC_NO_GOST */
+
+/********************************************************************
+ *
* HMAC transforms
*
*******************************************************************/
@@ -523,6 +550,23 @@
#endif /* XMLSEC_NO_SHA512 */
+/********************************************************************
+ *
+ * GOSTR3411_94 transform
+ *
+ *******************************************************************/
+#ifndef XMLSEC_NO_GOST
+
+/**
+ * xmlSecOpenSSLTransformGostR3411_94Id:
+ *
+ * The GOSTR3411_94 digest transform klass.
+ */
+#define xmlSecOpenSSLTransformGostR3411_94Id \
+ xmlSecOpenSSLTransformGostR3411_94GetKlass()
+XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecOpenSSLTransformGostR3411_94GetKlass(void);
+#endif /* XMLSEC_NO_GOST */
+
diff -ur ../tmp/xmlsec1-1.2.18//src/openssl/crypto.c xmlsec1-1.2.18/src/openssl/crypto.c
--- ../tmp/xmlsec1-1.2.18//src/openssl/crypto.c 2011-05-12 03:02:01.000000000 +0400
+++ xmlsec1-1.2.18/src/openssl/crypto.c 2011-08-06 15:25:18.000000000 +0400
@@ -74,6 +74,10 @@
gXmlSecOpenSSLFunctions->keyDataDsaGetKlass = xmlSecOpenSSLKeyDataDsaGetKlass;
#endif /* XMLSEC_NO_DSA */
+#ifndef XMLSEC_NO_GOST
+ gXmlSecOpenSSLFunctions->keyDataGost2001GetKlass = xmlSecOpenSSLKeyDataGost2001GetKlass;
+#endif /* XMLSEC_NO_GOST*/
+
#ifndef XMLSEC_NO_HMAC
gXmlSecOpenSSLFunctions->keyDataHmacGetKlass = xmlSecOpenSSLKeyDataHmacGetKlass;
#endif /* XMLSEC_NO_HMAC */
@@ -127,6 +131,15 @@
#endif /* XMLSEC_NO_DSA */
+ /******************************* GOST ********************************/
+#ifndef XMLSEC_NO_GOST
+ gXmlSecOpenSSLFunctions->transformGost2001GostR3411_94GetKlass = xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass;
+#endif /* XMLSEC_NO_GOST */
+
+#ifndef XMLSEC_NO_GOST
+ gXmlSecOpenSSLFunctions->transformGostR3411_94GetKlass = xmlSecOpenSSLTransformGostR3411_94GetKlass;
+#endif /* XMLSEC_NO_GOST */
+
/******************************* HMAC ********************************/
#ifndef XMLSEC_NO_HMAC
diff -ur ../tmp/xmlsec1-1.2.18//src/openssl/digests.c xmlsec1-1.2.18/src/openssl/digests.c
--- ../tmp/xmlsec1-1.2.18//src/openssl/digests.c 2011-05-12 03:02:01.000000000 +0400
+++ xmlsec1-1.2.18/src/openssl/digests.c 2011-09-02 18:43:17.000000000 +0400
@@ -102,6 +102,12 @@
} else
#endif /* XMLSEC_NO_SHA512 */
+#ifndef XMLSEC_NO_GOST
+ if(xmlSecTransformCheckId(transform, xmlSecOpenSSLTransformGostR3411_94Id)) {
+ return(1);
+ } else
+#endif /* XMLSEC_NO_GOST*/
+
{
return(0);
@@ -165,6 +171,21 @@
} else
#endif /* XMLSEC_NO_SHA512 */
+#ifndef XMLSEC_NO_GOST
+ if(xmlSecTransformCheckId(transform, xmlSecOpenSSLTransformGostR3411_94Id)) {
+ ctx->digest = EVP_get_digestbyname("md_gost94");
+ if (!ctx->digest)
+ {
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
+ NULL,
+ XMLSEC_ERRORS_R_INVALID_TRANSFORM,
+ XMLSEC_ERRORS_NO_MESSAGE);
+ return(-1);
+ }
+ } else
+#endif /* XMLSEC_NO_GOST*/
+
{
xmlSecError(XMLSEC_ERRORS_HERE,
xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
@@ -680,3 +701,47 @@
}
#endif /* XMLSEC_NO_SHA512 */
+#ifndef XMLSEC_NO_GOST
+/******************************************************************************
+ *
+ * GOSTR3411_94
+ *
+ *****************************************************************************/
+static xmlSecTransformKlass xmlSecOpenSSLGostR3411_94Klass = {
+ /* klass/object sizes */
+ sizeof(xmlSecTransformKlass), /* size_t klassSize */
+ xmlSecOpenSSLEvpDigestSize, /* size_t objSize */
+
+ xmlSecNameGostR3411_94, /* const xmlChar* name; */
+ xmlSecHrefGostR3411_94, /* const xmlChar* href; */
+ xmlSecTransformUsageDigestMethod, /* xmlSecTransformUsage usage; */
+ xmlSecOpenSSLEvpDigestInitialize, /* xmlSecTransformInitializeMethod initialize; */
+ xmlSecOpenSSLEvpDigestFinalize, /* xmlSecTransformFinalizeMethod finalize; */
+ NULL, /* xmlSecTransformNodeReadMethod readNode; */
+ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */
+ NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */
+ NULL, /* xmlSecTransformSetKeyMethod setKey; */
+ xmlSecOpenSSLEvpDigestVerify, /* xmlSecTransformVerifyMethod verify; */
+ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */
+ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */
+ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */
+ NULL, /* xmlSecTransformPushXmlMethod pushXml; */
+ NULL, /* xmlSecTransformPopXmlMethod popXml; */
+ xmlSecOpenSSLEvpDigestExecute, /* xmlSecTransformExecuteMethod execute; */
+ NULL, /* void* reserved0; */
+ NULL, /* void* reserved1; */
+};
+
+/**
+ * xmlSecOpenSSLTransformGostR3411_94GetKlass:
+ *
+ * GOSTR3411_94 digest transform klass.
+ *
+ * Returns: pointer to GOSTR3411_94 digest transform klass.
+ */
+xmlSecTransformId
+xmlSecOpenSSLTransformGostR3411_94GetKlass(void) {
+ return(&xmlSecOpenSSLGostR3411_94Klass);
+}
+#endif /* XMLSEC_NO_GOST*/
+
diff -ur ../tmp/xmlsec1-1.2.18//src/openssl/evp.c xmlsec1-1.2.18/src/openssl/evp.c
--- ../tmp/xmlsec1-1.2.18//src/openssl/evp.c 2011-05-12 03:02:01.000000000 +0400
+++ xmlsec1-1.2.18/src/openssl/evp.c 2011-08-06 16:25:51.000000000 +0400
@@ -1556,4 +1556,144 @@
#endif /* XMLSEC_NO_RSA */
+#ifndef XMLSEC_NO_GOST
+/**************************************************************************
+ *
+ * GOST2001 xml key representation processing. Contain errors.
+ *
+ *************************************************************************/
+static int xmlSecOpenSSLKeyDataGost2001Initialize(xmlSecKeyDataPtr data);
+static int xmlSecOpenSSLKeyDataGost2001Duplicate(xmlSecKeyDataPtr dst,
+ xmlSecKeyDataPtr src);
+static void xmlSecOpenSSLKeyDataGost2001Finalize(xmlSecKeyDataPtr data);
+static int xmlSecOpenSSLKeyDataGost2001XmlRead (xmlSecKeyDataId id,
+ xmlSecKeyPtr key,
+ xmlNodePtr node,
+ xmlSecKeyInfoCtxPtr keyInfoCtx);
+static int xmlSecOpenSSLKeyDataGost2001XmlWrite(xmlSecKeyDataId id,
+ xmlSecKeyPtr key,
+ xmlNodePtr node,
+ xmlSecKeyInfoCtxPtr keyInfoCtx);
+static int xmlSecOpenSSLKeyDataGost2001Generate(xmlSecKeyDataPtr data,
+ xmlSecSize sizeBits,
+ xmlSecKeyDataType type);
+
+static xmlSecKeyDataType xmlSecOpenSSLKeyDataGost2001GetType(xmlSecKeyDataPtr data);
+static xmlSecSize xmlSecOpenSSLKeyDataGost2001GetSize(xmlSecKeyDataPtr data);
+static void xmlSecOpenSSLKeyDataGost2001DebugDump(xmlSecKeyDataPtr data,
+ FILE* output);
+static void xmlSecOpenSSLKeyDataGost2001DebugXmlDump(xmlSecKeyDataPtr data,
+ FILE* output);
+
+static xmlSecKeyDataKlass xmlSecOpenSSLKeyDataGost2001Klass = {
+ sizeof(xmlSecKeyDataKlass),
+ xmlSecOpenSSLEvpKeyDataSize,
+
+ /* data */
+ xmlSecNameGOST2001KeyValue,
+ xmlSecKeyDataUsageKeyValueNode | xmlSecKeyDataUsageRetrievalMethodNodeXml,
+ /* xmlSecKeyDataUsage usage; */
+ xmlSecHrefGOST2001KeyValue, /* const xmlChar* href; */
+ xmlSecNodeGOST2001KeyValue, /* const xmlChar* dataNodeName; */
+ xmlSecDSigNs, /* const xmlChar* dataNodeNs; */
+
+ /* constructors/destructor */
+ xmlSecOpenSSLKeyDataGost2001Initialize, /* xmlSecKeyDataInitializeMethod initialize; */
+ xmlSecOpenSSLKeyDataGost2001Duplicate, /* xmlSecKeyDataDuplicateMethod duplicate; */
+ xmlSecOpenSSLKeyDataGost2001Finalize, /* xmlSecKeyDataFinalizeMethod finalize; */
+ NULL, /* xmlSecOpenSSLKeyDataGost2001Generate,*/ /* xmlSecKeyDataGenerateMethod generate; */
+
+ /* get info */
+ xmlSecOpenSSLKeyDataGost2001GetType, /* xmlSecKeyDataGetTypeMethod getType; */
+ xmlSecOpenSSLKeyDataGost2001GetSize, /* xmlSecKeyDataGetSizeMethod getSize; */
+ NULL, /* xmlSecKeyDataGetIdentifier getIdentifier; */
+
+ /* read/write */
+ NULL, /* xmlSecKeyDataXmlReadMethod xmlRead; */
+ NULL, /* xmlSecKeyDataXmlWriteMethod xmlWrite; */
+ NULL, /* xmlSecKeyDataBinReadMethod binRead; */
+ NULL, /* xmlSecKeyDataBinWriteMethod binWrite; */
+
+ /* debug */
+ xmlSecOpenSSLKeyDataGost2001DebugDump, /* xmlSecKeyDataDebugDumpMethod debugDump; */
+ xmlSecOpenSSLKeyDataGost2001DebugXmlDump,/* xmlSecKeyDataDebugDumpMethod debugXmlDump; */
+
+ /* reserved for the future */
+ NULL, /* void* reserved0; */
+ NULL, /* void* reserved1; */
+};
+
+/**
+ * xmlSecOpenSSLKeyDataGost2001GetKlass:
+ *
+ * The GOST2001 key data klass.
+ *
+ * Returns: pointer to GOST2001 key data klass.
+ */
+xmlSecKeyDataId
+xmlSecOpenSSLKeyDataGost2001GetKlass(void) {
+ return(&xmlSecOpenSSLKeyDataGost2001Klass);
+}
+
+
+static int
+xmlSecOpenSSLKeyDataGost2001Initialize(xmlSecKeyDataPtr data) {
+ xmlSecOpenSSLEvpKeyDataCtxPtr ctx;
+
+ xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataGost2001Id), xmlSecKeyDataTypeUnknown);
+
+ xmlSecOpenSSLKeyDataInitialize(data);
+
+ ctx = xmlSecOpenSSLEvpKeyDataGetCtx(data);
+ xmlSecAssert2(ctx != NULL, -1);
+
+ return(0);
+}
+
+static int
+xmlSecOpenSSLKeyDataGost2001Duplicate(xmlSecKeyDataPtr dst, xmlSecKeyDataPtr src) {
+ xmlSecAssert2(xmlSecKeyDataCheckId(dst, xmlSecOpenSSLKeyDataGost2001Id), -1);
+ xmlSecAssert2(xmlSecKeyDataCheckId(src, xmlSecOpenSSLKeyDataGost2001Id), -1);
+
+ return(xmlSecOpenSSLKeyDataDuplicate(dst, src));
+}
+
+static void
+xmlSecOpenSSLKeyDataGost2001Finalize(xmlSecKeyDataPtr data) {
+ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataGost2001Id));
+
+ xmlSecOpenSSLKeyDataFinalize(data);
+}
+
+static xmlSecKeyDataType
+xmlSecOpenSSLKeyDataGost2001GetType(xmlSecKeyDataPtr data) {
+ return(xmlSecOpenSSLKeyDataGetType(data));
+}
+
+static xmlSecSize
+xmlSecOpenSSLKeyDataGost2001GetSize(xmlSecKeyDataPtr data) {
+ xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataGost2001Id), 0);
+
+ return xmlSecOpenSSLKeyDataGetSize(data);
+}
+
+static void
+xmlSecOpenSSLKeyDataGost2001DebugDump(xmlSecKeyDataPtr data, FILE* output) {
+ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataGost2001Id));
+ xmlSecAssert(output != NULL);
+
+ fprintf(output, "=== dsa key: size = %d\n",
+ xmlSecOpenSSLKeyDataGost2001GetSize(data));
+}
+
+static void
+xmlSecOpenSSLKeyDataGost2001DebugXmlDump(xmlSecKeyDataPtr data, FILE* output) {
+ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataGost2001Id));
+ xmlSecAssert(output != NULL);
+
+ fprintf(output, "<GOST2001KeyValue size=\"%d\" />\n",
+ xmlSecOpenSSLKeyDataGost2001GetSize(data));
+}
+
+#endif /* XMLSEC_NO_GOST*/
diff -ur ../tmp/xmlsec1-1.2.18//src/openssl/signatures.c xmlsec1-1.2.18/src/openssl/signatures.c
--- ../tmp/xmlsec1-1.2.18//src/openssl/signatures.c 2011-05-12 03:02:01.000000000 +0400
+++ xmlsec1-1.2.18/src/openssl/signatures.c 2011-09-02 00:30:37.000000000 +0400
@@ -127,6 +127,12 @@
#endif /* XMLSEC_NO_RSA */
+#ifndef XMLSEC_NO_GOST
+ if(xmlSecTransformCheckId(transform, xmlSecOpenSSLTransformGost2001GostR3411_94Id)) {
+ return(1);
+ } else
+#endif /* XMLSEC_NO_GOST*/
+
{
return(0);
}
@@ -210,6 +216,22 @@
#endif /* XMLSEC_NO_RSA */
+#ifndef XMLSEC_NO_GOST
+ if(xmlSecTransformCheckId(transform, xmlSecOpenSSLTransformGost2001GostR3411_94Id)) {
+ ctx->keyId = xmlSecOpenSSLKeyDataGost2001Id;
+ ctx->digest = EVP_get_digestbyname("md_gost94");
+ if (!ctx->digest)
+ {
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
+ NULL,
+ XMLSEC_ERRORS_R_INVALID_TRANSFORM,
+ XMLSEC_ERRORS_NO_MESSAGE);
+ return(-1);
+ }
+ } else
+#endif /* XMLSEC_NO_GOST*/
+
if(1) {
xmlSecError(XMLSEC_ERRORS_HERE,
xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
@@ -1062,4 +1084,52 @@
#endif /* XMLSEC_NO_RSA */
+#ifndef XMLSEC_NO_GOST
+/****************************************************************************
+ *
+ * GOST2001-GOSTR3411_94 signature transform
+ *
+ ***************************************************************************/
+
+static xmlSecTransformKlass xmlSecOpenSSLGost2001GostR3411_94Klass = {
+ /* klass/object sizes */
+ sizeof(xmlSecTransformKlass), /* xmlSecSize klassSize */
+ xmlSecOpenSSLEvpSignatureSize, /* xmlSecSize objSize */
+
+ xmlSecNameGost2001GostR3411_94, /* const xmlChar* name; */
+ xmlSecHrefGost2001GostR3411_94, /* const xmlChar* href; */
+ xmlSecTransformUsageSignatureMethod, /* xmlSecTransformUsage usage; */
+
+ xmlSecOpenSSLEvpSignatureInitialize, /* xmlSecTransformInitializeMethod initialize; */
+ xmlSecOpenSSLEvpSignatureFinalize, /* xmlSecTransformFinalizeMethod finalize; */
+ NULL, /* xmlSecTransformNodeReadMethod readNode; */
+ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */
+ xmlSecOpenSSLEvpSignatureSetKeyReq, /* xmlSecTransformSetKeyReqMethod setKeyReq; */
+ xmlSecOpenSSLEvpSignatureSetKey, /* xmlSecTransformSetKeyMethod setKey; */
+ xmlSecOpenSSLEvpSignatureVerify, /* xmlSecTransformVerifyMethod verify; */
+ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */
+ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */
+ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */
+ NULL, /* xmlSecTransformPushXmlMethod pushXml; */
+ NULL, /* xmlSecTransformPopXmlMethod popXml; */
+ xmlSecOpenSSLEvpSignatureExecute, /* xmlSecTransformExecuteMethod execute; */
+
+ NULL, /* void* reserved0; */
+ NULL, /* void* reserved1; */
+};
+
+/**
+ * xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass:
+ *
+ * The GOST2001-GOSTR3411_94 signature transform klass.
+ *
+ * Returns: GOST2001-GOSTR3411_94 signature transform klass.
+ */
+xmlSecTransformId
+xmlSecOpenSSLTransformGost2001GostR3411_94GetKlass(void) {
+ return(&xmlSecOpenSSLGost2001GostR3411_94Klass);
+}
+
+#endif /* XMLSEC_NO_GOST*/
+
_______________________________________________
xmlsec mailing list
[email protected]
http://www.aleksey.com/mailman/listinfo/xmlsec