SkypeACL/SkypeACL.cpp
#include <windows.h>
#include <stdio.h>
#include "HashUtil.h"
#include "KeyGen_SBOX.h"
void StrToUpperCase(char *lpOutString, char *lpInString)
{
while(*lpInString != 0x00)
*lpOutString++ = toupper(*lpInString++);
}
void StrToLowerCase(char *lpOutString, char *lpInString)
{
while(*lpInString != 0x00)
*lpOutString++ = tolower(*lpInString++);
}
///////////////////////////////////////////////////////////////////////////////
// Skype ACL KeyGen
// Input:
// lpUserName : skype accountname
// lpFileName : full path of plugin
// Output: All fields are encrypted!
// lpOutKey1 : Key1
// lpOutKey2 : Key2
// lpOutKey3 : Key3
// lpOutKey4 : Key4
// lpOutPath : Path
//
BOOL SkypeACLKeyGen(char *lpUserName, char *lpFileName, char *lpOutKey1, char *lpOutKey2, char *lpOutKey3, char *lpOutKey4, char *lpOutKey5, char *lpOutKey6, char *lpOutPath, BOOL isOld)
{
char szPluginDigest_SHA256[(32*2) * 2];
char szPluginDigest_MD5[17 * 2];
char *szPassphrase1 = "Element'ry!penguiNs;-)SingingHarekrishna_";
char *szPassphrase2 = "Element'ry!penguiNs;-)SingingHareKrishna_";
const int username_len = strlen(lpUserName);
SHA256_Plugin(lpFileName, szPluginDigest_SHA256, isOld);
MD5_Plugin(lpFileName, szPluginDigest_MD5);
char *szUSERNAME = (char *) malloc(strlen(lpUserName)+1);
char *szFILENAME = (char *) malloc(strlen(lpFileName)+1);
RtlZeroMemory(szUSERNAME, strlen(lpUserName)+1);
RtlZeroMemory(szFILENAME, strlen(lpFileName)+1);
StrToUpperCase(szFILENAME, lpFileName);
StrToUpperCase(szUSERNAME, lpUserName);
char *result = NULL;
char temp[512];
char tmp[1024];
// /Client/Key1
char _md5_filename[MD5_DIGEST_SIZE * 2 + 1];
char _md5_key1_0[MD5_DIGEST_SIZE * 2 + 1];
char _md5_key1_1[MD5_DIGEST_SIZE * 2 + 1];
char _md5_key1[MD5_DIGEST_SIZE * 4 + 1];
char passSBOX[4][MD5_DIGEST_SIZE*2+1];
RtlZeroMemory(_md5_filename, MD5_DIGEST_SIZE * 2 + 1);
MD5_Array(_md5_filename, szFILENAME, strlen(szFILENAME));
if(isOld) {
sprintf(tmp, "%s%s", _md5_filename, szPassphrase1);
MD5_Array(_md5_key1_0, tmp, strlen(tmp));
sprintf(tmp, "%s%s", szPluginDigest_MD5, szPassphrase1);
MD5_Array(_md5_key1_1, tmp, strlen(tmp));
} else {
sprintf(tmp, "%s%s", _md5_filename, szPassphrase2);
MD5_Array(_md5_key1_0, tmp, strlen(tmp));
sprintf(tmp, "%s%s", szPluginDigest_MD5, szPassphrase2);
MD5_Array(_md5_key1_1, tmp, strlen(tmp));
}
sprintf(_md5_key1, "%s%s", _md5_key1_0, _md5_key1_1);
// Encrypt sha256 /Client/Key1
result = Encrypt(lpUserName, _md5_key1);
RtlCopyMemory(lpOutKey1, result, strlen(result));
free(result);
//// Encrypt sha256 /Client/Key2
//sprintf(tmp, "%s%s%s%s", szUSERNAME, "ke:", szFILENAME, "1a");
//RtlZeroMemory(temp, sizeof(temp));
//MD5_Array(temp, tmp, strlen(tmp));
//result = Encrypt(lpUserName, temp);
//RtlCopyMemory(lpOutKey2, result, strlen(result));
//free(result);
// generate all keys to find correct!
sprintf(tmp, "%s%s%s%s", szUSERNAME, "ke:", szFILENAME, "1a");
RtlZeroMemory(temp, sizeof(temp));
MD5_Array(passSBOX[0], tmp, strlen(tmp));
sprintf(tmp, "%s%s%s%s", "1u", szFILENAME, "ba", szUSERNAME);
RtlZeroMemory(temp, sizeof(temp));
MD5_Array(passSBOX[1], tmp, strlen(tmp));
sprintf(tmp, "%s%s%s%s", "ky", szUSERNAME, "s1", szFILENAME);
RtlZeroMemory(temp, sizeof(temp));
MD5_Array(passSBOX[2], tmp, strlen(tmp));
sprintf(tmp, "%s%s%s%s", "p0", szUSERNAME, "1e", szFILENAME);
RtlZeroMemory(temp, sizeof(temp));
MD5_Array(passSBOX[3], tmp, strlen(tmp));
// Encrypt sha256 /Client/Key2
result = Encrypt(lpUserName, passSBOX[1]);
RtlCopyMemory(lpOutKey2, result, strlen(result));
free(result);
// Encrypt sha256 /Client/Key3
result = Encrypt(lpUserName, passSBOX[3]);
RtlCopyMemory(lpOutKey3, result, strlen(result));
free(result);
// Encrypt sha256 /Client/Key4
RtlZeroMemory(temp, sizeof(temp));
StrToUpperCase(temp, szPluginDigest_SHA256);
result = Encrypt(lpUserName, temp);
RtlCopyMemory(lpOutKey4, result, strlen(result)+1);
free(result);
// Encrypt path //Client/Path
result = Encrypt(lpUserName, lpFileName);
RtlCopyMemory(lpOutPath, result, strlen(result));
free(result);
// encrypt date
char today[32];
SYSTEMTIME sys_time;
GetSystemTime(&sys_time);
GetDateFormatA(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &sys_time, NULL, today, sizeof(today));
char count[4];
count[0] = '3';
count[1] = 0x00;
count[2] = 0x00;
count[3] = 0x00;
result = Encrypt(lpUserName, today);
RtlCopyMemory(lpOutKey5, result, strlen(result));
free(result);
result = Encrypt(lpUserName, count);
RtlCopyMemory(lpOutKey6, result, strlen(result));
free(result);
free(szUSERNAME);
free(szFILENAME);
return TRUE;
}