diff src/ch/ethz/ssh2/crypto/SimpleDERReader.java @ 273:91a31873c42a ganymed

start conversion from trilead to ganymed
author Carl Byington <carl@five-ten-sg.com>
date Fri, 18 Jul 2014 11:21:46 -0700
parents
children e0da43026046
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ch/ethz/ssh2/crypto/SimpleDERReader.java	Fri Jul 18 11:21:46 2014 -0700
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
+ * Please refer to the LICENSE.txt for licensing details.
+ */
+package ch.ethz.ssh2.crypto;
+
+import java.io.IOException;
+
+import java.math.BigInteger;
+
+/**
+ * SimpleDERReader.
+ * 
+ * @author Christian Plattner
+ * @version 2.50, 03/15/10
+ */
+public class SimpleDERReader
+{
+	byte[] buffer;
+	int pos;
+	int count;
+
+	public SimpleDERReader(byte[] b)
+	{
+		resetInput(b);
+	}
+	
+	public SimpleDERReader(byte[] b, int off, int len)
+	{
+		resetInput(b, off, len);
+	}
+
+	public void resetInput(byte[] b)
+	{
+		resetInput(b, 0, b.length);
+	}
+	
+	public void resetInput(byte[] b, int off, int len)
+	{
+		buffer = b;
+		pos = off;
+		count = len;
+	}
+
+	private byte readByte() throws IOException
+	{
+		if (count <= 0)
+			throw new IOException("DER byte array: out of data");
+		count--;
+		return buffer[pos++];
+	}
+
+	private byte[] readBytes(int len) throws IOException
+	{
+		if (len > count)
+			throw new IOException("DER byte array: out of data");
+
+		byte[] b = new byte[len];
+
+		System.arraycopy(buffer, pos, b, 0, len);
+
+		pos += len;
+		count -= len;
+
+		return b;
+	}
+
+	public int available()
+	{
+		return count;
+	}
+
+	private int readLength() throws IOException
+	{
+		int len = readByte() & 0xff;
+
+		if ((len & 0x80) == 0)
+			return len;
+
+		int remain = len & 0x7F;
+
+		if (remain == 0)
+			return -1;
+
+		len = 0;
+		
+		while (remain > 0)
+		{
+			len = len << 8;
+			len = len | (readByte() & 0xff);
+			remain--;
+		}
+
+		return len;
+	}
+
+	public int ignoreNextObject() throws IOException
+	{
+		int type = readByte() & 0xff;
+
+		int len = readLength();
+
+		if ((len < 0) || len > available())
+			throw new IOException("Illegal len in DER object (" + len  + ")");
+
+		readBytes(len);
+		
+		return type;
+	}
+	
+	public BigInteger readInt() throws IOException
+	{
+		int type = readByte() & 0xff;
+		
+		if (type != 0x02)
+			throw new IOException("Expected DER Integer, but found type " + type);
+		
+		int len = readLength();
+
+		if ((len < 0) || len > available())
+			throw new IOException("Illegal len in DER object (" + len  + ")");
+
+		byte[] b = readBytes(len);
+
+		return new BigInteger(b);
+	}
+
+	public byte[] readSequenceAsByteArray() throws IOException
+	{
+		int type = readByte() & 0xff;
+		
+		if (type != 0x30)
+			throw new IOException("Expected DER Sequence, but found type " + type);
+		
+		int len = readLength();
+
+		if ((len < 0) || len > available())
+			throw new IOException("Illegal len in DER object (" + len  + ")");
+
+		return readBytes(len);
+	}
+	
+	public byte[] readOctetString() throws IOException
+	{
+		int type = readByte() & 0xff;
+		
+		if (type != 0x04)
+			throw new IOException("Expected DER Octetstring, but found type " + type);
+		
+		int len = readLength();
+
+		if ((len < 0) || len > available())
+			throw new IOException("Illegal len in DER object (" + len  + ")");
+
+		return readBytes(len);
+	}
+
+}