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