001: /*
002: * @(#)DSAPublicKey.java 1.63 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.security.provider;
029:
030: import java.util.*;
031: import java.io.*;
032: import java.math.BigInteger;
033: import java.security.InvalidKeyException;
034: import java.security.ProviderException;
035: import java.security.AlgorithmParameters;
036: import java.security.spec.DSAParameterSpec;
037: import java.security.spec.InvalidParameterSpecException;
038: import java.security.interfaces.DSAParams;
039:
040: import sun.security.x509.X509Key;
041: import sun.security.x509.AlgIdDSA;
042: import sun.security.util.Debug;
043: import sun.security.util.DerValue;
044: import sun.security.util.DerInputStream;
045: import sun.security.util.DerOutputStream;
046:
047: /**
048: * An X.509 public key for the Digital Signature Algorithm.
049: *
050: * @author Benjamin Renaud
051: *
052: * @version 1.57, 02/02/00
053: *
054: * @see DSAPrivateKey
055: * @see AlgIdDSA
056: * @see DSA
057: */
058:
059: public final class DSAPublicKey extends X509Key implements
060: java.security.interfaces.DSAPublicKey, Serializable {
061:
062: /** use serialVersionUID from JDK 1.1. for interoperability */
063: private static final long serialVersionUID = -2994193307391104133L;
064:
065: /* the public key */
066: private BigInteger y;
067:
068: /*
069: * Keep this constructor for backwards compatibility with JDK1.1.
070: */
071: public DSAPublicKey() {
072: }
073:
074: /**
075: * Make a DSA public key out of a public key and three parameters.
076: * The p, q, and g parameters may be null, but if so, parameters will need
077: * to be supplied from some other source before this key can be used in
078: * cryptographic operations. PKIX RFC2459bis explicitly allows DSA public
079: * keys without parameters, where the parameters are provided in the
080: * issuer's DSA public key.
081: *
082: * @param y the actual key bits
083: * @param p DSA parameter p, may be null if all of p, q, and g are null.
084: * @param q DSA parameter q, may be null if all of p, q, and g are null.
085: * @param g DSA parameter g, may be null if all of p, q, and g are null.
086: */
087: public DSAPublicKey(BigInteger y, BigInteger p, BigInteger q,
088: BigInteger g) throws InvalidKeyException {
089: this .y = y;
090: algid = new AlgIdDSA(p, q, g);
091:
092: try {
093: key = new DerValue(DerValue.tag_Integer, y.toByteArray())
094: .toByteArray();
095: encode();
096: } catch (IOException e) {
097: throw new InvalidKeyException("could not DER encode y: "
098: + e.getMessage());
099: }
100: }
101:
102: /**
103: * Make a DSA public key from its DER encoding (X.509).
104: */
105: public DSAPublicKey(byte[] encoded) throws InvalidKeyException {
106: decode(encoded);
107: }
108:
109: /**
110: * Returns the DSA parameters associated with this key, or null if the
111: * parameters could not be parsed.
112: */
113: public DSAParams getParams() {
114: try {
115: if (algid instanceof DSAParams) {
116: return (DSAParams) algid;
117: } else {
118: DSAParameterSpec paramSpec;
119: AlgorithmParameters algParams = algid.getParameters();
120: if (algParams == null) {
121: return null;
122: }
123: paramSpec = (DSAParameterSpec) algParams
124: .getParameterSpec(DSAParameterSpec.class);
125: return (DSAParams) paramSpec;
126: }
127: } catch (InvalidParameterSpecException e) {
128: return null;
129: }
130: }
131:
132: /**
133: * Get the raw public value, y, without the parameters.
134: *
135: * @see getParameters
136: */
137: public BigInteger getY() {
138: return y;
139: }
140:
141: public String toString() {
142: return "Sun DSA Public Key\n Parameters:" + algid
143: + "\n y:\n" + Debug.toHexString(y) + "\n";
144: }
145:
146: protected void parseKeyBits() throws InvalidKeyException {
147: try {
148: DerInputStream in = new DerInputStream(key);
149: y = in.getBigInteger();
150: } catch (IOException e) {
151: throw new InvalidKeyException("Invalid key: y value\n"
152: + e.getMessage());
153: }
154: }
155: }
|