1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /*
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  * TODO
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  * 1. The class extends the PrivateKeyImpl class in "org.apache.harmony.security" package.
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  *
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  * 2. See a compatibility with RI comments
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  *    in the below "DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec)" constructor.
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  */
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.provider.crypto;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
302f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughesimport java.io.NotActiveException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.interfaces.DSAParams;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.interfaces.DSAPrivateKey;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.DSAParameterSpec;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.DSAPrivateKeySpec;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.InvalidKeySpecException;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.PKCS8EncodedKeySpec;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.PrivateKeyImpl;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Integer;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.pkcs8.PrivateKeyInfo;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.utils.AlgNameMapper;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x509.AlgorithmIdentifier;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The class provides DSAPrivateKey functionality by extending a class implementing PrivateKey
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and implementing methods defined in both interfaces, DSAKey and DSAPrivateKey
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class DSAPrivateKeyImpl extends PrivateKeyImpl implements DSAPrivateKey {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @serial
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -4716227614104950081L;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    private BigInteger x, g, p, q;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    private transient DSAParams params;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates object from DSAPrivateKeySpec.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec - a DSAPrivateKeySpec object
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DSAPrivateKeyImpl(DSAPrivateKeySpec keySpec) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        super("DSA");
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PrivateKeyInfo pki;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
702f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        g = keySpec.getG();
712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        p = keySpec.getP();
722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        q = keySpec.getQ();
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ThreeIntegerSequence threeInts = new ThreeIntegerSequence(p
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .toByteArray(), q.toByteArray(), g.toByteArray());
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AlgorithmIdentifier ai = new AlgorithmIdentifier(AlgNameMapper
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                .map2OID("DSA"),
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                threeInts.getEncoded());
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        x = keySpec.getX();
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pki = new PrivateKeyInfo(0, ai, ASN1Integer.getInstance().encode(
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                x.toByteArray()), null);
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setEncoding(pki.getEncoded());
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        params = new DSAParameterSpec(p, q, g);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates object from PKCS8EncodedKeySpec.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec - a XPKCS8EncodedKeySpec object
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeySpecException - if key data cannot be obtain from encoded format
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec)
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeySpecException {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        super("DSA");
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AlgorithmIdentifier ai;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ThreeIntegerSequence threeInts = null;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String alg, algName;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes        byte[] encoding = keySpec.getEncoded();
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PrivateKeyInfo privateKeyInfo = null;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            privateKeyInfo = (PrivateKeyInfo) PrivateKeyInfo.ASN1
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .decode(encoding);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
115897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new InvalidKeySpecException("Failed to decode keySpec encoding: " + e);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            x = new BigInteger((byte[]) ASN1Integer.getInstance().decode(
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    privateKeyInfo.getPrivateKey()));
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
122897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new InvalidKeySpecException("Failed to decode parameters: " + e);
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ai = privateKeyInfo.getAlgorithmIdentifier();
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            threeInts = (ThreeIntegerSequence) ThreeIntegerSequence.ASN1
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .decode(ai.getParameters());
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
130897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new InvalidKeySpecException("Failed to decode parameters: " + e);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        p = new BigInteger(threeInts.p);
1332f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        q = new BigInteger(threeInts.q);
1342f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        g = new BigInteger(threeInts.g);
1352f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        params = new DSAParameterSpec(p, q, g);
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setEncoding(encoding);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
138f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        /*
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the following code implements RI behavior
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        alg = ai.getAlgorithm();
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        algName = AlgNameMapper.map2AlgName(alg);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setAlgorithm(algName == null ? alg : algName);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public BigInteger getX() {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return x;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DSAParams getParams() {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return params;
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    private void readObject(java.io.ObjectInputStream in) throws NotActiveException, IOException, ClassNotFoundException {
1559efa300c26865520498c0ed132ff9ebe499e7d84Elliott Hughes        in.defaultReadObject();
1569efa300c26865520498c0ed132ff9ebe499e7d84Elliott Hughes        params = new DSAParameterSpec(p, q, g);
1572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
160