Verifying proper encryption of cards for registered users.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user