package org.ifsoft.rtp;
import org.ifsoft.*;
public class AESCounter
{
private Byte _key[];
private Byte _offset[];
private Byte _salt[];
public Byte[] decrypt(Byte data[], Long ssrc, Long packetIndex)
{
return encrypt(data, ssrc, packetIndex);
}
public Byte[] encrypt(Byte data[], Long ssrc, Long packetIndex)
{
Byte counter[] = new Byte[16];
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(counter).intValue();)
{
counter[num.intValue()] = _offset[num.intValue()];
Integer integer = num;
Integer integer1 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp = integer;
}
Byte integerBytesFromLongNetwork[] = BitAssistant.getIntegerBytesFromLongNetwork(ssrc);
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(integerBytesFromLongNetwork).intValue();)
{
counter[num.intValue() + 4] = new Byte((byte)(counter[num.intValue() + 4].byteValue() ^ integerBytesFromLongNetwork[num.intValue()].byteValue()));
Integer integer2 = num;
Integer integer3 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp1 = integer2;
}
Byte buffer3[] = BitAssistant.subArray(BitAssistant.getLongBytesNetwork(packetIndex), Integer.valueOf(2));
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(buffer3).intValue();)
{
counter[num.intValue() + 8] = new Byte((byte)(counter[num.intValue() + 8].byteValue() ^ buffer3[num.intValue()].byteValue()));
Integer integer4 = num;
Integer integer5 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp2 = integer4;
}
Integer length = Integer.valueOf((ArrayExtensions.getLength(data).intValue() / 16) * 16);
if(length.intValue() < ArrayExtensions.getLength(data).intValue())
length = Integer.valueOf(length.intValue() + 16);
Byte array[] = Crypto.generateAESKeystream(_key, length, counter);
if(ArrayExtensions.getLength(array).intValue() != 0)
{
array = BitAssistant.subArray(array, Integer.valueOf(0), ArrayExtensions.getLength(data));
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(array).intValue();)
{
array[num.intValue()] = new Byte((byte)(array[num.intValue()].byteValue() ^ data[num.intValue()].byteValue()));
Integer integer6 = num;
Integer integer7 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp3 = integer6;
}
}
return array;
}
public AESCounter(Byte key[], Byte salt[])
throws Exception
{
if(ArrayExtensions.getLength(key).intValue() != 16)
throw new Exception("Invalid key length.");
if(ArrayExtensions.getLength(salt).intValue() != 14)
throw new Exception("Invalid salt length.");
_key = key;
_salt = salt;
_offset = new Byte[16];
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(_offset).intValue();)
{
_offset[num.intValue()] = Byte.valueOf((byte)0);
Integer integer = num;
Integer integer2 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp = integer;
}
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(_salt).intValue();)
{
_offset[num.intValue()] = _salt[num.intValue()];
Integer integer1 = num;
Integer integer3 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp1 = integer1;
}
}
public Byte[] generate(Byte label, Integer length)
{
Byte buffer[] = new Byte[16];
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(buffer).intValue();)
{
buffer[num.intValue()] = Byte.valueOf((byte)0);
Integer integer = num;
Integer integer1 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp = integer;
}
buffer[7] = label;
Byte counter[] = new Byte[16];
for(Integer num = Integer.valueOf(0); num.intValue() < ArrayExtensions.getLength(counter).intValue();)
{
counter[num.intValue()] = new Byte((byte)(_offset[num.intValue()].byteValue() ^ buffer[num.intValue()].byteValue()));
Integer integer2 = num;
Integer integer3 = num = Integer.valueOf(num.intValue() + 1);
Integer _tmp1 = integer2;
}
Integer num2 = Integer.valueOf((length.intValue() / 16) * 16);
if(num2.intValue() < length.intValue())
num2 = Integer.valueOf(num2.intValue() + 16);
Byte array[] = Crypto.generateAESKeystream(_key, num2, counter);
if(ArrayExtensions.getLength(array).intValue() == 0)
return array;
else
return BitAssistant.subArray(array, Integer.valueOf(0), length);
}
}