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. * 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. * Called by UI thread after voter made choice to cast or audit ballot.
* @param castVote * @param castVote
*/ */
void voterCastOrAudit(boolean castVote); //void voterCastOrAudit(boolean castVote);
} }

View File

@ -52,6 +52,33 @@ message BallotAnswerTranslationTable {
bytes data = 1; 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 { message ElectionParams {
// TODO: different sets of keys for different roles? // TODO: different sets of keys for different roles?
repeated SignatureVerificationKey trusteeVerificationKeys = 1; 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; return retVal;
} }
public VBMessageType getType () {
return m_type;
}
public static VBMessage newEncryptionQuery (PlaintextBallot plaintextBallot) { public static VBMessage newEncryptionQuery (PlaintextBallot plaintextBallot) {
VBMessage retVal = new VBMessage(); VBMessage retVal = new VBMessage();
retVal.m_type = VBMessageType.VB_ENCRYPTION_QUERY; retVal.m_type = VBMessageType.VB_ENCRYPTION_QUERY;
@ -40,21 +44,21 @@ public class VBMessage {
} }
public EncryptedBallot getEncryptedBallot () { public EncryptedBallot getEncryptedBallot () {
assert m_type == VBMessageType.VB_CONTROLLER_RESPONSE; assert getType() == VBMessageType.VB_CONTROLLER_RESPONSE;
return m_encryptedBallot; return m_encryptedBallot;
} }
public BallotSecrets getSecrets () { public BallotSecrets getSecrets () {
assert m_type == VBMessageType.VB_CONTROLLER_RESPONSE; assert getType() == VBMessageType.VB_CONTROLLER_RESPONSE;
return m_secrets; return m_secrets;
} }
public PlaintextBallot getPlaintextBallot () { public PlaintextBallot getPlaintextBallot () {
assert m_type == VBMessageType.VB_ENCRYPTION_QUERY; assert getType() == VBMessageType.VB_ENCRYPTION_QUERY;
return m_plaintextBallot; return m_plaintextBallot;
} }
public boolean isEmptyMessage () { public boolean isEmptyMessage () {
return (m_type == VBMessageType.VB_TICK); return (getType() == VBMessageType.VB_TICK);
} }
} }

View File

@ -1,18 +1,17 @@
package meerkat.voting; package meerkat.voting;
import meerkat.protobuf.Voting.BallotAnswer; import meerkat.protobuf.Voting.*;
import meerkat.protobuf.Voting.BallotAnswerTranslationTable; import meerkat.crypto.Encryption;
import meerkat.protobuf.Voting.BallotQuestion; import meerkat.protobuf.Crypto.*;
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 java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.List; 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 BallotAnswer a_answers[];
private BallotAnswerTranslationTable m_answerTranslationTable; private BallotAnswerTranslationTable m_answerTranslationTable;
private BoothParams m_boothParams; private ArrayBlockingQueue<VBMessage> a_queue;
static private int m_queueSize = 5;
private VotingBooth.UI m_ui; private VotingBooth.UI m_ui;
//TODO: where do I use these?
SignatureVerificationKey a_signatureKeys[];
public static void main (String[] args) Encryption m_encryption;
{ Random m_random;
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 () { 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) { public void registerUI (UI ui) {
@ -58,8 +49,65 @@ public class VotingBoothToy implements VotingBooth, Runnable {
} }
public void run () { 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) /* (non-Javadoc)
* @see meerkat.voting.VotingBooth#init(meerkat.protobuf.Voting.ElectionParams, meerkat.protobuf.Voting.BoothParams) * @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_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 @Override
public void submitBallot(PlaintextBallot ballot) { public void submitBallot(PlaintextBallot ballot) {
System.err.println ("debug VB: submit ballot."); VBMessage msg = VBMessage.newEncryptionQuery(ballot);
// encryptBallot (PlaintextBallot) try {
a_queue.put(msg);
}
catch (InterruptedException e) {
System.err.println("SubmitBallot interrupted!!");
}
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see meerkat.voting.VotingBooth#cancelBallot() * @see meerkat.voting.VotingBooth#cancelBallot()
*/ */
@Override /*@Override
public void cancelBallot() { public void cancelBallot() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }*/
/* (non-Javadoc) /* (non-Javadoc)
* @see meerkat.voting.VotingBooth#voterCastOrAudit(boolean) * @see meerkat.voting.VotingBooth#voterCastOrAudit(boolean)
*/ */
@Override /*@Override
public void voterCastOrAudit(boolean castVote) { public void voterCastOrAudit(boolean castVote) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }*/
} }
@ -129,10 +187,10 @@ message BallotAnswer {
repeated sint64 answer = 1 [packed=true]; repeated sint64 answer = 1 [packed=true];
} }
message PlaintextBallot { message EncryptedBallot {
uint64 serialNumber = 1; // Ballot serial number uint64 serialNumber = 1; // Ballot serial number
repeated BallotAnswer answers = 2; RerandomizableEncryptedMessage data = 2;
} }
message BallotSecrets { message BallotSecrets {

View File

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