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.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@@ -182,6 +183,29 @@ public class RunRankingGameTest extends TestBase {
|
|||||||
failOnErrorMessage(msg);
|
failOnErrorMessage(msg);
|
||||||
if (msg.isHandStartMessageSelected()) {
|
if (msg.isHandStartMessageSelected()) {
|
||||||
handNum++;
|
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()) {
|
else if (msg.isPlayersTurnMessageSelected()) {
|
||||||
if (msg.getPlayersTurnMessage().getValue().getPlayerId().getValue() == firstPlayerId) {
|
if (msg.getPlayersTurnMessage().getValue().getPlayerId().getValue() == firstPlayerId) {
|
||||||
|
|||||||
@@ -38,10 +38,14 @@ import pokerth_protocol.NetGameInfo.RaiseIntervalModeChoiceType;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
import java.security.MessageDigest;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.util.Collection;
|
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.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
@@ -310,4 +314,34 @@ public abstract class TestBase {
|
|||||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
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