| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * TODO |
| * 1. The class extends the PrivateKeyImpl class in "org.apache.harmony.security" package. |
| * |
| * 2. See a compatibility with RI comments |
| * in the below "DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec)" constructor. |
| */ |
| |
| |
| package org.apache.harmony.security.provider.crypto; |
| |
| import java.io.IOException; |
| import java.io.NotActiveException; |
| import java.math.BigInteger; |
| import java.security.interfaces.DSAParams; |
| import java.security.interfaces.DSAPrivateKey; |
| import java.security.spec.DSAParameterSpec; |
| import java.security.spec.DSAPrivateKeySpec; |
| import java.security.spec.InvalidKeySpecException; |
| import java.security.spec.PKCS8EncodedKeySpec; |
| import org.apache.harmony.security.PrivateKeyImpl; |
| import org.apache.harmony.security.asn1.ASN1Integer; |
| import org.apache.harmony.security.pkcs8.PrivateKeyInfo; |
| import org.apache.harmony.security.utils.AlgNameMapper; |
| import org.apache.harmony.security.x509.AlgorithmIdentifier; |
| |
| /** |
| * The class provides DSAPrivateKey functionality by extending a class implementing PrivateKey |
| * and implementing methods defined in both interfaces, DSAKey and DSAPrivateKey |
| */ |
| public class DSAPrivateKeyImpl extends PrivateKeyImpl implements DSAPrivateKey { |
| |
| /** |
| * @serial |
| */ |
| private static final long serialVersionUID = -4716227614104950081L; |
| |
| private BigInteger x, g, p, q; |
| |
| private transient DSAParams params; |
| |
| /** |
| * Creates object from DSAPrivateKeySpec. |
| * |
| * @param keySpec - a DSAPrivateKeySpec object |
| */ |
| public DSAPrivateKeyImpl(DSAPrivateKeySpec keySpec) { |
| |
| super("DSA"); |
| |
| PrivateKeyInfo pki; |
| |
| g = keySpec.getG(); |
| p = keySpec.getP(); |
| q = keySpec.getQ(); |
| |
| ThreeIntegerSequence threeInts = new ThreeIntegerSequence(p |
| .toByteArray(), q.toByteArray(), g.toByteArray()); |
| |
| AlgorithmIdentifier ai = new AlgorithmIdentifier(AlgNameMapper |
| .map2OID("DSA"), |
| threeInts.getEncoded()); |
| x = keySpec.getX(); |
| |
| pki = new PrivateKeyInfo(0, ai, ASN1Integer.getInstance().encode( |
| x.toByteArray()), null); |
| |
| setEncoding(pki.getEncoded()); |
| |
| params = new DSAParameterSpec(p, q, g); |
| } |
| |
| /** |
| * Creates object from PKCS8EncodedKeySpec. |
| * |
| * @param keySpec - a XPKCS8EncodedKeySpec object |
| * |
| * @throws InvalidKeySpecException - if key data cannot be obtain from encoded format |
| */ |
| public DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec) |
| throws InvalidKeySpecException { |
| |
| super("DSA"); |
| |
| AlgorithmIdentifier ai; |
| ThreeIntegerSequence threeInts = null; |
| |
| String alg, algName; |
| |
| byte[] encoding = keySpec.getEncoded(); |
| |
| PrivateKeyInfo privateKeyInfo = null; |
| |
| try { |
| privateKeyInfo = (PrivateKeyInfo) PrivateKeyInfo.ASN1 |
| .decode(encoding); |
| } catch (IOException e) { |
| throw new InvalidKeySpecException("Failed to decode keySpec encoding: " + e); |
| } |
| |
| try { |
| x = new BigInteger((byte[]) ASN1Integer.getInstance().decode( |
| privateKeyInfo.getPrivateKey())); |
| } catch (IOException e) { |
| throw new InvalidKeySpecException("Failed to decode parameters: " + e); |
| } |
| |
| ai = privateKeyInfo.getAlgorithmIdentifier(); |
| try { |
| threeInts = (ThreeIntegerSequence) ThreeIntegerSequence.ASN1 |
| .decode(ai.getParameters()); |
| } catch (IOException e) { |
| throw new InvalidKeySpecException("Failed to decode parameters: " + e); |
| } |
| p = new BigInteger(threeInts.p); |
| q = new BigInteger(threeInts.q); |
| g = new BigInteger(threeInts.g); |
| params = new DSAParameterSpec(p, q, g); |
| setEncoding(encoding); |
| |
| /* |
| * the following code implements RI behavior |
| */ |
| alg = ai.getAlgorithm(); |
| algName = AlgNameMapper.map2AlgName(alg); |
| setAlgorithm(algName == null ? alg : algName); |
| } |
| |
| public BigInteger getX() { |
| return x; |
| } |
| |
| public DSAParams getParams() { |
| return params; |
| } |
| |
| private void readObject(java.io.ObjectInputStream in) throws NotActiveException, IOException, ClassNotFoundException { |
| in.defaultReadObject(); |
| params = new DSAParameterSpec(p, q, g); |
| } |
| |
| } |