Files
interactive/gms/KT/sdkfreebsd64/auth.c
2026-08-07 17:38:18 +09:00

211 lines
4.8 KiB
C

#include "SHSSDK.h"
#include "main.h"
#include "auth.h"
#include "mcrypt.h"
#include "ne_string.h"
#define KEY_LENGTH 24
static const int g_pnKeyPos[] = {
41, 8467, 6334, 6500, 9169,
5724, 1478, 9358, 6962, 4464,
5705, 8145, 3281, 6827, 9961,
491, 2995, 1942, 4827, 5436,
2391, 10004, 3902, 153
};
const char *sh_get_auth_string(const char *userId, const char *password, const char *serviceId,
const char *authKey, const char *authFile, time_t expire)
{
char *pszResult = NULL;
char szMid[128]={0};
char *pszKey = NULL, szIV[KEY_LENGTH];
char szMD5[128], szPassword[128], szAuthString[256];
int i, nAuthStringLen, nSkipLen;
char* pData=NULL;
MCRYPT mcrypt = NULL;
pszKey = (char*)_sh_GetKey(authFile);
fprintf(stderr, "pszKey %s\n", pszKey);
if (!pszKey)
{
fprintf(stderr , "!!\n");
return NULL;
}
strcpy(szMD5, password);
ne_md5_buffer(szMD5, szPassword);
sprintf(szMD5, "%s@%s%s%010d", serviceId, userId, szPassword, (int)expire);
ne_md5_buffer(szMD5, szPassword);
sprintf(szAuthString, "%s@%s:%s@%s-%s-%010d", serviceId, userId, serviceId, userId, szPassword, (int)expire);
mcrypt = mcrypt_module_open(MCRYPT_BLOWFISH, NULL, MCRYPT_CBC, NULL);
if (mcrypt == MCRYPT_FAILED)
goto EXIT_FUNCTION;
memset(szIV, NULL, KEY_LENGTH);
if (KEY_LENGTH <= strlen(authKey))
memcpy(szIV, authKey, KEY_LENGTH);
else
strcpy(szIV, authKey);
if (mcrypt_generic_init(mcrypt, pszKey, KEY_LENGTH, szIV) < 0)
goto EXIT_FUNCTION;
nSkipLen = (int)strlen(serviceId) + (int)strlen(userId) + 2;
nAuthStringLen = (int)strlen(szAuthString);
if (mcrypt_generic(mcrypt, szAuthString + nSkipLen, nAuthStringLen - nSkipLen) < 0)
goto EXIT_FUNCTION;
mcrypt_generic_deinit(mcrypt);
pszResult = ne_base64((const unsigned char*)szAuthString, nAuthStringLen);
#ifdef _NEWAUTH
pData = ne_base64((const unsigned char*)szAuthString, nAuthStringLen);
ne_md5_buffer(pData,szMid);
pszResult = malloc(strlen(pData) + strlen(szMid)+2);
strcpy(pszResult,pData);
strcat(pszResult,":");
strcat(pszResult,szMid);
if (pData)
free(pData);
#endif
EXIT_FUNCTION:
i = GetLastError();
if (pszKey)
free(pszKey);
if (mcrypt)
mcrypt_module_close(mcrypt);
SetLastError(i);
return pszResult;
}
#define DECRYPT_KEY "I'm your father"
#define DECRYPT_BIT 24
const char *sh_decrypt(const char *encrypted, int acceptGap)
{
char *pszResult = NULL;
char szKey[DECRYPT_BIT], szIV[DECRYPT_BIT];
char *pszEncrypted = NULL, *pszDecrypted = NULL;
int i, nEncryptedSize, nDecryptedSize;
char szCreatedTime[15], szCurrentTime[15];
time_t tmNow;
struct tm *ptmGMT;
struct tm stm;
MCRYPT mcrypt = NULL;
pszEncrypted = strdup(encrypted);
if (!pszEncrypted)
return NULL;
memset(szKey, NULL, DECRYPT_BIT);
strcpy(szKey, DECRYPT_KEY);
nEncryptedSize = (int)strlen(pszEncrypted) - DECRYPT_BIT;
memcpy(szIV, pszEncrypted + nEncryptedSize, DECRYPT_BIT);
pszEncrypted[nEncryptedSize] = (char)NULL;
nDecryptedSize = (int)ne_unbase64(pszEncrypted, (unsigned char **)&pszDecrypted);
pszDecrypted[nDecryptedSize] = (char)NULL;
// º¹È£È­
mcrypt = mcrypt_module_open(MCRYPT_BLOWFISH, NULL, MCRYPT_CBC, NULL);
if (mcrypt == MCRYPT_FAILED)
goto EXIT_FUNCTION;
if (mcrypt_generic_init(mcrypt, szKey, DECRYPT_BIT, szIV) < 0)
goto EXIT_FUNCTION;
if (mdecrypt_generic(mcrypt, pszDecrypted, nDecryptedSize) < 0)
goto EXIT_FUNCTION;
mcrypt_generic_deinit(mcrypt);
// ½Ã°£ ºñ±³
nDecryptedSize -= 14;
memcpy(szCreatedTime, pszDecrypted + nDecryptedSize, 14);
pszDecrypted[nDecryptedSize] = (char)NULL;
tmNow = (time_t)(get_time_from_sntp() - acceptGap);
ptmGMT = gmtime(&tmNow);
sprintf(szCurrentTime, "%04d%02d%02d%02d%02d%02d",
ptmGMT->tm_year + 1900, ptmGMT->tm_mon, ptmGMT->tm_wday, ptmGMT->tm_hour, ptmGMT->tm_min, ptmGMT->tm_sec);
if (strncmp(szCreatedTime, szCurrentTime, 14) < 0)
goto EXIT_FUNCTION;
tmNow = (time_t)(get_time_from_sntp() + acceptGap);
ptmGMT = gmtime(&tmNow);
sprintf(szCurrentTime, "%04d%02d%02d%02d%02d%02d",
ptmGMT->tm_year + 1900, ptmGMT->tm_mon, ptmGMT->tm_wday, ptmGMT->tm_hour, ptmGMT->tm_min, ptmGMT->tm_sec);
if (strncmp(szCreatedTime, szCurrentTime, 14) > 0)
goto EXIT_FUNCTION;
pszResult = strdup(pszDecrypted);
EXIT_FUNCTION:
i = GetLastError();
if (pszEncrypted)
free(pszEncrypted);
if (pszDecrypted)
free(pszDecrypted);
if (mcrypt)
mcrypt_module_close(mcrypt);
SetLastError(i);
return pszResult;
}
static const char* _sh_GetKey(const char* pszAuthFile)
{
FILE *pf = NULL;
char *pszKey = NULL;
int i = 0;
pf = fopen(pszAuthFile, "r");
if (!pf)
return NULL;
pszKey = (char*)malloc(KEY_LENGTH + 1);
for (i = 0; i < KEY_LENGTH ;i++) {
if (fseek(pf, g_pnKeyPos[i], 0) != 0) {
free(pszKey);
return NULL;
}
fread(pszKey + i, 1, 1, pf);
}
fclose(pf);
pszKey[KEY_LENGTH] = (char)NULL;
return pszKey;
}