package org.limewire.security.certificate; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import junit.framework.Test; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.limewire.inject.Providers; import org.limewire.util.BaseTestCase; public class KeyStoreProviderTest extends BaseTestCase { private char[] getUnitKeyStorePassword(){ return "".toCharArray(); } public KeyStoreProviderTest(String name) { super(name); } public static Test suite() { return buildTestSuite(KeyStoreProviderTest.class); } public void testGetKeyStoreFromNetwork() throws IOException, KeyStoreException { KeyStoreProviderImpl ksp = new KeyStoreProviderImpl(Providers.of((HttpClient)new DefaultHttpClient())); KeyStore keystore = ksp.getKeyStoreFromNetwork(); validateKeyStore(keystore); } private void validateKeyStore(KeyStore keyStore) throws KeyStoreException { X509Certificate certificate = (X509Certificate) keyStore.getCertificate("ca.limewire.com"); assertEquals( "3B0FAC37D4F1847574FD8FB6F56DAA05B0E3D81D8EE1A4FB2552A91E0A8D29CB2E0EE1FEB13BB547E59F8B127D0D48114828E5C96EF73BB2EBDFF0213D3B67FE7C1A2CC37CC5EF3D5BDD45F2FCE1D37F103DBB75BA7819E857FFA9B8D5D12FF8DC1D36A87B1905301AEBA86FB8E973295944233601DDCEB265B232F404831DA8", CertificateTools.encodeBytesToString(certificate.getSignature())); } /** * Loads the key store from the network, saves it to disk, then calls * getKeyStoreFromDisk. * * @throws IOException * @throws CertificateException * @throws NoSuchAlgorithmException * @throws KeyStoreException */ public void testGetKeyStoreFromDisk() throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException { File location = File.createTempFile("lwunit", "keystore"); location.deleteOnExit(); KeyStoreProviderImpl ksp = new KeyStoreProviderImpl(Providers.of((HttpClient)new DefaultHttpClient())); ksp.setKeyStoreLocation(location); ksp.setKeyStorePassword(getUnitKeyStorePassword()); KeyStore keystore = ksp.getKeyStoreFromNetwork(); keystore.store(new FileOutputStream(location), getUnitKeyStorePassword()); // Saved to disk, see if it loads! validateKeyStore(ksp.getKeyStoreFromDisk()); location.delete(); } public void testIsCachedAndInvalidateKeyStore() throws IOException, KeyStoreException { File location = File.createTempFile("lwunit", "keystore"); location.delete(); try { assertFalse(location.exists()); KeyStoreProviderImpl ksp = new KeyStoreProviderImpl(Providers.of((HttpClient)new DefaultHttpClient())); ksp.setKeyStoreLocation(location); ksp.setKeyStorePassword(getUnitKeyStorePassword()); assertFalse(ksp.isCached()); // Make sure caching works validateKeyStore(ksp.getKeyStore()); assertTrue(location.exists()); assertTrue(ksp.isCached()); // Make sure invalidation works ksp.invalidateKeyStore(); assertFalse(location.exists()); assertFalse(ksp.isCached()); // Make sure in-memory caching works validateKeyStore(ksp.getKeyStore()); assertTrue(location.exists()); assertTrue(ksp.isCached()); location.delete(); assertFalse(location.exists()); assertTrue(ksp.isCached()); } finally { location.delete(); } } }