blob: 66645e69e421fc023fdbce6ae9e9790b6f92ce45 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
package gnu.java.security.provider;
import java.math.BigInteger;
import gnu.java.security.der.DEREncodingException;
public class DERReader
{
byte source[];
int pos;
static final int UNIVERSAL = 1;
static final int APPLICATION = 2;
static final int CONTEXT_SPECIFIC = 3;
static final int PRIVATE = 4;
public DERReader()
{
source = null;
pos = 0;
}
public DERReader( byte source[] )
{
init( source );
}
public void init( String source )
{
init( source.getBytes() );
}
public void init( byte source[] )
{
this.source = source;
pos = 0;
}
public BigInteger getBigInteger() throws DEREncodingException
{
return new BigInteger( getPrimitive() );
}
//Reads Primitive, definite-length method
private byte[] getPrimitive() throws DEREncodingException
{
int tmp = pos;
//Read Identifier
byte identifier = source[tmp++];
if( (0x20 & identifier) != 0)
throw new DEREncodingException();
int type = translateLeadIdentifierByte(identifier);
//System.out.println("Type: " + type);
//get tag
int tag = (0x1f & identifier);
//if( tag == 0x1f)
// tag = getIdentifier(tmp);
//System.out.println("Tag: " + tag);
//get length
byte len = source[tmp]; //may be length of length parameter
long length = 0x7f & len;
int i;
if( (0x80 & len) != 0 ) {
//System.out.println("Extra Long Length");
len &= 0x7f;
//System.out.println("Length of Length: " + len);
//get length here
length = 0;
for( i = 0; i < len; i++ ) {
tmp++;
length <<= 8;
length += (source[tmp] < 0 ) ?
(256 + source[tmp]) :
source[tmp];
//System.out.println("Length of Length: " + length);
}
tmp++;
} else
tmp++;
/*System.out.println("Position: " + tmp);
System.out.println("Length: " + length);
for( i = 0; i < 10; i++)
System.out.print(source[tmp + i] + " ");
System.out.println();*/
byte tmpb[] = new byte[ (int)length ];
System.arraycopy( source, tmp, tmpb, 0, (int)length);
pos = (int)(tmp + length);
return tmpb;
}
private int translateLeadIdentifierByte(byte b)
{
if( (0x3f & b ) == b)
return UNIVERSAL;
else if( (0x7f & b ) == b)
return APPLICATION;
else if( (0xbf & b ) == b)
return CONTEXT_SPECIFIC;
else
return PRIVATE;
}
private int getIdentifier(int tpos)
{
while( (0x80 & source[tpos]) != 0)
tpos++;
return tpos;
}
}
|