diff --git a/tests/src/pokerth_test/RunRankingGameTest.java b/tests/src/pokerth_test/RunRankingGameTest.java index fcc668c9..cc9cbcd2 100644 --- a/tests/src/pokerth_test/RunRankingGameTest.java +++ b/tests/src/pokerth_test/RunRankingGameTest.java @@ -26,6 +26,7 @@ import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.StringTokenizer; import org.junit.Test; @@ -182,6 +183,29 @@ public class RunRankingGameTest extends TestBase { failOnErrorMessage(msg); if (msg.isHandStartMessageSelected()) { handNum++; + // Cards should be encrypted for registered users. + assertTrue(msg.getHandStartMessage().getValue().getYourCards().isEncryptedCardsSelected()); + byte[] encData = msg.getHandStartMessage().getValue().getYourCards().getEncryptedCards().getCardData(); + byte[] cardData = decryptCards(AuthPassword, encData); + int size = cardData.length; + while (size > 0 && cardData[size-1] == 0) { + size--; + } + String cardStr = new String(cardData, 0, size); + String[] cardTok = cardStr.split("\\s"); + // First token is player id. + assertEquals(String.valueOf(firstPlayerId), cardTok[0]); + // Second token is game id. + assertEquals(String.valueOf(gameId), cardTok[1]); + // Third token is hand num. + assertEquals(String.valueOf(handNum), cardTok[2]); + // Fourth and fifth tokens are cards. + int card1 = Integer.valueOf(cardTok[3]); + int card2 = Integer.valueOf(cardTok[4]); + assertTrue(card1 < 52); + assertTrue(card1 >= 0); + assertTrue(card2 < 52); + assertTrue(card2 >= 0); } else if (msg.isPlayersTurnMessageSelected()) { if (msg.getPlayersTurnMessage().getValue().getPlayerId().getValue() == firstPlayerId) { diff --git a/tests/src/pokerth_test/TestBase.java b/tests/src/pokerth_test/TestBase.java index 79fd0da2..d801dd54 100644 --- a/tests/src/pokerth_test/TestBase.java +++ b/tests/src/pokerth_test/TestBase.java @@ -38,10 +38,14 @@ import pokerth_protocol.NetGameInfo.RaiseIntervalModeChoiceType; import java.io.*; import java.net.*; +import java.security.MessageDigest; import java.sql.Connection; import java.sql.DriverManager; import java.util.Collection; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -310,4 +314,34 @@ public abstract class TestBase { fail("Received error: " + error.getValue().getErrorReason().getValue().toString()); } } + + public byte[] decryptCards(final String password, final byte[] ciphertext) throws Exception + { + /* compute key and initialization vector */ + final MessageDigest shaDigest = MessageDigest.getInstance("SHA-1"); + byte[] pw1 = password.getBytes("UTF-8"); + + byte[] keyHash1 = shaDigest.digest(pw1); + keyHash1 = shaDigest.digest(keyHash1); + byte[] pw2 = new byte[keyHash1.length + pw1.length]; + System.arraycopy(keyHash1, 0, pw2, 0, keyHash1.length); + System.arraycopy(pw1, 0, pw2, keyHash1.length, pw1.length); + byte[] keyHash2 = shaDigest.digest(pw2); + keyHash2 = shaDigest.digest(keyHash2); + + byte[] key = new byte[16]; + System.arraycopy(keyHash1, 0, key, 0, key.length); + byte[] iv = new byte[16]; + System.arraycopy(keyHash1, 16, iv, 0, 4); + System.arraycopy(keyHash2, 0, iv, 4, 12); + + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + + cipher.init( + Cipher.DECRYPT_MODE, + new SecretKeySpec(key, "AES"), + new IvParameterSpec(iv)); + + return cipher.doFinal(ciphertext); + } }