Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 232172
Collapse All | Expand All

(-)libexslt/crypto.c (-8 / +62 lines)
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)

Return to bug 232172