Verifying proper encryption of cards for registered users.

This commit is contained in:
lotodore
2011-03-10 16:37:27 +00:00
parent 8b4ed277ad
commit f4a49f0ed4
2 changed files with 58 additions and 0 deletions
@@ -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) {
+34
View File
@@ -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);
}
}