#include "PKG.h"

PKG::PKG(void) {
	P = 0;
	Q = 0;
	M = 0;
}

void PKG::setP(uint16 p) {
	
	if (Util::isPrime3mod4(p)) {
		P = p;
		M = P * Q;
	}
}

void PKG::setQ(uint16 q) {

	if (Util::isPrime3mod4(q)) {
		Q = q;
		M = P * Q;
	}
}

PKG* PKG::getInstance() {
	
	static PKG instance;
	
	return &instance;
}

uint32 PKG::createKey(string id) {

	uint32 a;
	uint32 exponent = (M + 5 - P - Q) / 8;
	
	a = Util::hash(id, M);

	return Util::powMod(a, exponent, M);

}

uint32 PKG::getM(void) {
	return M;
}