|
Lines 595-605
exsltCryptoRc4EncryptFunction (xmlXPathP
|
Link Here
|
|---|
|
int str_len = 0, bin_len = 0, hex_len = 0; | int str_len = 0, bin_len = 0, hex_len = 0; |
xmlChar *key = NULL, *str = NULL, *padkey = NULL; | xmlChar *key = NULL, *str = NULL, *padkey = NULL; |
xmlChar *bin = NULL, *hex = NULL; | xmlChar *bin = NULL, *hex = NULL; |
|
xsltTransformContextPtr tctxt = NULL; |
| |
if ((nargs < 1) || (nargs > 3)) { |
if (nargs != 2) { |
xmlXPathSetArityError (ctxt); | xmlXPathSetArityError (ctxt); |
return; | return; |
} | } |
|
tctxt = xsltXPathGetTransformContext(ctxt); |
| |
str = xmlXPathPopString (ctxt); | str = xmlXPathPopString (ctxt); |
str_len = xmlUTF8Strlen (str); | str_len = xmlUTF8Strlen (str); |
|
Lines 611-617
exsltCryptoRc4EncryptFunction (xmlXPathP
|
Link Here
|
|---|
|
} | } |
| |
key = xmlXPathPopString (ctxt); | key = xmlXPathPopString (ctxt); |
key_len = xmlUTF8Strlen (str); |
key_len = xmlUTF8Strlen (key); |
| |
if (key_len == 0) { | if (key_len == 0) { |
xmlXPathReturnEmptyString (ctxt); | xmlXPathReturnEmptyString (ctxt); |
|
Lines 620-634
exsltCryptoRc4EncryptFunction (xmlXPathP
|
Link Here
|
|---|
|
return; | 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); | 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); | memcpy (padkey, key, key_size); |
memset (padkey + key_size, '\0', sizeof (padkey)); |
|
| |
/* encrypt it */ | /* encrypt it */ |
bin_len = str_len; | bin_len = str_len; |
bin = xmlStrdup (str); | bin = xmlStrdup (str); |
if (bin == NULL) { | if (bin == NULL) { |
|
xsltTransformError(tctxt, NULL, tctxt->inst, |
|
"exsltCryptoRc4EncryptFunction: Failed to allocate string\n"); |
|
tctxt->state = XSLT_STATE_STOPPED; |
xmlXPathReturnEmptyString (ctxt); | xmlXPathReturnEmptyString (ctxt); |
goto done; | goto done; |
} | } |
|
Lines 638-643
exsltCryptoRc4EncryptFunction (xmlXPathP
|
Link Here
|
|---|
|
hex_len = str_len * 2 + 1; | hex_len = str_len * 2 + 1; |
hex = xmlMallocAtomic (hex_len); | hex = xmlMallocAtomic (hex_len); |
if (hex == NULL) { | if (hex == NULL) { |
|
xsltTransformError(tctxt, NULL, tctxt->inst, |
|
"exsltCryptoRc4EncryptFunction: Failed to allocate result\n"); |
|
tctxt->state = XSLT_STATE_STOPPED; |
xmlXPathReturnEmptyString (ctxt); | xmlXPathReturnEmptyString (ctxt); |
goto done; | goto done; |
} | } |
|
Lines 670-680
exsltCryptoRc4DecryptFunction (xmlXPathP
|
Link Here
|
|---|
|
int str_len = 0, bin_len = 0, ret_len = 0; | int str_len = 0, bin_len = 0, ret_len = 0; |
xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin = | xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin = |
NULL, *ret = NULL; | NULL, *ret = NULL; |
|
xsltTransformContextPtr tctxt = NULL; |
| |
if ((nargs < 1) || (nargs > 3)) { |
if (nargs != 2) { |
xmlXPathSetArityError (ctxt); | xmlXPathSetArityError (ctxt); |
return; | return; |
} | } |
|
tctxt = xsltXPathGetTransformContext(ctxt); |
| |
str = xmlXPathPopString (ctxt); | str = xmlXPathPopString (ctxt); |
str_len = xmlUTF8Strlen (str); | str_len = xmlUTF8Strlen (str); |
|
Lines 686-692
exsltCryptoRc4DecryptFunction (xmlXPathP
|
Link Here
|
|---|
|
} | } |
| |
key = xmlXPathPopString (ctxt); | key = xmlXPathPopString (ctxt); |
key_len = xmlUTF8Strlen (str); |
key_len = xmlUTF8Strlen (key); |
| |
if (key_len == 0) { | if (key_len == 0) { |
xmlXPathReturnEmptyString (ctxt); | xmlXPathReturnEmptyString (ctxt); |
|
Lines 695-716
exsltCryptoRc4DecryptFunction (xmlXPathP
|
Link Here
|
|---|
|
return; | 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); | 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); | memcpy (padkey, key, key_size); |
memset (padkey + key_size, '\0', sizeof (padkey)); |
|
| |
/* decode hex to binary */ | /* decode hex to binary */ |
bin_len = str_len; | bin_len = str_len; |
bin = xmlMallocAtomic (bin_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); | ret_len = exsltCryptoHex2Bin (str, str_len, bin, bin_len); |
| |
/* decrypt the binary blob */ | /* decrypt the binary blob */ |
ret = xmlMallocAtomic (ret_len); | 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); | PLATFORM_RC4_DECRYPT (ctxt, padkey, bin, ret_len, ret, ret_len); |
| |
xmlXPathReturnString (ctxt, ret); | xmlXPathReturnString (ctxt, ret); |
| |
|
done: |
if (key != NULL) | if (key != NULL) |
xmlFree (key); | xmlFree (key); |
if (str != NULL) | if (str != NULL) |