external/libxmlsec/UnpackedTarball_xmlsec.mk | 4 external/libxmlsec/xmlsec1-nss-ecdsa-memset.patch.1 | 37 + external/libxmlsec/xmlsec1-nss-ecdsa-sha256.patch.1 | 434 ++++++++++++++++++++ 3 files changed, 475 insertions(+)
New commits: commit b5acaa42bb44ad358b0c126af18ea3bdf88d4bd3 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Mar 8 08:52:25 2017 +0100 tdf#105983 libxmlsec: backport NSS / ECDSA patches NSS already supported ECDSA, and LibreOffice itself is agnostic here. All what was missing is the ECDSA wrapper in xmlsec's nss backend. Change-Id: Ic26cef369d0f4a1847b6a76825b9464837fe8f3b Reviewed-on: https://gerrit.libreoffice.org/34966 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/external/libxmlsec/UnpackedTarball_xmlsec.mk b/external/libxmlsec/UnpackedTarball_xmlsec.mk index aa3ff0c..d7859f3 100644 --- a/external/libxmlsec/UnpackedTarball_xmlsec.mk +++ b/external/libxmlsec/UnpackedTarball_xmlsec.mk @@ -15,6 +15,10 @@ xmlsec_patches += xmlsec1-noverify.patch.1 xmlsec_patches += xmlsec1-vc.patch.1 xmlsec_patches += xmlsec1-1.2.14_fix_extern_c.patch.1 xmlsec_patches += xmlsec1-customkeymanage.patch.1 +# Backport of <https://github.com/lsh123/xmlsec/pull/83>. +xmlsec_patches += xmlsec1-nss-ecdsa-sha256.patch.1 +# Backport of <https://github.com/lsh123/xmlsec/pull/91>. +xmlsec_patches += xmlsec1-nss-ecdsa-memset.patch.1 $(eval $(call gb_UnpackedTarball_UnpackedTarball,xmlsec)) diff --git a/external/libxmlsec/xmlsec1-nss-ecdsa-memset.patch.1 b/external/libxmlsec/xmlsec1-nss-ecdsa-memset.patch.1 new file mode 100644 index 0000000..2cefbe0 --- /dev/null +++ b/external/libxmlsec/xmlsec1-nss-ecdsa-memset.patch.1 @@ -0,0 +1,37 @@ +From 2ef2b9f34e2eebcdb4116e55e1e3b8034a1961c8 Mon Sep 17 00:00:00 2001 +From: Miklos Vajna <vmik...@collabora.co.uk> +Date: Mon, 6 Mar 2017 22:34:46 +0100 +Subject: [PATCH] nss: fix assert when building against debug nss (#91) + +Due to reading uninitialized memory. gdb says: + + Assertion failure: dest == NULL || dest->data == NULL, at secasn1e.c:1483 + Program received signal SIGABRT, Aborted. + 0x00007ffff74748d7 in raise () from /lib64/libc.so.6 + (gdb) up + #1 0x00007ffff7475caa in abort () from /lib64/libc.so.6 + (gdb) + #2 0x00007fffe57f96ae in PR_Assert (s=0x7fffe1cbf298 "dest == NULL || dest->data == NULL", file=0x7fffe1cbef60 "secasn1e.c", ln=1483) at ../../../../pr/src/io/prlog.c:553 + 553 abort(); + (gdb) + #3 0x00007fffe1cb1941 in SEC_ASN1EncodeItem_Util (poolp=0x0, dest=0x7fffffff95f0, src=0x7fffffff9530, theTemplate=0x7fffe55ae180 <DSA_SignatureTemplate>) at secasn1e.c:1483 + 1483 PORT_Assert(dest == NULL || dest->data == NULL); +--- + src/nss/signatures.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/nss/signatures.c b/src/nss/signatures.c +index a8fec2c..b7a292e 100644 +--- a/src/nss/signatures.c ++++ b/src/nss/signatures.c +@@ -354,6 +354,7 @@ xmlSecNssSignatureVerify(xmlSecTransformPtr transform, + SECItem signatureDer; + SECStatus statusDer; + ++ memset(&signatureDer, 0, sizeof(signatureDer)); + statusDer = DSAU_EncodeDerSigWithLen(&signatureDer, &signature, signature.len); + if(statusDer != SECSuccess) { + xmlSecError(XMLSEC_ERRORS_HERE, +-- +2.10.2 + diff --git a/external/libxmlsec/xmlsec1-nss-ecdsa-sha256.patch.1 b/external/libxmlsec/xmlsec1-nss-ecdsa-sha256.patch.1 new file mode 100644 index 0000000..dc6a13b --- /dev/null +++ b/external/libxmlsec/xmlsec1-nss-ecdsa-sha256.patch.1 @@ -0,0 +1,434 @@ +From a2448ac7a26c64be27b81a26a34cb933e4fb899d Mon Sep 17 00:00:00 2001 +From: Miklos Vajna <vmik...@collabora.co.uk> +Date: Sat, 25 Feb 2017 01:03:19 +0100 +Subject: [PATCH] nss: add ECDSA-SHA256 support (#83) + +Conflicts: + configure.ac + src/nss/signatures.c +--- + include/xmlsec/nss/crypto.h | 30 +++++++++ + include/xmlsec/nss/symbols.h | 1 + + src/nss/README | 2 +- + src/nss/crypto.c | 7 +++ + src/nss/pkikeys.c | 141 +++++++++++++++++++++++++++++++++++++++++++ + src/nss/signatures.c | 124 ++++++++++++++++++++++++++++++++----- + 6 files changed, 290 insertions(+), 15 deletions(-) + +diff --git a/include/xmlsec/nss/crypto.h b/include/xmlsec/nss/crypto.h +index 87f31bf..adc73c8 100644 +--- a/include/xmlsec/nss/crypto.h ++++ b/include/xmlsec/nss/crypto.h +@@ -189,6 +189,36 @@ XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecNssTransformDsaSha1GetKlass(void); + + /******************************************************************** + * ++ * ECDSA transform ++ * ++ *******************************************************************/ ++#ifndef XMLSEC_NO_ECDSA ++ ++/** ++ * xmlSecNssKeyDataEcdsaId: ++ * ++ * The ECDSA key klass. ++ */ ++#define xmlSecNssKeyDataEcdsaId xmlSecNssKeyDataEcdsaGetKlass() ++XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId xmlSecNssKeyDataEcdsaGetKlass(void); ++ ++#ifndef XMLSEC_NO_SHA256 ++ ++/** ++ * xmlSecNssTransformEcdsaSha256Id: ++ * ++ * The ECDSA SHA256 signature transform klass. ++ */ ++#define xmlSecNssTransformEcdsaSha256Id xmlSecNssTransformEcdsaSha256GetKlass() ++XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecNssTransformEcdsaSha256GetKlass(void); ++ ++#endif /* XMLSEC_NO_SHA256 */ ++ ++#endif /* XMLSEC_NO_ECDSA */ ++ ++ ++/******************************************************************** ++ * + * HMAC transforms + * + *******************************************************************/ +diff --git a/include/xmlsec/nss/symbols.h b/include/xmlsec/nss/symbols.h +index 23653ed..499801c 100644 +--- a/include/xmlsec/nss/symbols.h ++++ b/include/xmlsec/nss/symbols.h +@@ -65,6 +65,7 @@ extern "C" { + #define xmlSecTransformDes3CbcId xmlSecNssTransformDes3CbcId + #define xmlSecTransformKWDes3Id xmlSecNssTransformKWDes3Id + #define xmlSecTransformDsaSha1Id xmlSecNssTransformDsaSha1Id ++#define xmlSecTransformEcdsaSha256Id xmlSecNssTransformEcdsaSha256Id + #define xmlSecTransformHmacMd5Id xmlSecNssTransformHmacMd5Id + #define xmlSecTransformHmacRipemd160Id xmlSecNssTransformHmacRipemd160Id + #define xmlSecTransformHmacSha1Id xmlSecNssTransformHmacSha1Id +diff --git a/src/nss/README b/src/nss/README +index 65a0f45..536552e 100644 +--- a/src/nss/README ++++ b/src/nss/README +@@ -1,6 +1,6 @@ + WHAT VERSION OF NSS? + ------------------------------------------------------------------------ +-NSS 3.9 or greater and NSPR 4.4.1 or greater are required. ++NSS 3.11.1 or greater and NSPR 4.4.1 or greater are required. + + KEYS MANAGER + ------------------------------------------------------------------------ +diff --git a/src/nss/crypto.c b/src/nss/crypto.c +index 473429f..81a81d3 100644 +--- a/src/nss/crypto.c ++++ b/src/nss/crypto.c +@@ -124,6 +124,13 @@ xmlSecCryptoGetFunctions_nss(void) { + gXmlSecNssFunctions->transformDsaSha1GetKlass = xmlSecNssTransformDsaSha1GetKlass; + #endif /* XMLSEC_NO_DSA */ + ++ /******************************* ECDSA ******************************/ ++#ifndef XMLSEC_NO_ECDSA ++#ifndef XMLSEC_NO_SHA256 ++ gXmlSecNssFunctions->transformEcdsaSha256GetKlass = xmlSecNssTransformEcdsaSha256GetKlass; ++#endif /* XMLSEC_NO_SHA256 */ ++#endif /* XMLSEC_NO_ECDSA */ ++ + /******************************* HMAC ********************************/ + #ifndef XMLSEC_NO_HMAC + +diff --git a/src/nss/pkikeys.c b/src/nss/pkikeys.c +index 896c245..1d601d2 100644 +--- a/src/nss/pkikeys.c ++++ b/src/nss/pkikeys.c +@@ -257,6 +257,19 @@ xmlSecNssPKIAdoptKey(SECKEYPrivateKey *privkey, + } + break; + #endif /* XMLSEC_NO_DSA */ ++#ifndef XMLSEC_NO_ECDSA ++ case ecKey: ++ data = xmlSecKeyDataCreate(xmlSecNssKeyDataEcdsaId); ++ if(data == NULL) { ++ xmlSecError(XMLSEC_ERRORS_HERE, ++ NULL, ++ "xmlSecKeyDataCreate", ++ XMLSEC_ERRORS_R_XMLSEC_FAILED, ++ "xmlSecNssKeyDataEcdsaId"); ++ return(NULL); ++ } ++ break; ++#endif /* XMLSEC_NO_ECDSA */ + default: + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, +@@ -1564,5 +1577,133 @@ xmlSecNssKeyDataRsaDebugXmlDump(xmlSecKeyDataPtr data, FILE* output) { + + #endif /* XMLSEC_NO_RSA */ + ++#ifndef XMLSEC_NO_ECDSA ++static int xmlSecNssKeyDataEcdsaInitialize(xmlSecKeyDataPtr data); ++static int xmlSecNssKeyDataEcdsaDuplicate(xmlSecKeyDataPtr dst, ++ xmlSecKeyDataPtr src); ++static void xmlSecNssKeyDataEcdsaFinalize(xmlSecKeyDataPtr data); ++ ++static xmlSecKeyDataType xmlSecNssKeyDataEcdsaGetType(xmlSecKeyDataPtr data); ++static xmlSecSize xmlSecNssKeyDataEcdsaGetSize(xmlSecKeyDataPtr data); ++static void xmlSecNssKeyDataEcdsaDebugDump(xmlSecKeyDataPtr data, ++ FILE* output); ++static void xmlSecNssKeyDataEcdsaDebugXmlDump(xmlSecKeyDataPtr data, ++ FILE* output); ++ ++static xmlSecKeyDataKlass xmlSecNssKeyDataEcdsaKlass = { ++ sizeof(xmlSecKeyDataKlass), ++ xmlSecNssPKIKeyDataSize, ++ ++ /* data */ ++ xmlSecNameECDSAKeyValue, ++ xmlSecKeyDataUsageKeyValueNode | xmlSecKeyDataUsageRetrievalMethodNodeXml, ++ /* xmlSecKeyDataUsage usage; */ ++ xmlSecHrefECDSAKeyValue, /* const xmlChar* href; */ ++ xmlSecNodeECDSAKeyValue, /* const xmlChar* dataNodeName; */ ++ xmlSecDSigNs, /* const xmlChar* dataNodeNs; */ ++ ++ /* constructors/destructor */ ++ xmlSecNssKeyDataEcdsaInitialize, /* xmlSecKeyDataInitializeMethod initialize; */ ++ xmlSecNssKeyDataEcdsaDuplicate, /* xmlSecKeyDataDuplicateMethod duplicate; */ ++ xmlSecNssKeyDataEcdsaFinalize, /* xmlSecKeyDataFinalizeMethod finalize; */ ++ NULL, /* xmlSecKeyDataGenerateMethod generate; */ ++ ++ /* get info */ ++ xmlSecNssKeyDataEcdsaGetType, /* xmlSecKeyDataGetTypeMethod getType; */ ++ xmlSecNssKeyDataEcdsaGetSize, /* xmlSecKeyDataGetSizeMethod getSize; */ ++ NULL, /* xmlSecKeyDataGetIdentifier getIdentifier; */ ++ ++ /* read/write */ ++ NULL, /* xmlSecKeyDataXmlReadMethod xmlRead; */ ++ NULL, /* xmlSecKeyDataXmlWriteMethod xmlWrite; */ ++ NULL, /* xmlSecKeyDataBinReadMethod binRead; */ ++ NULL, /* xmlSecKeyDataBinWriteMethod binWrite; */ ++ ++ /* debug */ ++ xmlSecNssKeyDataEcdsaDebugDump, /* xmlSecKeyDataDebugDumpMethod debugDump; */ ++ xmlSecNssKeyDataEcdsaDebugXmlDump, /* xmlSecKeyDataDebugDumpMethod debugXmlDump; */ ++ ++ /* reserved for the future */ ++ NULL, /* void* reserved0; */ ++ NULL, /* void* reserved1; */ ++}; ++ ++/** ++ * xmlSecNssKeyDataEcdsaGetKlass: ++ * ++ * The ECDSA key data klass. ++ * ++ * Returns: pointer to ECDSA key data klass. ++ */ ++xmlSecKeyDataId ++xmlSecNssKeyDataEcdsaGetKlass(void) { ++ return(&xmlSecNssKeyDataEcdsaKlass); ++} ++ ++static int ++xmlSecNssKeyDataEcdsaInitialize(xmlSecKeyDataPtr data) { ++ xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId), -1); ++ ++ return(xmlSecNssPKIKeyDataInitialize(data)); ++} ++ ++static int ++xmlSecNssKeyDataEcdsaDuplicate(xmlSecKeyDataPtr dst, xmlSecKeyDataPtr src) { ++ xmlSecAssert2(xmlSecKeyDataCheckId(dst, xmlSecNssKeyDataEcdsaId), -1); ++ xmlSecAssert2(xmlSecKeyDataCheckId(src, xmlSecNssKeyDataEcdsaId), -1); ++ ++ return(xmlSecNssPKIKeyDataDuplicate(dst, src)); ++} ++ ++static void ++xmlSecNssKeyDataEcdsaFinalize(xmlSecKeyDataPtr data) { ++ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId)); ++ ++ xmlSecNssPKIKeyDataFinalize(data); ++} ++ ++static xmlSecKeyDataType ++xmlSecNssKeyDataEcdsaGetType(xmlSecKeyDataPtr data) { ++ xmlSecNssPKIKeyDataCtxPtr ctx; ++ ++ xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId), xmlSecKeyDataTypeUnknown); ++ ctx = xmlSecNssPKIKeyDataGetCtx(data); ++ xmlSecAssert2(ctx != NULL, -1); ++ xmlSecAssert2(SECKEY_GetPublicKeyType(ctx->pubkey) == ecKey, -1); ++ if (ctx->privkey != NULL) { ++ return(xmlSecKeyDataTypePrivate | xmlSecKeyDataTypePublic); ++ } else { ++ return(xmlSecKeyDataTypePublic); ++ } ++} ++ ++static xmlSecSize ++xmlSecNssKeyDataEcdsaGetSize(xmlSecKeyDataPtr data) { ++ xmlSecNssPKIKeyDataCtxPtr ctx; ++ ++ xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId), 0); ++ ctx = xmlSecNssPKIKeyDataGetCtx(data); ++ xmlSecAssert2(ctx != NULL, -1); ++ xmlSecAssert2(SECKEY_GetPublicKeyType(ctx->pubkey) == ecKey, -1); + ++ return(SECKEY_SignatureLen(ctx->pubkey)); ++} + ++static void ++xmlSecNssKeyDataEcdsaDebugDump(xmlSecKeyDataPtr data, FILE* output) { ++ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId)); ++ xmlSecAssert(output != NULL); ++ ++ fprintf(output, "=== ecdsa key: size = %d\n", ++ xmlSecNssKeyDataEcdsaGetSize(data)); ++} ++ ++static void ++xmlSecNssKeyDataEcdsaDebugXmlDump(xmlSecKeyDataPtr data, FILE* output) { ++ xmlSecAssert(xmlSecKeyDataCheckId(data, xmlSecNssKeyDataEcdsaId)); ++ xmlSecAssert(output != NULL); ++ ++ fprintf(output, "<ECDSAKeyValue size=\"%d\" />\n", ++ xmlSecNssKeyDataEcdsaGetSize(data)); ++} ++#endif /* XMLSEC_NO_ECDSA */ +diff --git a/src/nss/signatures.c b/src/nss/signatures.c +index 4f54170..a8fec2c 100644 +--- a/src/nss/signatures.c ++++ b/src/nss/signatures.c +@@ -83,6 +83,14 @@ xmlSecNssSignatureCheckId(xmlSecTransformPtr transform) { + } + #endif /* XMLSEC_NO_DSA */ + ++#ifndef XMLSEC_NO_ECDSA ++#ifndef XMLSEC_NO_SHA256 ++ if(xmlSecTransformCheckId(transform, xmlSecNssTransformEcdsaSha256Id)) { ++ return(1); ++ } ++#endif /* XMLSEC_NO_SHA256 */ ++#endif /* XMLSEC_NO_ECDSA */ ++ + #ifndef XMLSEC_NO_RSA + + #ifndef XMLSEC_NO_MD5 +@@ -139,6 +147,16 @@ xmlSecNssSignatureInitialize(xmlSecTransformPtr transform) { + } else + #endif /* XMLSEC_NO_DSA */ + ++#ifndef XMLSEC_NO_ECDSA ++#ifndef XMLSEC_NO_SHA256 ++ if(xmlSecTransformCheckId(transform, xmlSecNssTransformEcdsaSha256Id)) { ++ ctx->keyId = xmlSecNssKeyDataEcdsaId; ++ /* This creates a signature which is ASN1 encoded */ ++ ctx->alg = SEC_OID_ANSIX962_ECDSA_SHA256_SIGNATURE; ++ } else ++#endif /* XMLSEC_NO_SHA256 */ ++#endif /* XMLSEC_NO_ECDSA */ ++ + #ifndef XMLSEC_NO_RSA + + #ifndef XMLSEC_NO_MD5 +@@ -331,16 +349,16 @@ xmlSecNssSignatureVerify(xmlSecTransformPtr transform, + signature.data = (unsigned char *)data; + signature.len = dataSize; + +- if(ctx->alg == SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) { ++ if(ctx->alg == SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST || ctx->alg == SEC_OID_ANSIX962_ECDSA_SHA256_SIGNATURE) { + /* This creates a signature which is ASN1 encoded */ + SECItem signatureDer; + SECStatus statusDer; + +- statusDer = DSAU_EncodeDerSig(&signatureDer, &signature); ++ statusDer = DSAU_EncodeDerSigWithLen(&signatureDer, &signature, signature.len); + if(statusDer != SECSuccess) { + xmlSecError(XMLSEC_ERRORS_HERE, + xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), +- "DSAU_EncodeDerSig", ++ "DSAU_EncodeDerSigWithLen", + XMLSEC_ERRORS_R_CRYPTO_FAILED, + "error code=%d", + PORT_GetError()); +@@ -484,20 +502,48 @@ xmlSecNssSignatureExecute(xmlSecTransformPtr transform, int last, xmlSecTransfor + return(-1); + } + +- if(ctx->alg == SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) { ++ if(ctx->alg == SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST || ctx->alg == SEC_OID_ANSIX962_ECDSA_SHA256_SIGNATURE) { + /* This creates a signature which is ASN1 encoded */ + SECItem * signatureClr; + +- signatureClr = DSAU_DecodeDerSig(&signature); +- if(signatureClr == NULL) { +- xmlSecError(XMLSEC_ERRORS_HERE, +- xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), +- "DSAU_EncodeDerSig", +- XMLSEC_ERRORS_R_CRYPTO_FAILED, +- "error code=%d", +- PORT_GetError()); +- SECITEM_FreeItem(&signature, PR_FALSE); +- return(-1); ++ if(ctx->alg == SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) { ++ signatureClr = DSAU_DecodeDerSig(&signature); ++ if(signatureClr == NULL) { ++ xmlSecError(XMLSEC_ERRORS_HERE, ++ xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), ++ "DSAU_DecodeDerSig", ++ XMLSEC_ERRORS_R_CRYPTO_FAILED, ++ "error code=%d", ++ PORT_GetError()); ++ SECITEM_FreeItem(&signature, PR_FALSE); ++ return(-1); ++ } ++ } else { ++ /* In the ECDSA case the signature length depends on the ++ * key parameters. */ ++ int signatureSize = PK11_SignatureLen(ctx->u.sig.privkey); ++ if(signatureSize < 1) { ++ xmlSecError(XMLSEC_ERRORS_HERE, ++ xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), ++ "PK11_SignatureLen", ++ XMLSEC_ERRORS_R_CRYPTO_FAILED, ++ "error code=%d", ++ PORT_GetError()); ++ SECITEM_FreeItem(&signature, PR_FALSE); ++ return(-1); ++ } ++ ++ signatureClr = DSAU_DecodeDerSigToLen(&signature, signatureSize); ++ if(signatureClr == NULL) { ++ xmlSecError(XMLSEC_ERRORS_HERE, ++ xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), ++ "DSAU_DecodeDerSigToLen", ++ XMLSEC_ERRORS_R_CRYPTO_FAILED, ++ "error code=%d", ++ PORT_GetError()); ++ SECITEM_FreeItem(&signature, PR_FALSE); ++ return(-1); ++ } + } + + ret = xmlSecBufferSetData(out, signatureClr->data, signatureClr->len); +@@ -598,6 +644,56 @@ xmlSecNssTransformDsaSha1GetKlass(void) { + + #endif /* XMLSEC_NO_DSA */ + ++#ifndef XMLSEC_NO_ECDSA ++#ifndef XMLSEC_NO_SHA256 ++/**************************************************************************** ++ * ++ * ECDSA-SHA256 signature transform ++ * ++ ***************************************************************************/ ++ ++static xmlSecTransformKlass xmlSecNssEcdsaSha256Klass = { ++ /* klass/object sizes */ ++ sizeof(xmlSecTransformKlass), /* xmlSecSize klassSize */ ++ xmlSecNssSignatureSize, /* xmlSecSize objSize */ ++ ++ xmlSecNameEcdsaSha256, /* const xmlChar* name; */ ++ xmlSecHrefEcdsaSha256, /* const xmlChar* href; */ ++ xmlSecTransformUsageSignatureMethod, /* xmlSecTransformUsage usage; */ ++ ++ xmlSecNssSignatureInitialize, /* xmlSecTransformInitializeMethod initialize; */ ++ xmlSecNssSignatureFinalize, /* xmlSecTransformFinalizeMethod finalize; */ ++ NULL, /* xmlSecTransformNodeReadMethod readNode; */ ++ NULL, /* xmlSecTransformNodeWriteMethod writeNode; */ ++ xmlSecNssSignatureSetKeyReq, /* xmlSecTransformSetKeyReqMethod setKeyReq; */ ++ xmlSecNssSignatureSetKey, /* xmlSecTransformSetKeyMethod setKey; */ ++ xmlSecNssSignatureVerify, /* xmlSecTransformVerifyMethod verify; */ ++ xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */ ++ xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */ ++ xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */ ++ NULL, /* xmlSecTransformPushXmlMethod pushXml; */ ++ NULL, /* xmlSecTransformPopXmlMethod popXml; */ ++ xmlSecNssSignatureExecute, /* xmlSecTransformExecuteMethod execute; */ ++ ++ NULL, /* void* reserved0; */ ++ NULL, /* void* reserved1; */ ++}; ++ ++/** ++ * xmlSecNssTransformEcdsaSha256GetKlass: ++ * ++ * The ECDSA-SHA256 signature transform klass. ++ * ++ * Returns: ECDSA-SHA256 signature transform klass. ++ */ ++xmlSecTransformId ++xmlSecNssTransformEcdsaSha256GetKlass(void) { ++ return(&xmlSecNssEcdsaSha256Klass); ++} ++ ++#endif /* XMLSEC_NO_SHA256 */ ++#endif /* XMLSEC_NO_ECDSA */ ++ + #ifndef XMLSEC_NO_RSA + + #ifndef XMLSEC_NO_MD5 +-- +2.10.2 + _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits