comparison 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
comparison
equal deleted inserted replaced
272:ce2f4e397703 273:91a31873c42a
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
23 public SimpleDERReader(byte[] b)
24 {
25 resetInput(b);
26 }
27
28 public SimpleDERReader(byte[] b, int off, int len)
29 {
30 resetInput(b, off, len);
31 }
32
33 public void resetInput(byte[] b)
34 {
35 resetInput(b, 0, b.length);
36 }
37
38 public void resetInput(byte[] b, int off, int len)
39 {
40 buffer = b;
41 pos = off;
42 count = len;
43 }
44
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
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
68 public int available()
69 {
70 return count;
71 }
72
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
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
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
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
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 }