/**
* Copyright 2012, Board of Regents of the University of
* Wisconsin System. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Board of Regents of the University of Wisconsin
* System licenses this file to you 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 edu.wisc.doit.tcrypt;
import static org.junit.Assert.assertTrue;
import org.bouncycastle.openssl.PEMWriter;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.security.KeyPair;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Test that tries to go through each of the lifecycle phases that will be used by the token crypt webapp
*
* @author Eric Dalquist
*/
public class WebappLifecycleTest {
@Rule
public final TemporaryFolder folder = new TemporaryFolder();
//instance variables correspond to objects that can be configured as Spring singleton beans
private final TokenKeyPairGenerator bouncyCastleKeyPairGenerator = new BouncyCastleKeyPairGenerator();
/**
* Generates a key pair for a user request
*/
@Test
public void testKeyGeneration() throws Exception {
//Parameters that will come in to the controller
final String serviceName = "my-predev.doit.wisc.edu";
final String remoteUser = "bbadger";
final Date generationTimestamp = new Date();
//Generate the key pair
final KeyPair generateKeyPair = bouncyCastleKeyPairGenerator.generateKeyPair(2048);
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
final String keyFilePrefix = serviceName + "_" + remoteUser + "_" + simpleDateFormat.format(generationTimestamp) + "-";
//Save the private key to the file system, in the webapp this should get saved to some directory configurable via a properties file
final File privateKeyFile = folder.newFile(keyFilePrefix + "private.pem");
final PEMWriter privatePemWriter = new PEMWriter(new FileWriter(privateKeyFile));
privatePemWriter.writeObject(generateKeyPair.getPrivate());
privatePemWriter.flush();
privatePemWriter.close();
//Save the public key to the file system, in the webapp this should get saved to some directory configurable via a properties file
final File publicKeyFile = folder.newFile(keyFilePrefix + "public.pem");
final PEMWriter publicPemWriter = new PEMWriter(new FileWriter(publicKeyFile));
publicPemWriter.writeObject(generateKeyPair.getPublic());
publicPemWriter.flush();
publicPemWriter.close();
/*
* At this point the user's browser should automatically download the private key. Links to download both
* keys should be present and the user should get a very blunt warning about not losing their private key.
*/
}
@Test
public void testTokenEncryption() throws Exception {
//Parameters that will come in to the controller
final String serviceName = "my.wisc.edu";
final String plainText = "CWRnT63u";
/*
* this step will have happened in the background in the real app. On init, after key pair generation, and periodically
* the public key directory will be scanned and all public keys loaded and indexed by service name.
*/
final String keyFileName = "/" + serviceName + "-public.pem";
//Note that BouncyCastleTokenEncrypter instances are thread safe so this creation could be cached in a Map<serviceName, BouncyCastleTokenEncrypter>
final TokenEncrypter tokenEncrypter = new BouncyCastleTokenEncrypter(new InputStreamReader(this.getClass().getResourceAsStream(keyFileName)));
final String token = tokenEncrypter.encrypt(plainText);
assertTrue(token.startsWith(TokenEncrypter.TOKEN_PREFIX));
assertTrue(token.endsWith(TokenEncrypter.TOKEN_SUFFIX));
/*
* At this point the user should be shown the encrypted token
*/
}
}