| Index: third_party/libxslt/libexslt/crypto.c
|
| ===================================================================
|
| --- third_party/libxslt/libexslt/crypto.c (revision 39981)
|
| +++ third_party/libxslt/libexslt/crypto.c (working copy)
|
| @@ -140,7 +140,7 @@
|
| LocalFree (lpMsgBuf);
|
| }
|
|
|
| -HCRYPTHASH
|
| +static HCRYPTHASH
|
| exsltCryptoCryptoApiCreateHash (xmlXPathParserContextPtr ctxt,
|
| HCRYPTPROV hCryptProv, ALG_ID algorithm,
|
| const char *msg, unsigned int msglen,
|
| @@ -203,7 +203,7 @@
|
| CryptReleaseContext (hCryptProv, 0);
|
| }
|
|
|
| -void
|
| +static void
|
| exsltCryptoCryptoApiRc4Encrypt (xmlXPathParserContextPtr ctxt,
|
| const unsigned char *key,
|
| const unsigned char *msg, int msglen,
|
| @@ -254,7 +254,7 @@
|
| CryptReleaseContext (hCryptProv, 0);
|
| }
|
|
|
| -void
|
| +static void
|
| exsltCryptoCryptoApiRc4Decrypt (xmlXPathParserContextPtr ctxt,
|
| const unsigned char *key,
|
| const unsigned char *msg, int msglen,
|
| @@ -317,13 +317,13 @@
|
| #define PLATFORM_MD5 GCRY_MD_MD5
|
| #define PLATFORM_SHA1 GCRY_MD_SHA1
|
|
|
| -#ifdef HAVE_SYS_TYPES_H
|
| -# include <sys/types.h>
|
| -#endif
|
| -#ifdef HAVE_STDINT_H
|
| -# include <stdint.h>
|
| -#endif
|
| -
|
| +#ifdef HAVE_SYS_TYPES_H
|
| +# include <sys/types.h>
|
| +#endif
|
| +#ifdef HAVE_STDINT_H
|
| +# include <stdint.h>
|
| +#endif
|
| +
|
| #ifdef HAVE_SYS_SELECT_H
|
| #include <sys/select.h> /* needed by gcrypt.h 4 Jul 04 */
|
| #endif
|
| @@ -595,11 +595,13 @@
|
| int str_len = 0, bin_len = 0, hex_len = 0;
|
| xmlChar *key = NULL, *str = NULL, *padkey = NULL;
|
| xmlChar *bin = NULL, *hex = NULL;
|
| + xsltTransformContextPtr tctxt = NULL;
|
|
|
| - if ((nargs < 1) || (nargs > 3)) {
|
| + if (nargs != 2) {
|
| xmlXPathSetArityError (ctxt);
|
| return;
|
| }
|
| + tctxt = xsltXPathGetTransformContext(ctxt);
|
|
|
| str = xmlXPathPopString (ctxt);
|
| str_len = xmlUTF8Strlen (str);
|
| @@ -611,7 +613,7 @@
|
| }
|
|
|
| key = xmlXPathPopString (ctxt);
|
| - key_len = xmlUTF8Strlen (str);
|
| + key_len = xmlUTF8Strlen (key);
|
|
|
| if (key_len == 0) {
|
| xmlXPathReturnEmptyString (ctxt);
|
| @@ -620,15 +622,33 @@
|
| return;
|
| }
|
|
|
| - padkey = xmlMallocAtomic (RC4_KEY_LENGTH);
|
| + padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1);
|
| + if (padkey == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| + memset(padkey, 0, RC4_KEY_LENGTH + 1);
|
| +
|
| key_size = xmlUTF8Strsize (key, key_len);
|
| + if ((key_size > RC4_KEY_LENGTH) || (key_size < 0)) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: key size too long or key broken\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| memcpy (padkey, key, key_size);
|
| - memset (padkey + key_size, '\0', sizeof (padkey));
|
|
|
| /* encrypt it */
|
| bin_len = str_len;
|
| bin = xmlStrdup (str);
|
| if (bin == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate string\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| xmlXPathReturnEmptyString (ctxt);
|
| goto done;
|
| }
|
| @@ -638,6 +658,9 @@
|
| hex_len = str_len * 2 + 1;
|
| hex = xmlMallocAtomic (hex_len);
|
| if (hex == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate result\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| xmlXPathReturnEmptyString (ctxt);
|
| goto done;
|
| }
|
| @@ -670,11 +693,13 @@
|
| int str_len = 0, bin_len = 0, ret_len = 0;
|
| xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin =
|
| NULL, *ret = NULL;
|
| + xsltTransformContextPtr tctxt = NULL;
|
|
|
| - if ((nargs < 1) || (nargs > 3)) {
|
| + if (nargs != 2) {
|
| xmlXPathSetArityError (ctxt);
|
| return;
|
| }
|
| + tctxt = xsltXPathGetTransformContext(ctxt);
|
|
|
| str = xmlXPathPopString (ctxt);
|
| str_len = xmlUTF8Strlen (str);
|
| @@ -686,7 +711,7 @@
|
| }
|
|
|
| key = xmlXPathPopString (ctxt);
|
| - key_len = xmlUTF8Strlen (str);
|
| + key_len = xmlUTF8Strlen (key);
|
|
|
| if (key_len == 0) {
|
| xmlXPathReturnEmptyString (ctxt);
|
| @@ -695,22 +720,51 @@
|
| return;
|
| }
|
|
|
| - padkey = xmlMallocAtomic (RC4_KEY_LENGTH);
|
| + padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1);
|
| + if (padkey == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| + memset(padkey, 0, RC4_KEY_LENGTH + 1);
|
| key_size = xmlUTF8Strsize (key, key_len);
|
| + if ((key_size > RC4_KEY_LENGTH) || (key_size < 0)) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: key size too long or key broken\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| memcpy (padkey, key, key_size);
|
| - memset (padkey + key_size, '\0', sizeof (padkey));
|
|
|
| /* decode hex to binary */
|
| bin_len = str_len;
|
| bin = xmlMallocAtomic (bin_len);
|
| + if (bin == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate string\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| ret_len = exsltCryptoHex2Bin (str, str_len, bin, bin_len);
|
|
|
| /* decrypt the binary blob */
|
| ret = xmlMallocAtomic (ret_len);
|
| + if (ret == NULL) {
|
| + xsltTransformError(tctxt, NULL, tctxt->inst,
|
| + "exsltCryptoRc4EncryptFunction: Failed to allocate result\n");
|
| + tctxt->state = XSLT_STATE_STOPPED;
|
| + xmlXPathReturnEmptyString (ctxt);
|
| + goto done;
|
| + }
|
| PLATFORM_RC4_DECRYPT (ctxt, padkey, bin, ret_len, ret, ret_len);
|
|
|
| xmlXPathReturnString (ctxt, ret);
|
|
|
| +done:
|
| if (key != NULL)
|
| xmlFree (key);
|
| if (str != NULL)
|
| @@ -747,6 +801,11 @@
|
| }
|
|
|
| #else
|
| +/**
|
| + * exsltCryptoRegister:
|
| + *
|
| + * Registers the EXSLT - Crypto module
|
| + */
|
| void
|
| exsltCryptoRegister (void) {
|
| }
|
|
|