Lines 595-605
exsltCryptoRc4EncryptFunction (xmlXPathP
Link Here
|
595 |
int str_len = 0, bin_len = 0, hex_len = 0; |
595 |
int str_len = 0, bin_len = 0, hex_len = 0; |
596 |
xmlChar *key = NULL, *str = NULL, *padkey = NULL; |
596 |
xmlChar *key = NULL, *str = NULL, *padkey = NULL; |
597 |
xmlChar *bin = NULL, *hex = NULL; |
597 |
xmlChar *bin = NULL, *hex = NULL; |
|
|
598 |
xsltTransformContextPtr tctxt = NULL; |
598 |
|
599 |
|
599 |
if ((nargs < 1) || (nargs > 3)) { |
600 |
if (nargs != 2) { |
600 |
xmlXPathSetArityError (ctxt); |
601 |
xmlXPathSetArityError (ctxt); |
601 |
return; |
602 |
return; |
602 |
} |
603 |
} |
|
|
604 |
tctxt = xsltXPathGetTransformContext(ctxt); |
603 |
|
605 |
|
604 |
str = xmlXPathPopString (ctxt); |
606 |
str = xmlXPathPopString (ctxt); |
605 |
str_len = xmlUTF8Strlen (str); |
607 |
str_len = xmlUTF8Strlen (str); |
Lines 611-617
exsltCryptoRc4EncryptFunction (xmlXPathP
Link Here
|
611 |
} |
613 |
} |
612 |
|
614 |
|
613 |
key = xmlXPathPopString (ctxt); |
615 |
key = xmlXPathPopString (ctxt); |
614 |
key_len = xmlUTF8Strlen (str); |
616 |
key_len = xmlUTF8Strlen (key); |
615 |
|
617 |
|
616 |
if (key_len == 0) { |
618 |
if (key_len == 0) { |
617 |
xmlXPathReturnEmptyString (ctxt); |
619 |
xmlXPathReturnEmptyString (ctxt); |
Lines 620-634
exsltCryptoRc4EncryptFunction (xmlXPathP
Link Here
|
620 |
return; |
622 |
return; |
621 |
} |
623 |
} |
622 |
|
624 |
|
623 |
padkey = xmlMallocAtomic (RC4_KEY_LENGTH); |
625 |
padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1); |
|
|
626 |
if (padkey == NULL) { |
627 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
628 |
"exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n"); |
629 |
tctxt->state = XSLT_STATE_STOPPED; |
630 |
xmlXPathReturnEmptyString (ctxt); |
631 |
goto done; |
632 |
} |
633 |
memset(padkey, 0, RC4_KEY_LENGTH + 1); |
634 |
|
624 |
key_size = xmlUTF8Strsize (key, key_len); |
635 |
key_size = xmlUTF8Strsize (key, key_len); |
|
|
636 |
if ((key_size > RC4_KEY_LENGTH) || (key_size < 0)) { |
637 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
638 |
"exsltCryptoRc4EncryptFunction: key size too long or key broken\n"); |
639 |
tctxt->state = XSLT_STATE_STOPPED; |
640 |
xmlXPathReturnEmptyString (ctxt); |
641 |
goto done; |
642 |
} |
625 |
memcpy (padkey, key, key_size); |
643 |
memcpy (padkey, key, key_size); |
626 |
memset (padkey + key_size, '\0', sizeof (padkey)); |
|
|
627 |
|
644 |
|
628 |
/* encrypt it */ |
645 |
/* encrypt it */ |
629 |
bin_len = str_len; |
646 |
bin_len = str_len; |
630 |
bin = xmlStrdup (str); |
647 |
bin = xmlStrdup (str); |
631 |
if (bin == NULL) { |
648 |
if (bin == NULL) { |
|
|
649 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
650 |
"exsltCryptoRc4EncryptFunction: Failed to allocate string\n"); |
651 |
tctxt->state = XSLT_STATE_STOPPED; |
632 |
xmlXPathReturnEmptyString (ctxt); |
652 |
xmlXPathReturnEmptyString (ctxt); |
633 |
goto done; |
653 |
goto done; |
634 |
} |
654 |
} |
Lines 638-643
exsltCryptoRc4EncryptFunction (xmlXPathP
Link Here
|
638 |
hex_len = str_len * 2 + 1; |
658 |
hex_len = str_len * 2 + 1; |
639 |
hex = xmlMallocAtomic (hex_len); |
659 |
hex = xmlMallocAtomic (hex_len); |
640 |
if (hex == NULL) { |
660 |
if (hex == NULL) { |
|
|
661 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
662 |
"exsltCryptoRc4EncryptFunction: Failed to allocate result\n"); |
663 |
tctxt->state = XSLT_STATE_STOPPED; |
641 |
xmlXPathReturnEmptyString (ctxt); |
664 |
xmlXPathReturnEmptyString (ctxt); |
642 |
goto done; |
665 |
goto done; |
643 |
} |
666 |
} |
Lines 670-680
exsltCryptoRc4DecryptFunction (xmlXPathP
Link Here
|
670 |
int str_len = 0, bin_len = 0, ret_len = 0; |
693 |
int str_len = 0, bin_len = 0, ret_len = 0; |
671 |
xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin = |
694 |
xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin = |
672 |
NULL, *ret = NULL; |
695 |
NULL, *ret = NULL; |
|
|
696 |
xsltTransformContextPtr tctxt = NULL; |
673 |
|
697 |
|
674 |
if ((nargs < 1) || (nargs > 3)) { |
698 |
if (nargs != 2) { |
675 |
xmlXPathSetArityError (ctxt); |
699 |
xmlXPathSetArityError (ctxt); |
676 |
return; |
700 |
return; |
677 |
} |
701 |
} |
|
|
702 |
tctxt = xsltXPathGetTransformContext(ctxt); |
678 |
|
703 |
|
679 |
str = xmlXPathPopString (ctxt); |
704 |
str = xmlXPathPopString (ctxt); |
680 |
str_len = xmlUTF8Strlen (str); |
705 |
str_len = xmlUTF8Strlen (str); |
Lines 686-692
exsltCryptoRc4DecryptFunction (xmlXPathP
Link Here
|
686 |
} |
711 |
} |
687 |
|
712 |
|
688 |
key = xmlXPathPopString (ctxt); |
713 |
key = xmlXPathPopString (ctxt); |
689 |
key_len = xmlUTF8Strlen (str); |
714 |
key_len = xmlUTF8Strlen (key); |
690 |
|
715 |
|
691 |
if (key_len == 0) { |
716 |
if (key_len == 0) { |
692 |
xmlXPathReturnEmptyString (ctxt); |
717 |
xmlXPathReturnEmptyString (ctxt); |
Lines 695-716
exsltCryptoRc4DecryptFunction (xmlXPathP
Link Here
|
695 |
return; |
720 |
return; |
696 |
} |
721 |
} |
697 |
|
722 |
|
698 |
padkey = xmlMallocAtomic (RC4_KEY_LENGTH); |
723 |
padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1); |
|
|
724 |
if (padkey == NULL) { |
725 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
726 |
"exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n"); |
727 |
tctxt->state = XSLT_STATE_STOPPED; |
728 |
xmlXPathReturnEmptyString (ctxt); |
729 |
goto done; |
730 |
} |
731 |
memset(padkey, 0, RC4_KEY_LENGTH + 1); |
699 |
key_size = xmlUTF8Strsize (key, key_len); |
732 |
key_size = xmlUTF8Strsize (key, key_len); |
|
|
733 |
if ((key_size > RC4_KEY_LENGTH) || (key_size < 0)) { |
734 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
735 |
"exsltCryptoRc4EncryptFunction: key size too long or key broken\n"); |
736 |
tctxt->state = XSLT_STATE_STOPPED; |
737 |
xmlXPathReturnEmptyString (ctxt); |
738 |
goto done; |
739 |
} |
700 |
memcpy (padkey, key, key_size); |
740 |
memcpy (padkey, key, key_size); |
701 |
memset (padkey + key_size, '\0', sizeof (padkey)); |
|
|
702 |
|
741 |
|
703 |
/* decode hex to binary */ |
742 |
/* decode hex to binary */ |
704 |
bin_len = str_len; |
743 |
bin_len = str_len; |
705 |
bin = xmlMallocAtomic (bin_len); |
744 |
bin = xmlMallocAtomic (bin_len); |
|
|
745 |
if (bin == NULL) { |
746 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
747 |
"exsltCryptoRc4EncryptFunction: Failed to allocate string\n"); |
748 |
tctxt->state = XSLT_STATE_STOPPED; |
749 |
xmlXPathReturnEmptyString (ctxt); |
750 |
goto done; |
751 |
} |
706 |
ret_len = exsltCryptoHex2Bin (str, str_len, bin, bin_len); |
752 |
ret_len = exsltCryptoHex2Bin (str, str_len, bin, bin_len); |
707 |
|
753 |
|
708 |
/* decrypt the binary blob */ |
754 |
/* decrypt the binary blob */ |
709 |
ret = xmlMallocAtomic (ret_len); |
755 |
ret = xmlMallocAtomic (ret_len); |
|
|
756 |
if (ret == NULL) { |
757 |
xsltTransformError(tctxt, NULL, tctxt->inst, |
758 |
"exsltCryptoRc4EncryptFunction: Failed to allocate result\n"); |
759 |
tctxt->state = XSLT_STATE_STOPPED; |
760 |
xmlXPathReturnEmptyString (ctxt); |
761 |
goto done; |
762 |
} |
710 |
PLATFORM_RC4_DECRYPT (ctxt, padkey, bin, ret_len, ret, ret_len); |
763 |
PLATFORM_RC4_DECRYPT (ctxt, padkey, bin, ret_len, ret, ret_len); |
711 |
|
764 |
|
712 |
xmlXPathReturnString (ctxt, ret); |
765 |
xmlXPathReturnString (ctxt, ret); |
713 |
|
766 |
|
|
|
767 |
done: |
714 |
if (key != NULL) |
768 |
if (key != NULL) |
715 |
xmlFree (key); |
769 |
xmlFree (key); |
716 |
if (str != NULL) |
770 |
if (str != NULL) |