/* * * Paros and its related class files. * * Paros is an HTTP/HTTPS proxy for assessing web application security. * Copyright (C) 2003-2004 Chinotec Technologies Company * * This program is free software; you can redistribute it and/or * modify it under the terms of the Clarified Artistic License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Clarified Artistic License for more details. * * You should have received a copy of the Clarified Artistic License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // ZAP: 2012/03/15 Changed to allow the modifying of the charset and the break lines while // encoding of the Base64. Changed to use the updated Base64 class. Changed to use // StringBuilder instead of StringBuffer. Replaced some string concatenations with calls to the // method append of the class StringBuilder. // ZAP: 2013/01/23 Clean up of exception handling/logging. // ZAP: 2013/03/03 Issue 546: Remove all template Javadoc comments // ZAP: 2014/03/03 Issue 1012: Support HTML and JavaScript encoding package org.parosproxy.paros.extension.encoder; import org.apache.commons.lang.StringEscapeUtils; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.log4j.Logger; public class Encoder { private static final Logger logger = Logger.getLogger(Encoder.class); private int base64EncodeOptions; private String base64Charset; public Encoder() { setBase64DoBreakLines(true); this.base64Charset = "UTF-8"; } public String getURLEncode(String msg) { String result = ""; try { result = URLEncoder.encode(msg, "UTF8"); } catch (UnsupportedEncodingException e) { logger.error(e.getMessage(), e); } return result; } public String getURLDecode(String msg) { String result = ""; try { result = URLDecoder.decode(msg, "UTF8"); } catch (UnsupportedEncodingException e) { logger.error(e.getMessage(), e); } return result; } public byte[] getHashSHA1(byte[] buf) throws NoSuchAlgorithmException { MessageDigest sha = MessageDigest.getInstance("SHA-1"); sha.update(buf); return sha.digest(); } public byte[] getHashMD5(byte[] buf) throws NoSuchAlgorithmException { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(buf); return md5.digest(); } public String getHexString(byte[] buf) { StringBuilder sb = new StringBuilder(20); for (int i=0; i<buf.length; i++) { int digit = buf[i] & 0xFF; String hexDigit = Integer.toHexString(digit).toUpperCase(); if (hexDigit.length() == 1) { sb.append('0'); } sb.append(hexDigit); } return sb.toString(); } public String getHTMLString(String msg){ return StringEscapeUtils.escapeHtml(msg); } public String getJavaScriptString(String msg){ return StringEscapeUtils.escapeJavaScript(msg); } public byte[] getBytes(String buf) { byte[] result = null; try { result = buf.getBytes(base64Charset); } catch (UnsupportedEncodingException e) { logger.error(e.getMessage(), e); } return result; } public String getBase64Encode(String msg) throws NullPointerException, IOException { return Base64.encodeBytes(getBytes(msg), base64EncodeOptions); } public String getBase64Decode(String msg) throws IllegalArgumentException, IOException { return new String(Base64.decode(msg, Base64.NO_OPTIONS), base64Charset); } public String getIllegalUTF8Encode(String msg, int bytes) { char [] input_array = msg.toCharArray(); if (bytes != 4 && bytes != 3) { bytes = 2; } //numbers of characters * number of bytes * ("%" + Hex + Hex) StringBuilder sbResult = new StringBuilder(input_array.length * bytes * 3); for(char c : input_array) { if (bytes == 4) { sbResult.append('%').append(Integer.toHexString(0xff & ((byte) 0xf0))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) 0x80))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0x80 | ((c & 0x7f)>>6))))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0x80 | (c & 0x3f))))); } else if (bytes == 3) { sbResult.append('%').append(Integer.toHexString(0xff & ((byte) 0xe0))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0x80 | ((c & 0x7f)>>6))))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0x80 | (c & 0x3f))))); } else { sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0xc0 | ((c & 0x7f)>>6))))); sbResult.append('%').append(Integer.toHexString(0xff & ((byte) (0x80 | (c & 0x3f))))); } } return sbResult.toString(); } public void setBase64DoBreakLines(boolean doBreakLines) { if (doBreakLines) { base64EncodeOptions = Base64.DO_BREAK_LINES; } else { base64EncodeOptions = Base64.NO_OPTIONS; } } public void setBase64Charset(String charset) { base64Charset = charset; } }