changeset 277:e0da43026046 ganymed

start conversion from trilead to ganymed
author Carl Byington <carl@five-ten-sg.com>
date Fri, 18 Jul 2014 11:59:52 -0700
parents 3a1deb1040f6
children d7e088fa2123
files src/ch/ethz/ssh2/crypto/SimpleDERReader.java
diffstat 1 files changed, 169 insertions(+), 122 deletions(-) [+]
line wrap: on
line diff
--- a/src/ch/ethz/ssh2/crypto/SimpleDERReader.java	Fri Jul 18 11:57:12 2014 -0700
+++ b/src/ch/ethz/ssh2/crypto/SimpleDERReader.java	Fri Jul 18 11:59:52 2014 -0700
@@ -1,7 +1,3 @@
-/*
- * 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;
@@ -10,149 +6,200 @@
 
 /**
  * SimpleDERReader.
- * 
- * @author Christian Plattner
- * @version 2.50, 03/15/10
+ *
+ * @author Christian Plattner, plattner@trilead.com
+ * @version $Id: SimpleDERReader.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $
  */
-public class SimpleDERReader
-{
-	byte[] buffer;
-	int pos;
-	int count;
+public class SimpleDERReader {
+    private static final int CONSTRUCTED = 0x20;
+
+    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 SimpleDERReader(byte[] b)
-	{
-		resetInput(b);
-	}
-	
-	public SimpleDERReader(byte[] b, int off, int len)
-	{
-		resetInput(b, off, len);
-	}
+    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");
 
-	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;
-	}
+        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;
+    }
 
-	private byte readByte() throws IOException
-	{
-		if (count <= 0)
-			throw new IOException("DER byte array: out of data");
-		count--;
-		return buffer[pos++];
-	}
+    public int available() {
+        return count;
+    }
+
+    private int readLength() throws IOException {
+        int len = readByte() & 0xff;
+
+        if ((len & 0x80) == 0)
+            return len;
 
-	private byte[] readBytes(int len) throws IOException
-	{
-		if (len > count)
-			throw new IOException("DER byte array: out of data");
+        int remain = len & 0x7F;
+
+        if (remain == 0)
+            return -1;
 
-		byte[] b = new byte[len];
+        len = 0;
 
-		System.arraycopy(buffer, pos, b, 0, len);
-
-		pos += len;
-		count -= len;
+        while (remain > 0) {
+            len = len << 8;
+            len = len | (readByte() & 0xff);
+            remain--;
+        }
 
-		return b;
-	}
+        return len;
+    }
 
-	public int available()
-	{
-		return count;
-	}
+    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  + ")");
 
-	private int readLength() throws IOException
-	{
-		int len = readByte() & 0xff;
+        readBytes(len);
+        return type;
+    }
+
+    public BigInteger readInt() throws IOException {
+        int type = readByte() & 0xff;
 
-		if ((len & 0x80) == 0)
-			return len;
+        if (type != 0x02)
+            throw new IOException("Expected DER Integer, but found type " + type);
 
-		int remain = len & 0x7F;
+        int len = readLength();
 
-		if (remain == 0)
-			return -1;
+        if ((len < 0) || len > available())
+            throw new IOException("Illegal len in DER object (" + len  + ")");
 
-		len = 0;
-		
-		while (remain > 0)
-		{
-			len = len << 8;
-			len = len | (readByte() & 0xff);
-			remain--;
-		}
+        byte[] b = readBytes(len);
+        BigInteger bi = new BigInteger(b);
+        return bi;
+    }
+
+    public int readConstructedType() throws IOException {
+        int type = readByte() & 0xff;
 
-		return len;
-	}
+        if ((type & CONSTRUCTED) != CONSTRUCTED)
+            throw new IOException("Expected constructed type, but was " + type);
+
+        return type & 0x1f;
+    }
 
-	public int ignoreNextObject() throws IOException
-	{
-		int type = readByte() & 0xff;
+    public SimpleDERReader readConstructed() throws IOException {
+        int len = readLength();
+
+        if ((len < 0) || len > available())
+            throw new IOException("Illegal len in DER object (" + len  + ")");
 
-		int len = readLength();
+        SimpleDERReader cr = new SimpleDERReader(buffer, pos, len);
+        pos += len;
+        count -= len;
+        return cr;
+    }
 
-		if ((len < 0) || len > available())
-			throw new IOException("Illegal len in DER object (" + len  + ")");
+    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();
 
-		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 b;
+    }
+
+    public String readOid() throws IOException {
+        int type = readByte() & 0xff;
+
+        if (type != 0x06)
+            throw new IOException("Expected DER OID, but found type " + type);
+
+        int len = readLength();
 
-		if ((len < 0) || len > available())
-			throw new IOException("Illegal len in DER object (" + len  + ")");
+        if ((len < 1) || len > available())
+            throw new IOException("Illegal len in DER object (" + len  + ")");
 
-		byte[] b = readBytes(len);
-
-		return new BigInteger(b);
-	}
+        byte[] b = readBytes(len);
+        long value = 0;
+        StringBuilder sb = new StringBuilder(64);
 
-	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();
+        switch (b[0] / 40) {
+            case 0:
+                sb.append('0');
+                break;
+
+            case 1:
+                sb.append('1');
+                b[0] -= 40;
+                break;
+
+            default:
+                sb.append('2');
+                b[0] -= 80;
+                break;
+        }
 
-		if ((len < 0) || len > available())
-			throw new IOException("Illegal len in DER object (" + len  + ")");
+        for (int i = 0; i < len; i++) {
+            value = (value << 7) + (b[i] & 0x7F);
+
+            if ((b[i] & 0x80) == 0) {
+                sb.append('.');
+                sb.append(value);
+                value = 0;
+            }
+        }
+
+        return sb.toString();
+    }
 
-		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();
+    public byte[] readOctetString() throws IOException {
+        int type = readByte() & 0xff;
+
+        if (type != 0x04 && type != 0x03)
+            throw new IOException("Expected DER Octetstring, but found type " + type);
 
-		if ((len < 0) || len > available())
-			throw new IOException("Illegal len in DER object (" + len  + ")");
+        int len = readLength();
 
-		return readBytes(len);
-	}
+        if ((len < 0) || len > available())
+            throw new IOException("Illegal len in DER object (" + len  + ")");
+
+        byte[] b = readBytes(len);
+        return b;
+    }
 
 }