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) { |
} |