View | Details | Raw Unified
Collapse All | Expand All

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