package com.rau.evoting.beans;
import java.math.BigInteger;
import java.util.ArrayList;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.mail.MessagingException;
import org.primefaces.model.StreamedContent;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.rau.evoting.ElGamal.BigIntegerTypeAdapter;
import com.rau.evoting.ElGamal.ChaumPedersen;
import com.rau.evoting.ElGamal.ChaumPedersenProof;
import com.rau.evoting.ElGamal.CryptoUtil;
import com.rau.evoting.ElGamal.ElGamalHelper;
import com.rau.evoting.data.ElectionDP;
import com.rau.evoting.data.ElectionVoteDP;
import com.rau.evoting.data.ElectionAnswerDP;
import com.rau.evoting.data.UserDP;
import com.rau.evoting.models.Answer;
import com.rau.evoting.models.Election;
import com.rau.evoting.models.User;
import com.rau.evoting.utils.BarcodeHelper;
import com.rau.evoting.utils.MailService;
import com.rau.evoting.utils.Pair;
import com.rau.evoting.utils.StringHelper;
import com.rau.evoting.utils.Util;
public class Vote {
private ArrayList<Answer> answers1;
private ArrayList<Answer> answers2;
private boolean showEncode;
private boolean showShuffle;
private String encoded1;
private String encoded2;
private StreamedContent barcode1;
private StreamedContent barcode2;
private StreamedContent barcodeReceipt;
private int selectedDecodedList;
private boolean showDecode;
private boolean showDecoded1;
private boolean showDecoded2;
private int selectedVote;
private int elId;
private int userId;
private String decoded1;
private String decoded2;
private String hash1;
private String hash2;
private int receiptId;
private Election election;
private String publicKey;
private BigInteger r1;
private BigInteger r2;
private String chaumPedersen;
public Vote() {
userId = (int) FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().get("userId");
}
public String fromElection() {
elId = Integer.valueOf(FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("elId"));
answers1 = ElectionAnswerDP.getElectionAnswers(elId);
answers2 = ElectionAnswerDP.getElectionAnswers(elId);
showEncode = false;
showShuffle = true;
selectedDecodedList = 1;
selectedVote = 0;
showDecode = false;
showDecoded1 = false;
showDecoded2 = false;
barcode1 = null;
barcode2 = null;
barcodeReceipt = null;
encoded1 = null;
encoded2 = null;
/*a1 = new ArrayList<Integer>();
a2 = new ArrayList<Integer>();
for (Answer ans : answers) {
a1.add(ans.getId());
a2.add(ans.getId());
}*/
election = ElectionDP.getElection(elId);
publicKey = election.getPublicKey();
return "Vote?faces-redirect=true";
}
public void shuffle(AjaxBehaviorEvent event) {
Util.shuffle(answers1);
Util.shuffle(answers2);
showEncode = true;
}
public void encode(AjaxBehaviorEvent event) {
showShuffle = false;
decoded1 = StringHelper.convertAnswersIdsToString(answers1);
ElGamalHelper e1 = new ElGamalHelper(publicKey);
encoded1 = e1.encodeBigInt(decoded1);
System.out.println("enc + dec: " + encoded1 + " " + decoded1);
barcode1 = BarcodeHelper.getBarcodeFromString(encoded1);
decoded2 = StringHelper.convertAnswersIdsToString(answers2);
r1 = e1.getR();
ElGamalHelper e2 = new ElGamalHelper(publicKey);
encoded2 = e2.encodeBigInt(decoded2);
System.out.println("enc + dec2: " + encoded2 + " " + decoded2);
barcode2 = BarcodeHelper.getBarcodeFromString(encoded2);
r2 = e2.getR();
showEncode = false;
showDecode = true;
}
public void decode(AjaxBehaviorEvent event) {
showDecode = false;
hash1 = StringHelper.getSHA256hash(encoded1);
hash2 = StringHelper.getSHA256hash(encoded2);
if (selectedDecodedList == 1) {
showDecoded1 = true;
// make decode logic
} else {
showDecoded2 = true;
// make decode logic
}
}
public String vote() {
// vote
if(selectedDecodedList == 1) {
//selectedVote = a2.indexOf(selectedVote) + 1;
for(int i = 0; i < answers2.size(); ++i) {
if(answers2.get(i).getId() == selectedVote) {
selectedVote = i+1;
break;
}
}
} else {
for(int i = 0; i < answers1.size(); ++i) {
if(answers1.get(i).getId() == selectedVote) {
selectedVote = i+1;
break;
}
}
}
ChaumPedersenProof chaum = new ChaumPedersenProof();
ChaumPedersen cp = chaum.generate(new BigInteger(publicKey),
(selectedDecodedList == 1 ? r1 : r2));
cp.setMessage(selectedDecodedList == 1 ? decoded1 : decoded2);
Pair<BigInteger, BigInteger> enc = CryptoUtil
.getBigIntEncodedA_B(selectedDecodedList == 1 ? encoded1 : encoded2);
cp.setA(enc.getFirst());
cp.setB(enc.getSecond());
System.out.println("a" + cp.getA());
System.out.println("b" + cp.getB());
Gson gson = new GsonBuilder().registerTypeAdapter(BigInteger.class,
new BigIntegerTypeAdapter()).create();
chaumPedersen = gson.toJson(cp);
receiptId = ElectionVoteDP.setElectionVote(elId, userId,
selectedDecodedList, (selectedDecodedList == 1 ? decoded1
: decoded2), encoded1, encoded2, selectedVote,
chaumPedersen);
barcodeReceipt = BarcodeHelper.getBarcodeFromString(chaumPedersen);
if (receiptId == -1) {
return "Home?faces-redirect=true";
}
String message = " Reciept Id: " + receiptId + "\n " + " hash1: "
+ hash1 + "\n " + " hash2: " + hash2 + "\n "
+ " selected audit ballot: " + selectedDecodedList + " - "
+ (selectedDecodedList == 1 ? decoded1 : decoded2) + "\n "
+ " your choice: " + selectedVote;
String subject = "Receipt for " + election.getName() + " election";
User user = UserDP.getUser(userId);
try {
MailService.sendMessage(user.getEmail(), subject, message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "AfterVote?faces-redirect=true";
}
public ArrayList<Answer> getAnswers1() {
return answers1;
}
public void setAnswers1(ArrayList<Answer> answers1) {
this.answers1 = answers1;
}
public ArrayList<Answer> getAnswers2() {
return answers2;
}
public void setAnswers2(ArrayList<Answer> answers2) {
this.answers2 = answers2;
}
public boolean isShowEncode() {
return showEncode;
}
public void setShowEncode(boolean showEncode) {
this.showEncode = showEncode;
}
public boolean isShowShuffle() {
return showShuffle;
}
public void setShowShuffle(boolean showShuffle) {
this.showShuffle = showShuffle;
}
public StreamedContent getBarcode1() {
return barcode1;
}
public void setBarcode1(StreamedContent encoded1) {
this.barcode1 = encoded1;
}
public StreamedContent getBarcode2() {
return barcode2;
}
public void setBarcode2(StreamedContent encoded2) {
this.barcode2 = encoded2;
}
public StreamedContent getBarcodeReceipt() {
return barcodeReceipt;
}
public void setBarcodeReceipt(StreamedContent barcodeReceipt) {
this.barcodeReceipt = barcodeReceipt;
}
public int getSelectedDecodedList() {
return selectedDecodedList;
}
public void setSelectedDecodedList(int selectedDecodedList) {
this.selectedDecodedList = selectedDecodedList;
}
public boolean isShowDecode() {
return showDecode;
}
public void setShowDecode(boolean showDecode) {
this.showDecode = showDecode;
}
public boolean isShowDecoded1() {
return showDecoded1;
}
public void setShowDecoded1(boolean showDecoded1) {
this.showDecoded1 = showDecoded1;
}
public boolean isShowDecoded2() {
return showDecoded2;
}
public void setShowDecoded2(boolean showDecoded2) {
this.showDecoded2 = showDecoded2;
}
public int getSelectedVote() {
return selectedVote;
}
public void setSelectedVote(int selectedVote) {
this.selectedVote = selectedVote;
}
public String getHash1() {
return hash1;
}
public void setHash1(String hash1) {
this.hash1 = hash1;
}
public String getHash2() {
return hash2;
}
public void setHash2(String hash2) {
this.hash2 = hash2;
}
public String getDecoded1() {
return decoded1;
}
public void setDecoded1(String decoded1) {
this.decoded1 = decoded1;
}
public String getDecoded2() {
return decoded2;
}
public void setDecoded2(String decoded2) {
this.decoded2 = decoded2;
}
public int getReceiptId() {
return receiptId;
}
public void setReceiptId(int receiptId) {
this.receiptId = receiptId;
}
}