package de.tum.in.tumcampusapp;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Base64;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
import de.tum.in.tumcampusapp.auxiliary.AuthenticationManager;
import de.tum.in.tumcampusapp.auxiliary.RSASigner;
import de.tum.in.tumcampusapp.auxiliary.Utils;
import de.tum.in.tumcampusapp.models.tumcabe.ChatMessage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class RSASignerTestCase {
private RSASigner signer;
private PrivateKey privateKeyFixture;
private List<ChatMessage> messageFixtures;
private static PrivateKey buildPrivateKey(String privateKeyString) {
byte[] privateKeyBytes = Base64.decode(privateKeyString, Base64.DEFAULT);
KeyFactory keyFactory;
try {
keyFactory = AuthenticationManager.getKeyFactoryInstance();
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
return keyFactory.generatePrivate(privateKeySpec);
} catch (InvalidKeySpecException e) {
Utils.log(e);
}
return null;
}
@Before
public void setUp() {
privateKeyFixture = buildPrivateKey(
"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM46wq9uOF7y1dmNO3nY8D1P6bCe" +
"t3izsm2GKQtvWmV78WbBxk1rZI2GNExvZ3aVg4mb6jOToGzm+jdNiWR07kBFSlrgNC5zq7Jmm0gz" +
"yTgrou6eV5NoQsPO2fI3tworvxgGa886Hu0U8p3gFk+BJnffndSq8DdBKcIjGDunTv4dAgMBAAEC" +
"gYB3QywLX+ZhonVhVneqw3ZLPseaSG858lGhXRCneEICpma4Uh9n7k88OPxNp69huJ1VG0GZiiog" +
"UIMrMD/gRG7y2NJxKkDbR2aVB+YR6aGAWYfwZVDM+Swxe3wUbDfRsAuXGapKCXnjHOKGbUCi/gx9" +
"AvFH4YJ9IImFGD+T7jSogQJBAP/oBCSXhDCHQXoN3vqdncmNNKl1J9QvzPY2ESMzfbdJ4QESb4YZ" +
"f88ixXUZpb3JVamW4WI6QHEHGMnGZwJyL6UCQQDOThaq2Mw/8QyPiKup7B+QT7/Bz7wpQx7IHw6a" +
"r5pX5AYAO7WmihxOgDMX6VfhCJlksxfLTVSuiJdXuJSm90sZAkBdXuJkF4R70F3rkrQQ7QFtUMAu" +
"NDjcCrTWANQv69Gq1qHqKjfWzeb8RMuW9kyq+pLu1cZWeLqaguRgequLEO6hAkBsq1NjUOldsQI1" +
"xP7vdbI2mNtgIqVxcqqPLVTLBD6flzvV+Z24iL1aWEsRiFdC8P2jvnaFH0nA2bAmg9LBlDdZAkEA" +
"9tg4rD0aCHQZ6kEquwN6emc9QM0X6DR0dx6Bqq8CGDkVdk0hXHBR9VUBGE4YSsxpn+LnyWSWyJum" +
"dWuepeUKig==");
messageFixtures = new ArrayList<>();
messageFixtures.add(buildChatMessage(
"This is a message!",
"Tw7Geajto7C/orsLT4TfNCUa1gnu6pGumfp+Nck7/QoOmDxilgQCpuzlpxa5Y7xuQ2rQB4XhFSm4\n" +
"3gOHijTwF91SQx2sdIWClofzr/H0JABpQRkkMbsVQikwOnQYp+d9c1eylNPeendoYW4NAEBKpNyw\n" +
"ShtHN6jcC2Usw1lAfxE=\n"));
messageFixtures.add(buildChatMessage(
"A message with German characters: öäüßÖÄÜ!",
"tSHKrusEPatW7CUJGbPjLfpPkoO/hQnJPMCQDztVjQJNqpEk+Jbm+FTwakOQ49OaMtmZTfnKUoJQ\n" +
"MBwgp/I6zL7Xlafxiw+jA72ah/kvixm46VlpGFF2sEYfC0Ts3Agyq1T7XXYgkrGKjC3vs6sGNFGv\n" +
"IefIoEAOGaWIfZnnbuM=\n"));
messageFixtures.add(buildChatMessage(
"This is a Korean message: \uC88B\uC740 \uAC8C\uC784",
"Td+E1WOg5FweCrBKzsjjVbbf3EeiNLu/PWID1Tg41ak5NFllqsFUcPEzPP0bZ+Dpv0sU7deQ9BaQ\n" +
"lNVaNClQsI7Y5jTmoqS5elRdrig+eq9Qzl7bvEr0EI5CUvwLZJU4LCpLYUJEGD++IOzE0xZxB6/j\n" +
"MES0525W5YVR0knzoKw=\n"));
}
protected ChatMessage buildChatMessage(String text, String signature) {
ChatMessage message = new ChatMessage(text);
message.setSignature(signature);
return message;
}
/**
* Tests that a valid ASCII-based message is correctly signed.
*/
@Test
public void testAsciiMessageSigning() {
signer = new RSASigner(privateKeyFixture);
ChatMessage message = messageFixtures.get(0);
Utils.log(Boolean.toString(message.getSignature().equals(signer.sign(message.getText()))));
Utils.log(signer.sign(message.getText()));
assertEquals(message.getSignature(), signer.sign(message.getText()));
}
/**
* Tests that a unicode (european) message is correctly signed.
*/
@Test
public void testUnicodeMessageSigning() {
signer = new RSASigner(privateKeyFixture);
ChatMessage message = messageFixtures.get(1);
assertEquals(message.getSignature(), signer.sign(message.getText()));
}
/**
* Tests that a unicode (korean) message is correctly signed.
*/
@Test
public void testUnicodeKoreanMessageSigning() {
signer = new RSASigner(privateKeyFixture);
ChatMessage message = messageFixtures.get(2);
assertEquals(message.getSignature(), signer.sign(message.getText()));
}
/**
* Tests that when the private key associated with
* the signer is null, the signer returns null.
*/
@Test
public void testPrivateKeyNull() {
signer = new RSASigner(null);
ChatMessage message = messageFixtures.get(0);
assertNull(signer.sign(message.getText()));
}
}