package org.apache.kerberos.kerb.crypto; public class BytesUtil { public static short bytes2short(byte[] bytes, int offset, boolean bigEndian) { short val = 0; if (bigEndian) { val += (bytes[offset + 0] & 0xff) << 8; val += (bytes[offset + 1] & 0xff); } else { val += (bytes[offset + 1] & 0xff) << 8; val += (bytes[offset + 0] & 0xff); } return val; } public static short bytes2short(byte[] bytes, boolean bigEndian) { return bytes2short(bytes, 0, bigEndian); } public static byte[] short2bytes(int val, boolean bigEndian) { byte[] bytes = new byte[2]; short2bytes(val, bytes, 0, bigEndian); return bytes; } public static void short2bytes(int val, byte[] bytes, int offset, boolean bigEndian) { if (bigEndian) { bytes[offset + 0] = (byte) ((val >> 8) & 0xff); bytes[offset + 1] = (byte) ((val) & 0xff); } else { bytes[offset + 1] = (byte) ((val >> 8) & 0xff); bytes[offset + 0] = (byte) ((val ) & 0xff); } } public static int bytes2int(byte[] bytes, boolean bigEndian) { return bytes2int(bytes, 0, bigEndian); } public static int bytes2int(byte[] bytes, int offset, boolean bigEndian) { int val = 0; if (bigEndian) { val += (bytes[offset + 0] & 0xff) << 24; val += (bytes[offset + 1] & 0xff) << 16; val += (bytes[offset + 2] & 0xff) << 8; val += (bytes[offset + 3] & 0xff); } else { val += (bytes[offset + 3] & 0xff) << 24; val += (bytes[offset + 2] & 0xff) << 16; val += (bytes[offset + 1] & 0xff) << 8; val += (bytes[offset + 0] & 0xff); } return val; } public static byte[] int2bytes(int val, boolean bigEndian) { byte[] bytes = new byte[4]; int2bytes(val, bytes, 0, bigEndian); return bytes; } public static void int2bytes(int val, byte[] bytes, int offset, boolean bigEndian) { if (bigEndian) { bytes[offset + 0] = (byte) ((val >> 24) & 0xff); bytes[offset + 1] = (byte) ((val >> 16) & 0xff); bytes[offset + 2] = (byte) ((val >> 8) & 0xff); bytes[offset + 3] = (byte) ((val) & 0xff); } else { bytes[offset + 3] = (byte) ((val >> 24) & 0xff); bytes[offset + 2] = (byte) ((val >> 16) & 0xff); bytes[offset + 1] = (byte) ((val >> 8) & 0xff); bytes[offset + 0] = (byte) ((val) & 0xff); } } public static byte[] long2bytes(long val, boolean bigEndian) { byte[] bytes = new byte[8]; long2bytes(val, bytes, 0, bigEndian); return bytes; } public static void long2bytes(long val, byte[] bytes, int offset, boolean bigEndian) { if (bigEndian) { for (int i = 0; i < 8; i++) { bytes[i + offset] = (byte) ((val >> ((7 - i) * 8)) & 0xffL); } } else { for (int i = 0; i < 8; i++) { bytes[i + offset] = (byte) ((val >> (i * 8)) & 0xffL); } } } public static long bytes2long(byte[] bytes, boolean bigEndian) { return bytes2long(bytes, 0, bigEndian); } public static long bytes2long(byte[] bytes, int offset, boolean bigEndian) { long val = 0; if (bigEndian) { for (int i = 0; i < 8; i++) { val |= (((long) bytes[i + offset]) & 0xffL) << ((7 - i) * 8); } } else { for (int i = 0; i < 8; i++) { val |= (((long) bytes[i + offset]) & 0xffL) << (i * 8); } } return val; } public static byte[] padding(byte[] data, int block) { int len = data.length; int paddingLen = len % block != 0 ? 8 - len % block : 0; if (paddingLen == 0) { return data; } byte[] result = new byte[len + + paddingLen]; System.arraycopy(data, 0, result, 0, len); return result; } public static byte[] duplicate(byte[] bytes) { return duplicate(bytes, 0, bytes.length); } public static byte[] duplicate(byte[] bytes, int offset, int len) { byte[] dup = new byte[len]; System.arraycopy(bytes, offset, dup, 0, len); return dup; } }