#include "BruteForcePass.h"
#include "Client.h"


BruteForcePass::BruteForcePass(BruteForcePassParam* p){
	this->parameters=p;
	this->job=new Job();
	this->found=false;
	this->is_running=false;
}


BruteForcePass::~BruteForcePass(){
	destroy_Hash(this->build_hash);
	dlclose(lib_handle);
	this->exitThread();
	delete this;
}


void BruteForcePass::loadSharedModule() {
	lib_handle = dlopen(MODULE_NAME, RTLD_LAZY);
	if (!lib_handle) cerr << "Cannot load library: " << dlerror() << endl;
	create_Hash = (create_t*) dlsym(lib_handle, "create");
	const char* dlsym_error = dlerror();
	if (errno !=0 && dlsym_error) cerr << "Cannot load symbol create: " << dlsym_error << endl;
	destroy_Hash = (destroy_t*) dlsym(lib_handle, "destroy");
	dlsym_error = dlerror();
	if (errno !=0 && dlsym_error) cerr << "Cannot load symbol destroy: " << dlsym_error << endl;
	this->build_hash = create_Hash();
}


void BruteForcePass::createThread() {
	this->is_running=true;
	this->crackPass(this->job->begin);
	this->is_running=false;
	this->exitThread();
}

void BruteForcePass::crackPass(string str){
	int current_size=str.length();
	if (found==true || current_size>parameters->max_size) return;
	for (int idx=0;idx<parameters->chars_allowed_length;idx++){
		string tmp=str+parameters->chars_allowed[idx];
		crackPass(tmp);
	}
	if (current_size>=parameters->min_size) {
		this->build_hash->Compute(str);
// 		cout << str << "=" << this->hash->hash << endl;
		if ( this->build_hash->hash == parameters->hash_to_hack) {
			result=str;
			found=true;
			is_running=false;
		}
	}
}
