#include "TA.h"

TA::TA(void) {
	p = 0;
	q = 0;
	n = 0;
	phiN = 0;
	exponent = 0;
	masterKey = 0;
}

void TA::setP(uint16 p) {
	
	if (Util::isPrime(p)) {
		this->p = p;
		n = p * q;
		phiN = p * q - p - q + 1;
	}
}

void TA::setQ(uint16 q) {

	if (Util::isPrime(q)) {
		this->q = q;
		n = p * q;
		phiN = p * q - p - q + 1;
	}
}

TA* TA::getInstance(void) {
	
	static TA instance;
	
	return &instance;
}

void TA::setUp(void) {

	do {
		exponent = (uint32)((double)rand() / RAND_MAX * (phiN-2)) + 1;
	} while (Util::gcd(exponent, (uint32)phiN) != 1);

	masterKey = Util::inv(exponent, (uint32)phiN);
}

uint32 TA::getPhiN(void) {
	return phiN;
}

uint32 TA::getN(void) {
	return n;
}

uint32 TA::userKeyGeneration(string id) {

	uint32 ID = Util::hash(id) % phiN;

	return Util::powMod(ID, masterKey, n);

}

uint32 TA::getExponent(void) {
	return exponent;
}