package com.rava.voting.ui;
import java.math.BigInteger;
import java.nio.charset.Charset;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
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.CryptoUtil;
import com.rau.evoting.ElGamal.GlobalParameters;
import com.rava.voting.R;
public class ReceiptInfoFragment extends Fragment {
public static final String TAG = "ReceiptInfoFragment";
// public static final String KEY_A = "KEY_A";
// public static final String KEY_B = "KEY_B";
// public static final String KEY_MESSAGE = "KEY_MESSAGE";
private TextView mTextViewP;
private TextView mTextViewG;
private TextView mTextViewY;
private TextView mTextViewA;
private TextView mTextViewB;
private TextView mTextViewMessage;
private TextView mTextViewMessageBigInt;
private TextView mTextViewY1;
private TextView mTextViewY2;
private TextView mTextViewA1;
private TextView mTextViewA2;
private TextView mTextViewC;
private TextView mTextViewS;
private TextView mTextViewRes1;
private TextView mTextViewRes2;
private TextView mTextViewNote;
private TextView mTextViewNextNote;
private TextView mtextViewWrongQrcode;
private Button mButtonNext;
private TableRow mTableRowA;
private TableRow mTableRowB;
private TableRow mTableRowMessage;
private TableRow mTableRowMessageBigInt;
private TableRow mTableRowA1;
private TableRow mTableRowA2;
private TableRow mTableRowC;
private TableRow mTableRowS;
private TableRow mTableRowRes1;
private TableRow mTableRowRes2;
private TableLayout mTableLayoutReceiptInfo;
private int clicks = 0;
private BigInteger p;
private BigInteger g;
private BigInteger y;
// private BigInteger r = new BigInteger("43245626364");
private BigInteger a;
private BigInteger b;
private BigInteger y1;
private BigInteger y2;
private BigInteger a1;
private BigInteger a2;
//private BigInteger k;
private BigInteger c;
private BigInteger s;
private BigInteger res1;
private BigInteger res2;
private ChaumPedersen mChaumPedersen;
public static ReceiptInfoFragment newInstance(String content) {
ReceiptInfoFragment fragment = new ReceiptInfoFragment();
Bundle args = new Bundle();
args.putString("content", content);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_receipt_info, container,
false);
mTextViewP = (TextView) root.findViewById(R.id.textview_p);
mTextViewG = (TextView) root.findViewById(R.id.textview_g);
mTextViewY = (TextView) root.findViewById(R.id.textview_y);
mTextViewA = (TextView) root.findViewById(R.id.textview_a);
mTextViewB = (TextView) root.findViewById(R.id.textview_b);
mTextViewMessage = (TextView) root.findViewById(R.id.textview_message);
mTextViewMessageBigInt = (TextView) root
.findViewById(R.id.textview_message_bigint);
mTextViewY1 = (TextView) root.findViewById(R.id.textview_y1);
mTextViewY2 = (TextView) root.findViewById(R.id.textview_y2);
mTextViewA1 = (TextView) root.findViewById(R.id.textview_a1);
mTextViewA2 = (TextView) root.findViewById(R.id.textview_a2);
mTextViewC = (TextView) root.findViewById(R.id.textview_c);
mTextViewS = (TextView) root.findViewById(R.id.textview_s);
mTextViewRes1 = (TextView) root.findViewById(R.id.textview_res1);
mTextViewRes2 = (TextView) root.findViewById(R.id.textview_res2);
mTextViewNote = (TextView) root.findViewById(R.id.textview_note);
mTextViewNextNote = (TextView) root
.findViewById(R.id.textview_next_note);
mtextViewWrongQrcode = (TextView) root.findViewById(R.id.textview_wrong_qrcode);
mButtonNext = (Button) root.findViewById(R.id.button_next);
mButtonNext.setOnClickListener(new NextClick());
mTableRowA = (TableRow) root.findViewById(R.id.tablerow_a);
mTableRowB = (TableRow) root.findViewById(R.id.tablerow_b);
mTableRowMessage = (TableRow) root.findViewById(R.id.tablerow_message);
mTableRowMessageBigInt = (TableRow) root
.findViewById(R.id.tablerow_message_bigint);
mTableRowA1 = (TableRow) root.findViewById(R.id.tablerow_a1);
mTableRowA2 = (TableRow) root.findViewById(R.id.tablerow_a2);
mTableRowC = (TableRow) root.findViewById(R.id.tablerow_c);
mTableRowS = (TableRow) root.findViewById(R.id.tablerow_s);
mTableRowRes1 = (TableRow) root.findViewById(R.id.tablerow_result1);
mTableRowRes2 = (TableRow) root.findViewById(R.id.tablerow_result2);
mTableLayoutReceiptInfo = (TableLayout) root.findViewById(R.id.tablelayout_receipt_info);
return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle args = getArguments();
String content = args.getString("content");
Gson gson = new GsonBuilder().registerTypeAdapter(BigInteger.class,
new BigIntegerTypeAdapter()).create();
try {
mChaumPedersen = gson.fromJson(content, ChaumPedersen.class);
calculate();
} catch (Exception ex) {
mTableLayoutReceiptInfo.setVisibility(View.GONE);
mTextViewNextNote.setVisibility(View.GONE);
mtextViewWrongQrcode.setVisibility(View.VISIBLE);
}
}
private void calculate() {
a = mChaumPedersen.getA();
b = mChaumPedersen.getB();
String message = mChaumPedersen.getMessage();
p = GlobalParameters.getParams().getP();// mChaumPedersen.getP();
g = GlobalParameters.getParams().getG(); // mChaumPedersen.getG();
y = mChaumPedersen.getY();
Charset charset = Charset.forName("ISO-8859-1");
byte[] bytes = message.getBytes(charset);
BigInteger messageBigint = CryptoUtil.stringToBigInteger(message);// new BigInteger(bytes);
y1 = a;
y2 = b.divide(messageBigint).mod(p);
mTextViewP.setText(p.toString());
mTextViewG.setText(g.toString());
mTextViewY.setText(y.toString());
mTextViewA.setText(a.toString());
mTextViewB.setText(b.toString());
mTextViewMessage.setText(message);
mTextViewMessageBigInt.setText(messageBigint.toString());
mTextViewY1.setText(y1.toString());
mTextViewY2.setText(y2.toString());
// change to random
// k = new BigInteger("1231365");
a1 = mChaumPedersen.getA1();// g.modPow(k, p);
a2 = mChaumPedersen.getA2(); // y.modPow(k, p);
mTextViewA1.setText(a1.toString());
mTextViewA2.setText(a2.toString());
mTextViewNote.setText(getResources().getString(R.string.note2));
mTextViewNextNote
.setText(getResources().getString(R.string.next_note2));
String temp = a1.toString().concat(a2.toString());
long t2 = temp.hashCode();
c = BigInteger.valueOf(t2).mod(p);
// c = new BigInteger("111");
mTextViewC.setText(c.toString());
mTextViewNextNote
.setText(getResources().getString(R.string.next_note3));
mTableRowS.setVisibility(View.VISIBLE);
// BigInteger temp2 = c.multiply(r).mod(p);
s = mChaumPedersen.getS(); // k.subtract(temp2).mod(p);
mTextViewS.setText(s.toString());
mTextViewNextNote
.setText(getResources().getString(R.string.next_note4));
mTextViewNote.setVisibility(View.GONE);
res1 = g.modPow(s, p).multiply(y1.modPow(c, p)).mod(p);
res2 = y.modPow(s, p).multiply(y2.modPow(c, p)).mod(p);
mTextViewRes1.setText(res1.toString());
mTextViewRes2.setText(res2.toString());
if (a1.equals(res1) && a2.equals(res2)) {
mTextViewNextNote.setText(getResources().getString(
R.string.next_note5));
} else {
mTextViewNextNote.setText(getResources().getString(
R.string.next_error));
mTextViewNextNote.setTextColor(getResources().getColor(
android.R.color.holo_red_dark));
}
}
private class NextClick implements OnClickListener {
@Override
public void onClick(View v) {
clicks++;
switch (clicks) {
case 1:
mTableRowA.setVisibility(View.GONE);
mTableRowB.setVisibility(View.GONE);
mTableRowMessage.setVisibility(View.GONE);
mTableRowMessageBigInt.setVisibility(View.GONE);
mTableRowA1.setVisibility(View.VISIBLE);
mTableRowA2.setVisibility(View.VISIBLE);
// change to random
// k = new BigInteger("1231365");
a1 = mChaumPedersen.getA1();// g.modPow(k, p);
a2 = mChaumPedersen.getA2(); // y.modPow(k, p);
mTextViewA1.setText(a1.toString());
mTextViewA2.setText(a2.toString());
mTextViewNote.setText(getResources().getString(R.string.note2));
mTextViewNextNote.setText(getResources().getString(
R.string.next_note2));
break;
case 2:
mTableRowC.setVisibility(View.VISIBLE);
String temp = a1.toString().concat(a2.toString());
long t2 = temp.hashCode();
// String hash = CryptoUtil.getSHA256hash(temp);
c = BigInteger.valueOf(t2).mod(p);
// c = new BigInteger(hash);
// c = new BigInteger("111");
mTextViewC.setText(c.toString());
mTextViewNote.setVisibility(View.GONE);
mTextViewNextNote.setText(getResources().getString(
R.string.next_note3));
break;
case 3:
mTableRowS.setVisibility(View.VISIBLE);
// BigInteger temp2 = c.multiply(r).mod(p);
s = mChaumPedersen.getS(); // k.subtract(temp2).mod(p);
mTextViewS.setText(s.toString());
// mTextViewNote.setVisibility(View.GONE);
mTextViewNextNote.setText(getResources().getString(
R.string.next_note4));
break;
case 4:
mButtonNext.setVisibility(View.GONE);
mTableRowRes1.setVisibility(View.VISIBLE);
mTableRowRes2.setVisibility(View.VISIBLE);
res1 = g.modPow(s, p).multiply(y1.modPow(c, p)).mod(p);
res2 = y.modPow(s, p).multiply(y2.modPow(c, p)).mod(p);
mTextViewRes1.setText(res1.toString());
mTextViewRes2.setText(res2.toString());
if (a1.equals(res1) && a2.equals(res2)) {
mTextViewNextNote.setText(getResources().getString(
R.string.next_note5));
} else {
mTextViewNextNote.setText(getResources().getString(
R.string.next_error));
mTextViewNextNote.setTextColor(getResources().getColor(
android.R.color.holo_red_dark));
}
break;
}
}
}
}