#include <iostream>
using namespace std;

#include <passwordverifier001.h>
#include <passwordverifier001test.h>
#include <print.h>

void passwordverifier001test::test02()
{
  ZZ pass;
  conv(pass,"8493903");

  ZZ j1;
  conv(j1,"23");
  ZZ k1;
  conv(k1,"12");

  ZZ n1;
  conv(n1,"8294");
  //conv(n1,"8294");

  cout << SHOW(pass) << endl;
  cout << SHOW(j1) << endl;
  cout << SHOW(n1) << endl;

  ZZ w;
  //w = (pass ^ j1 ) % n1;
  w = PowerMod(pass%n1,j1,n1);

  cout << SHOW(w) << endl;


/*

  ZZ j2;
  conv(j2,"3");
  
*/

}

int passwordverifier001test::unittest01()
{
  uintc nbits=20;
  cout << SHOW(nbits) << endl;
  passwordverifier001 client(nbits);
  cout << "Create a passord" << endl;
  
  client.generatePassword();
  cout << SHOW(client.password) << endl;

  passwordverifier001 server(nbits);
  server.password = client.password;
  cout << SHOW(server.password) << endl;

  cout << "Both the server and client share the password." << endl << endl;

  cout << "Client requests parameters." << endl;
  cout << "Server is generating the function parameters." << endl;
  server.generateRandomFunction();
  string param;
  server.parameters_get(param);
  cout << SHOW(param) << endl << endl;
  client.parameters_set(param);

  string param2;
  client.parameters_get(param2);
  cout << SHOW(param2) << endl << endl;

cout << endl << "Double Check" << endl;
cout << SHOW(client.j1) << endl;
cout << SHOW(client.j2) << endl;
cout << SHOW(client.n1) << endl;
cout << SHOW(client.n2) << endl;
cout << SHOW(client.k1) << endl;
cout << SHOW(server.j1) << endl;
cout << SHOW(server.j2) << endl;
cout << SHOW(server.n1) << endl;
cout << SHOW(server.n2) << endl;
cout << SHOW(server.k1) << endl;
cout << endl;

  string answer;
  client.eval(answer);
  cout << "Client evaluates the answer." << endl;
  cout << SHOW(answer) << endl << endl;

  cout << "Server verifies this." << endl;
  string answer2;
  server.eval(answer2);
  cout << SHOW(answer2) << endl << endl;
 

  bool result;
  result = server.verify(answer);
  cout << SHOW(result) << endl;

  if (result==false)
    return 1;

  return 0;
}




