/*******************************************************************************
* Copyright (c) 2008 Cambridge Semantics Incorporated.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created by: Jordi Albornoz Mulligan ( <a href="mailto:jordi@cambridgesemantics.com">jordi@cambridgesemantics.com </a>)
*
* Contributors:
* Cambridge Semantics Incorporated - initial API and implementation
*******************************************************************************/
package org.openanzo.security.keystore;
import java.io.File;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Arrays;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import junit.framework.TestCase;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
/**
* SecretKeystore test
*/
public class TestSecretKeyEncoder extends TestCase {
//private static final Logger log = LoggerFactory.getLogger(TestSecretKeyEncoder.class);
private static final String KEY_STORE_ENCODING = "JCEKS";
private static final char[] TEST_KEYSTORE_PASSWORD = "passw0rd".toCharArray();
private static final String KEY_NAME = "test-service-container-key";
private static final String ALGORITHM = "AES";
private ISecretKeystore encoder;
@Override
protected void setUp() throws Exception {
super.setUp();
// Load up a keystore from the src/text/resources. We'd rather load up a saved key
// rather than create a new one every time so that the test is deterministic.
KeyStore keyStore = KeyStore.getInstance(KEY_STORE_ENCODING);
InputStream keystoreStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("testKeystore");
if (keystoreStream == null) {
throw new Exception("Could not find keystore.");
}
keyStore.load(keystoreStream, TEST_KEYSTORE_PASSWORD);
Key key;
if (keyStore.containsAlias(KEY_NAME)) {
key = keyStore.getKey(KEY_NAME, TEST_KEYSTORE_PASSWORD);
} else {
throw new Exception("Could not find test key in test key store.");
}
SecretKeyStore encoder = new SecretKeyStore(null, (File) null);
encoder.initialize((SecretKey) key, ALGORITHM);
this.encoder = encoder;
}
/**
* @throws Exception
*/
public void testEncryptAndBase64EncodeString() throws Exception {
String str = "My string to encrypt, including an uncommon character,\u05D2 (the Hebrew Gimel), to ensure character encoding is handled correctly.";
String cyphertext = encoder.encryptAndBase64EncodeString(str);
assertTrue(Base64.isArrayByteBase64(cyphertext.getBytes("UTF-8")));
String decrypted = encoder.decryptAndBase64DecodeString(cyphertext);
assertEquals(str, decrypted);
}
/**
* @throws Exception
*/
public void testEncryptAndBase64EncodeBytes() throws Exception {
byte[] sample = { 0, 1, 2, 3, 4, 5 };
String cyphertext = encoder.encryptAndBase64EncodeBytes(sample);
assertTrue(Base64.isArrayByteBase64(cyphertext.getBytes("UTF-8")));
byte[] decrypted = encoder.decryptAndBase64DecodeBytes(cyphertext);
assertTrue(Arrays.equals(sample, decrypted));
}
/**
* @throws Exception
*/
public void testEncryptString() throws Exception {
String str = "My string to encrypt, including an uncommon character,\u05D2 (the Hebrew Gimel), to ensure character encoding is handled correctly.";
byte[] cyphertext = encoder.encryptString(str);
String decrypted = encoder.decryptString(cyphertext);
assertEquals(str, decrypted);
}
/**
* @throws Exception
*/
public void testEncryptBytes() throws Exception {
byte[] sample = { 0, 1, 2, 3, 4, 5 };
byte[] cyphertext = encoder.encryptBytes(sample);
byte[] decrypted = encoder.decryptBytes(cyphertext);
assertTrue(Arrays.equals(sample, decrypted));
}
/**
* Main method used to generate a keystore. Useful for bootstrapping the first time.
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File file = new File("testKeystore");
System.out.println("Generating new keystore to:" + file.getAbsolutePath());
KeyStore keyStore = KeyStore.getInstance("JCEKS");
keyStore.load(null, TEST_KEYSTORE_PASSWORD);
KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
Key key = kgen.generateKey();
keyStore.setKeyEntry(KEY_NAME, key, TEST_KEYSTORE_PASSWORD, new Certificate[0]);
keyStore.store(FileUtils.openOutputStream(file), TEST_KEYSTORE_PASSWORD);
System.out.println("Done generating keystore.");
}
}