package cz.abclinuxu.datoveschranky.common.impl;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
/**
*
* @author Vaclav Rosecky <xrosecky 'at' gmail 'dot' com>
*/
public class Utils {
private static final int BUFFER_SIZE = 4 * 4096;
public static String readResourceAsString(Class<?> clazz, String resourceFile) {
try {
InputStream is = clazz.getResourceAsStream(resourceFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} finally {
is.close();
}
return sb.toString();
} catch (IOException ioe) {
String message = String.format("IO chyba pri cteni zdroje %s.", resourceFile);
throw new DataBoxException(message);
}
}
public static KeyStore createTrustStore() {
return createTrustStore(readX509Certificates());
}
public static Collection<X509Certificate> readX509Certificates() {
InputStream instream = Utils.class.getResourceAsStream("/keys/certificates");
return readX509Certificates(instream);
}
public static Collection<X509Certificate> getX509Certificates(KeyStore store) {
List<X509Certificate> certs = new ArrayList<X509Certificate>();
try {
for (Enumeration<String> e = store.aliases(); e.hasMoreElements();) {
String alias = e.nextElement();
Certificate cert = store.getCertificate(alias);
if (cert instanceof X509Certificate) {
certs.add((X509Certificate) cert);
}
}
} catch (Exception ex) {
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new DataBoxException("Nemohu ziskat seznam X.509 certifikatu z KeyStore.", ex);
}
return certs;
}
public static Collection<X509Certificate> readX509Certificates(InputStream is) {
List<X509Certificate> certs = new ArrayList<X509Certificate>();
BufferedInputStream bis = new BufferedInputStream(is);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
certs.add((X509Certificate) cf.generateCertificate(bis));
}
} catch (CertificateException ce) {
throw new DataBoxException("Nemohu precist X.509 certifikat.", ce);
} catch (IOException ioe) {
throw new DataBoxException("IO chyba pri cteni X.509 certifikatu.", ioe);
}
return certs;
}
public static SSLSocketFactory createSSLSocketFactory(KeyStore keys) {
try {
String algo = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(algo);
trustManagerFactory.init(keys);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
return context.getSocketFactory();
} catch (Exception ex) {
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new DataBoxException("Nemohu vytvorit SSLSocketFactory.", ex);
}
}
public static KeyStore createTrustStore(Collection<X509Certificate> certs) {
try {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, "".toCharArray());
int counter = 0;
for (X509Certificate cert : certs) {
keyStore.setCertificateEntry(String.valueOf(counter), cert);
counter++;
}
return keyStore;
} catch (Exception ex) {
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new DataBoxException("Chyba pri importu X.509 certifikatu do keyStore.", ex);
}
}
/*TODO: Not implemented on android
public static XMLGregorianCalendar toXmlDate(GregorianCalendar date) {
try {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(date);
} catch (DatatypeConfigurationException dtce) {
throw new UnsupportedOperationException("Nemohu prevest " +
"GregorianCalendar na XMLGregorianCalendar", dtce);
}
}
public static GregorianCalendar toGregorianCalendar(String date) {
try {
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(date);
return xmlDate.toGregorianCalendar();
} catch (DatatypeConfigurationException dtce) {
throw new UnsupportedOperationException("Nemohu prevest " +
"GregorianCalendar na XMLGregorianCalendar", dtce);
}
}
*/
public static void close(Closeable... closeUs) {
IOException lastException = null;
for (Closeable closeMe : closeUs) {
try {
closeMe.close();
} catch (IOException ioe) {
lastException = ioe;
}
}
if (lastException != null) {
throw new RuntimeException("Chyba pri zavirani.", lastException);
}
}
public static void copy(InputStream source, OutputStream dest) throws IOException {
byte[] bytes = new byte[BUFFER_SIZE];
int read;
while ((read = source.read(bytes)) != -1) {
dest.write(bytes, 0, read);
}
}
}