/*
 *  Java OTR library
 *  Copyright (C) 2008-2009  Ian Goldberg, Muhaimeen Ashraf, Andrew Chung,
 *                           Can Tang
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of version 2.1 of the GNU Lesser General
 *  Public License as published by the Free Software Foundation.
 *
 *  This library 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 GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package ca.uwaterloo.crysp.otr;

public class Util {
	public static boolean arrayEquals(byte[] b1, byte[] b2){
		if(b1==null || b2==null || b1.length!=b2.length){
			return false;
		}
		for(int i=0; i<b1.length; i++){
			if(b1[i]!=b2[i]){
				return false;
			}
		}
		return true;
	}
	
	public static void checkBytes(String s, byte[] bytes) {
		String hexString = new String();
		for (int i = 0; i < bytes.length; i++) {
			hexString += Integer.toHexString((bytes[i] >>> 4) & 0x0F);
			hexString += Integer.toHexString(0x0F & bytes[i]);
		}
		System.out.println(s + ": " + hexString);
	}
	
	static void writeInt(byte[] dst, int index, int src) {
		dst[index] = (byte) ((src >> 24) & 0xff);
		dst[index + 1] = (byte) ((src >> 16) & 0xff);
		dst[index + 2] = (byte) ((src >> 8) & 0xff);
		dst[index + 3] = (byte) (src & 0xff);
	}

	static int readInt(byte[] src, int index) {
		int ret = ((int) src[index] << 24)
				| ((int) (src[index + 1] << 16) & 0xff0000)
				| ((int) (src[index + 2] << 8) & 0xff00)
				| ((int) src[index + 3] & 0xff);
		return ret;
	}
	
	static byte[] hexStringToBytes(String s){
		byte[] sbytes = s.getBytes();
		if(sbytes.length%2!=0) return null;
		byte[] ret = new byte[sbytes.length/2];
		for(int i=0; i<ret.length; i++){
			if(sbytes[2*i]>='A' && sbytes[2*i]<='F'){
				ret[i]=(byte)((sbytes[2*i]-('A'-10)) << 4);
			}else if(sbytes[2*i]>='a' && sbytes[2*i]<='f'){
				ret[i]=(byte)((sbytes[2*i]-('a'-10)) << 4);
			}
			else{
				ret[i]=(byte)((sbytes[2*i]-'0') << 4);
			}
			if(sbytes[2*i+1]>='A'&& sbytes[2*i+1]<='F'){
				ret[i] |= (byte)(sbytes[2*i+1]-('A'-10));
			}else if(sbytes[2*i+1]>='a'&& sbytes[2*i+1]<='f'){
				ret[i] |= (byte)(sbytes[2*i+1]-('a'-10));
			}
			else{
				ret[i] |= (byte)(sbytes[2*i+1]-'0');
			}
		}
		return ret;
	}
	
	static String bytesToHexString(byte[] mpi){
		byte[] hex = new byte[2*mpi.length];
		for(int i=0; i<mpi.length; i++){
			int num = (int)(mpi[i]>>4 & 0xf);
			if(num<=9){
				hex[2*i]=(byte)('0'+num);
			}else{
				hex[2*i]=(byte)('A'+num-10);
			}
			num = (int)(mpi[i] & 0xf);
			if(num<=9){
				hex[2*i+1]=(byte)('0'+num);
			}else{
				hex[2*i+1]=(byte)('A'+num-10);
			}
			
		}
		return new String(hex);
	}

}
