1package org.apache.harmony.xnet.tests.support;
2
3import java.io.ByteArrayInputStream;
4import java.security.KeyStore;
5import java.security.cert.CertificateFactory;
6import java.security.cert.X509Certificate;
7import java.security.cert.Certificate;
8import java.util.Enumeration;
9import java.util.Vector;
10import java.security.Principal;
11import java.security.PrivateKey;
12import java.net.Socket;
13
14import javax.net.ssl.X509KeyManager;
15
16public class X509KeyManagerImpl implements X509KeyManager {
17
18    private String keyType;
19    private String client = "CLIENT";
20    private String server = "SERVER";
21    private KeyStore keyTest;
22    private X509Certificate[] cert = null;
23
24    // creating a certificate
25    String certificate = "-----BEGIN CERTIFICATE-----\n"
26            + "MIICZTCCAdICBQL3AAC2MA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMSAw\n"
27            + "HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UECxMlU2VjdXJl\n"
28            + "IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NzAyMjAwMDAwMDBa\n"
29            + "Fw05ODAyMjAyMzU5NTlaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv\n"
30            + "cm5pYTESMBAGA1UEBxMJUGFsbyBBbHRvMR8wHQYDVQQKExZTdW4gTWljcm9zeXN0\n"
31            + "ZW1zLCBJbmMuMSEwHwYDVQQLExhUZXN0IGFuZCBFdmFsdWF0aW9uIE9ubHkxGjAY\n"
32            + "BgNVBAMTEWFyZ29uLmVuZy5zdW4uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\n"
33            + "iQKBgQCofmdY+PiUWN01FOzEewf+GaG+lFf132UpzATmYJkA4AEA/juW7jSi+LJk\n"
34            + "wJKi5GO4RyZoyimAL/5yIWDV6l1KlvxyKslr0REhMBaD/3Z3EsLTTEf5gVrQS6sT\n"
35            + "WMoSZAyzB39kFfsB6oUXNtV8+UKKxSxKbxvhQn267PeCz5VX2QIDAQABMA0GCSqG\n"
36            + "SIb3DQEBAgUAA34AXl3at6luiV/7I9MN5CXYoPJYI8Bcdc1hBagJvTMcmlqL2uOZ\n"
37            + "H9T5hNMEL9Tk6aI7yZPXcw/xI2K6pOR/FrMp0UwJmdxX7ljV6ZtUZf7pY492UqwC\n"
38            + "1777XQ9UEZyrKJvF5ntleeO0ayBqLGVKCWzWZX9YsXCpv47FNLZbupE=\n"
39            + "-----END CERTIFICATE-----\n";
40
41    ByteArrayInputStream certArray = new ByteArrayInputStream(certificate
42            .getBytes());
43
44    String certificate2 = "-----BEGIN CERTIFICATE-----\n"
45            + "MIICZzCCAdCgAwIBAgIBGzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY\n"
46            + "MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT\n"
47            + "A1BLSTEcMBoGA1UEAxMTRG9EIFBLSSBNZWQgUm9vdCBDQTAeFw05ODA4MDMyMjAy\n"
48            + "MjlaFw0wODA4MDQyMjAyMjlaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu\n"
49            + "IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD\n"
50            + "ExNEb0QgUEtJIE1lZCBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n"
51            + "gQDbrM/J9FrJSX+zxFUbsI9Vw5QbguVBIa95rwW/0M8+sM0r5gd+DY6iubm6wnXk\n"
52            + "CSvbfQlFEDSKr4WYeeGp+d9WlDnQdtDFLdA45tCi5SHjnW+hGAmZnld0rz6wQekF\n"
53            + "5xQaa5A6wjhMlLOjbh27zyscrorMJ1O5FBOWnEHcRv6xqQIDAQABoy8wLTAdBgNV\n"
54            + "HQ4EFgQUVrmYR6m9701cHQ3r5kXyG7zsCN0wDAYDVR0TBAUwAwEB/zANBgkqhkiG\n"
55            + "9w0BAQUFAAOBgQDVX1Y0YqC7vekeZjVxtyuC8Mnxbrz6D109AX07LEIRzNYzwZ0w\n"
56            + "MTImSp9sEzWW+3FueBIU7AxGys2O7X0qmN3zgszPfSiocBuQuXIYQctJhKjF5KVc\n"
57            + "VGQRYYlt+myhl2vy6yPzEVCjiKwMEb1Spu0irCf+lFW2hsdjvmSQMtZvOw==\n"
58            + "-----END CERTIFICATE-----\n";
59
60    ByteArrayInputStream certArray2 = new ByteArrayInputStream(certificate2
61            .getBytes());
62
63    String certificate3 = "-----BEGIN CERTIFICATE-----\n"
64            + "MIIDXDCCAsWgAwIBAgIBSjANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEY\n"
65            + "MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT\n"
66            + "A1BLSTERMA8GA1UEAxMITWVkIENBLTEwHhcNOTgwODAyMTgwMjQwWhcNMDEwODAy\n"
67            + "MTgwMjQwWjB0MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50\n"
68            + "MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTENMAsGA1UECxMEVVNBRjEgMB4G\n"
69            + "A1UEAxMXR3VtYnkuSm9zZXBoLjAwMDAwMDUwNDQwgZ8wDQYJKoZIhvcNAQEBBQAD\n"
70            + "gY0AMIGJAoGBALT/R7bPqs1c1YqXAg5HNpZLgW2HuAc7RCaP06cE4R44GBLw/fQc\n"
71            + "VRNLn5pgbTXsDnjiZVd8qEgYqjKFQka4/tNhaF7No2tBZB+oYL/eP0IWtP+h/W6D\n"
72            + "KR5+UvIIdgmx7k3t9jp2Q51JpHhhKEb9WN54trCO9Yu7PYU+LI85jEIBAgMBAAGj\n"
73            + "ggEaMIIBFjAWBgNVHSAEDzANMAsGCWCGSAFlAgELAzAfBgNVHSMEGDAWgBQzOhTo\n"
74            + "CWdhiGUkIOx5cELXppMe9jAdBgNVHQ4EFgQUkLBJl+ayKgzOp/wwBX9M1lSkCg4w\n"
75            + "DgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwgZ0GA1UdHwSBlTCBkjCBj6CB\n"
76            + "jKCBiYaBhmxkYXA6Ly9kcy0xLmNoYW1iLmRpc2EubWlsL2NuJTNkTWVkJTIwQ0El\n"
77            + "MmQxJTJjb3UlM2RQS0klMmNvdSUzZERvRCUyY28lM2RVLlMuJTIwR292ZXJubWVu\n"
78            + "dCUyY2MlM2RVUz9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0JTNiYmluYXJ5MA0G\n"
79            + "CSqGSIb3DQEBBQUAA4GBAFjapuDHMvIdUeYRyEYdShBR1JZC20tJ3MQnyBQveddz\n"
80            + "LGFDGpIkRAQU7T/5/ne8lMexyxViC21xOlK9LdbJCbVyywvb9uEm/1je9wieQQtr\n"
81            + "kjykuB+WB6qTCIslAO/eUmgzfzIENvnH8O+fH7QTr2PdkFkiPIqBJYHvw7F3XDqy\n"
82            + "-----END CERTIFICATE-----\n";
83
84    ByteArrayInputStream certArray3 = new ByteArrayInputStream(certificate3
85            .getBytes());
86
87
88    public X509KeyManagerImpl(String name) {
89        keyType = name;
90        try {
91            CertificateFactory cf = CertificateFactory.getInstance("X.509");
92            keyTest = KeyStore.getInstance(KeyStore.getDefaultType());
93            keyTest.load(null, null);
94            if (keyType.equals(client)) {
95                cert = new X509Certificate[2];
96                cert[0] = (X509Certificate) cf.generateCertificate(certArray);
97                cert[1] = (X509Certificate) cf.generateCertificate(certArray2);
98                //keyTest = KeyStore.getInstance(KeyStore.getDefaultType());
99                //keyTest.load(null, null);
100                keyTest.setCertificateEntry("clientAlias_01", cert[0]);
101                keyTest.setCertificateEntry("clientAlias_02", cert[0]);
102                keyTest.setCertificateEntry("clientAlias_03", cert[1]);
103            } else if (keyType.equals(server)) {
104                //CertificateFactory cf = CertificateFactory.getInstance("X.509");
105                cert = new X509Certificate[1];
106                cert[0] = (X509Certificate) cf.generateCertificate(certArray3);
107                //keyTest = KeyStore.getInstance(KeyStore.getDefaultType());
108                //keyTest.load(null, null);
109                keyTest.setCertificateEntry("serverAlias_00", cert[0]);
110            }
111        } catch (Exception ex) {
112            throw new IllegalArgumentException(ex.getMessage());
113        }
114    }
115
116    public String[] getClientAliases(String s, Principal[] aprincipal) {
117        if (s == null || s.equals("")) {
118            return null;
119        }
120        try {
121            if (s.equals(client)) {
122                Enumeration<String> aliase = keyTest.aliases();
123                Vector vec = new Vector();
124                int i = 0;
125                while (aliase.hasMoreElements()) {
126                    vec.addElement(aliase.nextElement());
127                    i++;
128                }
129                String[] res = new String[vec.size()];
130                for (i = 0; i < vec.size(); i++) {
131                    res[i] = vec.elementAt(i).toString();
132                }
133                return res;
134            } else return null;
135        } catch (Exception ex) {
136            throw new IllegalArgumentException(ex.getMessage());
137        }
138    }
139
140    public String chooseClientAlias(String[] as, Principal[] aprincipal, Socket socket) {
141        String alias = null;
142        if (as == null || as.length == 0) {
143            return null;
144        }
145        try {
146            if (as.length == 1 && as[0].equals(client)) {
147                if (socket == null) {
148                    alias = keyTest.getCertificateAlias(cert[0]);
149                } else {
150                    alias = keyTest.getCertificateAlias(cert[1]);
151                }
152                return alias;
153            }
154        } catch (Exception ex) {
155            throw new IllegalArgumentException(ex.getMessage());
156        }
157        return null;
158    }
159
160    public String[] getServerAliases(String s, Principal aprincipal[]) {
161        if (s == null || s.equals("")) {
162            return null;
163        }
164        try {
165            if (s.equals(server)) {
166                Enumeration<String> aliase = keyTest.aliases();
167                Vector vec = new Vector();
168                int i = 0;
169                while (aliase.hasMoreElements()) {
170                    vec.addElement(aliase.nextElement());
171                    i++;
172                }
173                String[] res = new String[vec.size()];
174                for (i = 0; i < vec.size(); i++) {
175                    res[i] = vec.elementAt(i).toString();
176                }
177                return res;
178            } else return null;
179        } catch (Exception ex) {
180            throw new IllegalArgumentException(ex.getMessage());
181        }
182    }
183
184    public String chooseServerAlias(String as, Principal[] aprincipal, Socket socket) {
185        String alias = null;
186        if (as == null || as.equals("")) {
187            return null;
188        }
189        try {
190            if (as.equals(server) && socket != null) {
191                return alias = keyTest.getCertificateAlias(cert[0]);
192            } else {
193                return null;
194            }
195        } catch (Exception ex) {
196            throw new IllegalArgumentException(ex.getMessage());
197        }
198    }
199
200    public X509Certificate[] getCertificateChain(String s) {
201        /*try {
202            if (s != null && !s.equals("")) {
203                X509Certificate[] cert = (X509Certificate[]) keyTest.getCertificateChain(s);
204                return cert;
205            } else return null;
206        } catch (Exception ex) {
207            throw new IllegalArgumentException(ex.getMessage());
208        }*/
209        return null;
210    }
211
212    public PrivateKey getPrivateKey(String s) {
213        /*try {
214            if (s != null && !s.equals("")) {
215                Certificate[] cert = keyTest.getCertificateChain(s);
216                PrivateKey pk = (PrivateKey) keyTest.getKey(s, null);
217                return pk;
218            } else return null;
219        } catch (Exception ex) {
220            throw new IllegalArgumentException(ex.getMessage());
221        }*/
222        return null;
223    }
224
225}
226