package com.runjva.sourceforge.jsocks.protocol;

/**
 * This interface provides for datagram encapsulation for SOCKSv5 protocol.
 * <p>
 * SOCKSv5 allows for datagrams to be encapsulated for purposes of integrity
 * and/or authenticity. How it should be done is aggreed during the
 * authentication stage, and is authentication dependent. This interface is
 * provided to allow this encapsulation.
 * 
 * @see Authentication
 */
public interface UDPEncapsulation {

	/**
	 * This method should provide any authentication depended transformation on
	 * datagrams being send from/to the client.
	 * 
	 * @param data
	 *            Datagram data (including any SOCKS related bytes), to be
	 *            encapsulated/decapsulated.
	 * @param out
	 *            Wether the data is being send out. If true method should
	 *            encapsulate/encrypt data, otherwise it should decapsulate/
	 *            decrypt data.
	 * @throw IOException if for some reason data can be transformed correctly.
	 * @return Should return byte array containing data after transformation. It
	 *         is possible to return same array as input, if transformation only
	 *         involves bit mangling, and no additional data is being added or
	 *         removed.
	 */
	byte[] udpEncapsulate(byte[] data, boolean out) throws java.io.IOException;
}
