1746a236e2be5dee62c482e27f4c682496d071d8bKenny Root/*
2746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * Copyright (C) 2012 The Android Open Source Project
3746a236e2be5dee62c482e27f4c682496d071d8bKenny Root *
4746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * you may not use this file except in compliance with the License.
6746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * You may obtain a copy of the License at
7746a236e2be5dee62c482e27f4c682496d071d8bKenny Root *
8746a236e2be5dee62c482e27f4c682496d071d8bKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9746a236e2be5dee62c482e27f4c682496d071d8bKenny Root *
10746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * Unless required by applicable law or agreed to in writing, software
11746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * See the License for the specific language governing permissions and
14746a236e2be5dee62c482e27f4c682496d071d8bKenny Root * limitations under the License.
15746a236e2be5dee62c482e27f4c682496d071d8bKenny Root */
16746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
17746a236e2be5dee62c482e27f4c682496d071d8bKenny Rootpackage org.apache.harmony.xnet.provider.jsse;
18746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
19746a236e2be5dee62c482e27f4c682496d071d8bKenny Rootimport java.math.BigInteger;
20746a236e2be5dee62c482e27f4c682496d071d8bKenny Rootimport java.security.interfaces.DSAParams;
21d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Rootimport java.security.spec.AlgorithmParameterSpec;
22746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
23d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Rootpublic class OpenSSLDSAParams implements DSAParams, AlgorithmParameterSpec {
24746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
25746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private OpenSSLKey key;
26746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
27746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private boolean fetchedParams;
28746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
29746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private BigInteger g;
30746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
31746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private BigInteger p;
32746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
33746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private BigInteger q;
34746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
35746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private BigInteger y;
36746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
37746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    private BigInteger x;
38746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
39746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    OpenSSLDSAParams(OpenSSLKey key) {
40746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        this.key = key;
41746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
42746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
43d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    OpenSSLKey getOpenSSLKey() {
44d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        return key;
45d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    }
46d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
47beac31ef5949d994a7096f20f12fcf929b06884dKenny Root    private synchronized final void ensureReadParams() {
48746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        if (fetchedParams) {
49746a236e2be5dee62c482e27f4c682496d071d8bKenny Root            return;
50746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        }
51746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
52746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        byte[][] params = NativeCrypto.get_DSA_params(key.getPkeyContext());
53746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        g = new BigInteger(params[0]);
54746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        p = new BigInteger(params[1]);
55746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        q = new BigInteger(params[2]);
56beac31ef5949d994a7096f20f12fcf929b06884dKenny Root        if (params[3] != null) {
57beac31ef5949d994a7096f20f12fcf929b06884dKenny Root            y = new BigInteger(params[3]);
58beac31ef5949d994a7096f20f12fcf929b06884dKenny Root        }
59beac31ef5949d994a7096f20f12fcf929b06884dKenny Root        if (params[4] != null) {
60beac31ef5949d994a7096f20f12fcf929b06884dKenny Root            x = new BigInteger(params[4]);
61beac31ef5949d994a7096f20f12fcf929b06884dKenny Root        }
62746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
63746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        fetchedParams = true;
64746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
65746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
66746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    @Override
67746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    public BigInteger getG() {
68746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        ensureReadParams();
69746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        return g;
70746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
71746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
72746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    @Override
73746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    public BigInteger getP() {
74746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        ensureReadParams();
75746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        return p;
76746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
77746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
78746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    @Override
79746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    public BigInteger getQ() {
80746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        ensureReadParams();
81746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        return q;
82746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
83746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
84746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    BigInteger getY() {
85746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        ensureReadParams();
86746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        return y;
87746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
88746a236e2be5dee62c482e27f4c682496d071d8bKenny Root
89746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    BigInteger getX() {
90746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        ensureReadParams();
91746a236e2be5dee62c482e27f4c682496d071d8bKenny Root        return x;
92746a236e2be5dee62c482e27f4c682496d071d8bKenny Root    }
93d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
94d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    @Override
95d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    public boolean equals(Object o) {
96d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        if (o == this) {
97d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            return true;
98d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        }
99d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
100d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        if (o instanceof OpenSSLDSAParams) {
101d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            OpenSSLDSAParams other = (OpenSSLDSAParams) o;
102d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
103d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            /*
104d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root             * We can shortcut the true case, but it still may be equivalent but
105d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root             * different copies.
106d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root             */
107d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            if (key == other.getOpenSSLKey()) {
108d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root                return true;
109d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            }
110d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        }
111d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
112d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        if (!(o instanceof DSAParams)) {
113d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root            return false;
114d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        }
115d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
116d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        ensureReadParams();
117d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
118d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        DSAParams other = (DSAParams) o;
119d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        return g.equals(other.getG()) && p.equals(other.getP()) && q.equals(other.getQ());
120d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    }
121d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
122d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    @Override
123d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    public int hashCode() {
124d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        ensureReadParams();
125d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
126d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        return g.hashCode() ^ p.hashCode() ^ q.hashCode();
127d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    }
128d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
129d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    @Override
130d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    public String toString() {
131d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        ensureReadParams();
132d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
133d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        final StringBuilder sb = new StringBuilder("OpenSSLDSAParams{");
134d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append("G=");
135d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append(g.toString(16));
136d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append(",P=");
137d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append(p.toString(16));
138d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append(",Q=");
139d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append(q.toString(16));
140d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        sb.append('}');
141d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root
142d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root        return sb.toString();
143d036721c2ecd146acef9f36408c7a397dd0a0785Kenny Root    }
144746a236e2be5dee62c482e27f4c682496d071d8bKenny Root}
145