summaryrefslogtreecommitdiff
path: root/gnu/java/security/provider/DSAParameters.java
blob: a73cd2be3380c1ccdf211cb937d6432dda693fff (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
116
117
118
119
120
121
/* DSAParameters.java --- DSA Parameters Implementation
   
  Copyright (c) 1999 by Free Software Foundation, Inc.
  Written by Mark Benvenuto <ivymccough@worldnet.att.net>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU Library General Public License as published 
  by the Free Software Foundation, version 2. (see COPYING.LIB)

  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation
  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. */

package gnu.java.security.provider;

import java.io.IOException;
import java.math.BigInteger;
import java.security.AlgorithmParametersSpi;
import java.security.InvalidAlgorithmParameterException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.DSAParameterSpec;
import java.security.spec.InvalidParameterSpecException;
import java.util.Random;
import gnu.java.security.der.DEREncodingException;

import gnu.java.security.util.Prime;

/*
	ASN.1 Encoding for DSA from rfc2459 

        id-dsa ID ::= { iso(1) member-body(2) us(840) x9-57(10040)
                  x9cm(4) 1 }

        Dss-Parms  ::=  SEQUENCE  {
            p             INTEGER,
            q             INTEGER,
            g             INTEGER  }

*/
public class DSAParameters extends AlgorithmParametersSpi
{
private BigInteger q; // the small prime
private BigInteger p; // the big prime
private BigInteger g;


public void engineInit(AlgorithmParameterSpec paramSpec)
                            throws InvalidParameterSpecException
{
	if( paramSpec instanceof DSAParameterSpec ) {
		DSAParameterSpec dsaParamSpec = (DSAParameterSpec)paramSpec;
		p = dsaParamSpec.getP();
		q = dsaParamSpec.getQ();
		q = dsaParamSpec.getG();
	}
	else
		throw new InvalidParameterSpecException("Only accepts DSAParameterSpec");
}

public void engineInit(byte[] params)
                            throws IOException
{
	DERReader reader = new DERReader( params );
	try {

		p = reader.getBigInteger();
		q = reader.getBigInteger();
		g = reader.getBigInteger();

	} catch ( DEREncodingException DERee) {
		throw new IOException("Invalid Format: Only accepts ASN.1");
	}
}

public void engineInit(byte[] params, String format)
                            throws IOException
{
	if( !format.equals("ASN.1") )
		throw new IOException("Invalid Format: Only accepts ASN.1");
	engineInit( params );	
}

public AlgorithmParameterSpec engineGetParameterSpec(Class paramSpec)
                          throws InvalidParameterSpecException
{
	if( paramSpec.isAssignableFrom(DSAParameterSpec.class) )
		return new DSAParameterSpec(p, q, g);
	else
		throw new InvalidParameterSpecException("Only accepts DSAParameterSpec");
}

public byte[] engineGetEncoded()
                                    throws IOException
{
	DERWriter writer = new DERWriter();
	return writer.joinarrays( writer.writeBigInteger(p), 
				writer.writeBigInteger(q), 
				writer.writeBigInteger(g) );
}


public byte[] engineGetEncoded(String format)
                                    throws IOException
{
	if( !format.equals("ASN.1") )
		throw new IOException("Invalid Format: Only accepts ASN.1");
	return engineGetEncoded();
}

public String engineToString()
{
	String lineSeparator = System.getProperty("line.seperator");
	return ("q: " + q + lineSeparator + "p: " + p + lineSeparator + "g:" + g);
}

}