blob: 92cd5afe8e5f01706690b38c7981c042440a611f [file] [log] [blame]
package com.trilead.ssh2.packets;
import com.trilead.ssh2.util.Tokenizer;
import java.io.IOException;
import java.math.BigInteger;
/**
* TypesReader.
*
* @author Christian Plattner, plattner@trilead.com
* @version $Id: TypesReader.java,v 1.2 2008/04/01 12:38:09 cplattne Exp $
*/
public class TypesReader
{
byte[] arr;
int pos = 0;
int max = 0;
public TypesReader(byte[] arr)
{
this.arr = arr;
pos = 0;
max = arr.length;
}
public TypesReader(byte[] arr, int off)
{
this.arr = arr;
this.pos = off;
this.max = arr.length;
if ((pos < 0) || (pos > arr.length))
throw new IllegalArgumentException("Illegal offset.");
}
public TypesReader(byte[] arr, int off, int len)
{
this.arr = arr;
this.pos = off;
this.max = off + len;
if ((pos < 0) || (pos > arr.length))
throw new IllegalArgumentException("Illegal offset.");
if ((max < 0) || (max > arr.length))
throw new IllegalArgumentException("Illegal length.");
}
public int readByte() throws IOException
{
if (pos >= max)
throw new IOException("Packet too short.");
return (arr[pos++] & 0xff);
}
public byte[] readBytes(int len) throws IOException
{
if ((pos + len) > max)
throw new IOException("Packet too short.");
byte[] res = new byte[len];
System.arraycopy(arr, pos, res, 0, len);
pos += len;
return res;
}
public void readBytes(byte[] dst, int off, int len) throws IOException
{
if ((pos + len) > max)
throw new IOException("Packet too short.");
System.arraycopy(arr, pos, dst, off, len);
pos += len;
}
public boolean readBoolean() throws IOException
{
if (pos >= max)
throw new IOException("Packet too short.");
return (arr[pos++] != 0);
}
public int readUINT32() throws IOException
{
if ((pos + 4) > max)
throw new IOException("Packet too short.");
return ((arr[pos++] & 0xff) << 24) | ((arr[pos++] & 0xff) << 16) | ((arr[pos++] & 0xff) << 8)
| (arr[pos++] & 0xff);
}
public long readUINT64() throws IOException
{
if ((pos + 8) > max)
throw new IOException("Packet too short.");
long high = ((arr[pos++] & 0xff) << 24) | ((arr[pos++] & 0xff) << 16) | ((arr[pos++] & 0xff) << 8)
| (arr[pos++] & 0xff); /* sign extension may take place - will be shifted away =) */
long low = ((arr[pos++] & 0xff) << 24) | ((arr[pos++] & 0xff) << 16) | ((arr[pos++] & 0xff) << 8)
| (arr[pos++] & 0xff); /* sign extension may take place - handle below */
return (high << 32) | (low & 0xffffffffl); /* see Java language spec (15.22.1, 5.6.2) */
}
public BigInteger readMPINT() throws IOException
{
BigInteger b;
byte raw[] = readByteString();
if (raw.length == 0)
b = BigInteger.ZERO;
else
b = new BigInteger(raw);
return b;
}
public byte[] readByteString() throws IOException
{
int len = readUINT32();
if ((len + pos) > max)
throw new IOException("Malformed SSH byte string.");
byte[] res = new byte[len];
System.arraycopy(arr, pos, res, 0, len);
pos += len;
return res;
}
public String readString(String charsetName) throws IOException
{
int len = readUINT32();
if ((len + pos) > max)
throw new IOException("Malformed SSH string.");
String res = (charsetName == null) ? new String(arr, pos, len) : new String(arr, pos, len, charsetName);
pos += len;
return res;
}
public String readString() throws IOException
{
int len = readUINT32();
if ((len + pos) > max)
throw new IOException("Malformed SSH string.");
String res = new String(arr, pos, len, "ISO-8859-1");
pos += len;
return res;
}
public String[] readNameList() throws IOException
{
return Tokenizer.parseTokens(readString(), ',');
}
public int remain()
{
return max - pos;
}
}