1 /**
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one or more
4 * contributor license agreements. See the NOTICE file distributed with
5 * this work for additional information regarding copyright ownership.
6 * The ASF licenses this file to You under the Apache License, Version 2.0
7 * (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 package org.apache.geronimo.util.jce.provider;
20
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.math.BigInteger;
24 import java.security.interfaces.DSAParams;
25 import java.security.interfaces.DSAPrivateKey;
26 import java.security.spec.DSAParameterSpec;
27 import java.security.spec.DSAPrivateKeySpec;
28 import java.util.Enumeration;
29 import java.util.Hashtable;
30 import java.util.Vector;
31
32 import org.apache.geronimo.util.asn1.ASN1Sequence;
33 import org.apache.geronimo.util.asn1.DEREncodable;
34 import org.apache.geronimo.util.asn1.DERInteger;
35 import org.apache.geronimo.util.asn1.DERObjectIdentifier;
36 import org.apache.geronimo.util.asn1.DEROutputStream;
37 import org.apache.geronimo.util.asn1.pkcs.PrivateKeyInfo;
38 import org.apache.geronimo.util.asn1.x509.AlgorithmIdentifier;
39 import org.apache.geronimo.util.asn1.x509.DSAParameter;
40 import org.apache.geronimo.util.asn1.x9.X9ObjectIdentifiers;
41 import org.apache.geronimo.util.crypto.params.DSAPrivateKeyParameters;
42 import org.apache.geronimo.util.jce.interfaces.PKCS12BagAttributeCarrier;
43
44 public class JDKDSAPrivateKey
45 implements DSAPrivateKey, PKCS12BagAttributeCarrier
46 {
47 BigInteger x;
48 DSAParams dsaSpec;
49
50 private Hashtable pkcs12Attributes = new Hashtable();
51 private Vector pkcs12Ordering = new Vector();
52
53 protected JDKDSAPrivateKey()
54 {
55 }
56
57 JDKDSAPrivateKey(
58 DSAPrivateKey key)
59 {
60 this.x = key.getX();
61 this.dsaSpec = key.getParams();
62 }
63
64 JDKDSAPrivateKey(
65 DSAPrivateKeySpec spec)
66 {
67 this.x = spec.getX();
68 this.dsaSpec = new DSAParameterSpec(spec.getP(), spec.getQ(), spec.getG());
69 }
70
71 JDKDSAPrivateKey(
72 PrivateKeyInfo info)
73 {
74 DSAParameter params = new DSAParameter((ASN1Sequence)info.getAlgorithmId().getParameters());
75 DERInteger derX = (DERInteger)info.getPrivateKey();
76
77 this.x = derX.getValue();
78 this.dsaSpec = new DSAParameterSpec(params.getP(), params.getQ(), params.getG());
79 }
80
81 JDKDSAPrivateKey(
82 DSAPrivateKeyParameters params)
83 {
84 this.x = params.getX();
85 this.dsaSpec = new DSAParameterSpec(params.getParameters().getP(), params.getParameters().getQ(), params.getParameters().getG());
86 }
87
88 public String getAlgorithm()
89 {
90 return "DSA";
91 }
92
93 /**
94 * return the encoding format we produce in getEncoded().
95 *
96 * @return the string "PKCS#8"
97 */
98 public String getFormat()
99 {
100 return "PKCS#8";
101 }
102
103 /**
104 * Return a PKCS8 representation of the key. The sequence returned
105 * represents a full PrivateKeyInfo object.
106 *
107 * @return a PKCS8 representation of the key.
108 */
109 public byte[] getEncoded()
110 {
111 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
112 DEROutputStream dOut = new DEROutputStream(bOut);
113 PrivateKeyInfo info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_dsa, new DSAParameter(dsaSpec.getP(), dsaSpec.getQ(), dsaSpec.getG()).getDERObject()), new DERInteger(getX()));
114
115 try
116 {
117 dOut.writeObject(info);
118 dOut.close();
119 }
120 catch (IOException e)
121 {
122 throw new RuntimeException("Error encoding DSA private key");
123 }
124
125 return bOut.toByteArray();
126 }
127
128 public DSAParams getParams()
129 {
130 return dsaSpec;
131 }
132
133 public BigInteger getX()
134 {
135 return x;
136 }
137
138 public void setBagAttribute(
139 DERObjectIdentifier oid,
140 DEREncodable attribute)
141 {
142 pkcs12Attributes.put(oid, attribute);
143 pkcs12Ordering.addElement(oid);
144 }
145
146 public DEREncodable getBagAttribute(
147 DERObjectIdentifier oid)
148 {
149 return (DEREncodable)pkcs12Attributes.get(oid);
150 }
151
152 public Enumeration getBagAttributeKeys()
153 {
154 return pkcs12Ordering.elements();
155 }
156 }