• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.conscrypt;
18 
19 import java.math.BigInteger;
20 import java.security.interfaces.DSAParams;
21 import java.security.spec.AlgorithmParameterSpec;
22 
23 public class OpenSSLDSAParams implements DSAParams, AlgorithmParameterSpec {
24 
25     private OpenSSLKey key;
26 
27     private boolean fetchedParams;
28 
29     private BigInteger g;
30 
31     private BigInteger p;
32 
33     private BigInteger q;
34 
35     private BigInteger y;
36 
37     private BigInteger x;
38 
OpenSSLDSAParams(OpenSSLKey key)39     OpenSSLDSAParams(OpenSSLKey key) {
40         this.key = key;
41     }
42 
getOpenSSLKey()43     OpenSSLKey getOpenSSLKey() {
44         return key;
45     }
46 
ensureReadParams()47     private synchronized final void ensureReadParams() {
48         if (fetchedParams) {
49             return;
50         }
51 
52         byte[][] params = NativeCrypto.get_DSA_params(key.getPkeyContext());
53         if (params[0] != null) {
54             g = new BigInteger(params[0]);
55         }
56         if (params[1] != null) {
57             p = new BigInteger(params[1]);
58         }
59         if (params[2] != null) {
60             q = new BigInteger(params[2]);
61         }
62         if (params[3] != null) {
63             y = new BigInteger(params[3]);
64         }
65         if (params[4] != null) {
66             x = new BigInteger(params[4]);
67         }
68 
69         fetchedParams = true;
70     }
71 
72     @Override
getG()73     public BigInteger getG() {
74         ensureReadParams();
75         return g;
76     }
77 
78     @Override
getP()79     public BigInteger getP() {
80         ensureReadParams();
81         return p;
82     }
83 
84     @Override
getQ()85     public BigInteger getQ() {
86         ensureReadParams();
87         return q;
88     }
89 
hasParams()90     boolean hasParams() {
91         ensureReadParams();
92         return (g != null) && (p != null) && (q != null);
93     }
94 
getY()95     BigInteger getY() {
96         ensureReadParams();
97         return y;
98     }
99 
getX()100     BigInteger getX() {
101         ensureReadParams();
102         return x;
103     }
104 
105     @Override
equals(Object o)106     public boolean equals(Object o) {
107         if (o == this) {
108             return true;
109         }
110 
111         if (o instanceof OpenSSLDSAParams) {
112             OpenSSLDSAParams other = (OpenSSLDSAParams) o;
113 
114             /*
115              * We can shortcut the true case, but it still may be equivalent but
116              * different copies.
117              */
118             if (key == other.getOpenSSLKey()) {
119                 return true;
120             }
121         }
122 
123         if (!(o instanceof DSAParams)) {
124             return false;
125         }
126 
127         ensureReadParams();
128 
129         DSAParams other = (DSAParams) o;
130         return g.equals(other.getG()) && p.equals(other.getP()) && q.equals(other.getQ());
131     }
132 
133     @Override
hashCode()134     public int hashCode() {
135         ensureReadParams();
136 
137         return g.hashCode() ^ p.hashCode() ^ q.hashCode();
138     }
139 
140     @Override
toString()141     public String toString() {
142         ensureReadParams();
143 
144         final StringBuilder sb = new StringBuilder("OpenSSLDSAParams{");
145         sb.append("G=");
146         sb.append(g.toString(16));
147         sb.append(",P=");
148         sb.append(p.toString(16));
149         sb.append(",Q=");
150         sb.append(q.toString(16));
151         sb.append('}');
152 
153         return sb.toString();
154     }
155 }
156