• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
3  * Please refer to the LICENSE.txt for licensing details.
4  */
5 package ch.ethz.ssh2.crypto;
6 
7 import java.io.IOException;
8 
9 import java.math.BigInteger;
10 
11 /**
12  * SimpleDERReader.
13  *
14  * @author Christian Plattner
15  * @version 2.50, 03/15/10
16  */
17 public class SimpleDERReader
18 {
19 	byte[] buffer;
20 	int pos;
21 	int count;
22 
SimpleDERReader(byte[] b)23 	public SimpleDERReader(byte[] b)
24 	{
25 		resetInput(b);
26 	}
27 
SimpleDERReader(byte[] b, int off, int len)28 	public SimpleDERReader(byte[] b, int off, int len)
29 	{
30 		resetInput(b, off, len);
31 	}
32 
resetInput(byte[] b)33 	public void resetInput(byte[] b)
34 	{
35 		resetInput(b, 0, b.length);
36 	}
37 
resetInput(byte[] b, int off, int len)38 	public void resetInput(byte[] b, int off, int len)
39 	{
40 		buffer = b;
41 		pos = off;
42 		count = len;
43 	}
44 
readByte()45 	private byte readByte() throws IOException
46 	{
47 		if (count <= 0)
48 			throw new IOException("DER byte array: out of data");
49 		count--;
50 		return buffer[pos++];
51 	}
52 
readBytes(int len)53 	private byte[] readBytes(int len) throws IOException
54 	{
55 		if (len > count)
56 			throw new IOException("DER byte array: out of data");
57 
58 		byte[] b = new byte[len];
59 
60 		System.arraycopy(buffer, pos, b, 0, len);
61 
62 		pos += len;
63 		count -= len;
64 
65 		return b;
66 	}
67 
available()68 	public int available()
69 	{
70 		return count;
71 	}
72 
readLength()73 	private int readLength() throws IOException
74 	{
75 		int len = readByte() & 0xff;
76 
77 		if ((len & 0x80) == 0)
78 			return len;
79 
80 		int remain = len & 0x7F;
81 
82 		if (remain == 0)
83 			return -1;
84 
85 		len = 0;
86 
87 		while (remain > 0)
88 		{
89 			len = len << 8;
90 			len = len | (readByte() & 0xff);
91 			remain--;
92 		}
93 
94 		return len;
95 	}
96 
ignoreNextObject()97 	public int ignoreNextObject() throws IOException
98 	{
99 		int type = readByte() & 0xff;
100 
101 		int len = readLength();
102 
103 		if ((len < 0) || len > available())
104 			throw new IOException("Illegal len in DER object (" + len  + ")");
105 
106 		readBytes(len);
107 
108 		return type;
109 	}
110 
readInt()111 	public BigInteger readInt() throws IOException
112 	{
113 		int type = readByte() & 0xff;
114 
115 		if (type != 0x02)
116 			throw new IOException("Expected DER Integer, but found type " + type);
117 
118 		int len = readLength();
119 
120 		if ((len < 0) || len > available())
121 			throw new IOException("Illegal len in DER object (" + len  + ")");
122 
123 		byte[] b = readBytes(len);
124 
125 		return new BigInteger(b);
126 	}
127 
readSequenceAsByteArray()128 	public byte[] readSequenceAsByteArray() throws IOException
129 	{
130 		int type = readByte() & 0xff;
131 
132 		if (type != 0x30)
133 			throw new IOException("Expected DER Sequence, but found type " + type);
134 
135 		int len = readLength();
136 
137 		if ((len < 0) || len > available())
138 			throw new IOException("Illegal len in DER object (" + len  + ")");
139 
140 		return readBytes(len);
141 	}
142 
readOctetString()143 	public byte[] readOctetString() throws IOException
144 	{
145 		int type = readByte() & 0xff;
146 
147 		if (type != 0x04)
148 			throw new IOException("Expected DER Octetstring, but found type " + type);
149 
150 		int len = readLength();
151 
152 		if ((len < 0) || len > available())
153 			throw new IOException("Illegal len in DER object (" + len  + ")");
154 
155 		return readBytes(len);
156 	}
157 
158 }
159