summaryrefslogtreecommitdiff
path: root/gnu/java/security/provider/DERReader.java
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;
}

}