Committing so I can checkout to 'master' branch and pull and re-build

Because build failed, and not necessarily becuase of my changes....
vbdev
Hai Brenner 2015-12-19 14:46:14 +02:00
parent a7585e4b5f
commit e2708af39e
9 changed files with 334 additions and 51 deletions

View File

@ -60,11 +60,11 @@ public interface VotingBooth {
/**
* UI calls this when the user cancels the voting process in the middle.
*/
void cancelBallot();
//void cancelBallot();
/**
* Called by UI thread after voter made choice to cast or audit ballot.
* @param castVote
*/
void voterCastOrAudit(boolean castVote);
//void voterCastOrAudit(boolean castVote);
}

View File

@ -52,6 +52,33 @@ message BallotAnswerTranslationTable {
bytes data = 1;
}
enum UIDataType {
TEXT = 0;
IMAGE = 1;
VOICE = 2;
}
enum QuestionType {
MULTIPLE_CHOICE = 0;
MULTIPLE_SELECTION = 1;
ORDER = 2;
}
message UIElement {
UIDataType type = 1;
bytes data = 2;
}
message BllotQuestionNew {
bool is_mandatory = 1;
UIElement question = 2;
UIElement description = 3;
repeated UIElement answers = 4;
}
message ElectionParams {
// TODO: different sets of keys for different roles?
repeated SignatureVerificationKey trusteeVerificationKeys = 1;

View File

@ -0,0 +1,58 @@
package meerkat.voting;
import java.io.IOException;
import java.util.Random;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import meerkat.crypto.Encryption;
import meerkat.protobuf.Crypto.EncryptionPublicKey;
import meerkat.protobuf.Crypto.EncryptionRandomness;
import meerkat.protobuf.Crypto.RerandomizableEncryptedMessage;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class EncryptionFake implements Encryption {
EncryptionPublicKey m_encryptionPublicKey;
Random m_rnd;
public EncryptionFake (EncryptionPublicKey publicKey) {
m_encryptionPublicKey = publicKey;
}
@Override
public RerandomizableEncryptedMessage encrypt(Message plaintext, EncryptionRandomness rnd) throws IOException {
// TODO Auto-generated method stub
assert plaintext != null;
assert rnd != null;
byte plaintextBytes[] = plaintext.toByteArray();
byte encryptedBytes[] = new byte[plaintextBytes.length + 1];
encryptedBytes[0] = rnd.getData().byteAt(0);
for (int i = 0; i < plaintextBytes.length; ++i) {
encryptedBytes[i+1] = (byte)(plaintextBytes[i] ^ encryptedBytes[0]);
}
return RerandomizableEncryptedMessage.newBuilder().setData(ByteString.copyFrom(encryptedBytes)).build();
}
@Override
public RerandomizableEncryptedMessage rerandomize(RerandomizableEncryptedMessage msg, EncryptionRandomness rnd)
throws InvalidProtocolBufferException {
// TODO Auto-generated method stub
System.err.println("rerandomize: not implemented!");
throw new NotImplementedException();
}
@Override
public EncryptionRandomness generateRandomness(Random rand) {
assert rand != null;
byte a[] = new byte[1];
a[0] = (byte)((rand.nextInt() % 255)+1);
ByteString val = ByteString.copyFrom(a);
return EncryptionRandomness.newBuilder().setData(val).build();
}
}

View File

@ -0,0 +1,47 @@
package meerkat.voting;
import meerkat.protobuf.Voting.EncryptedBallot;
public class SharedEncryptedBallotMessage {
private EncryptedBallot m_encryptedBallot;
private boolean b_writeable = true;
synchronized void setSharedMessage (EncryptedBallot encryptedBallot)
{
while (!b_writeable) {
try
{
wait ();
}
catch (InterruptedException e) {}
}
m_encryptedBallot = EncryptedBallot.newBuilder(encryptedBallot).build();
b_writeable = false;
notifyAll ();
}
synchronized EncryptedBallot getSharedMessage (int millisecTimeout)
{
do {
try {
wait (millisecTimeout);
}
catch (InterruptedException e) { }
} while (b_writeable && millisecTimeout == 0);
EncryptedBallot retValue = null;
if (m_encryptedBallot != null)
{
b_writeable = true;
notifyAll ();
retValue = EncryptedBallot.newBuilder(m_encryptedBallot).build();
m_encryptedBallot = null;
}
return retValue;
}
}

View File

@ -0,0 +1,40 @@
package meerkat.voting;
import meerkat.protobuf.Voting.PlaintextBallot;
public class SharedPlaintextBallotMessage {
private PlaintextBallot m_plaintextBallot;
private boolean b_writeable = true;
synchronized void setSharedMessage (PlaintextBallot plaintextBallot)
{
while (!b_writeable) {
try
{
wait ();
}
catch (InterruptedException e) {}
}
m_plaintextBallot = PlaintextBallot.newBuilder(plaintextBallot).build();
b_writeable = false;
notifyAll ();
}
synchronized PlaintextBallot getSharedMessage ()
{
while (b_writeable) {
try
{
wait ();
}
catch (InterruptedException e) { }
}
b_writeable = true;
notifyAll ();
return PlaintextBallot.newBuilder(m_plaintextBallot).build();
}
}

View File

@ -24,6 +24,10 @@ public class VBMessage {
return retVal;
}
public VBMessageType getType () {
return m_type;
}
public static VBMessage newEncryptionQuery (PlaintextBallot plaintextBallot) {
VBMessage retVal = new VBMessage();
retVal.m_type = VBMessageType.VB_ENCRYPTION_QUERY;
@ -40,21 +44,21 @@ public class VBMessage {
}
public EncryptedBallot getEncryptedBallot () {
assert m_type == VBMessageType.VB_CONTROLLER_RESPONSE;
assert getType() == VBMessageType.VB_CONTROLLER_RESPONSE;
return m_encryptedBallot;
}
public BallotSecrets getSecrets () {
assert m_type == VBMessageType.VB_CONTROLLER_RESPONSE;
assert getType() == VBMessageType.VB_CONTROLLER_RESPONSE;
return m_secrets;
}
public PlaintextBallot getPlaintextBallot () {
assert m_type == VBMessageType.VB_ENCRYPTION_QUERY;
assert getType() == VBMessageType.VB_ENCRYPTION_QUERY;
return m_plaintextBallot;
}
public boolean isEmptyMessage () {
return (m_type == VBMessageType.VB_TICK);
return (getType() == VBMessageType.VB_TICK);
}
}

View File

@ -1,18 +1,17 @@
package meerkat.voting;
import meerkat.protobuf.Voting.BallotAnswer;
import meerkat.protobuf.Voting.BallotAnswerTranslationTable;
import meerkat.protobuf.Voting.BallotQuestion;
import meerkat.protobuf.Voting.BallotSecrets;
import meerkat.protobuf.Voting.BoothParams;
import meerkat.protobuf.Voting.ElectionParams;
import meerkat.protobuf.Voting.PlaintextBallot;
import meerkat.protobuf.Crypto.EncryptionPublicKey;
import meerkat.protobuf.Voting.*;
import meerkat.crypto.Encryption;
import meerkat.protobuf.Crypto.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import com.google.protobuf.ByteString;
@ -25,32 +24,24 @@ public class VotingBoothToy implements VotingBooth, Runnable {
private BallotAnswer a_answers[];
private BallotAnswerTranslationTable m_answerTranslationTable;
private BoothParams m_boothParams;
private ArrayBlockingQueue<VBMessage> a_queue;
static private int m_queueSize = 5;
private VotingBooth.UI m_ui;
//TODO: where do I use these?
SignatureVerificationKey a_signatureKeys[];
Encryption m_encryption;
Random m_random;
public static void main (String[] args)
{
VotingBoothToy vbController = new VotingBoothToy ();
VotingBoothToyConsoleUI ui = new VotingBoothToyConsoleUI();
vbController.registerUI (ui);
ui.registerVBController(vbController);
BoothParams boothParams = new BoothParams();
ElectionParams electionParams = new ElectionParams();
vbController.init(electionParams, boothParams);
Thread controllerThread = new Thread(new VotingBoothToy ());
Thread uiThread = new Thread(ui);
controllerThread.start();
uiThread.start();
}
public VotingBoothToy () {
a_queue = new ArrayBlockingQueue<VBMessage> (m_queueSize, true);
m_encryption = new EncryptionFake(m_ballotEncryptionKey);
m_random = new Random();
}
public void registerUI (UI ui) {
@ -58,9 +49,66 @@ public class VotingBoothToy implements VotingBooth, Runnable {
}
public void run () {
System.err.println("VB controller is up and running");
while (true) {
VBMessage msg;
try {
msg = a_queue.take();
}
catch (InterruptedException e) {
System.err.println("VB controller interrupted!!");
break;
}
if (msg.getType() == VBMessage.VBMessageType.VB_ENCRYPTION_QUERY) {
handleEncryptionQuery (msg);
}
else {
System.err.println("VB controller unknown type of message!!");
break;
}
}
}
private void handleEncryptionQuery (VBMessage msg) {
assert msg.getType() == VBMessage.VBMessageType.VB_ENCRYPTION_QUERY;
PlaintextBallot ptb = msg.getPlaintextBallot();
// encrypt
RerandomizableEncryptedMessage encMsg;
EncryptionRandomness rnd = m_encryption.generateRandomness(m_random);
try {
// simulate taking a lot of time
Thread.sleep(30000);
encMsg = m_encryption.encrypt(ptb, rnd);
}
catch (InterruptedException e) {
System.err.println("debug: VotingBoothToy encrypt interrupted!");
return;
}
catch (IOException e) {
System.err.println("debug: VotingBoothToy encrypt IOException!");
return;
}
EncryptedBallot encBallot = EncryptedBallot.newBuilder()
.setSerialNumber(ptb.getSerialNumber())
.setData(encMsg)
.build();
RandomnessGenerationProof proof = RandomnessGenerationProof.newBuilder()
.setData(ByteString.copyFrom(new byte[0]))
.build();
BallotSecrets secrets = BallotSecrets.newBuilder()
.setPlaintextBallot(ptb)
.setEncryptionRandomness(rnd)
.setProof(proof)
.build();
m_ui.commitToEncryptedBallot(encBallot, secrets);
}
/* (non-Javadoc)
* @see meerkat.voting.VotingBooth#init(meerkat.protobuf.Voting.ElectionParams, meerkat.protobuf.Voting.BoothParams)
*/
@ -72,7 +120,13 @@ public class VotingBoothToy implements VotingBooth, Runnable {
this.m_answerTranslationTable = globalParams.getAnswerTranslationTable();
this.m_boothParams = boothParams;
List<SignatureVerificationKey> l_signatureKeys = boothParams.getPscVerificationKeysList();
a_signatureKeys = new SignatureVerificationKey[l_signatureKeys.size()];
int i = 0;
for (SignatureVerificationKey q: l_signatureKeys) {
a_signatureKeys[i] = q;
++i;
}
}
@ -85,28 +139,32 @@ public class VotingBoothToy implements VotingBooth, Runnable {
*/
@Override
public void submitBallot(PlaintextBallot ballot) {
System.err.println ("debug VB: submit ballot.");
// encryptBallot (PlaintextBallot)
VBMessage msg = VBMessage.newEncryptionQuery(ballot);
try {
a_queue.put(msg);
}
catch (InterruptedException e) {
System.err.println("SubmitBallot interrupted!!");
}
}
/* (non-Javadoc)
* @see meerkat.voting.VotingBooth#cancelBallot()
*/
@Override
/*@Override
public void cancelBallot() {
// TODO Auto-generated method stub
}
}*/
/* (non-Javadoc)
* @see meerkat.voting.VotingBooth#voterCastOrAudit(boolean)
*/
@Override
/*@Override
public void voterCastOrAudit(boolean castVote) {
// TODO Auto-generated method stub
}
}*/
}
@ -129,17 +187,17 @@ message BallotAnswer {
repeated sint64 answer = 1 [packed=true];
}
message PlaintextBallot {
uint64 serialNumber = 1; // Ballot serial number
message EncryptedBallot {
uint64 serialNumber = 1; // Ballot serial number
repeated BallotAnswer answers = 2;
RerandomizableEncryptedMessage data = 2;
}
message BallotSecrets {
PlaintextBallot plaintext_ballot = 1;
PlaintextBallot plaintext_ballot = 1;
EncryptionRandomness encryption_randomness = 2;
RandomnessGenerationProof proof = 3;
EncryptionRandomness encryption_randomness = 2;
RandomnessGenerationProof proof = 3;
}
message BoothParams {

View File

@ -31,12 +31,14 @@ public class VotingBoothToyConsoleUI implements UI, Runnable {
private ArrayBlockingQueue<VBMessage> a_queue;
static private int m_queueSize = 5;
private BallotQuestion a_questions[];
private BallotQuestionNew a_questionsNew[];
private int m_serialNumber;
private PlaintextBallot m_plaintextBallot;
private EncryptedBallot m_encryptedBallot;
private BallotSecrets m_ballotSecrets;
private int m_waitForControllerMillisecTimeout = 10;
private BallotAnswerTranslationTable m_answerTranslationTable;
public VotingBoothToyConsoleUI () {
a_queue = new ArrayBlockingQueue<VBMessage> (m_queueSize, true);
@ -44,6 +46,9 @@ public class VotingBoothToyConsoleUI implements UI, Runnable {
public VotingBoothToyConsoleUI(ElectionParams globalParams) {
m_serialNumber = 0;
this.m_answerTranslationTable = globalParams.getAnswerTranslationTable();
List<BallotQuestion> l_questions = globalParams.getQuestionsList();
a_questions = new BallotQuestion[l_questions.size()];
m_in = new BufferedReader(new InputStreamReader(System.in));
@ -65,7 +70,6 @@ public class VotingBoothToyConsoleUI implements UI, Runnable {
System.err.println ("UI debug: preparing console UI for a new user.");
// clear history from memory
// TODO: should we clean memory better?
eraseEncryption();
erasePlaintext();

View File

@ -0,0 +1,45 @@
package meerkat.voting;
import com.google.protobuf.ByteString;
import meerkat.protobuf.Crypto.SignatureType;
import meerkat.protobuf.Crypto.SignatureVerificationKey;
import meerkat.protobuf.Voting.BoothParams;
import meerkat.protobuf.Voting.ElectionParams;
public class VotingBoothToyDemoRun {
static int N_SIGNATURE_VERIFICATION_KEYS = 3;
public static void main (String[] args)
{
VotingBoothToy vbController = new VotingBoothToy ();
VotingBoothToyConsoleUI ui = new VotingBoothToyConsoleUI();
vbController.registerUI (ui);
ui.registerVBController(vbController);
BoothParams.Builder bpb = BoothParams.newBuilder();
SignatureType signatureType = SignatureType.ECDSA;
for (int i = 0; i < N_SIGNATURE_VERIFICATION_KEYS; ++i) {
SignatureVerificationKey verifiationKey = SignatureVerificationKey.newBuilder()
.setType(signatureType)
.setData(ByteString.copyFrom(new byte[0]))
.build();
bpb.addPscVerificationKeys(i, verifiationKey);
}
BoothParams boothParams = bpb.build();
ElectionParams electionParams = new ElectionParams();
vbController.init(electionParams, boothParams);
Thread controllerThread = new Thread(new VotingBoothToy ());
Thread uiThread = new Thread(ui);
controllerThread.start();
uiThread.start();
}
}