/*
* Copyright 1999-2010 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
*
* See the License for the specific language governing permissions and limitations under the License.
*/
package org.globus.gsi;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
import java.security.GeneralSecurityException;
import java.security.PrivateKey;
import org.globus.gsi.bc.BouncyCastleOpenSSLKey;
import org.globus.gsi.testutils.FileSetupUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Created by IntelliJ IDEA. User: turtlebender Date: Dec 31, 2009 Time: 9:54:25
* AM To change this template use File | Settings | File Templates.
*/
@Category( { SecurityTest.class })
public class OpenSSLKeyTest {
static FileSetupUtil file;
@BeforeClass
public static void setup() throws Exception {
file = new FileSetupUtil("key.pem");
file.copyFileToTemp();
file.getTempFile();
}
@AfterClass
public static void cleanup() throws Exception {
file.deleteFile();
}
@Test
public void testOpenSSLKeyCreation() throws Exception {
OpenSSLKey opensslkey = new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
byte[] encoded = opensslkey.getEncoded();
OpenSSLKey byteStreamInit = new BouncyCastleOpenSSLKey("RSA", encoded);
assertThat(opensslkey.getEncoded(), is(byteStreamInit.getEncoded()));
PrivateKey privateKey = opensslkey.getPrivateKey();
OpenSSLKey privateKeyInit = new BouncyCastleOpenSSLKey(privateKey);
assertThat(opensslkey.getEncoded(), is(privateKeyInit.getEncoded()));
opensslkey.encrypt("password");
assertThat(opensslkey.getEncoded(), is(not(encoded)));
byteStreamInit.encrypt("password");
opensslkey = new BouncyCastleOpenSSLKey(opensslkey.getPrivateKey());
opensslkey.decrypt("password");
byteStreamInit = new BouncyCastleOpenSSLKey(byteStreamInit.getPrivateKey());
byteStreamInit.decrypt("password");
assertThat(opensslkey.getEncoded(), is(byteStreamInit.getEncoded()));
}
@Test(expected = IllegalArgumentException.class)
public void testNullByteStream() throws Exception {
new BouncyCastleOpenSSLKey("RSA", null);
}
@Test(expected = GeneralSecurityException.class)
public void testEmptyByteStream() throws Exception {
new BouncyCastleOpenSSLKey("RSA", new byte[] {});
}
// @Test
// public void testNullAlgo() throws Exception{
// new BouncyCastleOpenSSLKey(null, new byte[]{});
// }
@Test
public void testEqualsNull() throws Exception
{
OpenSSLKey key =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
assertThat(key, not(equalTo(null)));
}
@Test
public void testEqualsReflexive() throws Exception
{
OpenSSLKey key =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
assertThat(key, equalTo(key));
}
@Test
public void testEqualsSymmetricForEqualKeys() throws Exception
{
OpenSSLKey key1 =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
OpenSSLKey key2 =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
assertThat(key2, equalTo(key1));
assertThat(key1, equalTo(key2));
}
@Test
public void testEqualsForKeysDifferingByEncrypted() throws Exception
{
OpenSSLKey key1 =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
OpenSSLKey key2 =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
key2.encrypt("too many secrets");
assertThat(key2, not(equalTo(key1)));
}
@Test
public void testSerializableUnencrypted() throws Exception {
OpenSSLKey key =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
OpenSSLKey copy = serialiseAndDeserialise(key);
assertThat(copy, equalTo(key));
}
@Test
public void testSerializableEncrypted() throws Exception {
OpenSSLKey key =
new BouncyCastleOpenSSLKey(file.getAbsoluteFilename());
key.encrypt("too many secrets");
OpenSSLKey copy = serialiseAndDeserialise(key);
assertThat(copy, equalTo(key));
}
private OpenSSLKey serialiseAndDeserialise(OpenSSLKey key) throws IOException, ClassNotFoundException {
ByteArrayOutputStream storage = new ByteArrayOutputStream();
new ObjectOutputStream(storage).writeObject(key);
byte[] data = storage.toByteArray();
ObjectInputStream in =
new ObjectInputStream(new ByteArrayInputStream(data));
return (OpenSSLKey) in.readObject();
}
}