aboutsummaryrefslogtreecommitdiff
path: root/extension/opensslthread.cpp
blob: 84e22863b8925186394663a3bf5ef6f34898ea8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "opensslthread.h"


OpensslThread::OpensslThread(void *_data, OpensslThread_Type _type):
type(_type),data(_data)
{
	assert((type > OpensslThread_Type_NOTHING && type < OpensslThread_Type_LAST));
	assert((data != NULL));
}


OpensslThread::~OpensslThread()
{

}

static void openssl_hash_FramAction(void *data)
{
	if(data == NULL)
		return;

	Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
	
	IPluginFunction *pFunc = handle->hash_callback;
	assert((pFunc != NULL));
	if(pFunc != NULL)
	{
		pFunc->PushCell(handle->success);
		if(handle->output == NULL)
			pFunc->PushString("");
		else
			pFunc->PushString(handle->output);
		pFunc->PushCell(handle->UserData);
		pFunc->Execute(NULL);
	}
	
	if(handle->output != NULL)
		delete handle->output;
	if(handle->path != NULL)
		delete handle->path;
	delete handle;
}

void OpensslThread::RunFileHash()
{
	Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
	handle->success = false;

	assert((handle->path != NULL));

	char realpath[PLATFORM_MAX_PATH];
	g_pSM->BuildPath(Path_Game, realpath, sizeof(realpath), "%s", handle->path);
	FILE *pFile = fopen(realpath, "rb");
	if(!pFile)
		return;

	unsigned char *output = NULL;
	int outlength;

	if(!g_OpensslManager.HashFile(handle->algorithm, pFile, &output, &outlength))
		goto clean;

	assert((output != NULL));
	if(output != NULL)
	{
		handle->output = new char[outlength*2+1];
		int pos = 0;
		for(int i=0; i<outlength; i++)
		{
			sprintf(&handle->output[pos],"%02x",(unsigned char)output[i]);
			pos+=2;
		}
		handle->success = true;
	}

clean:
	if(output != NULL)
		delete output;

	fclose(pFile);
}

void OpensslThread::RunThread(IThreadHandle *pHandle)
{
	if(type == OpensslThread_Type_HASH_FILE)
	{
		RunFileHash();
	}
}

void OpensslThread::OnTerminate(IThreadHandle *pHandle, bool cancel)
{
	if(type == OpensslThread_Type_HASH_FILE)
	{
		smutils->AddFrameAction(openssl_hash_FramAction, data);
	}

	delete this;
}