Added support for CLion, removed a lot of unused code in preparation of the rewriting of the network stack
This commit is contained in:
parent
b99293c9d7
commit
d2f43a8620
|
@ -362,5 +362,83 @@ MigrationBackup/
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
# Debug folder
|
# Debug folder
|
||||||
test/
|
test/
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
|
@ -0,0 +1 @@
|
||||||
|
Metin2 Server
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding">
|
||||||
|
<file url="file://$PROJECT_DIR$/game/src/main.cpp" charset="EUC-KR" />
|
||||||
|
<file url="PROJECT" charset="EUC-KR" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||||
|
</project>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/Server.iml" filepath="$PROJECT_DIR$/.idea/Server.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -15,7 +15,7 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||||
|
|
||||||
# Set the CMake module directory
|
# Set the CMake module directory
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/Modules/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
||||||
|
|
||||||
# Set environment variables
|
# Set environment variables
|
||||||
set(METIN2_OS_NAME ${CMAKE_SYSTEM})
|
set(METIN2_OS_NAME ${CMAKE_SYSTEM})
|
||||||
|
|
|
@ -42,7 +42,7 @@ public:
|
||||||
offer_price= _offer_price;
|
offer_price= _offer_price;
|
||||||
price = _price;
|
price = _price;
|
||||||
offer_id = _offer_id;
|
offer_id = _offer_id;
|
||||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||||
expired_time = _expired_time;
|
expired_time = _expired_time;
|
||||||
item_id = _item_id;
|
item_id = _item_id;
|
||||||
bidder_id = _bidder_id;
|
bidder_id = _bidder_id;
|
||||||
|
@ -64,7 +64,7 @@ public:
|
||||||
const char* get_bidder_name () { return shown_name; }
|
const char* get_bidder_name () { return shown_name; }
|
||||||
void set_bidder_name (const char* new_bidder_name)
|
void set_bidder_name (const char* new_bidder_name)
|
||||||
{
|
{
|
||||||
thecore_memcpy(shown_name, new_bidder_name, strlen(new_bidder_name) + 1);
|
memcpy(shown_name, new_bidder_name, strlen(new_bidder_name) + 1);
|
||||||
}
|
}
|
||||||
} TAuctionItemInfo;
|
} TAuctionItemInfo;
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ typedef struct _sale : public _base_auction
|
||||||
item_num = _item_num;
|
item_num = _item_num;
|
||||||
offer_price= _offer_price;
|
offer_price= _offer_price;
|
||||||
offer_id = _offer_id;
|
offer_id = _offer_id;
|
||||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||||
item_id = _item_id;
|
item_id = _item_id;
|
||||||
wisher_id = _wisher_id;
|
wisher_id = _wisher_id;
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ typedef struct _wish : public _base_auction
|
||||||
item_num = _item_num;
|
item_num = _item_num;
|
||||||
offer_price= _offer_price;
|
offer_price= _offer_price;
|
||||||
offer_id = _offer_id;
|
offer_id = _offer_id;
|
||||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||||
expired_time = _expired_time;
|
expired_time = _expired_time;
|
||||||
empire = _empire;
|
empire = _empire;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ template <typename T> class cache
|
||||||
|
|
||||||
void Put(T * pNew, bool bSkipQuery = false)
|
void Put(T * pNew, bool bSkipQuery = false)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&m_data, pNew, sizeof(T));
|
memcpy(&m_data, pNew, sizeof(T));
|
||||||
m_lastUpdateTime = time(0);
|
m_lastUpdateTime = time(0);
|
||||||
|
|
||||||
if (!bSkipQuery)
|
if (!bSkipQuery)
|
||||||
|
|
|
@ -72,8 +72,6 @@ enum EMisc
|
||||||
|
|
||||||
//END_LIMIT_GOLD
|
//END_LIMIT_GOLD
|
||||||
|
|
||||||
OPENID_AUTHKEY_LEN = 32,
|
|
||||||
|
|
||||||
SHOP_TAB_NAME_MAX = 32,
|
SHOP_TAB_NAME_MAX = 32,
|
||||||
SHOP_TAB_COUNT_MAX = 3,
|
SHOP_TAB_COUNT_MAX = 3,
|
||||||
|
|
||||||
|
@ -685,7 +683,7 @@ enum ETeenFlags
|
||||||
// inventory의 position을 나타내는 구조체
|
// inventory의 position을 나타내는 구조체
|
||||||
// int와의 암시적 형변환이 있는 이유는,
|
// int와의 암시적 형변환이 있는 이유는,
|
||||||
// 인벤 관련된 모든 함수가 window_type은 받지 않고, cell 하나만 받았기 때문에,(기존에는 인벤이 하나 뿐이어서 inventory type이란게 필요없었기 때문에,)
|
// 인벤 관련된 모든 함수가 window_type은 받지 않고, cell 하나만 받았기 때문에,(기존에는 인벤이 하나 뿐이어서 inventory type이란게 필요없었기 때문에,)
|
||||||
// 인벤 관련 모든 함수 호출부분을 수정하는 것이 난감하기 떄문이다.
|
// 인벤 관련 모든 함수 호출부분을 수정하는 것이 난감하기 ??문이다.
|
||||||
|
|
||||||
enum EDragonSoulRefineWindowSize
|
enum EDragonSoulRefineWindowSize
|
||||||
{
|
{
|
||||||
|
|
|
@ -198,7 +198,7 @@ void AuctionManager::LoadAuctionInfo()
|
||||||
str_to_number(auctionItemInfo.offer_price, row[cur++]);
|
str_to_number(auctionItemInfo.offer_price, row[cur++]);
|
||||||
str_to_number(auctionItemInfo.price, row[cur++]);
|
str_to_number(auctionItemInfo.price, row[cur++]);
|
||||||
str_to_number(auctionItemInfo.offer_id, row[cur++]);
|
str_to_number(auctionItemInfo.offer_id, row[cur++]);
|
||||||
thecore_memcpy (auctionItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
memcpy (auctionItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
||||||
cur++;
|
cur++;
|
||||||
str_to_number(auctionItemInfo.empire, row[cur++]);
|
str_to_number(auctionItemInfo.empire, row[cur++]);
|
||||||
str_to_number(auctionItemInfo.expired_time, row[cur++]);
|
str_to_number(auctionItemInfo.expired_time, row[cur++]);
|
||||||
|
@ -242,7 +242,7 @@ void AuctionManager::LoadSaleInfo()
|
||||||
str_to_number(saleItemInfo.offer_price, row[cur++]);
|
str_to_number(saleItemInfo.offer_price, row[cur++]);
|
||||||
str_to_number(saleItemInfo.price, row[cur++]);
|
str_to_number(saleItemInfo.price, row[cur++]);
|
||||||
str_to_number(saleItemInfo.offer_id, row[cur++]);
|
str_to_number(saleItemInfo.offer_id, row[cur++]);
|
||||||
thecore_memcpy (saleItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
memcpy (saleItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
||||||
cur++;
|
cur++;
|
||||||
str_to_number(saleItemInfo.empire, row[cur++]);
|
str_to_number(saleItemInfo.empire, row[cur++]);
|
||||||
str_to_number(saleItemInfo.expired_time, row[cur++]);
|
str_to_number(saleItemInfo.expired_time, row[cur++]);
|
||||||
|
@ -285,7 +285,7 @@ void AuctionManager::LoadWishInfo()
|
||||||
str_to_number(wishItemInfo.offer_price, row[cur++]);
|
str_to_number(wishItemInfo.offer_price, row[cur++]);
|
||||||
str_to_number(wishItemInfo.price, row[cur++]);
|
str_to_number(wishItemInfo.price, row[cur++]);
|
||||||
str_to_number(wishItemInfo.offer_id, row[cur++]);
|
str_to_number(wishItemInfo.offer_id, row[cur++]);
|
||||||
thecore_memcpy (wishItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
memcpy (wishItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1);
|
||||||
cur++;
|
cur++;
|
||||||
str_to_number(wishItemInfo.empire, row[cur++]);
|
str_to_number(wishItemInfo.empire, row[cur++]);
|
||||||
str_to_number(wishItemInfo.expired_time, row[cur++]);
|
str_to_number(wishItemInfo.expired_time, row[cur++]);
|
||||||
|
@ -551,7 +551,7 @@ AuctionResult AuctionManager::GetAuctionedItem (DWORD actor_id, DWORD item_id, T
|
||||||
return AUCTION_NOT_EXPIRED;
|
return AUCTION_NOT_EXPIRED;
|
||||||
}
|
}
|
||||||
|
|
||||||
thecore_memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
||||||
|
|
||||||
return AUCTION_SUCCESS;
|
return AUCTION_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -574,7 +574,7 @@ AuctionResult AuctionManager::BuySoldItem (DWORD actor_id, DWORD item_id, TPlaye
|
||||||
|
|
||||||
TSaleItemInfo* item_info = item_info_cache->Get(false);
|
TSaleItemInfo* item_info = item_info_cache->Get(false);
|
||||||
|
|
||||||
thecore_memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
||||||
|
|
||||||
return AUCTION_SUCCESS;
|
return AUCTION_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -596,7 +596,7 @@ AuctionResult AuctionManager::CancelAuction (DWORD actor_id, DWORD item_id, TPla
|
||||||
}
|
}
|
||||||
TAuctionItemInfo* item_info = item_info_cache->Get(false);
|
TAuctionItemInfo* item_info = item_info_cache->Get(false);
|
||||||
|
|
||||||
thecore_memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
||||||
|
|
||||||
return AUCTION_SUCCESS;
|
return AUCTION_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -630,7 +630,7 @@ AuctionResult AuctionManager::CancelSale (DWORD actor_id, DWORD item_id, TPlayer
|
||||||
}
|
}
|
||||||
TSaleItemInfo* item_info = item_info_cache->Get(false);
|
TSaleItemInfo* item_info = item_info_cache->Get(false);
|
||||||
|
|
||||||
thecore_memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
memcpy(&item, c->Get(), sizeof(TPlayerItem));
|
||||||
|
|
||||||
return AUCTION_SUCCESS;
|
return AUCTION_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,7 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
|
||||||
|
|
||||||
m_data.byCount = pUpdateList->byCount;
|
m_data.byCount = pUpdateList->byCount;
|
||||||
|
|
||||||
thecore_memcpy(m_data.aPriceInfo, pUpdateList->aPriceInfo, sizeof(TItemPriceInfo) * pUpdateList->byCount);
|
memcpy(m_data.aPriceInfo, pUpdateList->aPriceInfo, sizeof(TItemPriceInfo) * pUpdateList->byCount);
|
||||||
|
|
||||||
int nDeletedNum; // 삭제된 가격정보의 갯수
|
int nDeletedNum; // 삭제된 가격정보의 갯수
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
|
||||||
if (tmpvec.size() < sizeAddOldDataSize)
|
if (tmpvec.size() < sizeAddOldDataSize)
|
||||||
sizeAddOldDataSize = tmpvec.size();
|
sizeAddOldDataSize = tmpvec.size();
|
||||||
|
|
||||||
thecore_memcpy(m_data.aPriceInfo + pUpdateList->byCount, &tmpvec[0], sizeof(TItemPriceInfo) * sizeAddOldDataSize);
|
memcpy(m_data.aPriceInfo + pUpdateList->byCount, &tmpvec[0], sizeof(TItemPriceInfo) * sizeAddOldDataSize);
|
||||||
m_data.byCount += sizeAddOldDataSize;
|
m_data.byCount += sizeAddOldDataSize;
|
||||||
|
|
||||||
nDeletedNum = tmpvec.size() - sizeAddOldDataSize;
|
nDeletedNum = tmpvec.size() - sizeAddOldDataSize;
|
||||||
|
|
|
@ -1083,7 +1083,7 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
|
||||||
|
|
||||||
strncpy(kMapLocations.szHost, peer->GetPublicIP(), sizeof(kMapLocations.szHost));
|
strncpy(kMapLocations.szHost, peer->GetPublicIP(), sizeof(kMapLocations.szHost));
|
||||||
kMapLocations.wPort = peer->GetListenPort();
|
kMapLocations.wPort = peer->GetListenPort();
|
||||||
thecore_memcpy(kMapLocations.alMaps, peer->GetMaps(), sizeof(kMapLocations.alMaps));
|
memcpy(kMapLocations.alMaps, peer->GetMaps(), sizeof(kMapLocations.alMaps));
|
||||||
|
|
||||||
BYTE bMapCount;
|
BYTE bMapCount;
|
||||||
|
|
||||||
|
@ -1106,7 +1106,7 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
|
||||||
TMapLocation kMapLocation2;
|
TMapLocation kMapLocation2;
|
||||||
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
||||||
kMapLocation2.wPort = tmp->GetListenPort();
|
kMapLocation2.wPort = tmp->GetListenPort();
|
||||||
thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
||||||
vec_kMapLocations.push_back(kMapLocation2);
|
vec_kMapLocations.push_back(kMapLocation2);
|
||||||
|
|
||||||
tmp->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation));
|
tmp->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation));
|
||||||
|
@ -1133,7 +1133,7 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
|
||||||
TMapLocation kMapLocation2;
|
TMapLocation kMapLocation2;
|
||||||
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
||||||
kMapLocation2.wPort = tmp->GetListenPort();
|
kMapLocation2.wPort = tmp->GetListenPort();
|
||||||
thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
||||||
vec_kMapLocations.push_back(kMapLocation2);
|
vec_kMapLocations.push_back(kMapLocation2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1161,7 +1161,7 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
|
||||||
|
|
||||||
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
strncpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
|
||||||
kMapLocation2.wPort = tmp->GetListenPort();
|
kMapLocation2.wPort = tmp->GetListenPort();
|
||||||
thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
|
||||||
|
|
||||||
vec_kMapLocations.push_back(kMapLocation2);
|
vec_kMapLocations.push_back(kMapLocation2);
|
||||||
}
|
}
|
||||||
|
@ -2180,7 +2180,7 @@ void CClientManager::MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* p
|
||||||
table.byCount = pPacket->byCount;
|
table.byCount = pPacket->byCount;
|
||||||
|
|
||||||
const TItemPriceInfo * pInfo = reinterpret_cast<const TItemPriceInfo*>(pPacket + sizeof(TPacketMyshopPricelistHeader));
|
const TItemPriceInfo * pInfo = reinterpret_cast<const TItemPriceInfo*>(pPacket + sizeof(TPacketMyshopPricelistHeader));
|
||||||
thecore_memcpy(table.aPriceInfo, pInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
|
memcpy(table.aPriceInfo, pInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
|
||||||
|
|
||||||
pCache->UpdateList(&table);
|
pCache->UpdateList(&table);
|
||||||
}
|
}
|
||||||
|
@ -2192,7 +2192,7 @@ void CClientManager::MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* p
|
||||||
pUpdateTable->byCount = pPacket->byCount;
|
pUpdateTable->byCount = pPacket->byCount;
|
||||||
|
|
||||||
const TItemPriceInfo * pInfo = reinterpret_cast<const TItemPriceInfo*>(pPacket + sizeof(TPacketMyshopPricelistHeader));
|
const TItemPriceInfo * pInfo = reinterpret_cast<const TItemPriceInfo*>(pPacket + sizeof(TPacketMyshopPricelistHeader));
|
||||||
thecore_memcpy(pUpdateTable->aPriceInfo, pInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
|
memcpy(pUpdateTable->aPriceInfo, pInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
|
||||||
|
|
||||||
char szQuery[QUERY_MAX_LEN];
|
char szQuery[QUERY_MAX_LEN];
|
||||||
snprintf(szQuery, sizeof(szQuery), "SELECT item_vnum, price FROM myshop_pricelist%s WHERE owner_id=%u", GetTablePostfix(), pPacket->dwOwnerID);
|
snprintf(szQuery, sizeof(szQuery), "SELECT item_vnum, price FROM myshop_pricelist%s WHERE owner_id=%u", GetTablePostfix(), pPacket->dwOwnerID);
|
||||||
|
|
|
@ -507,7 +507,7 @@ bool CClientManager::InitializeShopTable()
|
||||||
|
|
||||||
while (it != map_shop.end())
|
while (it != map_shop.end())
|
||||||
{
|
{
|
||||||
thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
|
memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
|
||||||
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
|
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -1176,7 +1176,7 @@ void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<in
|
||||||
|
|
||||||
while (p)
|
while (p)
|
||||||
{
|
{
|
||||||
if (isnhdigit(*t))
|
if (isdigit(*t))
|
||||||
{
|
{
|
||||||
strncpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
|
strncpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
|
||||||
|
|
||||||
|
@ -1198,7 +1198,7 @@ void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<in
|
||||||
p = strchr(t, '/');
|
p = strchr(t, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isnhdigit(*t))
|
if (isdigit(*t))
|
||||||
{
|
{
|
||||||
strncpy(szNum, t, sizeof(szNum));
|
strncpy(szNum, t, sizeof(szNum));
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
|
||||||
|
|
||||||
pkLD->SetPlay(true);
|
pkLD->SetPlay(true);
|
||||||
SendLoginToBilling(pkLD, true);
|
SendLoginToBilling(pkLD, true);
|
||||||
thecore_memcpy(pTab->aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(pTab->aiPremiumTimes));
|
memcpy(pTab->aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(pTab->aiPremiumTimes));
|
||||||
|
|
||||||
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, dwHandle, sizeof(TPlayerTable));
|
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, dwHandle, sizeof(TPlayerTable));
|
||||||
peer->Encode(pTab, sizeof(TPlayerTable));
|
peer->Encode(pTab, sizeof(TPlayerTable));
|
||||||
|
@ -290,7 +290,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
|
||||||
TPlayerItem * p = c->Get();
|
TPlayerItem * p = c->Get();
|
||||||
|
|
||||||
if (p->vnum) // vnum이 없으면 삭제된 아이템이다.
|
if (p->vnum) // vnum이 없으면 삭제된 아이템이다.
|
||||||
thecore_memcpy(&s_items[dwCount++], p, sizeof(TPlayerItem));
|
memcpy(&s_items[dwCount++], p, sizeof(TPlayerItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_test_server)
|
if (g_test_server)
|
||||||
|
@ -491,14 +491,14 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
|
||||||
str_to_number(pkTab->parts[PART_HAIR], row[col++]);
|
str_to_number(pkTab->parts[PART_HAIR], row[col++]);
|
||||||
|
|
||||||
if (row[col])
|
if (row[col])
|
||||||
thecore_memcpy(pkTab->skills, row[col], sizeof(pkTab->skills));
|
memcpy(pkTab->skills, row[col], sizeof(pkTab->skills));
|
||||||
else
|
else
|
||||||
memset(&pkTab->skills, 0, sizeof(pkTab->skills));
|
memset(&pkTab->skills, 0, sizeof(pkTab->skills));
|
||||||
|
|
||||||
col++;
|
col++;
|
||||||
|
|
||||||
if (row[col])
|
if (row[col])
|
||||||
thecore_memcpy(pkTab->quickslot, row[col], sizeof(pkTab->quickslot));
|
memcpy(pkTab->quickslot, row[col], sizeof(pkTab->quickslot));
|
||||||
else
|
else
|
||||||
memset(pkTab->quickslot, 0, sizeof(pkTab->quickslot));
|
memset(pkTab->quickslot, 0, sizeof(pkTab->quickslot));
|
||||||
|
|
||||||
|
@ -652,7 +652,7 @@ void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHa
|
||||||
|
|
||||||
pkLD->SetPlay(true);
|
pkLD->SetPlay(true);
|
||||||
SendLoginToBilling(pkLD, true);
|
SendLoginToBilling(pkLD, true);
|
||||||
thecore_memcpy(tab.aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(tab.aiPremiumTimes));
|
memcpy(tab.aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(tab.aiPremiumTimes));
|
||||||
|
|
||||||
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, pkInfo->dwHandle, sizeof(TPlayerTable));
|
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, pkInfo->dwHandle, sizeof(TPlayerTable));
|
||||||
peer->Encode(&tab, sizeof(TPlayerTable));
|
peer->Encode(&tab, sizeof(TPlayerTable));
|
||||||
|
|
|
@ -1203,7 +1203,7 @@ bool CGuildManager::ChangeMaster(DWORD dwGID, DWORD dwFrom, DWORD dwTo)
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
CGuildWarReserve::CGuildWarReserve(const TGuildWarReserve & rTable)
|
CGuildWarReserve::CGuildWarReserve(const TGuildWarReserve & rTable)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&m_data, &rTable, sizeof(TGuildWarReserve));
|
memcpy(&m_data, &rTable, sizeof(TGuildWarReserve));
|
||||||
m_iLastNoticeMin = -1;
|
m_iLastNoticeMin = -1;
|
||||||
|
|
||||||
Initialize();
|
Initialize();
|
||||||
|
|
|
@ -26,7 +26,7 @@ TAccountTable & CLoginData::GetAccountRef()
|
||||||
|
|
||||||
void CLoginData::SetClientKey(const DWORD * c_pdwClientKey)
|
void CLoginData::SetClientKey(const DWORD * c_pdwClientKey)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&m_adwClientKey, c_pdwClientKey, sizeof(DWORD) * 4);
|
memcpy(&m_adwClientKey, c_pdwClientKey, sizeof(DWORD) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const DWORD * CLoginData::GetClientKey()
|
const DWORD * CLoginData::GetClientKey()
|
||||||
|
@ -105,7 +105,7 @@ bool CLoginData::IsDeleted()
|
||||||
|
|
||||||
void CLoginData::SetPremium(int * paiPremiumTimes)
|
void CLoginData::SetPremium(int * paiPremiumTimes)
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_aiPremiumTimes, paiPremiumTimes, sizeof(m_aiPremiumTimes));
|
memcpy(m_aiPremiumTimes, paiPremiumTimes, sizeof(m_aiPremiumTimes));
|
||||||
}
|
}
|
||||||
|
|
||||||
int CLoginData::GetPremium(BYTE type)
|
int CLoginData::GetPremium(BYTE type)
|
||||||
|
|
|
@ -129,7 +129,7 @@ void CPeer::SetP2PPort(WORD wPort)
|
||||||
|
|
||||||
void CPeer::SetMaps(long * pl)
|
void CPeer::SetMaps(long * pl)
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_alMaps, pl, sizeof(m_alMaps));
|
memcpy(m_alMaps, pl, sizeof(m_alMaps));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPeer::SendSpareItemIDRange()
|
void CPeer::SendSpareItemIDRange()
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "../../libthecore/include/memcpy.h"
|
|
||||||
#include <common/stl.h>
|
#include <common/stl.h>
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
|
|
||||||
|
@ -14,7 +13,7 @@ CGrid::CGrid(CGrid * pkGrid, int w, int h) : m_iWidth(w), m_iHeight(h)
|
||||||
{
|
{
|
||||||
m_pGrid = new char[m_iWidth * m_iHeight];
|
m_pGrid = new char[m_iWidth * m_iHeight];
|
||||||
int iSize = std::MIN(w * h, pkGrid->m_iWidth * pkGrid->m_iHeight);
|
int iSize = std::MIN(w * h, pkGrid->m_iWidth * pkGrid->m_iHeight);
|
||||||
thecore_memcpy(m_pGrid, pkGrid->m_pGrid, sizeof(char) * iSize);
|
memcpy(m_pGrid, pkGrid->m_pGrid, sizeof(char) * iSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGrid::~CGrid()
|
CGrid::~CGrid()
|
||||||
|
|
|
@ -16,7 +16,6 @@ find_package(Boost COMPONENTS system REQUIRED)
|
||||||
find_package(DevIL REQUIRED)
|
find_package(DevIL REQUIRED)
|
||||||
find_package(LZO REQUIRED)
|
find_package(LZO REQUIRED)
|
||||||
find_package(cryptopp CONFIG REQUIRED)
|
find_package(cryptopp CONFIG REQUIRED)
|
||||||
find_package(GTest REQUIRED)
|
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${sources})
|
add_executable(${PROJECT_NAME} ${sources})
|
||||||
|
|
||||||
|
@ -30,7 +29,6 @@ target_link_libraries (${PROJECT_NAME} cryptopp-static)
|
||||||
include_directories(${Boost_INCLUDE_DIR})
|
include_directories(${Boost_INCLUDE_DIR})
|
||||||
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
|
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
|
||||||
|
|
||||||
|
|
||||||
if (IL_FOUND)
|
if (IL_FOUND)
|
||||||
include_directories(${IL_INCLUDE_DIR})
|
include_directories(${IL_INCLUDE_DIR})
|
||||||
target_link_libraries (${PROJECT_NAME} ${IL_LIBRARIES})
|
target_link_libraries (${PROJECT_NAME} ${IL_LIBRARIES})
|
||||||
|
@ -47,11 +45,5 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
find_package (Threads REQUIRED)
|
find_package (Threads REQUIRED)
|
||||||
target_link_libraries (${PROJECT_NAME} Threads::Threads)
|
target_link_libraries (${PROJECT_NAME} Threads::Threads)
|
||||||
|
|
||||||
# Google test
|
|
||||||
if (GTEST_FOUND)
|
|
||||||
include_directories(${GTEST_INCLUDE_DIRS})
|
|
||||||
target_link_libraries (${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES})
|
|
||||||
endif (GTEST_FOUND)
|
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} libgame libpoly libsql libthecore liblua)
|
target_link_libraries(${PROJECT_NAME} libgame libpoly libsql libthecore liblua)
|
||||||
|
|
||||||
|
|
|
@ -279,7 +279,7 @@ void SGuildMarkBlock::CopyFrom(const BYTE * pbCompBuf, DWORD dwCompSize, DWORD c
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_sizeCompBuf = dwCompSize;
|
m_sizeCompBuf = dwCompSize;
|
||||||
thecore_memcpy(m_abCompBuf, pbCompBuf, dwCompSize);
|
memcpy(m_abCompBuf, pbCompBuf, dwCompSize);
|
||||||
m_crc = crc;
|
m_crc = crc;
|
||||||
//printf("SGuildMarkBlock::CopyFrom: %u > %u crc %u\n", sizeof(Pixel) * SGuildMarkBlock::SIZE, m_sizeCompBuf, m_crc);
|
//printf("SGuildMarkBlock::CopyFrom: %u > %u crc %u\n", sizeof(Pixel) * SGuildMarkBlock::SIZE, m_sizeCompBuf, m_crc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ bool AuctionBoard::InsertItemInfo (TAuctionItemInfo* item_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
c = new TAuctionItemInfo();
|
c = new TAuctionItemInfo();
|
||||||
thecore_memcpy (c, item_info, sizeof(TAuctionItemInfo));
|
memcpy (c, item_info, sizeof(TAuctionItemInfo));
|
||||||
|
|
||||||
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
||||||
item_map.insert(TItemInfoMap::value_type(item_info->item_id, c));
|
item_map.insert(TItemInfoMap::value_type(item_info->item_id, c));
|
||||||
|
@ -170,7 +170,7 @@ bool AuctionBoard::UpdateItemInfo (TAuctionItemInfo* item_info)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
thecore_memcpy (c, item_info, sizeof(TAuctionItemInfo));
|
memcpy (c, item_info, sizeof(TAuctionItemInfo));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,7 +352,7 @@ bool SaleBoard::InsertItemInfo (TSaleItemInfo* item_info)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
c = new TSaleItemInfo ();
|
c = new TSaleItemInfo ();
|
||||||
thecore_memcpy (c, item_info, sizeof(TSaleItemInfo));
|
memcpy (c, item_info, sizeof(TSaleItemInfo));
|
||||||
|
|
||||||
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
||||||
|
|
||||||
|
@ -457,7 +457,7 @@ bool WishBoard::InsertItemInfo (TWishItemInfo* item_info)
|
||||||
if (item_it == item_map->end())
|
if (item_it == item_map->end())
|
||||||
{
|
{
|
||||||
TWishItemInfo* c = new TWishItemInfo();
|
TWishItemInfo* c = new TWishItemInfo();
|
||||||
thecore_memcpy (c, item_info, sizeof(TWishItemInfo));
|
memcpy (c, item_info, sizeof(TWishItemInfo));
|
||||||
|
|
||||||
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
|
||||||
item_map->insert (TItemMap::value_type (item_num, c));
|
item_map->insert (TItemMap::value_type (item_num, c));
|
||||||
|
@ -1234,7 +1234,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
|
||||||
cmd_result++;
|
cmd_result++;
|
||||||
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
|
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
|
||||||
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
|
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
|
||||||
thecore_memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
|
memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
|
||||||
MyBid.Insert(new_item_info->bidder_id, new_item_info->item_id, new_item_info->get_bid_price());
|
MyBid.Insert(new_item_info->bidder_id, new_item_info->item_id, new_item_info->get_bid_price());
|
||||||
if (ch != NULL)
|
if (ch != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1251,7 +1251,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
|
||||||
cmd_result++;
|
cmd_result++;
|
||||||
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
|
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
|
||||||
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
|
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
|
||||||
thecore_memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
|
memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
|
||||||
if (ch != NULL)
|
if (ch != NULL)
|
||||||
{
|
{
|
||||||
ch->ChatPacket(CHAT_TYPE_INFO, "Áﱸ Çعö·È¾î.");
|
ch->ChatPacket(CHAT_TYPE_INFO, "Áﱸ Çعö·È¾î.");
|
||||||
|
|
|
@ -1,182 +0,0 @@
|
||||||
/* vi: set sw=4 ts=8 cino=g0,\:0 : */
|
|
||||||
/*********************************************************************
|
|
||||||
* date : 2010.4.7
|
|
||||||
* file : auth_brazil.c
|
|
||||||
* author : mhh
|
|
||||||
* description :
|
|
||||||
*/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
#include <md5.h>
|
|
||||||
#else
|
|
||||||
#include "../../libthecore/include/xmd5.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "auth_brazil.h"
|
|
||||||
|
|
||||||
static const char* FN_md5(const char *src)
|
|
||||||
{
|
|
||||||
static char s_buffer[512];
|
|
||||||
|
|
||||||
memset(s_buffer, 0x00, sizeof(s_buffer));
|
|
||||||
|
|
||||||
unsigned char digest[16] = {0};
|
|
||||||
MD5_CTX md5;
|
|
||||||
MD5Init(&md5);
|
|
||||||
MD5Update(&md5, (const unsigned char*) src, strlen(src));
|
|
||||||
MD5Final(digest, &md5);
|
|
||||||
|
|
||||||
int offset = 0;
|
|
||||||
for (int i=0; i<16; ++i) {
|
|
||||||
offset += sprintf(s_buffer + offset, "%02x", digest[i]);
|
|
||||||
}
|
|
||||||
return s_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int FN_make_request(const char *login, const char *password, /*out*/ char *dst, int dst_size)
|
|
||||||
{
|
|
||||||
int len = snprintf(dst, dst_size,
|
|
||||||
// "GET /metin2/game_auth.php?ID=%s&PW=%s HTTP/1.1\r\n"
|
|
||||||
"GET /metin2/?ID=%s&PW=%s HTTP/1.1\r\n"
|
|
||||||
"Host: auth.ongame.com.br\r\n"
|
|
||||||
"Connection: Close\r\n\r\n",
|
|
||||||
login, FN_md5(password));
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int FN_parse_reply(char *reply)
|
|
||||||
{
|
|
||||||
char buffer[2048];
|
|
||||||
strncpy(buffer, reply, sizeof(buffer));
|
|
||||||
|
|
||||||
const char *delim = "\r\n";
|
|
||||||
char *last = 0;
|
|
||||||
char *v = strtok_r(buffer, delim, &last);
|
|
||||||
char *result = 0;
|
|
||||||
|
|
||||||
while (v)
|
|
||||||
{
|
|
||||||
result = v;
|
|
||||||
v = strtok_r(NULL, delim, &last);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
if (0 == strcasecmp("true", result))
|
|
||||||
return AUTH_BRAZIL_SUCC;
|
|
||||||
else if (0 == strcasecmp("false", result))
|
|
||||||
return AUTH_BRAZIL_WRONGPWD;
|
|
||||||
else if (0 == strcasecmp("unknown", result))
|
|
||||||
return AUTH_BRAZIL_NOID;
|
|
||||||
else if (0 == strcasecmp("flash", result))
|
|
||||||
return AUTH_BRAZIL_FLASHUSER;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AUTH_BRAZIL_SERVER_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern void socket_timeout(socket_t s, long sec, long usec);
|
|
||||||
|
|
||||||
int auth_brazil(const char *login, const char *pwd)
|
|
||||||
{
|
|
||||||
|
|
||||||
const char *host = "auth.ongame.com.br";
|
|
||||||
int port = 80;
|
|
||||||
|
|
||||||
socket_t fd = socket_connect(host, port);
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
sys_err("[AUTH_BRAZIL] : could not connect to gsp server(%s)", host);
|
|
||||||
return AUTH_BRAZIL_SERVER_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
socket_block(fd);
|
|
||||||
socket_timeout(fd, 3, 0);
|
|
||||||
|
|
||||||
// send request
|
|
||||||
{
|
|
||||||
char request[512];
|
|
||||||
int len = FN_make_request(login, pwd, request, sizeof(request));
|
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
if (write(fd, request, len) < 0)
|
|
||||||
#else
|
|
||||||
if (_write(fd, request, len) < 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
sys_err("[AUTH_BRAZIL] : could not send auth-request (%s)", login);
|
|
||||||
close(fd);
|
|
||||||
return AUTH_BRAZIL_SERVER_ERR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read reply
|
|
||||||
{
|
|
||||||
char reply[1024] = {0};
|
|
||||||
int len = read(fd, reply, sizeof(reply));
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
{
|
|
||||||
sys_err("[AUTH_BRAZIL] : could not recv auth-reply (%s)", login);
|
|
||||||
return AUTH_BRAZIL_SERVER_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 응답받은 경우에만 query count를 늘린다.
|
|
||||||
auth_brazil_inc_query_count();
|
|
||||||
|
|
||||||
return FN_parse_reply(reply);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int s_query_count = 0;
|
|
||||||
|
|
||||||
int auth_brazil_inc_query_count()
|
|
||||||
{
|
|
||||||
return ++s_query_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
void auth_brazil_log()
|
|
||||||
{
|
|
||||||
FILE *fp = 0;
|
|
||||||
|
|
||||||
// open and try backup
|
|
||||||
{
|
|
||||||
fp = fopen("AUTH_COUNT.log", "a");
|
|
||||||
|
|
||||||
if (0 == fp)
|
|
||||||
return;
|
|
||||||
|
|
||||||
struct stat sb;
|
|
||||||
fstat(fileno(fp), &sb);
|
|
||||||
if (sb.st_size > 1024 * 1024)
|
|
||||||
{
|
|
||||||
fclose(fp);
|
|
||||||
rename("AUTH_COUNT.log", "AUTH_COUNT.log.old");
|
|
||||||
|
|
||||||
fp = fopen("AUTH_COUNT.log", "a");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write log
|
|
||||||
{
|
|
||||||
fprintf(fp, "%d\n", s_query_count);
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset query count
|
|
||||||
s_query_count = 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
/* vi: set sw=4 ts=8 cino=g0,\:0 : */
|
|
||||||
/*********************************************************************
|
|
||||||
* date : 2010.4.7
|
|
||||||
* file : auth_brazil.h
|
|
||||||
* author : mhh
|
|
||||||
* description :
|
|
||||||
*/
|
|
||||||
#ifndef __auth_brazil_h_1270647899__
|
|
||||||
#define __auth_brazil_h_1270647899__
|
|
||||||
|
|
||||||
#define AUTH_BRAZIL_SERVER_ERR 0
|
|
||||||
#define AUTH_BRAZIL_SUCC 1
|
|
||||||
#define AUTH_BRAZIL_NOID 2
|
|
||||||
#define AUTH_BRAZIL_WRONGPWD 3
|
|
||||||
#define AUTH_BRAZIL_FLASHUSER 4
|
|
||||||
|
|
||||||
int auth_brazil(const char *login, const char *pwd);
|
|
||||||
|
|
||||||
|
|
||||||
int auth_brazil_inc_query_count();
|
|
||||||
void auth_brazil_log();
|
|
||||||
|
|
||||||
#endif // __auth_brazil_h_1270647899__
|
|
|
@ -37,7 +37,7 @@ CObject::CObject(TObject * pData, TObjectProto * pProto)
|
||||||
{
|
{
|
||||||
CEntity::Initialize(ENTITY_OBJECT);
|
CEntity::Initialize(ENTITY_OBJECT);
|
||||||
|
|
||||||
thecore_memcpy(&m_data, pData, sizeof(TObject));
|
memcpy(&m_data, pData, sizeof(TObject));
|
||||||
}
|
}
|
||||||
|
|
||||||
CObject::~CObject()
|
CObject::~CObject()
|
||||||
|
@ -315,7 +315,7 @@ void CObject::RegenNPC()
|
||||||
|
|
||||||
CLand::CLand(TLand * pData)
|
CLand::CLand(TLand * pData)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&m_data, pData, sizeof(TLand));
|
memcpy(&m_data, pData, sizeof(TLand));
|
||||||
}
|
}
|
||||||
|
|
||||||
CLand::~CLand()
|
CLand::~CLand()
|
||||||
|
@ -647,7 +647,7 @@ void CManager::Destroy()
|
||||||
bool CManager::LoadObjectProto(const TObjectProto * pProto, int size) // from DB
|
bool CManager::LoadObjectProto(const TObjectProto * pProto, int size) // from DB
|
||||||
{
|
{
|
||||||
m_vec_kObjectProto.resize(size);
|
m_vec_kObjectProto.resize(size);
|
||||||
thecore_memcpy(&m_vec_kObjectProto[0], pProto, sizeof(TObjectProto) * size);
|
memcpy(&m_vec_kObjectProto[0], pProto, sizeof(TObjectProto) * size);
|
||||||
|
|
||||||
for (int i = 0; i < size; ++i)
|
for (int i = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1226,10 +1226,10 @@ void CHARACTER::CreatePlayerProto(TPlayerTable & tab)
|
||||||
if (m_stMobile.length() && !*m_szMobileAuth)
|
if (m_stMobile.length() && !*m_szMobileAuth)
|
||||||
strncpy(tab.szMobile, m_stMobile.c_str(), sizeof(tab.szMobile));
|
strncpy(tab.szMobile, m_stMobile.c_str(), sizeof(tab.szMobile));
|
||||||
|
|
||||||
thecore_memcpy(tab.parts, m_pointsInstant.parts, sizeof(tab.parts));
|
memcpy(tab.parts, m_pointsInstant.parts, sizeof(tab.parts));
|
||||||
|
|
||||||
// REMOVE_REAL_SKILL_LEVLES
|
// REMOVE_REAL_SKILL_LEVLES
|
||||||
thecore_memcpy(tab.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
memcpy(tab.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
||||||
// END_OF_REMOVE_REAL_SKILL_LEVLES
|
// END_OF_REMOVE_REAL_SKILL_LEVLES
|
||||||
|
|
||||||
tab.horse = GetHorseData();
|
tab.horse = GetHorseData();
|
||||||
|
@ -1737,7 +1737,7 @@ void CHARACTER::SetPlayerProto(const TPlayerTable * t)
|
||||||
M2_DELETE_ARRAY(m_pSkillLevels);
|
M2_DELETE_ARRAY(m_pSkillLevels);
|
||||||
|
|
||||||
m_pSkillLevels = M2_NEW TPlayerSkill[SKILL_MAX_NUM];
|
m_pSkillLevels = M2_NEW TPlayerSkill[SKILL_MAX_NUM];
|
||||||
thecore_memcpy(m_pSkillLevels, t->skills, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
memcpy(m_pSkillLevels, t->skills, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
||||||
// END_OF_REMOVE_REAL_SKILL_LEVLES
|
// END_OF_REMOVE_REAL_SKILL_LEVLES
|
||||||
|
|
||||||
if (t->lMapIndex >= 10000)
|
if (t->lMapIndex >= 10000)
|
||||||
|
@ -1804,7 +1804,7 @@ void CHARACTER::SetPlayerProto(const TPlayerTable * t)
|
||||||
if (GetHorseLevel() > 0)
|
if (GetHorseLevel() > 0)
|
||||||
UpdateHorseDataByLogoff(t->logoff_interval);
|
UpdateHorseDataByLogoff(t->logoff_interval);
|
||||||
|
|
||||||
thecore_memcpy(m_aiPremiumTimes, t->aiPremiumTimes, sizeof(t->aiPremiumTimes));
|
memcpy(m_aiPremiumTimes, t->aiPremiumTimes, sizeof(t->aiPremiumTimes));
|
||||||
|
|
||||||
m_dwLogOffInterval = t->logoff_interval;
|
m_dwLogOffInterval = t->logoff_interval;
|
||||||
|
|
||||||
|
@ -6251,8 +6251,8 @@ void CHARACTER::SendEquipment(LPCHARACTER ch)
|
||||||
p.equips[i].vnum = item->GetVnum();
|
p.equips[i].vnum = item->GetVnum();
|
||||||
p.equips[i].count = item->GetCount();
|
p.equips[i].count = item->GetCount();
|
||||||
|
|
||||||
thecore_memcpy(p.equips[i].alSockets, item->GetSockets(), sizeof(p.equips[i].alSockets));
|
memcpy(p.equips[i].alSockets, item->GetSockets(), sizeof(p.equips[i].alSockets));
|
||||||
thecore_memcpy(p.equips[i].aAttr, item->GetAttributes(), sizeof(p.equips[i].aAttr));
|
memcpy(p.equips[i].aAttr, item->GetAttributes(), sizeof(p.equips[i].aAttr));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -453,7 +453,7 @@ void CHARACTER::LoadAffect(DWORD dwCount, TPacketAffectElement * pElements)
|
||||||
info->pid = GetPlayerID();
|
info->pid = GetPlayerID();
|
||||||
info->count = dwCount;
|
info->count = dwCount;
|
||||||
info->data = M2_NEW char[sizeof(TPacketAffectElement) * dwCount];
|
info->data = M2_NEW char[sizeof(TPacketAffectElement) * dwCount];
|
||||||
thecore_memcpy(info->data, pElements, sizeof(TPacketAffectElement) * dwCount);
|
memcpy(info->data, pElements, sizeof(TPacketAffectElement) * dwCount);
|
||||||
|
|
||||||
event_create(load_affect_login_event, info, PASSES_PER_SEC(1));
|
event_create(load_affect_login_event, info, PASSES_PER_SEC(1));
|
||||||
|
|
||||||
|
|
|
@ -414,8 +414,8 @@ void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
|
||||||
pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
|
pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
|
||||||
|
|
||||||
|
|
||||||
thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
|
memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
|
||||||
thecore_memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));
|
memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));
|
||||||
|
|
||||||
GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));
|
GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));
|
||||||
}
|
}
|
||||||
|
@ -1346,7 +1346,7 @@ bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p.material_count = prt->material_count;
|
p.material_count = prt->material_count;
|
||||||
thecore_memcpy(&p.materials, prt->materials, sizeof(prt->materials));
|
memcpy(&p.materials, prt->materials, sizeof(prt->materials));
|
||||||
}
|
}
|
||||||
// END_OF_REFINE_COST
|
// END_OF_REFINE_COST
|
||||||
|
|
||||||
|
@ -4403,8 +4403,7 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||||
if (GetDungeon())
|
if (GetDungeon())
|
||||||
{
|
{
|
||||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("던전 안에서는 %s%s 사용할 수 없습니다."),
|
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("던전 안에서는 %s%s 사용할 수 없습니다."),
|
||||||
item->GetName(),
|
item->GetName(), "");
|
||||||
g_iUseLocale ? "" : (under_han(item->GetName()) ? LC_TEXT("À»") : LC_TEXT("¸¦")));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ void CHARACTER::SkillLevelPacket()
|
||||||
TPacketGCSkillLevel pack;
|
TPacketGCSkillLevel pack;
|
||||||
|
|
||||||
pack.bHeader = HEADER_GC_SKILL_LEVEL;
|
pack.bHeader = HEADER_GC_SKILL_LEVEL;
|
||||||
thecore_memcpy(&pack.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
memcpy(&pack.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
|
||||||
GetDesc()->Packet(&pack, sizeof(TPacketGCSkillLevel));
|
GetDesc()->Packet(&pack, sizeof(TPacketGCSkillLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#ifdef __FreeBSD__
|
|
||||||
#include <md5.h>
|
|
||||||
#else
|
|
||||||
#include "../../libthecore/include/xmd5.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -112,8 +107,7 @@ ACMD(do_user_horse_feed)
|
||||||
ch->RemoveSpecifyItem(dwFood, 1);
|
ch->RemoveSpecifyItem(dwFood, 1);
|
||||||
ch->FeedHorse();
|
ch->FeedHorse();
|
||||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("말에게 %s%s 주었습니다."),
|
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("말에게 %s%s 주었습니다."),
|
||||||
ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName,
|
ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName, "");
|
||||||
g_iUseLocale ? "" : under_han(ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName) ? LC_TEXT("À»") : LC_TEXT("¸¦"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2353,30 +2347,9 @@ ACMD(do_in_game_mall)
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf[512+1];
|
char buf[512+1];
|
||||||
char sas[33];
|
|
||||||
MD5_CTX ctx;
|
|
||||||
const char sas_key[] = "GF9001";
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%u%u%s", ch->GetPlayerID(), ch->GetAID(), sas_key);
|
snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d",
|
||||||
|
g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id);
|
||||||
MD5Init(&ctx);
|
|
||||||
MD5Update(&ctx, (const unsigned char *) buf, strlen(buf));
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
MD5End(&ctx, sas);
|
|
||||||
#else
|
|
||||||
static const char hex[] = "0123456789abcdef";
|
|
||||||
unsigned char digest[16];
|
|
||||||
MD5Final(digest, &ctx);
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 16; ++i) {
|
|
||||||
sas[i+i] = hex[digest[i] >> 4];
|
|
||||||
sas[i+i+1] = hex[digest[i] & 0x0f];
|
|
||||||
}
|
|
||||||
sas[i+i] = '\0';
|
|
||||||
#endif
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d&sas=%s",
|
|
||||||
g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id, sas);
|
|
||||||
|
|
||||||
ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
|
ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
|
||||||
}
|
}
|
||||||
|
|
|
@ -365,7 +365,7 @@ ACMD(do_goto)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isnhdigit(*arg1) && isnhdigit(*arg2))
|
if (isdigit(*arg1) && isdigit(*arg2))
|
||||||
{
|
{
|
||||||
str_to_number(x, arg1);
|
str_to_number(x, arg1);
|
||||||
str_to_number(y, arg2);
|
str_to_number(y, arg2);
|
||||||
|
@ -388,7 +388,7 @@ ACMD(do_goto)
|
||||||
if (*arg1 == '#')
|
if (*arg1 == '#')
|
||||||
str_to_number(mapIndex, (arg1 + 1));
|
str_to_number(mapIndex, (arg1 + 1));
|
||||||
|
|
||||||
if (*arg2 && isnhdigit(*arg2))
|
if (*arg2 && isdigit(*arg2))
|
||||||
{
|
{
|
||||||
str_to_number(empire, arg2);
|
str_to_number(empire, arg2);
|
||||||
empire = MINMAX(1, empire, 3);
|
empire = MINMAX(1, empire, 3);
|
||||||
|
@ -452,7 +452,7 @@ ACMD(do_warp)
|
||||||
|
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
|
|
||||||
if (isnhdigit(*arg1) && isnhdigit(*arg2))
|
if (isdigit(*arg1) && isdigit(*arg2))
|
||||||
{
|
{
|
||||||
str_to_number(x, arg1);
|
str_to_number(x, arg1);
|
||||||
str_to_number(y, arg2);
|
str_to_number(y, arg2);
|
||||||
|
@ -518,7 +518,7 @@ ACMD(do_item)
|
||||||
|
|
||||||
DWORD dwVnum;
|
DWORD dwVnum;
|
||||||
|
|
||||||
if (isnhdigit(*arg1))
|
if (isdigit(*arg1))
|
||||||
str_to_number(dwVnum, arg1);
|
str_to_number(dwVnum, arg1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -769,7 +769,7 @@ ACMD(do_mob)
|
||||||
|
|
||||||
const CMob* pkMob = NULL;
|
const CMob* pkMob = NULL;
|
||||||
|
|
||||||
if (isnhdigit(*arg1))
|
if (isdigit(*arg1))
|
||||||
{
|
{
|
||||||
str_to_number(vnum, arg1);
|
str_to_number(vnum, arg1);
|
||||||
|
|
||||||
|
@ -830,7 +830,7 @@ ACMD(do_mob_ld)
|
||||||
|
|
||||||
const CMob* pkMob = NULL;
|
const CMob* pkMob = NULL;
|
||||||
|
|
||||||
if (isnhdigit(*arg1))
|
if (isdigit(*arg1))
|
||||||
{
|
{
|
||||||
str_to_number(vnum, arg1);
|
str_to_number(vnum, arg1);
|
||||||
|
|
||||||
|
@ -1951,7 +1951,7 @@ ACMD(do_book)
|
||||||
|
|
||||||
CSkillProto * pkProto;
|
CSkillProto * pkProto;
|
||||||
|
|
||||||
if (isnhdigit(*arg1))
|
if (isdigit(*arg1))
|
||||||
{
|
{
|
||||||
DWORD vnum = 0;
|
DWORD vnum = 0;
|
||||||
str_to_number(vnum, arg1);
|
str_to_number(vnum, arg1);
|
||||||
|
|
|
@ -124,16 +124,10 @@ int gPlayerMaxLevel = 99;
|
||||||
|
|
||||||
bool g_BlockCharCreation = false;
|
bool g_BlockCharCreation = false;
|
||||||
|
|
||||||
|
|
||||||
//OPENID
|
|
||||||
int openid_server = 0;
|
|
||||||
char openid_host[256];
|
|
||||||
char openid_uri[256];
|
|
||||||
|
|
||||||
bool is_string_true(const char * string)
|
bool is_string_true(const char * string)
|
||||||
{
|
{
|
||||||
bool result = 0;
|
bool result = 0;
|
||||||
if (isnhdigit(*string))
|
if (isdigit(*string))
|
||||||
{
|
{
|
||||||
str_to_number(result, string);
|
str_to_number(result, string);
|
||||||
return result > 0 ? true : false;
|
return result > 0 ? true : false;
|
||||||
|
@ -490,25 +484,7 @@ void config_init(const string& st_localeServiceName)
|
||||||
snprintf(buf, sizeof(buf), "LOG_SQL: %s %s %s %s %d", log_host, log_user, log_pwd, log_db, log_port);
|
snprintf(buf, sizeof(buf), "LOG_SQL: %s %s %s %s %d", log_host, log_user, log_pwd, log_db, log_port);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//OPENID
|
|
||||||
TOKEN("WEB_AUTH")
|
|
||||||
{
|
|
||||||
const char * line = two_arguments(value_string, openid_host, sizeof(openid_host), openid_uri, sizeof(openid_uri));
|
|
||||||
|
|
||||||
if (!*openid_host || !*openid_uri)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "WEB_AUTH syntax error (ex: WEB_AUTH <host(metin2.co.kr) uri(/kyw/gameauth.php)>\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
char buf[1024];
|
|
||||||
openid_server = 1;
|
|
||||||
snprintf(buf, sizeof(buf), "WEB_AUTH: %s %s", openid_host, openid_uri);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//처리가 끝났으니 파일을 닫자.
|
//처리가 끝났으니 파일을 닫자.
|
||||||
fclose(fpOnlyForDB);
|
fclose(fpOnlyForDB);
|
||||||
|
@ -859,7 +835,7 @@ void config_init(const string& st_localeServiceName)
|
||||||
|
|
||||||
for (; *p; p++)
|
for (; *p; p++)
|
||||||
{
|
{
|
||||||
if (isnhspace(*p))
|
if (isspace(*p))
|
||||||
{
|
{
|
||||||
if (stNum.length())
|
if (stNum.length())
|
||||||
{
|
{
|
||||||
|
|
320
game/src/db.cpp
320
game/src/db.cpp
|
@ -19,11 +19,9 @@
|
||||||
#include "locale_service.h"
|
#include "locale_service.h"
|
||||||
#include "pcbang.h"
|
#include "pcbang.h"
|
||||||
#include "spam.h"
|
#include "spam.h"
|
||||||
#include "auth_brazil.h"
|
|
||||||
|
|
||||||
extern bool g_bNoPasspod;
|
extern bool g_bNoPasspod;
|
||||||
extern std::string g_stBlockDate;
|
extern std::string g_stBlockDate;
|
||||||
extern int openid_server;
|
|
||||||
|
|
||||||
//Áß±¹ passpod Àü¿ë ÇÔ¼ö
|
//Áß±¹ passpod Àü¿ë ÇÔ¼ö
|
||||||
bool CheckPasspod(const char * account)
|
bool CheckPasspod(const char * account)
|
||||||
|
@ -490,8 +488,8 @@ void DBManager::SendAuthLogin(LPDESC d)
|
||||||
ptod.bBillType = pkLD->GetBillType();
|
ptod.bBillType = pkLD->GetBillType();
|
||||||
ptod.dwBillID = pkLD->GetBillID();
|
ptod.dwBillID = pkLD->GetBillID();
|
||||||
|
|
||||||
thecore_memcpy(ptod.iPremiumTimes, pkLD->GetPremiumPtr(), sizeof(ptod.iPremiumTimes));
|
memcpy(ptod.iPremiumTimes, pkLD->GetPremiumPtr(), sizeof(ptod.iPremiumTimes));
|
||||||
thecore_memcpy(&ptod.adwClientKey, pkLD->GetClientKey(), sizeof(DWORD) * 4);
|
memcpy(&ptod.adwClientKey, pkLD->GetClientKey(), sizeof(DWORD) * 4);
|
||||||
|
|
||||||
db_clientdesc->DBPacket(HEADER_GD_AUTH_LOGIN, d->GetHandle(), &ptod, sizeof(TPacketGDAuthLogin));
|
db_clientdesc->DBPacket(HEADER_GD_AUTH_LOGIN, d->GetHandle(), &ptod, sizeof(TPacketGDAuthLogin));
|
||||||
sys_log(0, "SendAuthLogin %s key %u", ptod.szLogin, ptod.dwID);
|
sys_log(0, "SendAuthLogin %s key %u", ptod.szLogin, ptod.dwID);
|
||||||
|
@ -698,22 +696,9 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
|
||||||
|
|
||||||
if (pMsg->Get()->uiNumRows == 0)
|
if (pMsg->Get()->uiNumRows == 0)
|
||||||
{
|
{
|
||||||
if (true == LC_IsBrazil())
|
sys_log(0, " NOID");
|
||||||
{
|
LoginFailure(d, "NOID");
|
||||||
// 계정이 없으면 새로 만들어야 한다
|
M2_DELETE(pinfo);
|
||||||
ReturnQuery(QID_BRAZIL_CREATE_ID, qi->dwIdent, pinfo,
|
|
||||||
"INSERT INTO account(login, password, social_id, create_time) "
|
|
||||||
"VALUES('%s', password('%s'), '0000000', NOW()) ;",
|
|
||||||
pinfo->login, pinfo->passwd);
|
|
||||||
|
|
||||||
sys_log(0, "[AUTH_BRAZIL] : Create A new AccountID From OnGame");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sys_log(0, " NOID");
|
|
||||||
LoginFailure(d, "NOID");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -898,238 +883,6 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QID_AUTH_LOGIN_OPENID:
|
|
||||||
{
|
|
||||||
TPacketCGLogin3 * pinfo = (TPacketCGLogin3 *) qi->pvData;
|
|
||||||
LPDESC d = DESC_MANAGER::instance().FindByLoginKey(qi->dwIdent);
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
{
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//위치 변경 - By SeMinZ
|
|
||||||
d->SetLogin(pinfo->login);
|
|
||||||
|
|
||||||
sys_log(0, "QID_AUTH_LOGIN_OPENID: START %u %p", qi->dwIdent, get_pointer(d));
|
|
||||||
|
|
||||||
if (pMsg->Get()->uiNumRows == 0)
|
|
||||||
{
|
|
||||||
if (true == LC_IsBrazil())
|
|
||||||
{
|
|
||||||
// 계정이 없으면 새로 만들어야 한다
|
|
||||||
ReturnQuery(QID_BRAZIL_CREATE_ID, qi->dwIdent, pinfo,
|
|
||||||
"INSERT INTO account(login, password, social_id, create_time) "
|
|
||||||
"VALUES('%s', password('%s'), '0000000', NOW()) ;",
|
|
||||||
pinfo->login, pinfo->passwd);
|
|
||||||
|
|
||||||
sys_log(0, "[AUTH_BRAZIL] : Create A new AccountID From OnGame");
|
|
||||||
} else if (true == LC_IsJapan())
|
|
||||||
{
|
|
||||||
// 계정이 없으면 새로 만들어야 한다
|
|
||||||
ReturnQuery(QID_JAPAN_CREATE_ID, qi->dwIdent, pinfo,
|
|
||||||
"INSERT INTO account(login, password, social_id, create_time) "
|
|
||||||
"VALUES('%s', password('%s'), '0000000', NOW()) ;",
|
|
||||||
pinfo->login, "^Aasl@(!$)djl!231fj!&#");
|
|
||||||
|
|
||||||
sys_log(0, "[AUTH_JAPAN] : Create A new AccountID From OGE");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sys_log(0, " NOID");
|
|
||||||
LoginFailure(d, "NOID");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
|
|
||||||
int col = 0;
|
|
||||||
|
|
||||||
// PASSWORD('%s'), password, securitycode, social_id, id, status
|
|
||||||
char szEncrytPassword[45 + 1];
|
|
||||||
char szPassword[45 + 1];
|
|
||||||
char szMatrixCode[MATRIX_CODE_MAX_LEN + 1];
|
|
||||||
char szSocialID[SOCIAL_ID_MAX_LEN + 1];
|
|
||||||
char szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
|
|
||||||
DWORD dwID = 0;
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
sys_err("error column %d", col);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(szEncrytPassword, row[col++], sizeof(szEncrytPassword));
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
sys_err("error column %d", col);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(szPassword, row[col++], sizeof(szPassword));
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
*szMatrixCode = '\0';
|
|
||||||
col++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strncpy(szMatrixCode, row[col++], sizeof(szMatrixCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
sys_err("error column %d", col);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(szSocialID, row[col++], sizeof(szSocialID));
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
sys_err("error column %d", col);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
str_to_number(dwID, row[col++]);
|
|
||||||
|
|
||||||
if (!row[col])
|
|
||||||
{
|
|
||||||
sys_err("error column %d", col);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(szStatus, row[col++], sizeof(szStatus));
|
|
||||||
|
|
||||||
BYTE bNotAvail = 0;
|
|
||||||
str_to_number(bNotAvail, row[col++]);
|
|
||||||
|
|
||||||
int aiPremiumTimes[PREMIUM_MAX_NUM];
|
|
||||||
memset(&aiPremiumTimes, 0, sizeof(aiPremiumTimes));
|
|
||||||
|
|
||||||
char szCreateDate[256] = "00000000";
|
|
||||||
|
|
||||||
if (!g_iUseLocale)
|
|
||||||
{
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_EXP], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_ITEM], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_SAFEBOX], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_AUTOLOOT], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_FISH_MIND], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_MARRIAGE_FAST], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_GOLD], row[col++]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_EXP], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_ITEM], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_SAFEBOX], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_AUTOLOOT], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_FISH_MIND], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_MARRIAGE_FAST], row[col++]);
|
|
||||||
str_to_number(aiPremiumTimes[PREMIUM_GOLD], row[col++]);
|
|
||||||
|
|
||||||
if (LC_IsEurope() || test_server)
|
|
||||||
{
|
|
||||||
long retValue = 0;
|
|
||||||
str_to_number(retValue, row[col]);
|
|
||||||
|
|
||||||
time_t create_time = retValue;
|
|
||||||
struct tm * tm1;
|
|
||||||
tm1 = localtime(&create_time);
|
|
||||||
strftime(szCreateDate, 255, "%Y%m%d", tm1);
|
|
||||||
|
|
||||||
sys_log(0, "Create_Time %d %s", retValue, szCreateDate);
|
|
||||||
sys_log(0, "Block Time %d ", strncmp(szCreateDate, g_stBlockDate.c_str(), 8));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int nPasswordDiff = strcmp(szEncrytPassword, szPassword);
|
|
||||||
|
|
||||||
if (true == LC_IsBrazil())
|
|
||||||
{
|
|
||||||
nPasswordDiff = 0; // 브라질 버전에서는 비밀번호 체크를 하지 않는다.
|
|
||||||
}
|
|
||||||
|
|
||||||
//OpenID : OpenID 의 경우, 비밀번호 체크를 하지 않는다.
|
|
||||||
if (openid_server)
|
|
||||||
{
|
|
||||||
nPasswordDiff = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nPasswordDiff)
|
|
||||||
{
|
|
||||||
LoginFailure(d, "WRONGPWD");
|
|
||||||
sys_log(0, " WRONGPWD");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else if (bNotAvail)
|
|
||||||
{
|
|
||||||
LoginFailure(d, "NOTAVAIL");
|
|
||||||
sys_log(0, " NOTAVAIL");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else if (DESC_MANAGER::instance().FindByLoginName(pinfo->login))
|
|
||||||
{
|
|
||||||
LoginFailure(d, "ALREADY");
|
|
||||||
sys_log(0, " ALREADY");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else if (strcmp(szStatus, "OK"))
|
|
||||||
{
|
|
||||||
LoginFailure(d, szStatus);
|
|
||||||
sys_log(0, " STATUS: %s", szStatus);
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (LC_IsEurope())
|
|
||||||
{
|
|
||||||
//stBlockData >= 0 == 날짜가 BlockDate 보다 미래
|
|
||||||
if (strncmp(szCreateDate, g_stBlockDate.c_str(), 8) >= 0)
|
|
||||||
{
|
|
||||||
LoginFailure(d, "BLKLOGIN");
|
|
||||||
sys_log(0, " BLKLOGIN");
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
char szQuery[1024];
|
|
||||||
snprintf(szQuery, sizeof(szQuery), "UPDATE account SET last_play=NOW() WHERE id=%u", dwID);
|
|
||||||
std::unique_ptr<SQLMsg> msg( DBManager::instance().DirectQuery(szQuery) );
|
|
||||||
}
|
|
||||||
|
|
||||||
TAccountTable & r = d->GetAccountTable();
|
|
||||||
|
|
||||||
r.id = dwID;
|
|
||||||
trim_and_lower(pinfo->login, r.login, sizeof(r.login));
|
|
||||||
strncpy(r.passwd, pinfo->passwd, sizeof(r.passwd));
|
|
||||||
strncpy(r.social_id, szSocialID, sizeof(r.social_id));
|
|
||||||
DESC_MANAGER::instance().ConnectAccount(r.login, d);
|
|
||||||
|
|
||||||
d->SetMatrixCode(szMatrixCode);
|
|
||||||
|
|
||||||
if (!g_bBilling)
|
|
||||||
{
|
|
||||||
LoginPrepare(BILLING_FREE, 0, 0, d, pinfo->adwClientKey, aiPremiumTimes);
|
|
||||||
//By SeMinZ
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sys_log(0, "QID_AUTH_LOGIN_OPENID: SUCCESS %s", pinfo->login);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QID_BILLING_GET_TIME:
|
case QID_BILLING_GET_TIME:
|
||||||
{
|
{
|
||||||
|
@ -1436,69 +1189,6 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
|
||||||
|
|
||||||
// END_OF_PCBANG_IP_LIST
|
// END_OF_PCBANG_IP_LIST
|
||||||
|
|
||||||
case QID_BRAZIL_CREATE_ID :
|
|
||||||
{
|
|
||||||
TPacketCGLogin3 * pinfo = (TPacketCGLogin3 *) qi->pvData ;
|
|
||||||
|
|
||||||
if( pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1 )
|
|
||||||
{
|
|
||||||
LPDESC d = DESC_MANAGER::instance().FindByLoginKey(qi->dwIdent) ;
|
|
||||||
sys_log(0, "[AUTH_BRAZIL] NOID") ;
|
|
||||||
sys_log(0, "[AUTH_BRAZIL] : Failed to create a new account %s", pinfo->login) ;
|
|
||||||
LoginFailure(d, "NOID") ;
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sys_log(0, "[AUTH_BRAZIL] : Succeed to create a new account %s", pinfo->login) ;
|
|
||||||
|
|
||||||
ReturnQuery(QID_AUTH_LOGIN, qi->dwIdent, pinfo,
|
|
||||||
"SELECT PASSWORD('%s'),password,securitycode,social_id,id,status,availDt - NOW() > 0,"
|
|
||||||
"UNIX_TIMESTAMP(silver_expire),"
|
|
||||||
"UNIX_TIMESTAMP(gold_expire),"
|
|
||||||
"UNIX_TIMESTAMP(safebox_expire),"
|
|
||||||
"UNIX_TIMESTAMP(autoloot_expire),"
|
|
||||||
"UNIX_TIMESTAMP(fish_mind_expire),"
|
|
||||||
"UNIX_TIMESTAMP(marriage_fast_expire),"
|
|
||||||
"UNIX_TIMESTAMP(money_drop_rate_expire),"
|
|
||||||
"UNIX_TIMESTAMP(create_time)"
|
|
||||||
" FROM account WHERE login='%s'",
|
|
||||||
pinfo->passwd, pinfo->login) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case QID_JAPAN_CREATE_ID :
|
|
||||||
{
|
|
||||||
TPacketCGLogin3 * pinfo = (TPacketCGLogin3 *) qi->pvData ;
|
|
||||||
|
|
||||||
if( pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1 )
|
|
||||||
{
|
|
||||||
LPDESC d = DESC_MANAGER::instance().FindByLoginKey(qi->dwIdent) ;
|
|
||||||
sys_log(0, "[AUTH_JAPAN] NOID") ;
|
|
||||||
sys_log(0, "[AUTH_JAPAN] : Failed to create a new account %s", pinfo->login) ;
|
|
||||||
LoginFailure(d, "NOID") ;
|
|
||||||
M2_DELETE(pinfo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sys_log(0, "[AUTH_JAPAN] : Succeed to create a new account %s", pinfo->login) ;
|
|
||||||
|
|
||||||
ReturnQuery(QID_AUTH_LOGIN_OPENID, qi->dwIdent, pinfo,
|
|
||||||
"SELECT PASSWORD('%s'),password,securitycode,social_id,id,status,availDt - NOW() > 0,"
|
|
||||||
"UNIX_TIMESTAMP(silver_expire),"
|
|
||||||
"UNIX_TIMESTAMP(gold_expire),"
|
|
||||||
"UNIX_TIMESTAMP(safebox_expire),"
|
|
||||||
"UNIX_TIMESTAMP(autoloot_expire),"
|
|
||||||
"UNIX_TIMESTAMP(fish_mind_expire),"
|
|
||||||
"UNIX_TIMESTAMP(marriage_fast_expire),"
|
|
||||||
"UNIX_TIMESTAMP(money_drop_rate_expire),"
|
|
||||||
"UNIX_TIMESTAMP(create_time)"
|
|
||||||
" FROM account WHERE login='%s'",
|
|
||||||
pinfo->passwd, pinfo->login) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
sys_err("FATAL ERROR!!! Unhandled return query id %d", qi->iType);
|
sys_err("FATAL ERROR!!! Unhandled return query id %d", qi->iType);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -16,7 +16,6 @@ enum
|
||||||
QID_SAFEBOX_SIZE,
|
QID_SAFEBOX_SIZE,
|
||||||
QID_DB_STRING,
|
QID_DB_STRING,
|
||||||
QID_AUTH_LOGIN,
|
QID_AUTH_LOGIN,
|
||||||
QID_AUTH_LOGIN_OPENID,
|
|
||||||
QID_LOTTO,
|
QID_LOTTO,
|
||||||
QID_HIGHSCORE_REGISTER,
|
QID_HIGHSCORE_REGISTER,
|
||||||
QID_HIGHSCORE_SHOW,
|
QID_HIGHSCORE_SHOW,
|
||||||
|
@ -35,9 +34,6 @@ enum
|
||||||
// PROTECT_CHILD_FOR_NEWCIBN
|
// PROTECT_CHILD_FOR_NEWCIBN
|
||||||
QID_PROTECT_CHILD,
|
QID_PROTECT_CHILD,
|
||||||
// END_PROTECT_CHILD_FOR_NEWCIBN
|
// END_PROTECT_CHILD_FOR_NEWCIBN
|
||||||
|
|
||||||
QID_BRAZIL_CREATE_ID,
|
|
||||||
QID_JAPAN_CREATE_ID,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SUseTime
|
typedef struct SUseTime
|
||||||
|
|
|
@ -245,13 +245,13 @@ bool DESC::Setup(LPFDWATCH _fdw, socket_t _fd, const struct sockaddr_in & c_rSoc
|
||||||
#ifndef _IMPROVED_PACKET_ENCRYPTION_
|
#ifndef _IMPROVED_PACKET_ENCRYPTION_
|
||||||
if (LC_IsEurope())
|
if (LC_IsEurope())
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_adwEncryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4);
|
memcpy(m_adwEncryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4);
|
||||||
thecore_memcpy(m_adwDecryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4);
|
memcpy(m_adwDecryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_adwEncryptionKey, "testtesttesttest", sizeof(DWORD) * 4);
|
memcpy(m_adwEncryptionKey, "testtesttesttest", sizeof(DWORD) * 4);
|
||||||
thecore_memcpy(m_adwDecryptionKey, "testtesttesttest", sizeof(DWORD) * 4);
|
memcpy(m_adwDecryptionKey, "testtesttesttest", sizeof(DWORD) * 4);
|
||||||
}
|
}
|
||||||
#endif // _IMPROVED_PACKET_ENCRYPTION_
|
#endif // _IMPROVED_PACKET_ENCRYPTION_
|
||||||
|
|
||||||
|
@ -578,7 +578,7 @@ void DESC::SetPhase(int _phase)
|
||||||
void DESC::BindAccountTable(TAccountTable * pAccountTable)
|
void DESC::BindAccountTable(TAccountTable * pAccountTable)
|
||||||
{
|
{
|
||||||
assert(pAccountTable != NULL);
|
assert(pAccountTable != NULL);
|
||||||
thecore_memcpy(&m_accountTable, pAccountTable, sizeof(TAccountTable));
|
memcpy(&m_accountTable, pAccountTable, sizeof(TAccountTable));
|
||||||
DESC_MANAGER::instance().ConnectAccount(m_accountTable.login, this);
|
DESC_MANAGER::instance().ConnectAccount(m_accountTable.login, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,7 +920,7 @@ void DESC::SendLoginSuccessPacket()
|
||||||
|
|
||||||
p.handle = GetHandle();
|
p.handle = GetHandle();
|
||||||
p.random_key = DESC_MANAGER::instance().MakeRandomKey(GetHandle()); // FOR MARK
|
p.random_key = DESC_MANAGER::instance().MakeRandomKey(GetHandle()); // FOR MARK
|
||||||
thecore_memcpy(p.players, rTable.players, sizeof(rTable.players));
|
memcpy(p.players, rTable.players, sizeof(rTable.players));
|
||||||
|
|
||||||
for (int i = 0; i < PLAYER_PER_ACCOUNT; ++i)
|
for (int i = 0; i < PLAYER_PER_ACCOUNT; ++i)
|
||||||
{
|
{
|
||||||
|
@ -1035,7 +1035,7 @@ void DESC::SetSecurityKey(const DWORD * c_pdwKey)
|
||||||
if (g_iUseLocale && !LC_IsKorea())
|
if (g_iUseLocale && !LC_IsKorea())
|
||||||
c_pszKey = GetKey_20050304Myevan() + 37;
|
c_pszKey = GetKey_20050304Myevan() + 37;
|
||||||
|
|
||||||
thecore_memcpy(&m_adwDecryptionKey, c_pdwKey, 16);
|
memcpy(&m_adwDecryptionKey, c_pdwKey, 16);
|
||||||
TEA_Encrypt(&m_adwEncryptionKey[0], &m_adwDecryptionKey[0], (const DWORD *) c_pszKey, 16);
|
TEA_Encrypt(&m_adwEncryptionKey[0], &m_adwDecryptionKey[0], (const DWORD *) c_pszKey, 16);
|
||||||
|
|
||||||
sys_log(0, "SetSecurityKey decrypt %u %u %u %u encrypt %u %u %u %u",
|
sys_log(0, "SetSecurityKey decrypt %u %u %u %u encrypt %u %u %u %u",
|
||||||
|
|
|
@ -197,7 +197,7 @@ void CLIENT_DESC::SetPhase(int iPhase)
|
||||||
strncpy(pck.szHost, d->GetHostName(), sizeof(pck.szHost));
|
strncpy(pck.szHost, d->GetHostName(), sizeof(pck.szHost));
|
||||||
pck.dwLoginKey = d->GetLoginKey();
|
pck.dwLoginKey = d->GetLoginKey();
|
||||||
#ifndef _IMPROVED_PACKET_ENCRYPTION_
|
#ifndef _IMPROVED_PACKET_ENCRYPTION_
|
||||||
thecore_memcpy(pck.adwClientKey, d->GetDecryptionKey(), 16);
|
memcpy(pck.adwClientKey, d->GetDecryptionKey(), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
buf.write(&pck, sizeof(TPacketLoginOnSetup));
|
buf.write(&pck, sizeof(TPacketLoginOnSetup));
|
||||||
|
|
|
@ -419,7 +419,7 @@ void DESC_MANAGER::UpdateLocalUserCount()
|
||||||
f = std::for_each(c_ref_set.begin(), c_ref_set.end(), f);
|
f = std::for_each(c_ref_set.begin(), c_ref_set.end(), f);
|
||||||
|
|
||||||
m_iLocalUserCount = f.iTotalCount;
|
m_iLocalUserCount = f.iTotalCount;
|
||||||
thecore_memcpy(m_aiEmpireUserCount, f.aiEmpireUserCount, sizeof(m_aiEmpireUserCount));
|
memcpy(m_aiEmpireUserCount, f.aiEmpireUserCount, sizeof(m_aiEmpireUserCount));
|
||||||
|
|
||||||
m_aiEmpireUserCount[1] += P2P_MANAGER::instance().GetEmpireUserCount(1);
|
m_aiEmpireUserCount[1] += P2P_MANAGER::instance().GetEmpireUserCount(1);
|
||||||
m_aiEmpireUserCount[2] += P2P_MANAGER::instance().GetEmpireUserCount(2);
|
m_aiEmpireUserCount[2] += P2P_MANAGER::instance().GetEmpireUserCount(2);
|
||||||
|
|
|
@ -33,8 +33,8 @@ void exchange_packet(LPCHARACTER ch, BYTE sub_header, bool is_me, DWORD arg1, TI
|
||||||
|
|
||||||
if (sub_header == EXCHANGE_SUBHEADER_GC_ITEM_ADD && pvData)
|
if (sub_header == EXCHANGE_SUBHEADER_GC_ITEM_ADD && pvData)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&pack_exchg.alSockets, ((LPITEM) pvData)->GetSockets(), sizeof(pack_exchg.alSockets));
|
memcpy(&pack_exchg.alSockets, ((LPITEM) pvData)->GetSockets(), sizeof(pack_exchg.alSockets));
|
||||||
thecore_memcpy(&pack_exchg.aAttr, ((LPITEM) pvData)->GetAttributes(), sizeof(pack_exchg.aAttr));
|
memcpy(&pack_exchg.aAttr, ((LPITEM) pvData)->GetAttributes(), sizeof(pack_exchg.aAttr));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -556,7 +556,7 @@ bool CExchange::Accept(bool bAccept)
|
||||||
|
|
||||||
if (Done())
|
if (Done())
|
||||||
{
|
{
|
||||||
if (m_lGold) // µ·ÀÌ ÀÖÀ» ‹š¸¸ ÀúÀå
|
if (m_lGold) // 돈이 있을 ??만 저장
|
||||||
GetOwner()->Save();
|
GetOwner()->Save();
|
||||||
|
|
||||||
if (GetCompany()->Done())
|
if (GetCompany()->Done())
|
||||||
|
|
|
@ -185,7 +185,7 @@ namespace fishing
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
SFishInfo fish_info_bak[MAX_FISH];
|
SFishInfo fish_info_bak[MAX_FISH];
|
||||||
thecore_memcpy(fish_info_bak, fish_info, sizeof(fish_info));
|
memcpy(fish_info_bak, fish_info, sizeof(fish_info));
|
||||||
|
|
||||||
memset(fish_info, 0, sizeof(fish_info));
|
memset(fish_info, 0, sizeof(fish_info));
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@ void Initialize()
|
||||||
// 백업에 이름이 있으면 리스토어 한다.
|
// 백업에 이름이 있으면 리스토어 한다.
|
||||||
if (*fish_info_bak[0].name)
|
if (*fish_info_bak[0].name)
|
||||||
{
|
{
|
||||||
thecore_memcpy(fish_info, fish_info_bak, sizeof(fish_info));
|
memcpy(fish_info, fish_info_bak, sizeof(fish_info));
|
||||||
SendLog(" restoring to backup");
|
SendLog(" restoring to backup");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -237,7 +237,7 @@ void Initialize()
|
||||||
|
|
||||||
if (*fish_info_bak[0].name)
|
if (*fish_info_bak[0].name)
|
||||||
{
|
{
|
||||||
thecore_memcpy(fish_info, fish_info_bak, sizeof(fish_info));
|
memcpy(fish_info, fish_info_bak, sizeof(fish_info));
|
||||||
SendLog(" restoring to backup");
|
SendLog(" restoring to backup");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -600,7 +600,7 @@ void CGuild::LoadGuildData(SQLMsg* pmsg)
|
||||||
|
|
||||||
m_data.skill_point = (BYTE) strtoul(row[4], (char **) NULL, 10);
|
m_data.skill_point = (BYTE) strtoul(row[4], (char **) NULL, 10);
|
||||||
if (row[5])
|
if (row[5])
|
||||||
thecore_memcpy(m_data.abySkill, row[5], sizeof(BYTE) * GUILD_SKILL_COUNT);
|
memcpy(m_data.abySkill, row[5], sizeof(BYTE) * GUILD_SKILL_COUNT);
|
||||||
else
|
else
|
||||||
memset(m_data.abySkill, 0, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
memset(m_data.abySkill, 0, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
||||||
|
|
||||||
|
@ -648,7 +648,7 @@ void CGuild::SendDBSkillUpdate(int amount)
|
||||||
guild_skill.guild_id = m_data.guild_id;
|
guild_skill.guild_id = m_data.guild_id;
|
||||||
guild_skill.amount = amount;
|
guild_skill.amount = amount;
|
||||||
guild_skill.skill_point = m_data.skill_point;
|
guild_skill.skill_point = m_data.skill_point;
|
||||||
thecore_memcpy(guild_skill.skill_levels, m_data.abySkill, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
memcpy(guild_skill.skill_levels, m_data.abySkill, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
||||||
|
|
||||||
db_clientdesc->DBPacket(HEADER_GD_GUILD_SKILL_UPDATE, 0, &guild_skill, sizeof(guild_skill));
|
db_clientdesc->DBPacket(HEADER_GD_GUILD_SKILL_UPDATE, 0, &guild_skill, sizeof(guild_skill));
|
||||||
}
|
}
|
||||||
|
@ -1466,7 +1466,7 @@ void CGuild::UpdateSkill(BYTE skill_point, BYTE* skill_levels)
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
thecore_memcpy(m_data.abySkill, skill_levels, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
memcpy(m_data.abySkill, skill_levels, sizeof(BYTE) * GUILD_SKILL_COUNT);
|
||||||
ComputeGuildPoints();
|
ComputeGuildPoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -883,7 +883,7 @@ void CGuildManager::ReserveWarAdd(TGuildWarReserve * p)
|
||||||
m_vec_kReserveWar.push_back(pkReserve);
|
m_vec_kReserveWar.push_back(pkReserve);
|
||||||
}
|
}
|
||||||
|
|
||||||
thecore_memcpy(&pkReserve->data, p, sizeof(TGuildWarReserve));
|
memcpy(&pkReserve->data, p, sizeof(TGuildWarReserve));
|
||||||
|
|
||||||
sys_log(0, "ReserveWarAdd %u gid1 %u power %d gid2 %u power %d handicap %d",
|
sys_log(0, "ReserveWarAdd %u gid1 %u power %d gid2 %u power %d handicap %d",
|
||||||
pkReserve->data.dwID, p->dwGuildFrom, p->lPowerFrom, p->dwGuildTo, p->lPowerTo, p->lHandicap);
|
pkReserve->data.dwID, p->dwGuildFrom, p->lPowerFrom, p->dwGuildTo, p->lPowerTo, p->lHandicap);
|
||||||
|
|
|
@ -233,7 +233,6 @@ protected:
|
||||||
void ChangeName(LPDESC d, const char * data);
|
void ChangeName(LPDESC d, const char * data);
|
||||||
|
|
||||||
void AuthLogin(LPDESC d, const char * c_pData);
|
void AuthLogin(LPDESC d, const char * c_pData);
|
||||||
void AuthLoginOpenID(LPDESC d, const char * c_pData);
|
|
||||||
void ItemAward(const char * c_pData);
|
void ItemAward(const char * c_pData);
|
||||||
|
|
||||||
void ChangeEmpirePriv(const char* c_pData);
|
void ChangeEmpirePriv(const char* c_pData);
|
||||||
|
@ -365,11 +364,9 @@ class CInputAuth : public CInputProcessor
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
|
virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
|
||||||
int auth_OpenID(const char *authKey, const char *ipAddr, char *rID);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Login(LPDESC d, const char * c_pData);
|
void Login(LPDESC d, const char * c_pData);
|
||||||
void LoginOpenID(LPDESC d, const char * c_pData); //2012.07.19 OpenID : 김용욱
|
|
||||||
void PasspodAnswer(LPDESC d, const char * c_pData );
|
void PasspodAnswer(LPDESC d, const char * c_pData );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,11 +8,9 @@
|
||||||
#include "matrix_card.h"
|
#include "matrix_card.h"
|
||||||
#include "passpod.h"
|
#include "passpod.h"
|
||||||
#include "locale_service.h"
|
#include "locale_service.h"
|
||||||
#include "auth_brazil.h"
|
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
extern time_t get_global_time();
|
extern time_t get_global_time();
|
||||||
extern int openid_server;
|
|
||||||
|
|
||||||
bool FN_IS_VALID_LOGIN_STRING(const char *str)
|
bool FN_IS_VALID_LOGIN_STRING(const char *str)
|
||||||
{
|
{
|
||||||
|
@ -157,28 +155,8 @@ void CInputAuth::Login(LPDESC d, const char * c_pData)
|
||||||
|
|
||||||
sys_log(0, "InputAuth::Login : key %u:0x%x login %s", dwKey, dwPanamaKey, login);
|
sys_log(0, "InputAuth::Login : key %u:0x%x login %s", dwKey, dwPanamaKey, login);
|
||||||
|
|
||||||
// BRAZIL_AUTH
|
|
||||||
if (LC_IsBrazil() && !test_server)
|
|
||||||
{
|
|
||||||
int result = auth_brazil(login, passwd);
|
|
||||||
|
|
||||||
switch (result)
|
|
||||||
{
|
|
||||||
case AUTH_BRAZIL_SERVER_ERR:
|
|
||||||
case AUTH_BRAZIL_NOID:
|
|
||||||
LoginFailure(d, "NOID");
|
|
||||||
return;
|
|
||||||
case AUTH_BRAZIL_WRONGPWD:
|
|
||||||
LoginFailure(d, "WRONGPWD");
|
|
||||||
return;
|
|
||||||
case AUTH_BRAZIL_FLASHUSER:
|
|
||||||
LoginFailure(d, "FLASH");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3;
|
TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3;
|
||||||
thecore_memcpy(p, pinfo, sizeof(TPacketCGLogin3));
|
memcpy(p, pinfo, sizeof(TPacketCGLogin3));
|
||||||
|
|
||||||
char szPasswd[PASSWD_MAX_LEN * 2 + 1];
|
char szPasswd[PASSWD_MAX_LEN * 2 + 1];
|
||||||
DBManager::instance().EscapeString(szPasswd, sizeof(szPasswd), passwd, strlen(passwd));
|
DBManager::instance().EscapeString(szPasswd, sizeof(szPasswd), passwd, strlen(passwd));
|
||||||
|
@ -223,278 +201,6 @@ void CInputAuth::Login(LPDESC d, const char * c_pData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInputAuth::LoginOpenID(LPDESC d, const char * c_pData)
|
|
||||||
{
|
|
||||||
//OpenID test code.
|
|
||||||
TPacketCGLogin5 *tempInfo1 = (TPacketCGLogin5 *)c_pData;
|
|
||||||
|
|
||||||
//일본 웹 서버에 인증키 확인 요청을 보낸다.
|
|
||||||
char* authKey = tempInfo1->authKey;
|
|
||||||
char returnID[LOGIN_MAX_LEN + 1] = {0};
|
|
||||||
|
|
||||||
int test_url_get_protocol = auth_OpenID(authKey, inet_ntoa(d->GetAddr().sin_addr), returnID);
|
|
||||||
|
|
||||||
//인증 실패. 에러 처리
|
|
||||||
if (0!=test_url_get_protocol)
|
|
||||||
{
|
|
||||||
LoginFailure(d, "OpenID Fail");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
TPacketCGLogin3 tempInfo2;
|
|
||||||
strncpy(tempInfo2.login, returnID, LOGIN_MAX_LEN);
|
|
||||||
strncpy(tempInfo2.passwd, "0000", PASSWD_MAX_LEN);
|
|
||||||
for(int i=0;i<4;i++)
|
|
||||||
tempInfo2.adwClientKey[i] = tempInfo1->adwClientKey[i];
|
|
||||||
TPacketCGLogin3 * pinfo = &tempInfo2;
|
|
||||||
|
|
||||||
if (!g_bAuthServer)
|
|
||||||
{
|
|
||||||
sys_err ("CInputAuth class is not for game server. IP %s might be a hacker.",
|
|
||||||
inet_ntoa(d->GetAddr().sin_addr));
|
|
||||||
d->DelayedDisconnect(5);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// string 무결성을 위해 복사
|
|
||||||
char login[LOGIN_MAX_LEN + 1];
|
|
||||||
trim_and_lower(pinfo->login, login, sizeof(login));
|
|
||||||
|
|
||||||
char passwd[PASSWD_MAX_LEN + 1];
|
|
||||||
strncpy(passwd, pinfo->passwd, sizeof(passwd));
|
|
||||||
|
|
||||||
sys_log(0, "InputAuth::Login : %s(%d) desc %p",
|
|
||||||
login, strlen(login), get_pointer(d));
|
|
||||||
|
|
||||||
// check login string
|
|
||||||
if (false == FN_IS_VALID_LOGIN_STRING(login))
|
|
||||||
{
|
|
||||||
sys_log(0, "InputAuth::Login : IS_NOT_VALID_LOGIN_STRING(%s) desc %p",
|
|
||||||
login, get_pointer(d));
|
|
||||||
LoginFailure(d, "NOID");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_bNoMoreClient)
|
|
||||||
{
|
|
||||||
TPacketGCLoginFailure failurePacket;
|
|
||||||
|
|
||||||
failurePacket.header = HEADER_GC_LOGIN_FAILURE;
|
|
||||||
strncpy(failurePacket.szStatus, "SHUTDOWN", sizeof(failurePacket.szStatus));
|
|
||||||
|
|
||||||
d->Packet(&failurePacket, sizeof(failurePacket));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DESC_MANAGER::instance().FindByLoginName(login))
|
|
||||||
{
|
|
||||||
LoginFailure(d, "ALREADY");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD dwKey = DESC_MANAGER::instance().CreateLoginKey(d);
|
|
||||||
DWORD dwPanamaKey = dwKey ^ pinfo->adwClientKey[0] ^ pinfo->adwClientKey[1] ^ pinfo->adwClientKey[2] ^ pinfo->adwClientKey[3];
|
|
||||||
d->SetPanamaKey(dwPanamaKey);
|
|
||||||
|
|
||||||
sys_log(0, "InputAuth::Login : key %u:0x%x login %s", dwKey, dwPanamaKey, login);
|
|
||||||
|
|
||||||
// BRAZIL_AUTH
|
|
||||||
if (LC_IsBrazil() && !test_server)
|
|
||||||
{
|
|
||||||
int result = auth_brazil(login, passwd);
|
|
||||||
|
|
||||||
switch (result)
|
|
||||||
{
|
|
||||||
case AUTH_BRAZIL_SERVER_ERR:
|
|
||||||
case AUTH_BRAZIL_NOID:
|
|
||||||
LoginFailure(d, "NOID");
|
|
||||||
return;
|
|
||||||
case AUTH_BRAZIL_WRONGPWD:
|
|
||||||
LoginFailure(d, "WRONGPWD");
|
|
||||||
return;
|
|
||||||
case AUTH_BRAZIL_FLASHUSER:
|
|
||||||
LoginFailure(d, "FLASH");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3;
|
|
||||||
thecore_memcpy(p, pinfo, sizeof(TPacketCGLogin3));
|
|
||||||
|
|
||||||
char szPasswd[PASSWD_MAX_LEN * 2 + 1];
|
|
||||||
DBManager::instance().EscapeString(szPasswd, sizeof(szPasswd), passwd, strlen(passwd));
|
|
||||||
|
|
||||||
char szLogin[LOGIN_MAX_LEN * 2 + 1];
|
|
||||||
DBManager::instance().EscapeString(szLogin, sizeof(szLogin), login, strlen(login));
|
|
||||||
|
|
||||||
// CHANNEL_SERVICE_LOGIN
|
|
||||||
if (Login_IsInChannelService(szLogin))
|
|
||||||
{
|
|
||||||
sys_log(0, "ChannelServiceLogin [%s]", szLogin);
|
|
||||||
|
|
||||||
DBManager::instance().ReturnQuery(QID_AUTH_LOGIN_OPENID, dwKey, p,
|
|
||||||
"SELECT '%s',password,securitycode,social_id,id,status,availDt - NOW() > 0,"
|
|
||||||
"UNIX_TIMESTAMP(silver_expire),"
|
|
||||||
"UNIX_TIMESTAMP(gold_expire),"
|
|
||||||
"UNIX_TIMESTAMP(safebox_expire),"
|
|
||||||
"UNIX_TIMESTAMP(autoloot_expire),"
|
|
||||||
"UNIX_TIMESTAMP(fish_mind_expire),"
|
|
||||||
"UNIX_TIMESTAMP(marriage_fast_expire),"
|
|
||||||
"UNIX_TIMESTAMP(money_drop_rate_expire),"
|
|
||||||
"UNIX_TIMESTAMP(create_time)"
|
|
||||||
" FROM account WHERE login='%s'",
|
|
||||||
|
|
||||||
szPasswd, szLogin);
|
|
||||||
}
|
|
||||||
// END_OF_CHANNEL_SERVICE_LOGIN
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBManager::instance().ReturnQuery(QID_AUTH_LOGIN_OPENID, dwKey, p,
|
|
||||||
"SELECT PASSWORD('%s'),password,securitycode,social_id,id,status,availDt - NOW() > 0,"
|
|
||||||
"UNIX_TIMESTAMP(silver_expire),"
|
|
||||||
"UNIX_TIMESTAMP(gold_expire),"
|
|
||||||
"UNIX_TIMESTAMP(safebox_expire),"
|
|
||||||
"UNIX_TIMESTAMP(autoloot_expire),"
|
|
||||||
"UNIX_TIMESTAMP(fish_mind_expire),"
|
|
||||||
"UNIX_TIMESTAMP(marriage_fast_expire),"
|
|
||||||
"UNIX_TIMESTAMP(money_drop_rate_expire),"
|
|
||||||
"UNIX_TIMESTAMP(create_time)"
|
|
||||||
" FROM account WHERE login='%s'",
|
|
||||||
szPasswd, szLogin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void socket_timeout(socket_t s, long sec, long usec);
|
|
||||||
|
|
||||||
//OpenID
|
|
||||||
int CInputAuth::auth_OpenID(const char *authKey, const char *ipAddr, char *rID)
|
|
||||||
{
|
|
||||||
//return value
|
|
||||||
//0 : normal execution
|
|
||||||
//1 : cannot connect to openid auth server
|
|
||||||
//2 : socket_write failed
|
|
||||||
//3 : openid auth server not reply
|
|
||||||
//4 : Reply Error
|
|
||||||
//5 : Incorrect auth key.
|
|
||||||
|
|
||||||
extern char openid_host[256];
|
|
||||||
extern char openid_uri[256];
|
|
||||||
|
|
||||||
int port = 80;
|
|
||||||
|
|
||||||
socket_t fd = socket_connect(openid_host, port);
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
sys_err("[auth_OpenID] : could not connect to OpenID server(%s)", openid_host);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
socket_block(fd);
|
|
||||||
socket_timeout(fd, 3, 0);
|
|
||||||
|
|
||||||
// send request
|
|
||||||
{
|
|
||||||
char request[512];
|
|
||||||
int len = snprintf(request, sizeof(request),
|
|
||||||
//"GET /kyw/gameauth.php?auth_key=%s&ip=%s HTTP/1.1\r\n"
|
|
||||||
"GET %s?auth_key=%s&ip=%s HTTP/1.1\r\n"
|
|
||||||
"Host: %s\r\n"
|
|
||||||
"Connection: Close\r\n\r\n",
|
|
||||||
//openid_uri, authKey,ipAddr);//"aaaaa", "202.31.212.73");
|
|
||||||
//authKey,ipAddr);
|
|
||||||
//"/kyw/gameauth.php", authKey, ipAddr);
|
|
||||||
openid_uri, authKey, ipAddr, openid_host);
|
|
||||||
|
|
||||||
//#ifndef __WIN32__
|
|
||||||
// if (write(fd, request, len) < 0)
|
|
||||||
//#else
|
|
||||||
if (socket_write(fd, request, len) < 0)
|
|
||||||
//#endif
|
|
||||||
{
|
|
||||||
sys_err("[auth_OpenID] : could not send auth-request (%s)", authKey);
|
|
||||||
socket_close(fd);
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read reply
|
|
||||||
char reply[1024] = {0};
|
|
||||||
int len;
|
|
||||||
//#ifndef __WIN32__
|
|
||||||
// len = read(fd, reply, sizeof(reply));
|
|
||||||
//#else
|
|
||||||
len = socket_read(fd, reply, sizeof(reply));
|
|
||||||
//#endif
|
|
||||||
socket_close(fd);
|
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
{
|
|
||||||
sys_err("[auth_OpenID] : could not recv auth-reply (%s)", authKey);
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
//결과값 파싱
|
|
||||||
char buffer[1024];
|
|
||||||
strcpy(buffer, reply);
|
|
||||||
|
|
||||||
const char *delim = "\r\n";
|
|
||||||
char *last = 0;
|
|
||||||
char *v = strtok(buffer, delim);
|
|
||||||
char *result = 0;
|
|
||||||
|
|
||||||
while (v)
|
|
||||||
{
|
|
||||||
result = v;
|
|
||||||
v = strtok(NULL, delim);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *id = strtok(result, "%");
|
|
||||||
char *success = strtok(NULL, "%");
|
|
||||||
|
|
||||||
if (!*id || !*success)
|
|
||||||
{
|
|
||||||
sys_err("[auth_OpenID] : OpenID AuthServer Reply Error (%s)", reply);
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 != strcmp("OK", success)) //에러 처리
|
|
||||||
{
|
|
||||||
int returnNumber = 0;
|
|
||||||
str_to_number(returnNumber, id);
|
|
||||||
switch (returnNumber)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
sys_err("[auth_OpenID] : AuthKey incorrect");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
sys_err("[auth_OpenID] : ip incorrect");
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
sys_err("[auth_OpenID] : used AuthKey");
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
sys_err("[auth_OpenID] : AuthKey not delivered");
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
sys_err("[auth_OpenID] : ip not delivered");
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
sys_err("[auth_OpenID] : AuthKey time over");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(rID, id);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int CInputAuth::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
|
int CInputAuth::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -521,14 +227,6 @@ int CInputAuth::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
|
||||||
Login(d, c_pData);
|
Login(d, c_pData);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//2012.07.19 OpenID : 김용욱
|
|
||||||
case HEADER_CG_LOGIN5_OPENID:
|
|
||||||
if (openid_server)
|
|
||||||
LoginOpenID(d, c_pData);
|
|
||||||
else
|
|
||||||
sys_err("HEADER_CG_LOGIN5_OPENID : wrong client access");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HEADER_CG_PASSPOD_ANSWER:
|
case HEADER_CG_PASSPOD_ANSWER:
|
||||||
PasspodAnswer(d, c_pData);
|
PasspodAnswer(d, c_pData);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -57,7 +57,6 @@ extern int auction_server;
|
||||||
extern void gm_insert(const char * name, BYTE level);
|
extern void gm_insert(const char * name, BYTE level);
|
||||||
extern BYTE gm_get_level(const char * name, const char * host, const char* account );
|
extern BYTE gm_get_level(const char * name, const char * host, const char* account );
|
||||||
extern void gm_host_insert(const char * host);
|
extern void gm_host_insert(const char * host);
|
||||||
extern int openid_server;
|
|
||||||
|
|
||||||
#define MAPNAME_DEFAULT "none"
|
#define MAPNAME_DEFAULT "none"
|
||||||
|
|
||||||
|
@ -1753,42 +1752,6 @@ void CInputDB::AuthLogin(LPDESC d, const char * c_pData)
|
||||||
d->Packet(&ptoc, sizeof(TPacketGCAuthSuccess));
|
d->Packet(&ptoc, sizeof(TPacketGCAuthSuccess));
|
||||||
sys_log(0, "AuthLogin result %u key %u", bResult, d->GetLoginKey());
|
sys_log(0, "AuthLogin result %u key %u", bResult, d->GetLoginKey());
|
||||||
}
|
}
|
||||||
void CInputDB::AuthLoginOpenID(LPDESC d, const char * c_pData)
|
|
||||||
{
|
|
||||||
if (!d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
BYTE bResult = *(BYTE *) c_pData;
|
|
||||||
|
|
||||||
TPacketGCAuthSuccessOpenID ptoc;
|
|
||||||
|
|
||||||
ptoc.bHeader = HEADER_GC_AUTH_SUCCESS_OPENID;
|
|
||||||
|
|
||||||
if (bResult)
|
|
||||||
{
|
|
||||||
// Panama 암호화 팩에 필요한 키 보내기
|
|
||||||
SendPanamaList(d);
|
|
||||||
ptoc.dwLoginKey = d->GetLoginKey();
|
|
||||||
|
|
||||||
//NOTE: AuthSucess보다 먼저 보내야지 안그러면 PHASE Close가 되서 보내지지 않는다.-_-
|
|
||||||
//Send Client Package CryptKey
|
|
||||||
{
|
|
||||||
DESC_MANAGER::instance().SendClientPackageCryptKey(d);
|
|
||||||
DESC_MANAGER::instance().SendClientPackageSDBToLoadMap(d, MAPNAME_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ptoc.dwLoginKey = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(ptoc.login, d->GetLogin().c_str());
|
|
||||||
|
|
||||||
ptoc.bResult = bResult;
|
|
||||||
|
|
||||||
d->Packet(&ptoc, sizeof(TPacketGCAuthSuccessOpenID));
|
|
||||||
sys_log(0, "AuthLogin result %u key %u", bResult, d->GetLoginKey());
|
|
||||||
}
|
|
||||||
|
|
||||||
void CInputDB::ChangeEmpirePriv(const char* c_pData)
|
void CInputDB::ChangeEmpirePriv(const char* c_pData)
|
||||||
{
|
{
|
||||||
|
@ -2327,10 +2290,7 @@ int CInputDB::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HEADER_DG_AUTH_LOGIN:
|
case HEADER_DG_AUTH_LOGIN:
|
||||||
if (openid_server)
|
AuthLogin(DESC_MANAGER::instance().FindByHandle(m_dwHandle), c_pData);
|
||||||
AuthLoginOpenID(DESC_MANAGER::instance().FindByHandle(m_dwHandle), c_pData);
|
|
||||||
else
|
|
||||||
AuthLogin(DESC_MANAGER::instance().FindByHandle(m_dwHandle), c_pData);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HEADER_DG_CHANGE_EMPIRE_PRIV:
|
case HEADER_DG_CHANGE_EMPIRE_PRIV:
|
||||||
|
|
|
@ -196,7 +196,7 @@ void CInputLogin::LoginByKey(LPDESC d, const char * data)
|
||||||
|
|
||||||
strncpy(ptod.szLogin, login, sizeof(ptod.szLogin));
|
strncpy(ptod.szLogin, login, sizeof(ptod.szLogin));
|
||||||
ptod.dwLoginKey = pinfo->dwLoginKey;
|
ptod.dwLoginKey = pinfo->dwLoginKey;
|
||||||
thecore_memcpy(ptod.adwClientKey, pinfo->adwClientKey, sizeof(DWORD) * 4);
|
memcpy(ptod.adwClientKey, pinfo->adwClientKey, sizeof(DWORD) * 4);
|
||||||
strncpy(ptod.szIP, d->GetHostName(), sizeof(ptod.szIP));
|
strncpy(ptod.szIP, d->GetHostName(), sizeof(ptod.szIP));
|
||||||
|
|
||||||
db_clientdesc->DBPacket(HEADER_GD_LOGIN_BY_KEY, d->GetHandle(), &ptod, sizeof(TPacketGDLoginByKey));
|
db_clientdesc->DBPacket(HEADER_GD_LOGIN_BY_KEY, d->GetHandle(), &ptod, sizeof(TPacketGDLoginByKey));
|
||||||
|
|
|
@ -216,7 +216,7 @@ void CItem::UpdatePacket()
|
||||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||||
pack.alSockets[i] = m_alSockets[i];
|
pack.alSockets[i] = m_alSockets[i];
|
||||||
|
|
||||||
thecore_memcpy(pack.aAttr, GetAttributes(), sizeof(pack.aAttr));
|
memcpy(pack.aAttr, GetAttributes(), sizeof(pack.aAttr));
|
||||||
|
|
||||||
sys_log(2, "UpdatePacket %s -> %s", GetName(), m_pOwner->GetName());
|
sys_log(2, "UpdatePacket %s -> %s", GetName(), m_pOwner->GetName());
|
||||||
m_pOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
m_pOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
||||||
|
@ -541,7 +541,7 @@ int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell)
|
||||||
return WEAR_UNIQUE1;
|
return WEAR_UNIQUE1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 수집 퀘스트를 위한 아이템이 박히는곳으로 한번 박히면 절대 뺼수 없다.
|
// 수집 퀘스트를 위한 아이템이 박히는곳으로 한번 박히면 절대 ?E수 없다.
|
||||||
else if (GetWearFlag() & WEARABLE_ABILITY)
|
else if (GetWearFlag() & WEARABLE_ABILITY)
|
||||||
{
|
{
|
||||||
if (!ch->GetWear(WEAR_ABILITY1))
|
if (!ch->GetWear(WEAR_ABILITY1))
|
||||||
|
@ -994,7 +994,7 @@ bool CItem::CreateSocket(BYTE bSlot, BYTE bGold)
|
||||||
|
|
||||||
void CItem::SetSockets(const long * c_al)
|
void CItem::SetSockets(const long * c_al)
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_alSockets, c_al, sizeof(m_alSockets));
|
memcpy(m_alSockets, c_al, sizeof(m_alSockets));
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1992,8 +1992,8 @@ void CItem::CopyToRawData (TPlayerItem* new_item)
|
||||||
new_item->count = m_dwCount;
|
new_item->count = m_dwCount;
|
||||||
|
|
||||||
new_item->vnum = GetVnum();
|
new_item->vnum = GetVnum();
|
||||||
thecore_memcpy (new_item->alSockets, m_alSockets, sizeof (m_alSockets));
|
memcpy (new_item->alSockets, m_alSockets, sizeof (m_alSockets));
|
||||||
thecore_memcpy (new_item->aAttr, m_aAttr, sizeof (m_aAttr));
|
memcpy (new_item->aAttr, m_aAttr, sizeof (m_aAttr));
|
||||||
|
|
||||||
new_item->owner = m_pOwner->GetPlayerID();
|
new_item->owner = m_pOwner->GetPlayerID();
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,7 +285,7 @@ bool CItem::RemoveAttributeType(BYTE bType)
|
||||||
|
|
||||||
void CItem::SetAttributes(const TPlayerItemAttribute* c_pAttribute)
|
void CItem::SetAttributes(const TPlayerItemAttribute* c_pAttribute)
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_aAttr, c_pAttribute, sizeof(m_aAttr));
|
memcpy(m_aAttr, c_pAttribute, sizeof(m_aAttr));
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ bool ITEM_MANAGER::Initialize(TItemTable * table, int size)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
m_vec_prototype.resize(size);
|
m_vec_prototype.resize(size);
|
||||||
thecore_memcpy(&m_vec_prototype[0], table, sizeof(TItemTable) * size);
|
memcpy(&m_vec_prototype[0], table, sizeof(TItemTable) * size);
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
if (0 != m_vec_prototype[i].dwVnumRange)
|
if (0 != m_vec_prototype[i].dwVnumRange)
|
||||||
|
@ -460,8 +460,8 @@ void ITEM_MANAGER::SaveSingleItem(LPITEM item)
|
||||||
t.count = item->GetCount();
|
t.count = item->GetCount();
|
||||||
t.vnum = item->GetOriginalVnum();
|
t.vnum = item->GetOriginalVnum();
|
||||||
t.owner = (t.window == SAFEBOX || t.window == MALL) ? item->GetOwner()->GetDesc()->GetAccountTable().id : item->GetOwner()->GetPlayerID();
|
t.owner = (t.window == SAFEBOX || t.window == MALL) ? item->GetOwner()->GetDesc()->GetAccountTable().id : item->GetOwner()->GetPlayerID();
|
||||||
thecore_memcpy(t.alSockets, item->GetSockets(), sizeof(t.alSockets));
|
memcpy(t.alSockets, item->GetSockets(), sizeof(t.alSockets));
|
||||||
thecore_memcpy(t.aAttr, item->GetAttributes(), sizeof(t.aAttr));
|
memcpy(t.aAttr, item->GetAttributes(), sizeof(t.aAttr));
|
||||||
|
|
||||||
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));
|
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));
|
||||||
db_clientdesc->Packet(&t, sizeof(TPlayerItem));
|
db_clientdesc->Packet(&t, sizeof(TPlayerItem));
|
||||||
|
@ -1257,7 +1257,7 @@ bool DropEvent_CharStone_SetValue(const std::string& name, int value)
|
||||||
// fixme
|
// fixme
|
||||||
// 위의 것과 함께 quest로 뺄것 빼보자.
|
// 위의 것과 함께 quest로 뺄것 빼보자.
|
||||||
// 이거 너무 더럽잖아...
|
// 이거 너무 더럽잖아...
|
||||||
// 뷁.. 하드코딩 싫다 ㅜㅠ
|
// ??.. 하드코딩 싫다 ㅜㅠ
|
||||||
// 계량 아이템 보상 시작.
|
// 계량 아이템 보상 시작.
|
||||||
// by rtsummit 고치자 진짜
|
// by rtsummit 고치자 진짜
|
||||||
static struct DropEvent_RefineBox
|
static struct DropEvent_RefineBox
|
||||||
|
|
|
@ -29,11 +29,6 @@ int (*check_name) (const char * str) = NULL;
|
||||||
int (*is_twobyte) (const char * str) = NULL;
|
int (*is_twobyte) (const char * str) = NULL;
|
||||||
bool LC_InitLocalization( const std::string& szLocal );
|
bool LC_InitLocalization( const std::string& szLocal );
|
||||||
|
|
||||||
int is_twobyte_euckr(const char * str)
|
|
||||||
{
|
|
||||||
return ishan(*str);
|
|
||||||
}
|
|
||||||
|
|
||||||
int is_twobyte_gb2312(const char * str)
|
int is_twobyte_gb2312(const char * str)
|
||||||
{
|
{
|
||||||
if (!str || !*str)
|
if (!str || !*str)
|
||||||
|
@ -227,46 +222,6 @@ int check_name_big5(const char * str )
|
||||||
return check_name_independent(str);
|
return check_name_independent(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_name_euckr(const char * str)
|
|
||||||
{
|
|
||||||
int code;
|
|
||||||
const char* tmp;
|
|
||||||
|
|
||||||
if (!str || !*str)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ( strlen(str) < 2 || strlen(str) > 12 )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (tmp = str; *tmp; ++tmp)
|
|
||||||
{
|
|
||||||
// 한글이 아니고 빈칸이면 잘못된 것
|
|
||||||
if (isnhspace(*tmp))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// 한글이 아니고 숫자라면 적합하다.
|
|
||||||
if (isnhdigit(*tmp))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// 한글이 아니고 영문이라면 적합하다.
|
|
||||||
if (!ishan(*tmp) && isalpha(*tmp))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
code = *tmp;
|
|
||||||
code += 256;
|
|
||||||
|
|
||||||
if (code < 176 || code > 200)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
++tmp;
|
|
||||||
|
|
||||||
if (!*tmp)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return check_name_independent(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_name_latin1(const char * str)
|
int check_name_latin1(const char * str)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
|
@ -281,15 +236,15 @@ int check_name_latin1(const char * str)
|
||||||
for (tmp = str; *tmp; ++tmp)
|
for (tmp = str; *tmp; ++tmp)
|
||||||
{
|
{
|
||||||
// 한글이 아니고 빈칸이면 잘못된 것
|
// 한글이 아니고 빈칸이면 잘못된 것
|
||||||
if (isnhspace(*tmp))
|
if (isspace(*tmp))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// 한글이 아니고 숫자라면 적합하다.
|
// 한글이 아니고 숫자라면 적합하다.
|
||||||
if (isnhdigit(*tmp))
|
if (isdigit(*tmp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// 한글이 아니고 영문이라면 적합하다.
|
// 한글이 아니고 영문이라면 적합하다.
|
||||||
if (!ishan(*tmp) && isalpha(*tmp))
|
if (isalpha(*tmp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
unsigned char uc_tmp = *tmp;
|
unsigned char uc_tmp = *tmp;
|
||||||
|
@ -1197,10 +1152,10 @@ bool LocaleService_Init(const std::string& c_rstServiceName)
|
||||||
void LocaleService_TransferDefaultSetting()
|
void LocaleService_TransferDefaultSetting()
|
||||||
{
|
{
|
||||||
if (!check_name)
|
if (!check_name)
|
||||||
check_name = check_name_euckr;
|
check_name = check_name_independent;
|
||||||
|
|
||||||
if (!is_twobyte)
|
if (!is_twobyte)
|
||||||
is_twobyte = is_twobyte_euckr;
|
is_twobyte = is_twobyte_gb2312;
|
||||||
|
|
||||||
if (!exp_table)
|
if (!exp_table)
|
||||||
exp_table = exp_table_common;
|
exp_table = exp_table_common;
|
||||||
|
|
|
@ -21,7 +21,7 @@ CLoginData::CLoginData()
|
||||||
|
|
||||||
void CLoginData::SetClientKey(const DWORD * c_pdwClientKey)
|
void CLoginData::SetClientKey(const DWORD * c_pdwClientKey)
|
||||||
{
|
{
|
||||||
thecore_memcpy(&m_adwClientKey, c_pdwClientKey, sizeof(DWORD) * 4);
|
memcpy(&m_adwClientKey, c_pdwClientKey, sizeof(DWORD) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const DWORD * CLoginData::GetClientKey()
|
const DWORD * CLoginData::GetClientKey()
|
||||||
|
@ -140,7 +140,7 @@ const char * CLoginData::GetLogin()
|
||||||
|
|
||||||
void CLoginData::SetPremium(int * paiPremiumTimes)
|
void CLoginData::SetPremium(int * paiPremiumTimes)
|
||||||
{
|
{
|
||||||
thecore_memcpy(m_aiPremiumTimes, paiPremiumTimes, sizeof(m_aiPremiumTimes));
|
memcpy(m_aiPremiumTimes, paiPremiumTimes, sizeof(m_aiPremiumTimes));
|
||||||
}
|
}
|
||||||
|
|
||||||
int CLoginData::GetPremium(BYTE type)
|
int CLoginData::GetPremium(BYTE type)
|
||||||
|
|
|
@ -55,7 +55,6 @@
|
||||||
#include "spam.h"
|
#include "spam.h"
|
||||||
#include "panama.h"
|
#include "panama.h"
|
||||||
#include "threeway_war.h"
|
#include "threeway_war.h"
|
||||||
#include "auth_brazil.h"
|
|
||||||
#include "DragonLair.h"
|
#include "DragonLair.h"
|
||||||
#include "skill_power.h"
|
#include "skill_power.h"
|
||||||
#include "SpeedServer.h"
|
#include "SpeedServer.h"
|
||||||
|
@ -66,10 +65,6 @@
|
||||||
#include "auction_manager.h"
|
#include "auction_manager.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_STACKTRACE
|
#ifdef USE_STACKTRACE
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -112,8 +107,6 @@ int start(int argc, char **argv);
|
||||||
int idle();
|
int idle();
|
||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
void test();
|
|
||||||
|
|
||||||
enum EProfile
|
enum EProfile
|
||||||
{
|
{
|
||||||
PROF_EVENT,
|
PROF_EVENT,
|
||||||
|
@ -232,9 +225,6 @@ void heartbeat(LPHEART ht, int pulse)
|
||||||
// 1Ãʸ¶´Ù
|
// 1Ãʸ¶´Ù
|
||||||
if (!(pulse % ht->passes_per_sec))
|
if (!(pulse % ht->passes_per_sec))
|
||||||
{
|
{
|
||||||
if (g_bAuthServer && LC_IsBrazil() && !test_server)
|
|
||||||
auth_brazil_log();
|
|
||||||
|
|
||||||
if (!g_bAuthServer)
|
if (!g_bAuthServer)
|
||||||
{
|
{
|
||||||
TPlayerCountPacket pack;
|
TPlayerCountPacket pack;
|
||||||
|
@ -334,18 +324,6 @@ int main(int argc, char **argv)
|
||||||
DebugAllocator::StaticSetUp();
|
DebugAllocator::StaticSetUp();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
// <Factor> start unit tests if option is set
|
|
||||||
if ( argc > 1 )
|
|
||||||
{
|
|
||||||
if ( strcmp( argv[1], "unittest" ) == 0 )
|
|
||||||
{
|
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ilInit(); // DevIL Initialize
|
ilInit(); // DevIL Initialize
|
||||||
|
|
||||||
WriteVersion();
|
WriteVersion();
|
||||||
|
|
|
@ -65,7 +65,7 @@ bool CMobManager::Initialize(TMobTable * pTable, int iSize)
|
||||||
{
|
{
|
||||||
CMob * pkMob = M2_NEW CMob;
|
CMob * pkMob = M2_NEW CMob;
|
||||||
|
|
||||||
thecore_memcpy(&pkMob->m_table, t, sizeof(TMobTable));
|
memcpy(&pkMob->m_table, t, sizeof(TMobTable));
|
||||||
|
|
||||||
m_map_pkMobByVnum.insert(std::map<DWORD, CMob *>::value_type(t->dwVnum, pkMob));
|
m_map_pkMobByVnum.insert(std::map<DWORD, CMob *>::value_type(t->dwVnum, pkMob));
|
||||||
m_map_pkMobByName.insert(std::map<std::string, CMob *>::value_type(t->szLocaleName, pkMob));
|
m_map_pkMobByName.insert(std::map<std::string, CMob *>::value_type(t->szLocaleName, pkMob));
|
||||||
|
|
|
@ -52,7 +52,7 @@ enum
|
||||||
HEADER_CG_MESSENGER = 67,
|
HEADER_CG_MESSENGER = 67,
|
||||||
|
|
||||||
HEADER_CG_MALL_CHECKOUT = 69,
|
HEADER_CG_MALL_CHECKOUT = 69,
|
||||||
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣넎는다.
|
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣??는다.
|
||||||
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
|
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
|
||||||
|
|
||||||
HEADER_CG_PARTY_INVITE = 72,
|
HEADER_CG_PARTY_INVITE = 72,
|
||||||
|
@ -91,8 +91,6 @@ enum
|
||||||
HEADER_CG_SCRIPT_SELECT_ITEM = 114,
|
HEADER_CG_SCRIPT_SELECT_ITEM = 114,
|
||||||
// END_OF_SCRIPT_SELECT_ITEM
|
// END_OF_SCRIPT_SELECT_ITEM
|
||||||
|
|
||||||
HEADER_CG_LOGIN5_OPENID = 116, //OpenID : 클라이언트로부터 OpenID 인증키를 받는다.
|
|
||||||
|
|
||||||
// HEADER_CG_ROULETTE = 200,
|
// HEADER_CG_ROULETTE = 200,
|
||||||
// HEADER_CG_RUNUP_MATRIX_ANSWER = 201,
|
// HEADER_CG_RUNUP_MATRIX_ANSWER = 201,
|
||||||
|
|
||||||
|
@ -276,8 +274,6 @@ enum
|
||||||
HEADER_GC_HYBRIDCRYPT_SDB = 153, // SDB means Supplmentary Data Blocks
|
HEADER_GC_HYBRIDCRYPT_SDB = 153, // SDB means Supplmentary Data Blocks
|
||||||
//HYBRID CRYPT
|
//HYBRID CRYPT
|
||||||
|
|
||||||
HEADER_GC_AUTH_SUCCESS_OPENID = 154,
|
|
||||||
|
|
||||||
// ROULETTE
|
// ROULETTE
|
||||||
HEADER_GC_ROULETTE = 200,
|
HEADER_GC_ROULETTE = 200,
|
||||||
// END_ROULETTE
|
// END_ROULETTE
|
||||||
|
@ -548,13 +544,6 @@ typedef struct command_login3
|
||||||
DWORD adwClientKey[4];
|
DWORD adwClientKey[4];
|
||||||
} TPacketCGLogin3;
|
} TPacketCGLogin3;
|
||||||
|
|
||||||
typedef struct command_login5
|
|
||||||
{
|
|
||||||
BYTE header;
|
|
||||||
char authKey[OPENID_AUTHKEY_LEN + 1];
|
|
||||||
DWORD adwClientKey[4];
|
|
||||||
} TPacketCGLogin5;
|
|
||||||
|
|
||||||
typedef struct command_matrix_card
|
typedef struct command_matrix_card
|
||||||
{
|
{
|
||||||
BYTE bHeader;
|
BYTE bHeader;
|
||||||
|
@ -901,14 +890,6 @@ typedef struct packet_auth_success
|
||||||
BYTE bResult;
|
BYTE bResult;
|
||||||
} TPacketGCAuthSuccess;
|
} TPacketGCAuthSuccess;
|
||||||
|
|
||||||
typedef struct packet_auth_success_openid
|
|
||||||
{
|
|
||||||
BYTE bHeader;
|
|
||||||
DWORD dwLoginKey;
|
|
||||||
BYTE bResult;
|
|
||||||
char login[LOGIN_MAX_LEN + 1];
|
|
||||||
} TPacketGCAuthSuccessOpenID;
|
|
||||||
|
|
||||||
typedef struct packet_login_failure
|
typedef struct packet_login_failure
|
||||||
{
|
{
|
||||||
BYTE header;
|
BYTE header;
|
||||||
|
|
|
@ -146,7 +146,6 @@ CPacketInfoCG::CPacketInfoCG()
|
||||||
Set(HEADER_CG_LOGIN, sizeof(TPacketCGLogin), "Login", true);
|
Set(HEADER_CG_LOGIN, sizeof(TPacketCGLogin), "Login", true);
|
||||||
Set(HEADER_CG_LOGIN2, sizeof(TPacketCGLogin2), "Login2", true);
|
Set(HEADER_CG_LOGIN2, sizeof(TPacketCGLogin2), "Login2", true);
|
||||||
Set(HEADER_CG_LOGIN3, sizeof(TPacketCGLogin3), "Login3", true);
|
Set(HEADER_CG_LOGIN3, sizeof(TPacketCGLogin3), "Login3", true);
|
||||||
Set(HEADER_CG_LOGIN5_OPENID, sizeof(TPacketCGLogin5), "Login5", true); //OpenID
|
|
||||||
Set(HEADER_CG_ATTACK, sizeof(TPacketCGAttack), "Attack", true);
|
Set(HEADER_CG_ATTACK, sizeof(TPacketCGAttack), "Attack", true);
|
||||||
Set(HEADER_CG_CHAT, sizeof(TPacketCGChat), "Chat", true);
|
Set(HEADER_CG_CHAT, sizeof(TPacketCGChat), "Chat", true);
|
||||||
Set(HEADER_CG_WHISPER, sizeof(TPacketCGWhisper), "Whisper", true);
|
Set(HEADER_CG_WHISPER, sizeof(TPacketCGWhisper), "Whisper", true);
|
||||||
|
|
|
@ -869,15 +869,6 @@ namespace quest
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _under_han(lua_State* L)
|
|
||||||
{
|
|
||||||
if (!lua_isstring(L, 1))
|
|
||||||
lua_pushboolean(L, 0);
|
|
||||||
else
|
|
||||||
lua_pushboolean(L, under_han(lua_tostring(L, 1)));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _notice_all( lua_State* L )
|
int _notice_all( lua_State* L )
|
||||||
{
|
{
|
||||||
ostringstream s;
|
ostringstream s;
|
||||||
|
@ -1395,7 +1386,6 @@ namespace quest
|
||||||
{ "find_npc_by_vnum", _find_npc_by_vnum },
|
{ "find_npc_by_vnum", _find_npc_by_vnum },
|
||||||
{ "set_quest_state", _set_quest_state },
|
{ "set_quest_state", _set_quest_state },
|
||||||
{ "get_quest_state", _get_quest_state },
|
{ "get_quest_state", _get_quest_state },
|
||||||
{ "under_han", _under_han },
|
|
||||||
{ "notice", _notice },
|
{ "notice", _notice },
|
||||||
{ "notice_all", _notice_all },
|
{ "notice_all", _notice_all },
|
||||||
{ "notice_in_map", _notice_in_map },
|
{ "notice_in_map", _notice_in_map },
|
||||||
|
|
|
@ -76,8 +76,8 @@ bool CSafebox::Add(DWORD dwPos, LPITEM pkItem)
|
||||||
pack.count = pkItem->GetCount();
|
pack.count = pkItem->GetCount();
|
||||||
pack.flags = pkItem->GetFlag();
|
pack.flags = pkItem->GetFlag();
|
||||||
pack.anti_flags = pkItem->GetAntiFlag();
|
pack.anti_flags = pkItem->GetAntiFlag();
|
||||||
thecore_memcpy(pack.alSockets, pkItem->GetSockets(), sizeof(pack.alSockets));
|
memcpy(pack.alSockets, pkItem->GetSockets(), sizeof(pack.alSockets));
|
||||||
thecore_memcpy(pack.aAttr, pkItem->GetAttributes(), sizeof(pack.aAttr));
|
memcpy(pack.aAttr, pkItem->GetAttributes(), sizeof(pack.aAttr));
|
||||||
|
|
||||||
m_pkChrOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
m_pkChrOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
||||||
sys_log(1, "SAFEBOX: ADD %s %s count %d", m_pkChrOwner->GetName(), pkItem->GetName(), pkItem->GetCount());
|
sys_log(1, "SAFEBOX: ADD %s %s count %d", m_pkChrOwner->GetName(), pkItem->GetName(), pkItem->GetCount());
|
||||||
|
|
|
@ -333,7 +333,7 @@ int CShop::Buy(LPCHARACTER ch, BYTE pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 상점에서 살떄 세금 5%
|
// 상점에서 살?? 세금 5%
|
||||||
if (!m_pkPC)
|
if (!m_pkPC)
|
||||||
{
|
{
|
||||||
CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
|
CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
|
||||||
|
@ -463,8 +463,8 @@ bool CShop::AddGuest(LPCHARACTER ch, DWORD owner_vid, bool bOtherEmpire)
|
||||||
|
|
||||||
if (item.pkItem)
|
if (item.pkItem)
|
||||||
{
|
{
|
||||||
thecore_memcpy(pack2.items[i].alSockets, item.pkItem->GetSockets(), sizeof(pack2.items[i].alSockets));
|
memcpy(pack2.items[i].alSockets, item.pkItem->GetSockets(), sizeof(pack2.items[i].alSockets));
|
||||||
thecore_memcpy(pack2.items[i].aAttr, item.pkItem->GetAttributes(), sizeof(pack2.items[i].aAttr));
|
memcpy(pack2.items[i].aAttr, item.pkItem->GetAttributes(), sizeof(pack2.items[i].aAttr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,8 +531,8 @@ void CShop::BroadcastUpdateItem(BYTE pos)
|
||||||
pack2.item.vnum = m_itemVector[pos].vnum;
|
pack2.item.vnum = m_itemVector[pos].vnum;
|
||||||
if (m_itemVector[pos].pkItem)
|
if (m_itemVector[pos].pkItem)
|
||||||
{
|
{
|
||||||
thecore_memcpy(pack2.item.alSockets, m_itemVector[pos].pkItem->GetSockets(), sizeof(pack2.item.alSockets));
|
memcpy(pack2.item.alSockets, m_itemVector[pos].pkItem->GetSockets(), sizeof(pack2.item.alSockets));
|
||||||
thecore_memcpy(pack2.item.aAttr, m_itemVector[pos].pkItem->GetAttributes(), sizeof(pack2.item.aAttr));
|
memcpy(pack2.item.aAttr, m_itemVector[pos].pkItem->GetAttributes(), sizeof(pack2.item.aAttr));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,7 +65,7 @@ size_t str_lower(const char * src, char * dest, size_t dest_size)
|
||||||
|
|
||||||
void skip_spaces(const char **string)
|
void skip_spaces(const char **string)
|
||||||
{
|
{
|
||||||
for (; **string != '\0' && isnhspace(**string); ++(*string));
|
for (; **string != '\0' && isspace(**string); ++(*string));
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *one_argument(const char *argument, char *first_arg, size_t first_size)
|
const char *one_argument(const char *argument, char *first_arg, size_t first_size)
|
||||||
|
@ -94,7 +94,7 @@ const char *one_argument(const char *argument, char *first_arg, size_t first_siz
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mark && isnhspace(*argument))
|
if (!mark && isspace(*argument))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
*(first_arg++) = *argument;
|
*(first_arg++) = *argument;
|
||||||
|
@ -121,7 +121,7 @@ const char *first_cmd(const char *argument, char *first_arg, size_t first_arg_si
|
||||||
// \0 자리 확보
|
// \0 자리 확보
|
||||||
first_arg_size -= 1;
|
first_arg_size -= 1;
|
||||||
|
|
||||||
while (*argument && !isnhspace(*argument) && cur_len < first_arg_size)
|
while (*argument && !isspace(*argument) && cur_len < first_arg_size)
|
||||||
{
|
{
|
||||||
*(first_arg++) = LOWER(*argument);
|
*(first_arg++) = LOWER(*argument);
|
||||||
++argument;
|
++argument;
|
||||||
|
|
|
@ -124,7 +124,7 @@ CAttribute::CAttribute(DWORD * attr, DWORD width, DWORD height) // attr
|
||||||
Alloc();
|
Alloc();
|
||||||
|
|
||||||
if (dataType == D_DWORD) // D_DWORD일 때는 원본 속성과 같으므로 단지 복사.
|
if (dataType == D_DWORD) // D_DWORD일 때는 원본 속성과 같으므로 단지 복사.
|
||||||
thecore_memcpy(data, attr, sizeof(DWORD) * width * height);
|
memcpy(data, attr, sizeof(DWORD) * width * height);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 아니면 컨버트 해야 한다.
|
// 아니면 컨버트 해야 한다.
|
||||||
|
@ -245,7 +245,7 @@ void CAttribute::CopyRow(DWORD y, DWORD * row)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dwordPtr)
|
if (dwordPtr)
|
||||||
thecore_memcpy(row, dwordPtr[y], sizeof(DWORD) * width);
|
memcpy(row, dwordPtr[y], sizeof(DWORD) * width);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (bytePtr)
|
if (bytePtr)
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "../../libthecore/include/memcpy.h"
|
|
||||||
#include <common/stl.h>
|
#include <common/stl.h>
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
|
|
||||||
|
@ -14,7 +13,7 @@ CGrid::CGrid(CGrid * pkGrid, int w, int h) : m_iWidth(w), m_iHeight(h)
|
||||||
{
|
{
|
||||||
m_pGrid = new char[m_iWidth * m_iHeight];
|
m_pGrid = new char[m_iWidth * m_iHeight];
|
||||||
int iSize = std::MIN(w * h, pkGrid->m_iWidth * pkGrid->m_iHeight);
|
int iSize = std::MIN(w * h, pkGrid->m_iWidth * pkGrid->m_iHeight);
|
||||||
thecore_memcpy(m_pGrid, pkGrid->m_pGrid, sizeof(char) * iSize);
|
memcpy(m_pGrid, pkGrid->m_pGrid, sizeof(char) * iSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGrid::~CGrid()
|
CGrid::~CGrid()
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TEA is a 64-bit symmetric block cipher with a 128-bit key, developed
|
|
||||||
by David J. Wheeler and Roger M. Needham, and described in their
|
|
||||||
paper at <URL:http://www.cl.cam.ac.uk/ftp/users/djw3/tea.ps>.
|
|
||||||
|
|
||||||
This implementation is based on their code in
|
|
||||||
<URL:http://www.cl.cam.ac.uk/ftp/users/djw3/xtea.ps> */
|
|
||||||
|
|
||||||
extern int TEA_Encrypt(DWORD *dest, const DWORD *src, const DWORD *key, int size);
|
|
||||||
extern int TEA_Decrypt(DWORD *dest, const DWORD *src, const DWORD *key, int size);
|
|
||||||
|
|
||||||
extern int GOST_Encrypt(DWORD * DstBuffer, const DWORD * SrcBuffer, const DWORD * KeyAddress, DWORD Length, DWORD *IVector);
|
|
||||||
extern int GOST_Decrypt(DWORD * DstBuffer, const DWORD * SrcBuffer, const DWORD * KeyAddress, DWORD Length, DWORD *IVector);
|
|
||||||
|
|
||||||
extern int DES_Encrypt(DWORD *DstBuffer, const DWORD * SrcBuffer, const DWORD *KeyAddress, DWORD Length, DWORD *IVector);
|
|
||||||
extern int DES_Decrypt(DWORD *DstBuffer, const DWORD * SrcBuffer, const DWORD *KeyAddress, DWORD Length, DWORD *IVector);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef __INC_LIBTHECORE_HANGUL_H__
|
|
||||||
#define __INC_LIBTHECORE_HANGUL_H__
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
|
||||||
#define isdigit iswdigit
|
|
||||||
#define isspace iswspace
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ishan(ch) (((ch) & 0xE0) > 0x90)
|
|
||||||
#define ishanasc(ch) (isascii(ch) || ishan(ch))
|
|
||||||
#define ishanalp(ch) (isalpha(ch) || ishan(ch))
|
|
||||||
#define isnhdigit(ch) (!ishan(ch) && isdigit(ch))
|
|
||||||
#define isnhspace(ch) (!ishan(ch) && isspace(ch))
|
|
||||||
|
|
||||||
extern const char * first_han(const BYTE * str); // 첫번째 두 글자의 모음(ㄱㄴㄷ)을 뽑아 가/나/다/..를 리턴한다.
|
|
||||||
extern int check_han(const char * str); // 한글이면 true 스트링 전부 체크
|
|
||||||
extern int is_hangul(const BYTE * str); // 한글이면 true (2바이트만 체크)
|
|
||||||
extern int under_han(const void * orig); // 받침이 있으면 true
|
|
||||||
|
|
||||||
#define UNDER(str) under_han(str)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,10 +0,0 @@
|
||||||
/*
|
|
||||||
* Filename: kstbl.h
|
|
||||||
* Description: KS 완성형 2350자의 조합형 코드
|
|
||||||
*
|
|
||||||
* Author: 비엽 (server), myevan (Client)
|
|
||||||
*/
|
|
||||||
#ifndef __KSTBL_H__
|
|
||||||
#define __KSTBL_H__
|
|
||||||
extern unsigned KStbl[2350];
|
|
||||||
#endif
|
|
|
@ -1,23 +0,0 @@
|
||||||
#ifndef __INC_LIBTHECORE_MEMCPY_H__
|
|
||||||
#define __INC_LIBTHECORE_MEMCPY_H__
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
#ifdef __LIBTHECORE__
|
|
||||||
void thecore_find_best_memcpy();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
extern void *(*thecore_memcpy) (void * to, const void * from, size_t len);
|
|
||||||
#else
|
|
||||||
#include <cstring>
|
|
||||||
#define thecore_memcpy memcpy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -132,14 +132,10 @@ inline double rint(double x)
|
||||||
#include "heart.h"
|
#include "heart.h"
|
||||||
#include "fdwatch.h"
|
#include "fdwatch.h"
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
#include "kstbl.h"
|
|
||||||
#include "hangul.h"
|
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "signal.h"
|
#include "signal.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "crypt.h"
|
|
||||||
#include "memcpy.h"
|
|
||||||
|
|
||||||
#endif // __INC_LIBTHECORE_STDAFX_H__
|
#endif // __INC_LIBTHECORE_STDAFX_H__
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
#ifndef __FreeBSD__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* luau (Lib Update/Auto-Update): Simple Update Library
|
|
||||||
* Copyright (C) 2003 David Eklund
|
|
||||||
*
|
|
||||||
* - This library is free software; you can redistribute it and/or -
|
|
||||||
* - modify it under the terms of the GNU Lesser General Public -
|
|
||||||
* - License as published by the Free Software Foundation; either -
|
|
||||||
* - version 2.1 of the License, or (at your option) any later version. -
|
|
||||||
* - -
|
|
||||||
* - This library is distributed in the hope that it will be useful, -
|
|
||||||
* - but WITHOUT ANY WARRANTY; without even the implied warranty of -
|
|
||||||
* - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -
|
|
||||||
* - Lesser General Public License for more details. -
|
|
||||||
* - -
|
|
||||||
* - You should have received a copy of the GNU Lesser General Public -
|
|
||||||
* - License along with this library; if not, write to the Free Software -
|
|
||||||
* - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* md5.h and md5.c are based off of md5hl.c, md5c.c, and md5.h from libmd, which in turn are
|
|
||||||
* based off the FreeBSD libmd library. Their respective copyright notices follow:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This code implements the MD5 message-digest algorithm.
|
|
||||||
* The algorithm is due to Ron Rivest. This code was
|
|
||||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
|
||||||
* This code is in the public domain; do with it what you wish.
|
|
||||||
*
|
|
||||||
* Equivalent code is available from RSA Data Security, Inc.
|
|
||||||
* This code has been tested against that, and is equivalent,
|
|
||||||
* except that you don't need to include two pages of legalese
|
|
||||||
* with every copy.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
||||||
* <phk@login.dkuug.dk> wrote this file. As long as you retain this notice you
|
|
||||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
||||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* $Id: md5.h,v 1.1.1.1 2004/04/02 05:11:38 deklund2 Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MD5_H
|
|
||||||
#define MD5_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#define MD5_HASHBYTES 16
|
|
||||||
|
|
||||||
typedef struct MD5Context {
|
|
||||||
uint32_t buf[4];
|
|
||||||
uint32_t bits[2];
|
|
||||||
unsigned char in[64];
|
|
||||||
} MD5_CTX;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void MD5Init(MD5_CTX *context);
|
|
||||||
void MD5Update(MD5_CTX *context, unsigned char const *buf, unsigned len);
|
|
||||||
void MD5Final(unsigned char digest[MD5_HASHBYTES], MD5_CTX *context);
|
|
||||||
void MD5Transform(uint32_t buf[4], uint32_t const in[16]);
|
|
||||||
char* MD5End(MD5_CTX *, char *);
|
|
||||||
|
|
||||||
char* lutil_md5_file(const char *filename, char *buf);
|
|
||||||
char* lutil_md5_data(const unsigned char *data, unsigned int len, char *buf);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* MD5_H */
|
|
||||||
|
|
||||||
#endif // #ifndef __FreeBSD__
|
|
|
@ -1,326 +0,0 @@
|
||||||
static DWORD SP_boxes[8][64]=
|
|
||||||
{
|
|
||||||
/* 0 */
|
|
||||||
{
|
|
||||||
0x00820200, 0x00020000, 0x80800000, 0x80820200,
|
|
||||||
0x00800000, 0x80020200, 0x80020000, 0x80800000,
|
|
||||||
0x80020200, 0x00820200, 0x00820000, 0x80000200,
|
|
||||||
0x80800200, 0x00800000, 0x00000000, 0x80020000,
|
|
||||||
0x00020000, 0x80000000, 0x00800200, 0x00020200,
|
|
||||||
0x80820200, 0x00820000, 0x80000200, 0x00800200,
|
|
||||||
0x80000000, 0x00000200, 0x00020200, 0x80820000,
|
|
||||||
0x00000200, 0x80800200, 0x80820000, 0x00000000,
|
|
||||||
0x00000000, 0x80820200, 0x00800200, 0x80020000,
|
|
||||||
0x00820200, 0x00020000, 0x80000200, 0x00800200,
|
|
||||||
0x80820000, 0x00000200, 0x00020200, 0x80800000,
|
|
||||||
0x80020200, 0x80000000, 0x80800000, 0x00820000,
|
|
||||||
0x80820200, 0x00020200, 0x00820000, 0x80800200,
|
|
||||||
0x00800000, 0x80000200, 0x80020000, 0x00000000,
|
|
||||||
0x00020000, 0x00800000, 0x80800200, 0x00820200,
|
|
||||||
0x80000000, 0x80820000, 0x00000200, 0x80020200
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 1 */
|
|
||||||
{
|
|
||||||
0x10042004, 0x00000000, 0x00042000, 0x10040000,
|
|
||||||
0x10000004, 0x00002004, 0x10002000, 0x00042000,
|
|
||||||
0x00002000, 0x10040004, 0x00000004, 0x10002000,
|
|
||||||
0x00040004, 0x10042000, 0x10040000, 0x00000004,
|
|
||||||
0x00040000, 0x10002004, 0x10040004, 0x00002000,
|
|
||||||
0x00042004, 0x10000000, 0x00000000, 0x00040004,
|
|
||||||
0x10002004, 0x00042004, 0x10042000, 0x10000004,
|
|
||||||
0x10000000, 0x00040000, 0x00002004, 0x10042004,
|
|
||||||
0x00040004, 0x10042000, 0x10002000, 0x00042004,
|
|
||||||
0x10042004, 0x00040004, 0x10000004, 0x00000000,
|
|
||||||
0x10000000, 0x00002004, 0x00040000, 0x10040004,
|
|
||||||
0x00002000, 0x10000000, 0x00042004, 0x10002004,
|
|
||||||
0x10042000, 0x00002000, 0x00000000, 0x10000004,
|
|
||||||
0x00000004, 0x10042004, 0x00042000, 0x10040000,
|
|
||||||
0x10040004, 0x00040000, 0x00002004, 0x10002000,
|
|
||||||
0x10002004, 0x00000004, 0x10040000, 0x00042000
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 2 */
|
|
||||||
{
|
|
||||||
0x41000000, 0x01010040, 0x00000040, 0x41000040,
|
|
||||||
0x40010000, 0x01000000, 0x41000040, 0x00010040,
|
|
||||||
0x01000040, 0x00010000, 0x01010000, 0x40000000,
|
|
||||||
0x41010040, 0x40000040, 0x40000000, 0x41010000,
|
|
||||||
0x00000000, 0x40010000, 0x01010040, 0x00000040,
|
|
||||||
0x40000040, 0x41010040, 0x00010000, 0x41000000,
|
|
||||||
0x41010000, 0x01000040, 0x40010040, 0x01010000,
|
|
||||||
0x00010040, 0x00000000, 0x01000000, 0x40010040,
|
|
||||||
0x01010040, 0x00000040, 0x40000000, 0x00010000,
|
|
||||||
0x40000040, 0x40010000, 0x01010000, 0x41000040,
|
|
||||||
0x00000000, 0x01010040, 0x00010040, 0x41010000,
|
|
||||||
0x40010000, 0x01000000, 0x41010040, 0x40000000,
|
|
||||||
0x40010040, 0x41000000, 0x01000000, 0x41010040,
|
|
||||||
0x00010000, 0x01000040, 0x41000040, 0x00010040,
|
|
||||||
0x01000040, 0x00000000, 0x41010000, 0x40000040,
|
|
||||||
0x41000000, 0x40010040, 0x00000040, 0x01010000
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 3 */
|
|
||||||
{
|
|
||||||
0x00100402, 0x04000400, 0x00000002, 0x04100402,
|
|
||||||
0x00000000, 0x04100000, 0x04000402, 0x00100002,
|
|
||||||
0x04100400, 0x04000002, 0x04000000, 0x00000402,
|
|
||||||
0x04000002, 0x00100402, 0x00100000, 0x04000000,
|
|
||||||
0x04100002, 0x00100400, 0x00000400, 0x00000002,
|
|
||||||
0x00100400, 0x04000402, 0x04100000, 0x00000400,
|
|
||||||
0x00000402, 0x00000000, 0x00100002, 0x04100400,
|
|
||||||
0x04000400, 0x04100002, 0x04100402, 0x00100000,
|
|
||||||
0x04100002, 0x00000402, 0x00100000, 0x04000002,
|
|
||||||
0x00100400, 0x04000400, 0x00000002, 0x04100000,
|
|
||||||
0x04000402, 0x00000000, 0x00000400, 0x00100002,
|
|
||||||
0x00000000, 0x04100002, 0x04100400, 0x00000400,
|
|
||||||
0x04000000, 0x04100402, 0x00100402, 0x00100000,
|
|
||||||
0x04100402, 0x00000002, 0x04000400, 0x00100402,
|
|
||||||
0x00100002, 0x00100400, 0x04100000, 0x04000402,
|
|
||||||
0x00000402, 0x04000000, 0x04000002, 0x04100400
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 4 */
|
|
||||||
{
|
|
||||||
0x02000000, 0x00004000, 0x00000100, 0x02004108,
|
|
||||||
0x02004008, 0x02000100, 0x00004108, 0x02004000,
|
|
||||||
0x00004000, 0x00000008, 0x02000008, 0x00004100,
|
|
||||||
0x02000108, 0x02004008, 0x02004100, 0x00000000,
|
|
||||||
0x00004100, 0x02000000, 0x00004008, 0x00000108,
|
|
||||||
0x02000100, 0x00004108, 0x00000000, 0x02000008,
|
|
||||||
0x00000008, 0x02000108, 0x02004108, 0x00004008,
|
|
||||||
0x02004000, 0x00000100, 0x00000108, 0x02004100,
|
|
||||||
0x02004100, 0x02000108, 0x00004008, 0x02004000,
|
|
||||||
0x00004000, 0x00000008, 0x02000008, 0x02000100,
|
|
||||||
0x02000000, 0x00004100, 0x02004108, 0x00000000,
|
|
||||||
0x00004108, 0x02000000, 0x00000100, 0x00004008,
|
|
||||||
0x02000108, 0x00000100, 0x00000000, 0x02004108,
|
|
||||||
0x02004008, 0x02004100, 0x00000108, 0x00004000,
|
|
||||||
0x00004100, 0x02004008, 0x02000100, 0x00000108,
|
|
||||||
0x00000008, 0x00004108, 0x02004000, 0x02000008
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 5 */
|
|
||||||
{
|
|
||||||
0x20000010, 0x00080010, 0x00000000, 0x20080800,
|
|
||||||
0x00080010, 0x00000800, 0x20000810, 0x00080000,
|
|
||||||
0x00000810, 0x20080810, 0x00080800, 0x20000000,
|
|
||||||
0x20000800, 0x20000010, 0x20080000, 0x00080810,
|
|
||||||
0x00080000, 0x20000810, 0x20080010, 0x00000000,
|
|
||||||
0x00000800, 0x00000010, 0x20080800, 0x20080010,
|
|
||||||
0x20080810, 0x20080000, 0x20000000, 0x00000810,
|
|
||||||
0x00000010, 0x00080800, 0x00080810, 0x20000800,
|
|
||||||
0x00000810, 0x20000000, 0x20000800, 0x00080810,
|
|
||||||
0x20080800, 0x00080010, 0x00000000, 0x20000800,
|
|
||||||
0x20000000, 0x00000800, 0x20080010, 0x00080000,
|
|
||||||
0x00080010, 0x20080810, 0x00080800, 0x00000010,
|
|
||||||
0x20080810, 0x00080800, 0x00080000, 0x20000810,
|
|
||||||
0x20000010, 0x20080000, 0x00080810, 0x00000000,
|
|
||||||
0x00000800, 0x20000010, 0x20000810, 0x20080800,
|
|
||||||
0x20080000, 0x00000810, 0x00000010, 0x20080010
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 6 */
|
|
||||||
{
|
|
||||||
0x00001000, 0x00000080, 0x00400080, 0x00400001,
|
|
||||||
0x00401081, 0x00001001, 0x00001080, 0x00000000,
|
|
||||||
0x00400000, 0x00400081, 0x00000081, 0x00401000,
|
|
||||||
0x00000001, 0x00401080, 0x00401000, 0x00000081,
|
|
||||||
0x00400081, 0x00001000, 0x00001001, 0x00401081,
|
|
||||||
0x00000000, 0x00400080, 0x00400001, 0x00001080,
|
|
||||||
0x00401001, 0x00001081, 0x00401080, 0x00000001,
|
|
||||||
0x00001081, 0x00401001, 0x00000080, 0x00400000,
|
|
||||||
0x00001081, 0x00401000, 0x00401001, 0x00000081,
|
|
||||||
0x00001000, 0x00000080, 0x00400000, 0x00401001,
|
|
||||||
0x00400081, 0x00001081, 0x00001080, 0x00000000,
|
|
||||||
0x00000080, 0x00400001, 0x00000001, 0x00400080,
|
|
||||||
0x00000000, 0x00400081, 0x00400080, 0x00001080,
|
|
||||||
0x00000081, 0x00001000, 0x00401081, 0x00400000,
|
|
||||||
0x00401080, 0x00000001, 0x00001001, 0x00401081,
|
|
||||||
0x00400001, 0x00401080, 0x00401000, 0x00001001
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 7 */
|
|
||||||
{
|
|
||||||
0x08200020, 0x08208000, 0x00008020, 0x00000000,
|
|
||||||
0x08008000, 0x00200020, 0x08200000, 0x08208020,
|
|
||||||
0x00000020, 0x08000000, 0x00208000, 0x00008020,
|
|
||||||
0x00208020, 0x08008020, 0x08000020, 0x08200000,
|
|
||||||
0x00008000, 0x00208020, 0x00200020, 0x08008000,
|
|
||||||
0x08208020, 0x08000020, 0x00000000, 0x00208000,
|
|
||||||
0x08000000, 0x00200000, 0x08008020, 0x08200020,
|
|
||||||
0x00200000, 0x00008000, 0x08208000, 0x00000020,
|
|
||||||
0x00200000, 0x00008000, 0x08000020, 0x08208020,
|
|
||||||
0x00008020, 0x08000000, 0x00000000, 0x00208000,
|
|
||||||
0x08200020, 0x08008020, 0x08008000, 0x00200020,
|
|
||||||
0x08208000, 0x00000020, 0x00200020, 0x08008000,
|
|
||||||
0x08208020, 0x00200000, 0x08200000, 0x08000020,
|
|
||||||
0x00208000, 0x00008020, 0x08008020, 0x08200000,
|
|
||||||
0x00000020, 0x08208000, 0x00208020, 0x00000000,
|
|
||||||
0x08000000, 0x08200020, 0x00008000, 0x00208020
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static DWORD KeyPerm[8][64] =
|
|
||||||
{
|
|
||||||
/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
|
|
||||||
{
|
|
||||||
0x00000000,0x00000010,0x20000000,0x20000010,
|
|
||||||
0x00010000,0x00010010,0x20010000,0x20010010,
|
|
||||||
0x00000800,0x00000810,0x20000800,0x20000810,
|
|
||||||
0x00010800,0x00010810,0x20010800,0x20010810,
|
|
||||||
0x00000020,0x00000030,0x20000020,0x20000030,
|
|
||||||
0x00010020,0x00010030,0x20010020,0x20010030,
|
|
||||||
0x00000820,0x00000830,0x20000820,0x20000830,
|
|
||||||
0x00010820,0x00010830,0x20010820,0x20010830,
|
|
||||||
0x00080000,0x00080010,0x20080000,0x20080010,
|
|
||||||
0x00090000,0x00090010,0x20090000,0x20090010,
|
|
||||||
0x00080800,0x00080810,0x20080800,0x20080810,
|
|
||||||
0x00090800,0x00090810,0x20090800,0x20090810,
|
|
||||||
0x00080020,0x00080030,0x20080020,0x20080030,
|
|
||||||
0x00090020,0x00090030,0x20090020,0x20090030,
|
|
||||||
0x00080820,0x00080830,0x20080820,0x20080830,
|
|
||||||
0x00090820,0x00090830,0x20090820,0x20090830
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
|
|
||||||
{
|
|
||||||
0x00000000,0x02000000,0x00002000,0x02002000,
|
|
||||||
0x00200000,0x02200000,0x00202000,0x02202000,
|
|
||||||
0x00000004,0x02000004,0x00002004,0x02002004,
|
|
||||||
0x00200004,0x02200004,0x00202004,0x02202004,
|
|
||||||
0x00000400,0x02000400,0x00002400,0x02002400,
|
|
||||||
0x00200400,0x02200400,0x00202400,0x02202400,
|
|
||||||
0x00000404,0x02000404,0x00002404,0x02002404,
|
|
||||||
0x00200404,0x02200404,0x00202404,0x02202404,
|
|
||||||
0x10000000,0x12000000,0x10002000,0x12002000,
|
|
||||||
0x10200000,0x12200000,0x10202000,0x12202000,
|
|
||||||
0x10000004,0x12000004,0x10002004,0x12002004,
|
|
||||||
0x10200004,0x12200004,0x10202004,0x12202004,
|
|
||||||
0x10000400,0x12000400,0x10002400,0x12002400,
|
|
||||||
0x10200400,0x12200400,0x10202400,0x12202400,
|
|
||||||
0x10000404,0x12000404,0x10002404,0x12002404,
|
|
||||||
0x10200404,0x12200404,0x10202404,0x12202404
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
|
|
||||||
{
|
|
||||||
0x00000000,0x00000001,0x00040000,0x00040001,
|
|
||||||
0x01000000,0x01000001,0x01040000,0x01040001,
|
|
||||||
0x00000002,0x00000003,0x00040002,0x00040003,
|
|
||||||
0x01000002,0x01000003,0x01040002,0x01040003,
|
|
||||||
0x00000200,0x00000201,0x00040200,0x00040201,
|
|
||||||
0x01000200,0x01000201,0x01040200,0x01040201,
|
|
||||||
0x00000202,0x00000203,0x00040202,0x00040203,
|
|
||||||
0x01000202,0x01000203,0x01040202,0x01040203,
|
|
||||||
0x08000000,0x08000001,0x08040000,0x08040001,
|
|
||||||
0x09000000,0x09000001,0x09040000,0x09040001,
|
|
||||||
0x08000002,0x08000003,0x08040002,0x08040003,
|
|
||||||
0x09000002,0x09000003,0x09040002,0x09040003,
|
|
||||||
0x08000200,0x08000201,0x08040200,0x08040201,
|
|
||||||
0x09000200,0x09000201,0x09040200,0x09040201,
|
|
||||||
0x08000202,0x08000203,0x08040202,0x08040203,
|
|
||||||
0x09000202,0x09000203,0x09040202,0x09040203
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
|
|
||||||
{
|
|
||||||
0x00000000,0x00100000,0x00000100,0x00100100,
|
|
||||||
0x00000008,0x00100008,0x00000108,0x00100108,
|
|
||||||
0x00001000,0x00101000,0x00001100,0x00101100,
|
|
||||||
0x00001008,0x00101008,0x00001108,0x00101108,
|
|
||||||
0x04000000,0x04100000,0x04000100,0x04100100,
|
|
||||||
0x04000008,0x04100008,0x04000108,0x04100108,
|
|
||||||
0x04001000,0x04101000,0x04001100,0x04101100,
|
|
||||||
0x04001008,0x04101008,0x04001108,0x04101108,
|
|
||||||
0x00020000,0x00120000,0x00020100,0x00120100,
|
|
||||||
0x00020008,0x00120008,0x00020108,0x00120108,
|
|
||||||
0x00021000,0x00121000,0x00021100,0x00121100,
|
|
||||||
0x00021008,0x00121008,0x00021108,0x00121108,
|
|
||||||
0x04020000,0x04120000,0x04020100,0x04120100,
|
|
||||||
0x04020008,0x04120008,0x04020108,0x04120108,
|
|
||||||
0x04021000,0x04121000,0x04021100,0x04121100,
|
|
||||||
0x04021008,0x04121008,0x04021108,0x04121108
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
|
|
||||||
{
|
|
||||||
0x00000000,0x10000000,0x00010000,0x10010000,
|
|
||||||
0x00000004,0x10000004,0x00010004,0x10010004,
|
|
||||||
0x20000000,0x30000000,0x20010000,0x30010000,
|
|
||||||
0x20000004,0x30000004,0x20010004,0x30010004,
|
|
||||||
0x00100000,0x10100000,0x00110000,0x10110000,
|
|
||||||
0x00100004,0x10100004,0x00110004,0x10110004,
|
|
||||||
0x20100000,0x30100000,0x20110000,0x30110000,
|
|
||||||
0x20100004,0x30100004,0x20110004,0x30110004,
|
|
||||||
0x00001000,0x10001000,0x00011000,0x10011000,
|
|
||||||
0x00001004,0x10001004,0x00011004,0x10011004,
|
|
||||||
0x20001000,0x30001000,0x20011000,0x30011000,
|
|
||||||
0x20001004,0x30001004,0x20011004,0x30011004,
|
|
||||||
0x00101000,0x10101000,0x00111000,0x10111000,
|
|
||||||
0x00101004,0x10101004,0x00111004,0x10111004,
|
|
||||||
0x20101000,0x30101000,0x20111000,0x30111000,
|
|
||||||
0x20101004,0x30101004,0x20111004,0x30111004
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
|
|
||||||
{
|
|
||||||
0x00000000,0x08000000,0x00000008,0x08000008,
|
|
||||||
0x00000400,0x08000400,0x00000408,0x08000408,
|
|
||||||
0x00020000,0x08020000,0x00020008,0x08020008,
|
|
||||||
0x00020400,0x08020400,0x00020408,0x08020408,
|
|
||||||
0x00000001,0x08000001,0x00000009,0x08000009,
|
|
||||||
0x00000401,0x08000401,0x00000409,0x08000409,
|
|
||||||
0x00020001,0x08020001,0x00020009,0x08020009,
|
|
||||||
0x00020401,0x08020401,0x00020409,0x08020409,
|
|
||||||
0x02000000,0x0A000000,0x02000008,0x0A000008,
|
|
||||||
0x02000400,0x0A000400,0x02000408,0x0A000408,
|
|
||||||
0x02020000,0x0A020000,0x02020008,0x0A020008,
|
|
||||||
0x02020400,0x0A020400,0x02020408,0x0A020408,
|
|
||||||
0x02000001,0x0A000001,0x02000009,0x0A000009,
|
|
||||||
0x02000401,0x0A000401,0x02000409,0x0A000409,
|
|
||||||
0x02020001,0x0A020001,0x02020009,0x0A020009,
|
|
||||||
0x02020401,0x0A020401,0x02020409,0x0A020409
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
|
|
||||||
{
|
|
||||||
0x00000000,0x00000100,0x00080000,0x00080100,
|
|
||||||
0x01000000,0x01000100,0x01080000,0x01080100,
|
|
||||||
0x00000010,0x00000110,0x00080010,0x00080110,
|
|
||||||
0x01000010,0x01000110,0x01080010,0x01080110,
|
|
||||||
0x00200000,0x00200100,0x00280000,0x00280100,
|
|
||||||
0x01200000,0x01200100,0x01280000,0x01280100,
|
|
||||||
0x00200010,0x00200110,0x00280010,0x00280110,
|
|
||||||
0x01200010,0x01200110,0x01280010,0x01280110,
|
|
||||||
0x00000200,0x00000300,0x00080200,0x00080300,
|
|
||||||
0x01000200,0x01000300,0x01080200,0x01080300,
|
|
||||||
0x00000210,0x00000310,0x00080210,0x00080310,
|
|
||||||
0x01000210,0x01000310,0x01080210,0x01080310,
|
|
||||||
0x00200200,0x00200300,0x00280200,0x00280300,
|
|
||||||
0x01200200,0x01200300,0x01280200,0x01280300,
|
|
||||||
0x00200210,0x00200310,0x00280210,0x00280310,
|
|
||||||
0x01200210,0x01200310,0x01280210,0x01280310
|
|
||||||
},
|
|
||||||
|
|
||||||
/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
|
|
||||||
{
|
|
||||||
0x00000000,0x04000000,0x00040000,0x04040000,
|
|
||||||
0x00000002,0x04000002,0x00040002,0x04040002,
|
|
||||||
0x00002000,0x04002000,0x00042000,0x04042000,
|
|
||||||
0x00002002,0x04002002,0x00042002,0x04042002,
|
|
||||||
0x00000020,0x04000020,0x00040020,0x04040020,
|
|
||||||
0x00000022,0x04000022,0x00040022,0x04040022,
|
|
||||||
0x00002020,0x04002020,0x00042020,0x04042020,
|
|
||||||
0x00002022,0x04002022,0x00042022,0x04042022,
|
|
||||||
0x00000800,0x04000800,0x00040800,0x04040800,
|
|
||||||
0x00000802,0x04000802,0x00040802,0x04040802,
|
|
||||||
0x00002800,0x04002800,0x00042800,0x04042800,
|
|
||||||
0x00002802,0x04002802,0x00042802,0x04042802,
|
|
||||||
0x00000820,0x04000820,0x00040820,0x04040820,
|
|
||||||
0x00000822,0x04000822,0x00040822,0x04040822,
|
|
||||||
0x00002820,0x04002820,0x00042820,0x04042820,
|
|
||||||
0x00002822,0x04002822,0x00042822,0x04042822
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
|
@ -164,13 +164,13 @@ void buffer_write(LPBUFFER& buffer, const void *src, int length)
|
||||||
if (buffer->write_point_pos + length >= buffer->mem_size)
|
if (buffer->write_point_pos + length >= buffer->mem_size)
|
||||||
buffer_realloc(buffer, buffer->mem_size + length + MIN(10240, length));
|
buffer_realloc(buffer, buffer->mem_size + length + MIN(10240, length));
|
||||||
|
|
||||||
thecore_memcpy(buffer->write_point, src, length);
|
memcpy(buffer->write_point, src, length);
|
||||||
buffer_write_proceed(buffer, length);
|
buffer_write_proceed(buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buffer_read(LPBUFFER buffer, void * buf, int bytes)
|
void buffer_read(LPBUFFER buffer, void * buf, int bytes)
|
||||||
{
|
{
|
||||||
thecore_memcpy(buf, buffer->read_point, bytes);
|
memcpy(buf, buffer->read_point, bytes);
|
||||||
buffer_read_proceed(buffer, bytes);
|
buffer_read_proceed(buffer, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ void buffer_realloc(LPBUFFER& buffer, int length)
|
||||||
|
|
||||||
temp = buffer_new (length);
|
temp = buffer_new (length);
|
||||||
sys_log(0, "reallocating buffer to %d, current %d", temp->mem_size, buffer->mem_size);
|
sys_log(0, "reallocating buffer to %d, current %d", temp->mem_size, buffer->mem_size);
|
||||||
thecore_memcpy(temp->mem_data, buffer->mem_data, buffer->mem_size);
|
memcpy(temp->mem_data, buffer->mem_data, buffer->mem_size);
|
||||||
|
|
||||||
read_point_pos = buffer->read_point - buffer->mem_data;
|
read_point_pos = buffer->read_point - buffer->mem_data;
|
||||||
|
|
||||||
|
|
|
@ -1,281 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
#include "DES_table.h"
|
|
||||||
|
|
||||||
#define DES_ECB_ENCRYPT 0
|
|
||||||
#define DES_ECB_DECRYPT 1
|
|
||||||
|
|
||||||
// DES ECB encryption code
|
|
||||||
extern DWORD SP_boxes[8][64];
|
|
||||||
//extern DWORD KeyPerm[8][64];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macroses to transform array of 4 bytes to 32-bit dwords
|
|
||||||
* (and reverse) without depending on the Little-Endian or
|
|
||||||
* Big-Endian processor's architecture
|
|
||||||
*/
|
|
||||||
#define BYTES_TO_DWORD(b,d) (d = ((DWORD)(*((b)++))), \
|
|
||||||
d |= ((DWORD)(*((b)++)))<< 8, \
|
|
||||||
d |= ((DWORD)(*((b)++)))<<16, \
|
|
||||||
d |= ((DWORD)(*((b)++)))<<24)
|
|
||||||
|
|
||||||
#define DWORD_TO_4BYTES(d,b) (*((b)++)=(BYTE)(((d) )&0xff), \
|
|
||||||
*((b)++)=(BYTE)(((d)>> 8)&0xff), \
|
|
||||||
*((b)++)=(BYTE)(((d)>>16)&0xff), \
|
|
||||||
*((b)++)=(BYTE)(((d)>>24)&0xff))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First of all, take into accounts the bytes and bites ordering
|
|
||||||
* used in DES:
|
|
||||||
*
|
|
||||||
* DES: 1 2 3 4 5 6 7 8 .... 57 58 59 60 61 62 63 64
|
|
||||||
* INTEL: 63 62 61 60 59 58 57 56 .... 7 6 5 4 3 2 1 0
|
|
||||||
*
|
|
||||||
* According to the DES, every 8-th bits is not used:
|
|
||||||
* for DES the bites 8, 16, 32, ..., 64 are excluded,
|
|
||||||
* for INTEL: 56, 48, 40, ..., 0 are excluded
|
|
||||||
*
|
|
||||||
* According to the above rool of numbering, the tables
|
|
||||||
* used in DES (for Initial Permutation, Final Permutation,
|
|
||||||
* Key Permutation, Compression Permutation, Expansion
|
|
||||||
* Permutation and P-Box permutation) have to be re-written.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Some main ideas used to optimize DES software
|
|
||||||
implementation:
|
|
||||||
|
|
||||||
a). Do not make an Expansion Permutation of 32-bit to
|
|
||||||
48 bit (32-bit of data - right half of 64-bit of data),
|
|
||||||
but make a correspondent preparation of the Key. So,
|
|
||||||
the step of Expansion Permutation and XORing 48 bit of
|
|
||||||
Expanded data and 48 bit of Compressed key will be
|
|
||||||
replaced by 2 XOR operations: 32 bit of data XOR first
|
|
||||||
32 bit part of prepeared key, then, the same 32 bit of
|
|
||||||
data XOR second 32-bit part of prepeared key
|
|
||||||
|
|
||||||
b). Combine S-Box Substitution and P-Box Permutation
|
|
||||||
operations.
|
|
||||||
|
|
||||||
c). For the best performance 56-bit encryption key
|
|
||||||
have to be extendended to 128-byte array, i.e. for each
|
|
||||||
of 16 rounds of DES we prepare a unique pair of two
|
|
||||||
32-bit (4-bytes) words (see 'a)' above).
|
|
||||||
|
|
||||||
d). We can use XOR, SHIFT, AND operations to swap
|
|
||||||
bits between words. For example, we have:
|
|
||||||
|
|
||||||
word A word B
|
|
||||||
0 1 2 3 4 5 6 7
|
|
||||||
|
|
||||||
We want to get:
|
|
||||||
|
|
||||||
word A word B
|
|
||||||
0 4 2 6 1 5 3 7
|
|
||||||
|
|
||||||
First, shift word A to get bites 1, 3 on the "right place"
|
|
||||||
|
|
||||||
word TMP = (word A) >> 1 = 1 2 3 -
|
|
||||||
|
|
||||||
TMP = TMP ^ B = 1^4 2^5 3^6 7
|
|
||||||
|
|
||||||
we don't want to change bits 5 and 7 in the B word, so
|
|
||||||
|
|
||||||
TMP = TMP & MASK = TMP & 1010 = 1^4 - 3^6 -
|
|
||||||
|
|
||||||
now we can easy get the word B:
|
|
||||||
|
|
||||||
B = B ^ TMP = (4 5 6 7) ^ (1^4 - 3^6 -) = 1 5 3 7
|
|
||||||
|
|
||||||
if we shift our "masking" TMP word reverse - we get
|
|
||||||
a mask for A word:
|
|
||||||
|
|
||||||
TMP = TMP << 1 = - 1^4 - 3^6
|
|
||||||
|
|
||||||
now we can easy get the word A:
|
|
||||||
|
|
||||||
A = A ^ TMP = (0 1 2 3) ^ (- 1^4 - 3^6) = 0 4 2 6
|
|
||||||
|
|
||||||
The example above may be used to swap not only single
|
|
||||||
bits, but also bit sequencies. In this case you should
|
|
||||||
use shift on the value, equal to the number of bits
|
|
||||||
in pattern.
|
|
||||||
|
|
||||||
As you see, all this opearations may be written like:
|
|
||||||
TMP = ((A >> size) ^ B) & mask;
|
|
||||||
B ^ = TMP;
|
|
||||||
A ^= TMP << size;
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PERMUTATION(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
|
|
||||||
(b)^=(t),\
|
|
||||||
(a)^=((t)<<(n)))
|
|
||||||
|
|
||||||
#define HPERMUTATION(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
|
|
||||||
(a)=(a)^(t)^(t>>(16-(n))))
|
|
||||||
|
|
||||||
#define D_ENCRYPT(Left, Right, Ks, Num, TmpA, TmpB) \
|
|
||||||
TmpA = (Right ^ Ks[Num ]); \
|
|
||||||
TmpB = (Right ^ Ks[Num+1]); \
|
|
||||||
TmpB = ((TmpB >> 4) + (TmpB << 28)); \
|
|
||||||
Left ^= SP_boxes[1][(TmpB )&0x3f]| \
|
|
||||||
SP_boxes[3][(TmpB>> 8)&0x3f]| \
|
|
||||||
SP_boxes[5][(TmpB>>16)&0x3f]| \
|
|
||||||
SP_boxes[7][(TmpB>>24)&0x3f]| \
|
|
||||||
SP_boxes[0][(TmpA )&0x3f]| \
|
|
||||||
SP_boxes[2][(TmpA>> 8)&0x3f]| \
|
|
||||||
SP_boxes[4][(TmpA>>16)&0x3f]| \
|
|
||||||
SP_boxes[6][(TmpA>>24)&0x3f];
|
|
||||||
|
|
||||||
void DES_ECB_mode(BYTE * Input, /* 8 bytes of input data */
|
|
||||||
BYTE * Output, /* 8 bytes of output data */
|
|
||||||
const DWORD * KeySchedule, /* [16][2] array of DWORDs */
|
|
||||||
BYTE Operation) /* DES_ECB_ENCRYPT or DES_ECB_DECRYPT */
|
|
||||||
{
|
|
||||||
static BYTE * bInp, * bOut;
|
|
||||||
static DWORD dwLeft, dwRigh, dwTmp, dwTmp1;
|
|
||||||
|
|
||||||
bInp = Input;
|
|
||||||
bOut = Output;
|
|
||||||
|
|
||||||
BYTES_TO_DWORD(bInp, dwLeft);
|
|
||||||
BYTES_TO_DWORD(bInp, dwRigh);
|
|
||||||
|
|
||||||
/* Initial Permutation */
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 4, 0x0f0f0f0f);
|
|
||||||
PERMUTATION(dwLeft, dwRigh, dwTmp,16, 0x0000ffff);
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 2, 0x33333333);
|
|
||||||
PERMUTATION(dwLeft, dwRigh, dwTmp, 8, 0x00ff00ff);
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 1, 0x55555555);
|
|
||||||
|
|
||||||
/* dwRigh and dwLeft has reversed bit orders - itwill be taken
|
|
||||||
into account in the next step */
|
|
||||||
|
|
||||||
/* The initial rotate is done outside the loop. This required the
|
|
||||||
* SP_boxes values to be rotated 1 bit to the right.
|
|
||||||
*/
|
|
||||||
dwTmp = (dwRigh<<1) | (dwRigh>>31);
|
|
||||||
dwRigh = (dwLeft<<1) | (dwLeft>>31);
|
|
||||||
dwLeft = dwTmp;
|
|
||||||
|
|
||||||
/* clear the top bits on machines with 8byte longs */
|
|
||||||
dwLeft &= 0xffffffff;
|
|
||||||
dwRigh &= 0xffffffff;
|
|
||||||
|
|
||||||
if (Operation == DES_ECB_ENCRYPT)
|
|
||||||
{ /* Key order */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 0, dwTmp, dwTmp1); /* 1 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 2, dwTmp, dwTmp1); /* 2 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 4, dwTmp, dwTmp1); /* 3 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 6, dwTmp, dwTmp1); /* 4 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 8, dwTmp, dwTmp1); /* 5 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 10, dwTmp, dwTmp1); /* 6 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 12, dwTmp, dwTmp1); /* 7 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 14, dwTmp, dwTmp1); /* 8 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 16, dwTmp, dwTmp1); /* 9 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 18, dwTmp, dwTmp1); /* 10 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 20, dwTmp, dwTmp1); /* 11 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 22, dwTmp, dwTmp1); /* 12 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 24, dwTmp, dwTmp1); /* 13 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 26, dwTmp, dwTmp1); /* 14 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 28, dwTmp, dwTmp1); /* 15 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 30, dwTmp, dwTmp1); /* 16 */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 30, dwTmp, dwTmp1); /* 16 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 28, dwTmp, dwTmp1); /* 15 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 26, dwTmp, dwTmp1); /* 14 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 24, dwTmp, dwTmp1); /* 13 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 22, dwTmp, dwTmp1); /* 12 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 20, dwTmp, dwTmp1); /* 11 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 18, dwTmp, dwTmp1); /* 10 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 16, dwTmp, dwTmp1); /* 9 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 14, dwTmp, dwTmp1); /* 8 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 12, dwTmp, dwTmp1); /* 7 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 10, dwTmp, dwTmp1); /* 6 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 8, dwTmp, dwTmp1); /* 5 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 6, dwTmp, dwTmp1); /* 4 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 4, dwTmp, dwTmp1); /* 3 */
|
|
||||||
D_ENCRYPT(dwLeft, dwRigh, KeySchedule, 2, dwTmp, dwTmp1); /* 2 */
|
|
||||||
D_ENCRYPT(dwRigh, dwLeft, KeySchedule, 0, dwTmp, dwTmp1); /* 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
dwLeft = (dwLeft>>1) | (dwLeft<<31);
|
|
||||||
dwRigh = (dwRigh>>1) | (dwRigh<<31);
|
|
||||||
|
|
||||||
/* clear the top bits on machines with 8byte longs */
|
|
||||||
dwLeft &= 0xffffffff;
|
|
||||||
dwRigh &= 0xffffffff;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do we need to swap dwLeft and dwRigh?
|
|
||||||
* We have not to do the swap
|
|
||||||
* (We remember they are reversed)
|
|
||||||
* So - all we have to do is to make a correspondent Final Permutation
|
|
||||||
*/
|
|
||||||
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 1,0x55555555);
|
|
||||||
PERMUTATION(dwLeft, dwRigh, dwTmp, 8,0x00ff00ff);
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 2,0x33333333);
|
|
||||||
PERMUTATION(dwLeft, dwRigh, dwTmp,16,0x0000ffff);
|
|
||||||
PERMUTATION(dwRigh, dwLeft, dwTmp, 4,0x0f0f0f0f);
|
|
||||||
|
|
||||||
/* Place our two 32-bits results into 8 bytes of output data */
|
|
||||||
DWORD_TO_4BYTES(dwLeft, bOut);
|
|
||||||
DWORD_TO_4BYTES(dwRigh, bOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
//************ DES CBC mode encryption **************
|
|
||||||
int DES_Encrypt(DWORD *DstBuffer, const DWORD * SrcBuffer, const DWORD *KeyAddress, DWORD Length, DWORD *IVector)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
DWORD buffer[2];
|
|
||||||
|
|
||||||
buffer[0] = IVector[0];
|
|
||||||
buffer[1] = IVector[1];
|
|
||||||
|
|
||||||
for (i = 0; i < (Length >> 2); i = i+2)
|
|
||||||
{
|
|
||||||
// do EBC encryption of (Initial_Vector XOR Data)
|
|
||||||
buffer[0] ^= SrcBuffer[i];
|
|
||||||
buffer[1] ^= SrcBuffer[i+1];
|
|
||||||
|
|
||||||
DES_ECB_mode((BYTE *) buffer, (BYTE *) buffer, KeyAddress, DES_ECB_ENCRYPT);
|
|
||||||
|
|
||||||
DstBuffer[i] = buffer[0];
|
|
||||||
DstBuffer[i+1] = buffer[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return Length;
|
|
||||||
}
|
|
||||||
|
|
||||||
//************ DES CBC mode decryption **************
|
|
||||||
int DES_Decrypt(DWORD *DstBuffer, const DWORD * SrcBuffer, const DWORD *KeyAddress, DWORD Length, DWORD *IVector)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
DWORD buffer[2], ivectorL, ivectorR, oldSrcL, oldSrcR;
|
|
||||||
|
|
||||||
ivectorL = IVector[0];
|
|
||||||
ivectorR = IVector[1];
|
|
||||||
|
|
||||||
for (i = 0; i < (Length >> 2); i = i + 2)
|
|
||||||
{
|
|
||||||
buffer[0] = oldSrcL = SrcBuffer[i];
|
|
||||||
buffer[1] = oldSrcR = SrcBuffer[i+1];
|
|
||||||
|
|
||||||
// Encrypted Data -> new IV,
|
|
||||||
// then do EBC decryption of Encrypted Data,
|
|
||||||
// then XOR decrypted data with old IV
|
|
||||||
DES_ECB_mode((BYTE *)buffer, (BYTE *)buffer, KeyAddress, DES_ECB_DECRYPT);
|
|
||||||
|
|
||||||
DstBuffer[i] = buffer[0] ^ ivectorL;
|
|
||||||
DstBuffer[i+1] = buffer[1] ^ ivectorR;
|
|
||||||
|
|
||||||
ivectorL = oldSrcL;
|
|
||||||
ivectorR = oldSrcR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Length;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,234 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
/*
|
|
||||||
static unsigned char const k8[16] = { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 };
|
|
||||||
static unsigned char const k7[16] = { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 };
|
|
||||||
static unsigned char const k6[16] = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };
|
|
||||||
static unsigned char const k5[16] = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 };
|
|
||||||
static unsigned char const k4[16] = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 };
|
|
||||||
static unsigned char const k3[16] = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 };
|
|
||||||
static unsigned char const k2[16] = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };
|
|
||||||
static unsigned char const k1[16] = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 };
|
|
||||||
*/
|
|
||||||
static unsigned char const k8[16] = { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 };
|
|
||||||
static unsigned char const k7[16] = { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 };
|
|
||||||
static unsigned char const k6[16] = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };
|
|
||||||
static unsigned char const k5[16] = { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 };
|
|
||||||
static unsigned char const k4[16] = { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };
|
|
||||||
static unsigned char const k3[16] = { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };
|
|
||||||
static unsigned char const k2[16] = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };
|
|
||||||
static unsigned char const k1[16] = { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 };
|
|
||||||
|
|
||||||
/* Byte-at-a-time substitution boxes */
|
|
||||||
static unsigned char k87[256];
|
|
||||||
static unsigned char k65[256];
|
|
||||||
static unsigned char k43[256];
|
|
||||||
static unsigned char k21[256];
|
|
||||||
|
|
||||||
void GOST_Init()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
k87[i] = k8[i >> 4] << 4 | k7[i & 15];
|
|
||||||
k65[i] = k6[i >> 4] << 4 | k5[i & 15];
|
|
||||||
k43[i] = k4[i >> 4] << 4 | k3[i & 15];
|
|
||||||
k21[i] = k2[i >> 4] << 4 | k1[i & 15];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE static DWORD f(DWORD x)
|
|
||||||
{
|
|
||||||
x = k87[x >> 24 & 255] << 24 | k65[x >> 16 & 255] << 16 | k43[x >> 8 & 255] << 8 | k21[x & 255];
|
|
||||||
return x << 11 | x >> (32 - 11);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
static void GOST_ECB_Encrypt(DWORD * N1, DWORD * N2, const DWORD * KeyAddress)
|
|
||||||
{
|
|
||||||
register DWORD n1, n2; // As named in the GOST
|
|
||||||
|
|
||||||
n1 = *N1;
|
|
||||||
n2 = *N2;
|
|
||||||
|
|
||||||
// Instead of swapping halves, swap names each round
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[7]);
|
|
||||||
n1 ^= f(n2+KeyAddress[6]);
|
|
||||||
n2 ^= f(n1+KeyAddress[5]);
|
|
||||||
n1 ^= f(n2+KeyAddress[4]);
|
|
||||||
n2 ^= f(n1+KeyAddress[3]);
|
|
||||||
n1 ^= f(n2+KeyAddress[2]);
|
|
||||||
n2 ^= f(n1+KeyAddress[1]);
|
|
||||||
n1 ^= f(n2+KeyAddress[0]);
|
|
||||||
|
|
||||||
// There is no swap after the last round
|
|
||||||
*N1 = n2;
|
|
||||||
*N2 = n1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
int GOST_Encrypt(DWORD * DstBuffer, const DWORD * SrcBuffer, const DWORD * KeyAddress, DWORD Length, DWORD *IVector)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
DWORD N1,N2;
|
|
||||||
|
|
||||||
N1 = IVector[0];
|
|
||||||
N2 = IVector[1];
|
|
||||||
|
|
||||||
for (i = 0; i < (Length >> 2); i = i+2)
|
|
||||||
{
|
|
||||||
register DWORD n1, n2; // As named in the GOST
|
|
||||||
|
|
||||||
n1 = N1;
|
|
||||||
n2 = N2;
|
|
||||||
|
|
||||||
// Instead of swapping halves, swap names each round
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[7]);
|
|
||||||
n1 ^= f(n2+KeyAddress[6]);
|
|
||||||
n2 ^= f(n1+KeyAddress[5]);
|
|
||||||
n1 ^= f(n2+KeyAddress[4]);
|
|
||||||
n2 ^= f(n1+KeyAddress[3]);
|
|
||||||
n1 ^= f(n2+KeyAddress[2]);
|
|
||||||
n2 ^= f(n1+KeyAddress[1]);
|
|
||||||
n1 ^= f(n2+KeyAddress[0]);
|
|
||||||
|
|
||||||
N1 = n2;
|
|
||||||
N2 = n1;
|
|
||||||
//GOST_ECB_Encrypt(&N1, &N2, KeyAddress);
|
|
||||||
// XOR plaintext with initial vector,
|
|
||||||
// move rezult to ciphertext and to initial vector
|
|
||||||
DstBuffer[i] = SrcBuffer[i] ^ N1;
|
|
||||||
N1 = DstBuffer[i];
|
|
||||||
|
|
||||||
DstBuffer[i+1] = SrcBuffer[i+1] ^ N2;
|
|
||||||
N2 = DstBuffer[i+1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return Length;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************ GOST CBC decryption **************
|
|
||||||
int GOST_Decrypt(DWORD * DstBuffer, const DWORD * SrcBuffer, const DWORD * KeyAddress, DWORD Length, DWORD *IVector)
|
|
||||||
{
|
|
||||||
DWORD i;
|
|
||||||
DWORD N1, N2, dwTmp;
|
|
||||||
|
|
||||||
N1 = IVector[0];
|
|
||||||
N2 = IVector[1];
|
|
||||||
|
|
||||||
for (i = 0; i < (Length >> 2); i = i + 2)
|
|
||||||
{
|
|
||||||
register DWORD n1, n2; // As named in the GOST
|
|
||||||
|
|
||||||
n1 = N1;
|
|
||||||
n2 = N2;
|
|
||||||
|
|
||||||
// Instead of swapping halves, swap names each round
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[0]);
|
|
||||||
n1 ^= f(n2+KeyAddress[1]);
|
|
||||||
n2 ^= f(n1+KeyAddress[2]);
|
|
||||||
n1 ^= f(n2+KeyAddress[3]);
|
|
||||||
n2 ^= f(n1+KeyAddress[4]);
|
|
||||||
n1 ^= f(n2+KeyAddress[5]);
|
|
||||||
n2 ^= f(n1+KeyAddress[6]);
|
|
||||||
n1 ^= f(n2+KeyAddress[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+KeyAddress[7]);
|
|
||||||
n1 ^= f(n2+KeyAddress[6]);
|
|
||||||
n2 ^= f(n1+KeyAddress[5]);
|
|
||||||
n1 ^= f(n2+KeyAddress[4]);
|
|
||||||
n2 ^= f(n1+KeyAddress[3]);
|
|
||||||
n1 ^= f(n2+KeyAddress[2]);
|
|
||||||
n2 ^= f(n1+KeyAddress[1]);
|
|
||||||
n1 ^= f(n2+KeyAddress[0]);
|
|
||||||
|
|
||||||
// There is no swap after the last round
|
|
||||||
N1 = n2;
|
|
||||||
N2 = n1;
|
|
||||||
//GOST_ECB_Encrypt(&N1, &N2, KeyAddress);
|
|
||||||
// XOR encrypted text with encrypted initial vector (we get rezult - decrypted text),
|
|
||||||
// move encrypted text to new initial vector.
|
|
||||||
// We need dwTmp because SrcBuffer may be the same as DstBuffer
|
|
||||||
dwTmp = SrcBuffer[i] ^ N1;
|
|
||||||
N1 = SrcBuffer[i];
|
|
||||||
DstBuffer[i] = dwTmp;
|
|
||||||
|
|
||||||
dwTmp = SrcBuffer[i+1] ^ N2;
|
|
||||||
N2 = SrcBuffer[i+1];
|
|
||||||
DstBuffer[i+1] = dwTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Length;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,411 +0,0 @@
|
||||||
/*
|
|
||||||
* The GOST 28147-89 cipher
|
|
||||||
*
|
|
||||||
* This is based on the 25 Movember 1993 draft translation
|
|
||||||
* by Aleksandr Malchik, with Whitfield Diffie, of the Government
|
|
||||||
* Standard of the U.S.S.R. GOST 28149-89, "Cryptographic Transformation
|
|
||||||
* Algorithm", effective 1 July 1990. (Whitfield.Diffie@eng.sun.com)
|
|
||||||
*
|
|
||||||
* That is a draft, and may contain errors, which will be faithfully
|
|
||||||
* reflected here, along with possible exciting new bugs.
|
|
||||||
*
|
|
||||||
* Some details have been cleared up by the paper "Soviet Encryption
|
|
||||||
* Algorithm" by Josef Pieprzyk and Leonid Tombak of the University
|
|
||||||
* of Wollongong, New South Wales. (josef/leo@cs.adfa.oz.au)
|
|
||||||
*
|
|
||||||
* The standard is written by A. Zabotin (project leader), G.P. Glazkov,
|
|
||||||
* and V.B. Isaeva. It was accepted and introduced into use by the
|
|
||||||
* action of the State Standards Committee of the USSR on 2 June 89 as
|
|
||||||
* No. 1409. It was to be reviewed in 1993, but whether anyone wishes
|
|
||||||
* to take on this obligation from the USSR is questionable.
|
|
||||||
*
|
|
||||||
* This code is placed in the public domain.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If you read the standard, it belabors the point of copying corresponding
|
|
||||||
* bits from point A to point B quite a bit. It helps to understand that
|
|
||||||
* the standard is uniformly little-endian, although it numbers bits from
|
|
||||||
* 1 rather than 0, so bit n has value 2^(n-1). The least significant bit
|
|
||||||
* of the 32-bit words that are manipulated in the algorithm is the first,
|
|
||||||
* lowest-numbered, in the bit string.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* A 32-bit data type */
|
|
||||||
#ifdef __alpha /* Any other 64-bit machines? */
|
|
||||||
typedef unsigned int word32;
|
|
||||||
#else
|
|
||||||
typedef unsigned long word32;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The standard does not specify the contents of the 8 4 bit->4 bit
|
|
||||||
* substitution boxes, saying they're a parameter of the network
|
|
||||||
* being set up. For illustration purposes here, I have used
|
|
||||||
* the first rows of the 8 S-boxes from the DES. (Note that the
|
|
||||||
* DES S-boxes are numbered starting from 1 at the msb. In keeping
|
|
||||||
* with the rest of the GOST, I have used little-endian numbering.
|
|
||||||
* Thus, k8 is S-box 1.
|
|
||||||
*
|
|
||||||
* Obviously, a careful look at the cryptographic properties of the cipher
|
|
||||||
* must be undertaken before "production" substitution boxes are defined.
|
|
||||||
*
|
|
||||||
* The standard also does not specify a standard bit-string representation
|
|
||||||
* for the contents of these blocks.
|
|
||||||
*/
|
|
||||||
static unsigned char const k8[16] = { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 };
|
|
||||||
static unsigned char const k7[16] = { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 };
|
|
||||||
static unsigned char const k6[16] = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };
|
|
||||||
static unsigned char const k5[16] = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 };
|
|
||||||
static unsigned char const k4[16] = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 };
|
|
||||||
static unsigned char const k3[16] = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 };
|
|
||||||
static unsigned char const k2[16] = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };
|
|
||||||
static unsigned char const k1[16] = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 };
|
|
||||||
|
|
||||||
/* Byte-at-a-time substitution boxes */
|
|
||||||
static unsigned char k87[256];
|
|
||||||
static unsigned char k65[256];
|
|
||||||
static unsigned char k43[256];
|
|
||||||
static unsigned char k21[256];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Build byte-at-a-time subtitution tables.
|
|
||||||
* This must be called once for global setup.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
void kboxinit(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
k87[i] = k8[i >> 4] << 4 | k7[i & 15];
|
|
||||||
k65[i] = k6[i >> 4] << 4 | k5[i & 15];
|
|
||||||
k43[i] = k4[i >> 4] << 4 | k3[i & 15];
|
|
||||||
k21[i] = k2[i >> 4] << 4 | k1[i & 15];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do the substitution and rotation that are the core of the operation,
|
|
||||||
* like the expansion, substitution and permutation of the DES.
|
|
||||||
* It would be possible to perform DES-like optimisations and store
|
|
||||||
* the table entries as 32-bit words, already rotated, but the
|
|
||||||
* efficiency gain is questionable.
|
|
||||||
*
|
|
||||||
* This should be inlined for maximum speed
|
|
||||||
*/
|
|
||||||
#if __GNUC__
|
|
||||||
__inline__
|
|
||||||
#endif
|
|
||||||
static word32 f(word32 x)
|
|
||||||
{
|
|
||||||
/* Do substitutions */
|
|
||||||
#if 0
|
|
||||||
/* This is annoyingly slow */
|
|
||||||
x = k8[x>>28 & 15] << 28 | k7[x>>24 & 15] << 24 |
|
|
||||||
k6[x>>20 & 15] << 20 | k5[x>>16 & 15] << 16 |
|
|
||||||
k4[x>>12 & 15] << 12 | k3[x>> 8 & 15] << 8 |
|
|
||||||
k2[x>> 4 & 15] << 4 | k1[x & 15];
|
|
||||||
#else
|
|
||||||
/* This is faster */
|
|
||||||
x = k87[x>>24 & 255] << 24 | k65[x>>16 & 255] << 16 | k43[x>> 8 & 255] << 8 | k21[x & 255];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Rotate left 11 bits */
|
|
||||||
return x << 11 | x >> (32 - 11);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The GOST standard defines the input in terms of bits 1..64, with
|
|
||||||
* bit 1 being the lsb of in[0] and bit 64 being the msb of in[1].
|
|
||||||
*
|
|
||||||
* The keys are defined similarly, with bit 256 being the msb of key[7].
|
|
||||||
*/
|
|
||||||
void gostcrypt(word32 const in[2], word32 out[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
register word32 n1, n2; /* As named in the GOST */
|
|
||||||
|
|
||||||
n1 = in[0];
|
|
||||||
n2 = in[1];
|
|
||||||
|
|
||||||
/* Instead of swapping halves, swap names each round */
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[7]);
|
|
||||||
n1 ^= f(n2+key[6]);
|
|
||||||
n2 ^= f(n1+key[5]);
|
|
||||||
n1 ^= f(n2+key[4]);
|
|
||||||
n2 ^= f(n1+key[3]);
|
|
||||||
n1 ^= f(n2+key[2]);
|
|
||||||
n2 ^= f(n1+key[1]);
|
|
||||||
n1 ^= f(n2+key[0]);
|
|
||||||
|
|
||||||
/* There is no swap after the last round */
|
|
||||||
out[0] = n2;
|
|
||||||
out[1] = n1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The key schedule is somewhat different for decryption.
|
|
||||||
* (The key table is used once forward and three times backward.)
|
|
||||||
* You could define an expanded key, or just write the code twice,
|
|
||||||
* as done here.
|
|
||||||
*/
|
|
||||||
void gostdecrypt(word32 const in[2], word32 out[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
register word32 n1, n2; /* As named in the GOST */
|
|
||||||
|
|
||||||
n1 = in[0];
|
|
||||||
n2 = in[1];
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[7]);
|
|
||||||
n1 ^= f(n2+key[6]);
|
|
||||||
n2 ^= f(n1+key[5]);
|
|
||||||
n1 ^= f(n2+key[4]);
|
|
||||||
n2 ^= f(n1+key[3]);
|
|
||||||
n1 ^= f(n2+key[2]);
|
|
||||||
n2 ^= f(n1+key[1]);
|
|
||||||
n1 ^= f(n2+key[0]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[7]);
|
|
||||||
n1 ^= f(n2+key[6]);
|
|
||||||
n2 ^= f(n1+key[5]);
|
|
||||||
n1 ^= f(n2+key[4]);
|
|
||||||
n2 ^= f(n1+key[3]);
|
|
||||||
n1 ^= f(n2+key[2]);
|
|
||||||
n2 ^= f(n1+key[1]);
|
|
||||||
n1 ^= f(n2+key[0]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[7]);
|
|
||||||
n1 ^= f(n2+key[6]);
|
|
||||||
n2 ^= f(n1+key[5]);
|
|
||||||
n1 ^= f(n2+key[4]);
|
|
||||||
n2 ^= f(n1+key[3]);
|
|
||||||
n1 ^= f(n2+key[2]);
|
|
||||||
n2 ^= f(n1+key[1]);
|
|
||||||
n1 ^= f(n2+key[0]);
|
|
||||||
|
|
||||||
out[0] = n2;
|
|
||||||
out[1] = n1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The GOST "Output feedback" standard. It seems closer morally
|
|
||||||
* to the counter feedback mode some people have proposed for DES.
|
|
||||||
* The avoidance of the short cycles that are possible in OFB seems
|
|
||||||
* like a Good Thing.
|
|
||||||
*
|
|
||||||
* Calling it the stream mode makes more sense.
|
|
||||||
*
|
|
||||||
* The IV is encrypted with the key to produce the initial counter value.
|
|
||||||
* Then, for each output block, a constant is added, modulo 2^32-1
|
|
||||||
* (0 is represented as all-ones, not all-zeros), to each half of
|
|
||||||
* the counter, and the counter is encrypted to produce the value
|
|
||||||
* to XOR with the output.
|
|
||||||
*
|
|
||||||
* Len is the number of blocks. Sub-block encryption is
|
|
||||||
* left as an exercise for the user. Remember that the
|
|
||||||
* standard defines everything in a little-endian manner,
|
|
||||||
* so you want to use the low bit of gamma[0] first.
|
|
||||||
*
|
|
||||||
* OFB is, of course, self-inverse, so there is only one function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The constants for addition */
|
|
||||||
#define C1 0x01010104
|
|
||||||
#define C2 0x01010101
|
|
||||||
|
|
||||||
void gostofb(word32 const *in, word32 *out, int len, word32 const iv[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
word32 temp[2]; /* Counter */
|
|
||||||
word32 gamma[2]; /* Output XOR value */
|
|
||||||
|
|
||||||
/* Compute starting value for counter */
|
|
||||||
gostcrypt(iv, temp, key);
|
|
||||||
|
|
||||||
while (len--)
|
|
||||||
{
|
|
||||||
temp[0] += C2;
|
|
||||||
|
|
||||||
if (temp[0] < C2) /* Wrap modulo 2^32? */
|
|
||||||
temp[0]++; /* Make it modulo 2^32-1 */
|
|
||||||
|
|
||||||
temp[1] += C1;
|
|
||||||
|
|
||||||
if (temp[1] < C1) /* Wrap modulo 2^32? */
|
|
||||||
temp[1]++; /* Make it modulo 2^32-1 */
|
|
||||||
|
|
||||||
gostcrypt(temp, gamma, key);
|
|
||||||
|
|
||||||
*out++ = *in++ ^ gamma[0];
|
|
||||||
*out++ = *in++ ^ gamma[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The CFB mode is just what you'd expect. Each block of ciphertext y[] is
|
|
||||||
* derived from the input x[] by the following pseudocode:
|
|
||||||
* y[i] = x[i] ^ gostcrypt(y[i-1])
|
|
||||||
* x[i] = y[i] ^ gostcrypt(y[i-1])
|
|
||||||
* Where y[-1] is the IV.
|
|
||||||
*
|
|
||||||
* The IV is modified in place. Again, len is in *blocks*.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void gostcfbencrypt(word32 const *in, word32 *out, int len, word32 iv[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
while (len--)
|
|
||||||
{
|
|
||||||
gostcrypt(iv, iv, key);
|
|
||||||
iv[0] = *out++ ^= iv[0];
|
|
||||||
iv[1] = *out++ ^= iv[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void gostcfbdecrypt(word32 const *in, word32 *out, int len, word32 iv[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
word32 t;
|
|
||||||
|
|
||||||
while (len--)
|
|
||||||
{
|
|
||||||
gostcrypt(iv, iv, key);
|
|
||||||
t = *out;
|
|
||||||
*out++ ^= iv[0];
|
|
||||||
iv[0] = t;
|
|
||||||
t = *out;
|
|
||||||
*out++ ^= iv[1];
|
|
||||||
iv[1] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The message suthetication code uses only 16 of the 32 rounds.
|
|
||||||
* There *is* a swap after the 16th round.
|
|
||||||
* The last block should be padded to 64 bits with zeros.
|
|
||||||
* len is the number of *blocks* in the input.
|
|
||||||
*/
|
|
||||||
void gostmac(word32 const *in, int len, word32 out[2], word32 const key[8])
|
|
||||||
{
|
|
||||||
register word32 n1, n2; /* As named in the GOST */
|
|
||||||
|
|
||||||
n1 = 0;
|
|
||||||
n2 = 0;
|
|
||||||
|
|
||||||
while (len--)
|
|
||||||
{
|
|
||||||
n1 ^= *in++;
|
|
||||||
n2 = *in++;
|
|
||||||
|
|
||||||
/* Instead of swapping halves, swap names each round */
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
|
|
||||||
n2 ^= f(n1+key[0]);
|
|
||||||
n1 ^= f(n2+key[1]);
|
|
||||||
n2 ^= f(n1+key[2]);
|
|
||||||
n1 ^= f(n2+key[3]);
|
|
||||||
n2 ^= f(n1+key[4]);
|
|
||||||
n1 ^= f(n2+key[5]);
|
|
||||||
n2 ^= f(n1+key[6]);
|
|
||||||
n1 ^= f(n2+key[7]);
|
|
||||||
}
|
|
||||||
|
|
||||||
out[0] = n1;
|
|
||||||
out[1] = n2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Designed to cope with 15-bit rand() implementations */
|
|
||||||
#define RAND32 ((word32)rand() << 17 ^ (word32)rand() << 9 ^ rand())
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
word32 key[8];
|
|
||||||
word32 plain[2];
|
|
||||||
word32 cipher[2];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
kboxinit();
|
|
||||||
|
|
||||||
printf("GOST 21847-89 test driver.\n");
|
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
key[j] = RAND32;
|
|
||||||
|
|
||||||
plain[0] = RAND32;
|
|
||||||
plain[1] = RAND32;
|
|
||||||
|
|
||||||
printf("%3d\r", i);
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
gostcrypt(plain, cipher, key);
|
|
||||||
|
|
||||||
for (j = 0; j < 99; j++)
|
|
||||||
gostcrypt(cipher, cipher, key);
|
|
||||||
|
|
||||||
for (j = 0; j < 100; j++)
|
|
||||||
gostdecrypt(cipher, cipher, key);
|
|
||||||
|
|
||||||
if (plain[0] != cipher[0] || plain[1] != cipher[1])
|
|
||||||
{
|
|
||||||
fprintf(stderr, "\nError! i = %d\n", i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("All tests passed.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TEST */
|
|
|
@ -1,123 +0,0 @@
|
||||||
/*
|
|
||||||
* Filename: hangul.c
|
|
||||||
* Description: ÇÑ±Û °ü·Ã ±¸Çö ¼Ò½º
|
|
||||||
*
|
|
||||||
* Author: ºñ¿± aka. Cronan
|
|
||||||
*/
|
|
||||||
#define __LIBTHECORE__
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
int is_hangul(const BYTE * str)
|
|
||||||
{
|
|
||||||
if (str[0] >= 0xb0 && str[0] <= 0xc8 && str[1] >= 0xa1 && str[1] <= 0xfe)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_han(const char *str)
|
|
||||||
{
|
|
||||||
int i, code;
|
|
||||||
|
|
||||||
if (!str || !*str)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; str[i]; i += 2)
|
|
||||||
{
|
|
||||||
if (isnhspace(str[i]))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (isalpha(str[i]) || isdigit(str[i]))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
code = str[i];
|
|
||||||
code += 256;
|
|
||||||
|
|
||||||
if (code < 176 || code > 200)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *first_han(const BYTE *str)
|
|
||||||
{
|
|
||||||
unsigned char high, low;
|
|
||||||
int len, i;
|
|
||||||
char *p = "±×¿Ü";
|
|
||||||
|
|
||||||
static const char* wansung[] =
|
|
||||||
{
|
|
||||||
"°¡", "°¡", "³ª", "´Ù", "´Ù",
|
|
||||||
"¶ó", "¸¶", "¹Ù", "¹Ù", "»ç",
|
|
||||||
"»ç", "¾Æ", "ÀÚ", "ÀÚ", "Â÷",
|
|
||||||
"Ä«", "Ÿ", "ÆÄ", "ÇÏ", ""
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* johab[] =
|
|
||||||
{
|
|
||||||
"ˆa", "Œa", "<EFBFBD>a", "”a", "˜a",
|
|
||||||
"œa", " a", "¤a", "¨a", "¬a",
|
|
||||||
"°a", "´a", "¸a", "¼a", "Àa",
|
|
||||||
"Äa", "?", "?", "?", ""
|
|
||||||
};
|
|
||||||
|
|
||||||
len = strlen((const char*) str);
|
|
||||||
|
|
||||||
if (len < 2)
|
|
||||||
return p;
|
|
||||||
|
|
||||||
high = str[0];
|
|
||||||
low = str[1];
|
|
||||||
|
|
||||||
if (!is_hangul(str))
|
|
||||||
{
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
high = (KStbl[(high - 0xb0) * 94 + low - 0xa1] >> 8) & 0x7c;
|
|
||||||
|
|
||||||
for (i = 0; johab[i][0]; i++)
|
|
||||||
{
|
|
||||||
low = (johab[i][0] & 0x7f);
|
|
||||||
|
|
||||||
if (low == high)
|
|
||||||
return (wansung[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
int under_han(const void * orig)
|
|
||||||
{
|
|
||||||
const BYTE * str = (const BYTE *) orig;
|
|
||||||
BYTE high, low;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
len = strlen((const char*) str);
|
|
||||||
|
|
||||||
if (len < 2)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (str[len - 1] == ')')
|
|
||||||
{
|
|
||||||
while (str[len] != '(')
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
high = str[len - 2];
|
|
||||||
low = str[len - 1];
|
|
||||||
|
|
||||||
if (!is_hangul(&str[len - 2]))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
high = KStbl[(high - 0xb0) * 94 + low - 0xa1] & 0x1f;
|
|
||||||
|
|
||||||
if (high < 2)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (high > 28)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -1,335 +0,0 @@
|
||||||
/*
|
|
||||||
* Filename: kstbl.c
|
|
||||||
* Description: 아래 설명 대로다.
|
|
||||||
*
|
|
||||||
* Author: 비엽 aka. Cronan
|
|
||||||
*/
|
|
||||||
#define __LIBTHECORE__
|
|
||||||
unsigned KStbl[2350] =
|
|
||||||
{
|
|
||||||
/* KS 완성형 2350자의 조합형 코드 */
|
|
||||||
0x8861,0x8862,0x8865,0x8868,0x8869,0x886a,0x886b,0x8871,
|
|
||||||
0x8873,0x8874,0x8875,0x8876,0x8877,0x8878,0x8879,0x887b,
|
|
||||||
0x887c,0x887d,0x8881,0x8882,0x8885,0x8889,0x8891,0x8893,
|
|
||||||
0x8895,0x8896,0x8897,0x88a1,0x88a2,0x88a5,0x88a9,0x88b5,
|
|
||||||
0x88b7,0x88c1,0x88c5,0x88c9,0x88e1,0x88e2,0x88e5,0x88e8,
|
|
||||||
0x88e9,0x88eb,0x88f1,0x88f3,0x88f5,0x88f6,0x88f7,0x88f8,
|
|
||||||
0x88fb,0x88fc,0x88fd,0x8941,0x8945,0x8949,0x8951,0x8953,
|
|
||||||
0x8955,0x8956,0x8957,0x8961,0x8962,0x8963,0x8965,0x8968,
|
|
||||||
0x8969,0x8971,0x8973,0x8975,0x8976,0x8977,0x897b,0x8981,
|
|
||||||
0x8985,0x8989,0x8993,0x8995,0x89a1,0x89a2,0x89a5,0x89a8,
|
|
||||||
0x89a9,0x89ab,0x89ad,0x89b0,0x89b1,0x89b3,0x89b5,0x89b7,
|
|
||||||
0x89b8,0x89c1,0x89c2,0x89c5,0x89c9,0x89cb,
|
|
||||||
|
|
||||||
0x89d1,0x89d3,0x89d5,0x89d7,0x89e1,0x89e5,0x89e9,0x89f1,
|
|
||||||
0x89f6,0x89f7,0x8a41,0x8a42,0x8a45,0x8a49,0x8a51,0x8a53,
|
|
||||||
0x8a55,0x8a57,0x8a61,0x8a65,0x8a69,0x8a73,0x8a75,0x8a81,
|
|
||||||
0x8a82,0x8a85,0x8a88,0x8a89,0x8a8a,0x8a8b,0x8a90,0x8a91,
|
|
||||||
0x8a93,0x8a95,0x8a97,0x8a98,0x8aa1,0x8aa2,0x8aa5,0x8aa9,
|
|
||||||
0x8ab6,0x8ab7,0x8ac1,0x8ad5,0x8ae1,0x8ae2,0x8ae5,0x8ae9,
|
|
||||||
0x8af1,0x8af3,0x8af5,0x8b41,0x8b45,0x8b49,0x8b61,0x8b62,
|
|
||||||
0x8b65,0x8b68,0x8b69,0x8b6a,0x8b71,0x8b73,0x8b75,0x8b77,
|
|
||||||
0x8b81,0x8ba1,0x8ba2,0x8ba5,0x8ba8,0x8ba9,0x8bab,0x8bb1,
|
|
||||||
0x8bb3,0x8bb5,0x8bb7,0x8bb8,0x8bbc,0x8c61,0x8c62,0x8c63,
|
|
||||||
0x8c65,0x8c69,0x8c6b,0x8c71,0x8c73,0x8c75,0x8c76,0x8c77,
|
|
||||||
0x8c7b,0x8c81,0x8c82,0x8c85,0x8c89,0x8c91,
|
|
||||||
|
|
||||||
0x8c93,0x8c95,0x8c96,0x8c97,0x8ca1,0x8ca2,0x8ca9,0x8ce1,
|
|
||||||
0x8ce2,0x8ce3,0x8ce5,0x8ce9,0x8cf1,0x8cf3,0x8cf5,0x8cf6,
|
|
||||||
0x8cf7,0x8d41,0x8d42,0x8d45,0x8d51,0x8d55,0x8d57,0x8d61,
|
|
||||||
0x8d65,0x8d69,0x8d75,0x8d76,0x8d7b,0x8d81,0x8da1,0x8da2,
|
|
||||||
0x8da5,0x8da7,0x8da9,0x8db1,0x8db3,0x8db5,0x8db7,0x8db8,
|
|
||||||
0x8db9,0x8dc1,0x8dc2,0x8dc9,0x8dd6,0x8dd7,0x8de1,0x8de2,
|
|
||||||
0x8df7,0x8e41,0x8e45,0x8e49,0x8e51,0x8e53,0x8e57,0x8e61,
|
|
||||||
0x8e81,0x8e82,0x8e85,0x8e89,0x8e90,0x8e91,0x8e93,0x8e95,
|
|
||||||
0x8e97,0x8e98,0x8ea1,0x8ea9,0x8eb6,0x8eb7,0x8ec1,0x8ec2,
|
|
||||||
0x8ec5,0x8ec9,0x8ed1,0x8ed3,0x8ed6,0x8ee1,0x8ee5,0x8ee9,
|
|
||||||
0x8ef1,0x8ef3,0x8f41,0x8f61,0x8f62,0x8f65,0x8f67,0x8f69,
|
|
||||||
0x8f6b,0x8f70,0x8f71,0x8f73,0x8f75,0x8f77,
|
|
||||||
|
|
||||||
0x8f7b,0x8fa1,0x8fa2,0x8fa5,0x8fa9,0x8fb1,0x8fb3,0x8fb5,
|
|
||||||
0x8fb7,0x9061,0x9062,0x9063,0x9065,0x9068,0x9069,0x906a,
|
|
||||||
0x906b,0x9071,0x9073,0x9075,0x9076,0x9077,0x9078,0x9079,
|
|
||||||
0x907b,0x907d,0x9081,0x9082,0x9085,0x9089,0x9091,0x9093,
|
|
||||||
0x9095,0x9096,0x9097,0x90a1,0x90a2,0x90a5,0x90a9,0x90b1,
|
|
||||||
0x90b7,0x90e1,0x90e2,0x90e4,0x90e5,0x90e9,0x90eb,0x90ec,
|
|
||||||
0x90f1,0x90f3,0x90f5,0x90f6,0x90f7,0x90fd,0x9141,0x9142,
|
|
||||||
0x9145,0x9149,0x9151,0x9153,0x9155,0x9156,0x9157,0x9161,
|
|
||||||
0x9162,0x9165,0x9169,0x9171,0x9173,0x9176,0x9177,0x917a,
|
|
||||||
0x9181,0x9185,0x91a1,0x91a2,0x91a5,0x91a9,0x91ab,0x91b1,
|
|
||||||
0x91b3,0x91b5,0x91b7,0x91bc,0x91bd,0x91c1,0x91c5,0x91c9,
|
|
||||||
0x91d6,0x9241,0x9245,0x9249,0x9251,0x9253,
|
|
||||||
|
|
||||||
0x9255,0x9261,0x9262,0x9265,0x9269,0x9273,0x9275,0x9277,
|
|
||||||
0x9281,0x9282,0x9285,0x9288,0x9289,0x9291,0x9293,0x9295,
|
|
||||||
0x9297,0x92a1,0x92b6,0x92c1,0x92e1,0x92e5,0x92e9,0x92f1,
|
|
||||||
0x92f3,0x9341,0x9342,0x9349,0x9351,0x9353,0x9357,0x9361,
|
|
||||||
0x9362,0x9365,0x9369,0x936a,0x936b,0x9371,0x9373,0x9375,
|
|
||||||
0x9377,0x9378,0x937c,0x9381,0x9385,0x9389,0x93a1,0x93a2,
|
|
||||||
0x93a5,0x93a9,0x93af,0x93b1,0x93b3,0x93b5,0x93b7,0x93bc,
|
|
||||||
0x9461,0x9462,0x9463,0x9465,0x9468,0x9469,0x946a,0x946b,
|
|
||||||
0x946c,0x9470,0x9471,0x9473,0x9475,0x9476,0x9477,0x9478,
|
|
||||||
0x9479,0x947d,0x9481,0x9482,0x9485,0x9489,0x9491,0x9493,
|
|
||||||
0x9495,0x9496,0x9497,0x94a1,0x94e1,0x94e2,0x94e3,0x94e5,
|
|
||||||
0x94e8,0x94e9,0x94eb,0x94ec,0x94f1,0x94f3,
|
|
||||||
|
|
||||||
0x94f5,0x94f7,0x94f9,0x94fc,0x9541,0x9542,0x9545,0x9549,
|
|
||||||
0x9551,0x9553,0x9555,0x9556,0x9557,0x9561,0x9565,0x9569,
|
|
||||||
0x9576,0x9577,0x9581,0x9585,0x95a1,0x95a2,0x95a5,0x95a8,
|
|
||||||
0x95a9,0x95ab,0x95ad,0x95b1,0x95b3,0x95b5,0x95b7,0x95b9,
|
|
||||||
0x95bb,0x95c1,0x95c5,0x95c9,0x95e1,0x95f6,0x9641,0x9645,
|
|
||||||
0x9649,0x9651,0x9653,0x9655,0x9661,0x9681,0x9682,0x9685,
|
|
||||||
0x9689,0x9691,0x9693,0x9695,0x9697,0x96a1,0x96b6,0x96c1,
|
|
||||||
0x96d7,0x96e1,0x96e5,0x96e9,0x96f3,0x96f5,0x96f7,0x9741,
|
|
||||||
0x9745,0x9749,0x9751,0x9757,0x9761,0x9762,0x9765,0x9768,
|
|
||||||
0x9769,0x976b,0x9771,0x9773,0x9775,0x9777,0x9781,0x97a1,
|
|
||||||
0x97a2,0x97a5,0x97a8,0x97a9,0x97b1,0x97b3,0x97b5,0x97b6,
|
|
||||||
0x97b7,0x97b8,0x9861,0x9862,0x9865,0x9869,
|
|
||||||
|
|
||||||
0x9871,0x9873,0x9875,0x9876,0x9877,0x987d,0x9881,0x9882,
|
|
||||||
0x9885,0x9889,0x9891,0x9893,0x9895,0x9896,0x9897,0x98e1,
|
|
||||||
0x98e2,0x98e5,0x98e9,0x98eb,0x98ec,0x98f1,0x98f3,0x98f5,
|
|
||||||
0x98f6,0x98f7,0x98fd,0x9941,0x9942,0x9945,0x9949,0x9951,
|
|
||||||
0x9953,0x9955,0x9956,0x9957,0x9961,0x9976,0x99a1,0x99a2,
|
|
||||||
0x99a5,0x99a9,0x99b7,0x99c1,0x99c9,0x99e1,0x9a41,0x9a45,
|
|
||||||
0x9a81,0x9a82,0x9a85,0x9a89,0x9a90,0x9a91,0x9a97,0x9ac1,
|
|
||||||
0x9ae1,0x9ae5,0x9ae9,0x9af1,0x9af3,0x9af7,0x9b61,0x9b62,
|
|
||||||
0x9b65,0x9b68,0x9b69,0x9b71,0x9b73,0x9b75,0x9b81,0x9b85,
|
|
||||||
0x9b89,0x9b91,0x9b93,0x9ba1,0x9ba5,0x9ba9,0x9bb1,0x9bb3,
|
|
||||||
0x9bb5,0x9bb7,0x9c61,0x9c62,0x9c65,0x9c69,0x9c71,0x9c73,
|
|
||||||
0x9c75,0x9c76,0x9c77,0x9c78,0x9c7c,0x9c7d,
|
|
||||||
|
|
||||||
0x9c81,0x9c82,0x9c85,0x9c89,0x9c91,0x9c93,0x9c95,0x9c96,
|
|
||||||
0x9c97,0x9ca1,0x9ca2,0x9ca5,0x9cb5,0x9cb7,0x9ce1,0x9ce2,
|
|
||||||
0x9ce5,0x9ce9,0x9cf1,0x9cf3,0x9cf5,0x9cf6,0x9cf7,0x9cfd,
|
|
||||||
0x9d41,0x9d42,0x9d45,0x9d49,0x9d51,0x9d53,0x9d55,0x9d57,
|
|
||||||
0x9d61,0x9d62,0x9d65,0x9d69,0x9d71,0x9d73,0x9d75,0x9d76,
|
|
||||||
0x9d77,0x9d81,0x9d85,0x9d93,0x9d95,0x9da1,0x9da2,0x9da5,
|
|
||||||
0x9da9,0x9db1,0x9db3,0x9db5,0x9db7,0x9dc1,0x9dc5,0x9dd7,
|
|
||||||
0x9df6,0x9e41,0x9e45,0x9e49,0x9e51,0x9e53,0x9e55,0x9e57,
|
|
||||||
0x9e61,0x9e65,0x9e69,0x9e73,0x9e75,0x9e77,0x9e81,0x9e82,
|
|
||||||
0x9e85,0x9e89,0x9e91,0x9e93,0x9e95,0x9e97,0x9ea1,0x9eb6,
|
|
||||||
0x9ec1,0x9ee1,0x9ee2,0x9ee5,0x9ee9,0x9ef1,0x9ef5,0x9ef7,
|
|
||||||
0x9f41,0x9f42,0x9f45,0x9f49,0x9f51,0x9f53,
|
|
||||||
|
|
||||||
0x9f55,0x9f57,0x9f61,0x9f62,0x9f65,0x9f69,0x9f71,0x9f73,
|
|
||||||
0x9f75,0x9f77,0x9f78,0x9f7b,0x9f7c,0x9fa1,0x9fa2,0x9fa5,
|
|
||||||
0x9fa9,0x9fb1,0x9fb3,0x9fb5,0x9fb7,0xa061,0xa062,0xa065,
|
|
||||||
0xa067,0xa068,0xa069,0xa06a,0xa06b,0xa071,0xa073,0xa075,
|
|
||||||
0xa077,0xa078,0xa07b,0xa07d,0xa081,0xa082,0xa085,0xa089,
|
|
||||||
0xa091,0xa093,0xa095,0xa096,0xa097,0xa098,0xa0a1,0xa0a2,
|
|
||||||
0xa0a9,0xa0b7,0xa0e1,0xa0e2,0xa0e5,0xa0e9,0xa0eb,0xa0f1,
|
|
||||||
0xa0f3,0xa0f5,0xa0f7,0xa0f8,0xa0fd,0xa141,0xa142,0xa145,
|
|
||||||
0xa149,0xa151,0xa153,0xa155,0xa156,0xa157,0xa161,0xa162,
|
|
||||||
0xa165,0xa169,0xa175,0xa176,0xa177,0xa179,0xa181,0xa1a1,
|
|
||||||
0xa1a2,0xa1a4,0xa1a5,0xa1a9,0xa1ab,0xa1b1,0xa1b3,0xa1b5,
|
|
||||||
0xa1b7,0xa1c1,0xa1c5,0xa1d6,0xa1d7,0xa241,
|
|
||||||
|
|
||||||
0xa245,0xa249,0xa253,0xa255,0xa257,0xa261,0xa265,0xa269,
|
|
||||||
0xa273,0xa275,0xa281,0xa282,0xa283,0xa285,0xa288,0xa289,
|
|
||||||
0xa28a,0xa28b,0xa291,0xa293,0xa295,0xa297,0xa29b,0xa29d,
|
|
||||||
0xa2a1,0xa2a5,0xa2a9,0xa2b3,0xa2b5,0xa2c1,0xa2e1,0xa2e5,
|
|
||||||
0xa2e9,0xa341,0xa345,0xa349,0xa351,0xa355,0xa361,0xa365,
|
|
||||||
0xa369,0xa371,0xa375,0xa3a1,0xa3a2,0xa3a5,0xa3a8,0xa3a9,
|
|
||||||
0xa3ab,0xa3b1,0xa3b3,0xa3b5,0xa3b6,0xa3b7,0xa3b9,0xa3bb,
|
|
||||||
0xa461,0xa462,0xa463,0xa464,0xa465,0xa468,0xa469,0xa46a,
|
|
||||||
0xa46b,0xa46c,0xa471,0xa473,0xa475,0xa477,0xa47b,0xa481,
|
|
||||||
0xa482,0xa485,0xa489,0xa491,0xa493,0xa495,0xa496,0xa497,
|
|
||||||
0xa49b,0xa4a1,0xa4a2,0xa4a5,0xa4b3,0xa4e1,0xa4e2,0xa4e5,
|
|
||||||
0xa4e8,0xa4e9,0xa4eb,0xa4f1,0xa4f3,0xa4f5,
|
|
||||||
|
|
||||||
0xa4f7,0xa4f8,0xa541,0xa542,0xa545,0xa548,0xa549,0xa551,
|
|
||||||
0xa553,0xa555,0xa556,0xa557,0xa561,0xa562,0xa565,0xa569,
|
|
||||||
0xa573,0xa575,0xa576,0xa577,0xa57b,0xa581,0xa585,0xa5a1,
|
|
||||||
0xa5a2,0xa5a3,0xa5a5,0xa5a9,0xa5b1,0xa5b3,0xa5b5,0xa5b7,
|
|
||||||
0xa5c1,0xa5c5,0xa5d6,0xa5e1,0xa5f6,0xa641,0xa642,0xa645,
|
|
||||||
0xa649,0xa651,0xa653,0xa661,0xa665,0xa681,0xa682,0xa685,
|
|
||||||
0xa688,0xa689,0xa68a,0xa68b,0xa691,0xa693,0xa695,0xa697,
|
|
||||||
0xa69b,0xa69c,0xa6a1,0xa6a9,0xa6b6,0xa6c1,0xa6e1,0xa6e2,
|
|
||||||
0xa6e5,0xa6e9,0xa6f7,0xa741,0xa745,0xa749,0xa751,0xa755,
|
|
||||||
0xa757,0xa761,0xa762,0xa765,0xa769,0xa771,0xa773,0xa775,
|
|
||||||
0xa7a1,0xa7a2,0xa7a5,0xa7a9,0xa7ab,0xa7b1,0xa7b3,0xa7b5,
|
|
||||||
0xa7b7,0xa7b8,0xa7b9,0xa861,0xa862,0xa865,
|
|
||||||
|
|
||||||
0xa869,0xa86b,0xa871,0xa873,0xa875,0xa876,0xa877,0xa87d,
|
|
||||||
0xa881,0xa882,0xa885,0xa889,0xa891,0xa893,0xa895,0xa896,
|
|
||||||
0xa897,0xa8a1,0xa8a2,0xa8b1,0xa8e1,0xa8e2,0xa8e5,0xa8e8,
|
|
||||||
0xa8e9,0xa8f1,0xa8f5,0xa8f6,0xa8f7,0xa941,0xa957,0xa961,
|
|
||||||
0xa962,0xa971,0xa973,0xa975,0xa976,0xa977,0xa9a1,0xa9a2,
|
|
||||||
0xa9a5,0xa9a9,0xa9b1,0xa9b3,0xa9b7,0xaa41,0xaa61,0xaa77,
|
|
||||||
0xaa81,0xaa82,0xaa85,0xaa89,0xaa91,0xaa95,0xaa97,0xab41,
|
|
||||||
0xab57,0xab61,0xab65,0xab69,0xab71,0xab73,0xaba1,0xaba2,
|
|
||||||
0xaba5,0xaba9,0xabb1,0xabb3,0xabb5,0xabb7,0xac61,0xac62,
|
|
||||||
0xac64,0xac65,0xac68,0xac69,0xac6a,0xac6b,0xac71,0xac73,
|
|
||||||
0xac75,0xac76,0xac77,0xac7b,0xac81,0xac82,0xac85,0xac89,
|
|
||||||
0xac91,0xac93,0xac95,0xac96,0xac97,0xaca1,
|
|
||||||
|
|
||||||
0xaca2,0xaca5,0xaca9,0xacb1,0xacb3,0xacb5,0xacb7,0xacc1,
|
|
||||||
0xacc5,0xacc9,0xacd1,0xacd7,0xace1,0xace2,0xace3,0xace4,
|
|
||||||
0xace5,0xace8,0xace9,0xaceb,0xacec,0xacf1,0xacf3,0xacf5,
|
|
||||||
0xacf6,0xacf7,0xacfc,0xad41,0xad42,0xad45,0xad49,0xad51,
|
|
||||||
0xad53,0xad55,0xad56,0xad57,0xad61,0xad62,0xad65,0xad69,
|
|
||||||
0xad71,0xad73,0xad75,0xad76,0xad77,0xad81,0xad85,0xad89,
|
|
||||||
0xad97,0xada1,0xada2,0xada3,0xada5,0xada9,0xadab,0xadb1,
|
|
||||||
0xadb3,0xadb5,0xadb7,0xadbb,0xadc1,0xadc2,0xadc5,0xadc9,
|
|
||||||
0xadd7,0xade1,0xade5,0xade9,0xadf1,0xadf5,0xadf6,0xae41,
|
|
||||||
0xae45,0xae49,0xae51,0xae53,0xae55,0xae61,0xae62,0xae65,
|
|
||||||
0xae69,0xae71,0xae73,0xae75,0xae77,0xae81,0xae82,0xae85,
|
|
||||||
0xae88,0xae89,0xae91,0xae93,0xae95,0xae97,
|
|
||||||
|
|
||||||
0xae99,0xae9b,0xae9c,0xaea1,0xaeb6,0xaec1,0xaec2,0xaec5,
|
|
||||||
0xaec9,0xaed1,0xaed7,0xaee1,0xaee2,0xaee5,0xaee9,0xaef1,
|
|
||||||
0xaef3,0xaef5,0xaef7,0xaf41,0xaf42,0xaf49,0xaf51,0xaf55,
|
|
||||||
0xaf57,0xaf61,0xaf62,0xaf65,0xaf69,0xaf6a,0xaf71,0xaf73,
|
|
||||||
0xaf75,0xaf77,0xafa1,0xafa2,0xafa5,0xafa8,0xafa9,0xafb0,
|
|
||||||
0xafb1,0xafb3,0xafb5,0xafb7,0xafbc,0xb061,0xb062,0xb064,
|
|
||||||
0xb065,0xb069,0xb071,0xb073,0xb076,0xb077,0xb07d,0xb081,
|
|
||||||
0xb082,0xb085,0xb089,0xb091,0xb093,0xb096,0xb097,0xb0b7,
|
|
||||||
0xb0e1,0xb0e2,0xb0e5,0xb0e9,0xb0eb,0xb0f1,0xb0f3,0xb0f6,
|
|
||||||
0xb0f7,0xb141,0xb145,0xb149,0xb157,0xb1a1,0xb1a2,0xb1a5,
|
|
||||||
0xb1a8,0xb1a9,0xb1ab,0xb1b1,0xb1b3,0xb1b7,0xb1c1,0xb1c2,
|
|
||||||
0xb1c5,0xb1d6,0xb1e1,0xb1f6,0xb241,0xb245,
|
|
||||||
|
|
||||||
0xb249,0xb251,0xb253,0xb261,0xb281,0xb282,0xb285,0xb289,
|
|
||||||
0xb291,0xb293,0xb297,0xb2a1,0xb2b6,0xb2c1,0xb2e1,0xb2e5,
|
|
||||||
0xb357,0xb361,0xb362,0xb365,0xb369,0xb36b,0xb370,0xb371,
|
|
||||||
0xb373,0xb381,0xb385,0xb389,0xb391,0xb3a1,0xb3a2,0xb3a5,
|
|
||||||
0xb3a9,0xb3b1,0xb3b3,0xb3b5,0xb3b7,0xb461,0xb462,0xb465,
|
|
||||||
0xb466,0xb467,0xb469,0xb46a,0xb46b,0xb470,0xb471,0xb473,
|
|
||||||
0xb475,0xb476,0xb477,0xb47b,0xb47c,0xb481,0xb482,0xb485,
|
|
||||||
0xb489,0xb491,0xb493,0xb495,0xb496,0xb497,0xb4a1,0xb4a2,
|
|
||||||
0xb4a5,0xb4a9,0xb4ac,0xb4b1,0xb4b3,0xb4b5,0xb4b7,0xb4bb,
|
|
||||||
0xb4bd,0xb4c1,0xb4c5,0xb4c9,0xb4d3,0xb4e1,0xb4e2,0xb4e5,
|
|
||||||
0xb4e6,0xb4e8,0xb4e9,0xb4ea,0xb4eb,0xb4f1,0xb4f3,0xb4f4,
|
|
||||||
0xb4f5,0xb4f6,0xb4f7,0xb4f8,0xb4fa,0xb4fc,
|
|
||||||
|
|
||||||
0xb541,0xb542,0xb545,0xb549,0xb551,0xb553,0xb555,0xb557,
|
|
||||||
0xb561,0xb562,0xb563,0xb565,0xb569,0xb56b,0xb56c,0xb571,
|
|
||||||
0xb573,0xb574,0xb575,0xb576,0xb577,0xb57b,0xb57c,0xb57d,
|
|
||||||
0xb581,0xb585,0xb589,0xb591,0xb593,0xb595,0xb596,0xb5a1,
|
|
||||||
0xb5a2,0xb5a5,0xb5a9,0xb5aa,0xb5ab,0xb5ad,0xb5b0,0xb5b1,
|
|
||||||
0xb5b3,0xb5b5,0xb5b7,0xb5b9,0xb5c1,0xb5c2,0xb5c5,0xb5c9,
|
|
||||||
0xb5d1,0xb5d3,0xb5d5,0xb5d6,0xb5d7,0xb5e1,0xb5e2,0xb5e5,
|
|
||||||
0xb5f1,0xb5f5,0xb5f7,0xb641,0xb642,0xb645,0xb649,0xb651,
|
|
||||||
0xb653,0xb655,0xb657,0xb661,0xb662,0xb665,0xb669,0xb671,
|
|
||||||
0xb673,0xb675,0xb677,0xb681,0xb682,0xb685,0xb689,0xb68a,
|
|
||||||
0xb68b,0xb691,0xb693,0xb695,0xb697,0xb6a1,0xb6a2,0xb6a5,
|
|
||||||
0xb6a9,0xb6b1,0xb6b3,0xb6b6,0xb6b7,0xb6c1,
|
|
||||||
|
|
||||||
0xb6c2,0xb6c5,0xb6c9,0xb6d1,0xb6d3,0xb6d7,0xb6e1,0xb6e2,
|
|
||||||
0xb6e5,0xb6e9,0xb6f1,0xb6f3,0xb6f5,0xb6f7,0xb741,0xb742,
|
|
||||||
0xb745,0xb749,0xb751,0xb753,0xb755,0xb757,0xb759,0xb761,
|
|
||||||
0xb762,0xb765,0xb769,0xb76f,0xb771,0xb773,0xb775,0xb777,
|
|
||||||
0xb778,0xb779,0xb77a,0xb77b,0xb77c,0xb77d,0xb781,0xb785,
|
|
||||||
0xb789,0xb791,0xb795,0xb7a1,0xb7a2,0xb7a5,0xb7a9,0xb7aa,
|
|
||||||
0xb7ab,0xb7b0,0xb7b1,0xb7b3,0xb7b5,0xb7b6,0xb7b7,0xb7b8,
|
|
||||||
0xb7bc,0xb861,0xb862,0xb865,0xb867,0xb868,0xb869,0xb86b,
|
|
||||||
0xb871,0xb873,0xb875,0xb876,0xb877,0xb878,0xb881,0xb882,
|
|
||||||
0xb885,0xb889,0xb891,0xb893,0xb895,0xb896,0xb897,0xb8a1,
|
|
||||||
0xb8a2,0xb8a5,0xb8a7,0xb8a9,0xb8b1,0xb8b7,0xb8c1,0xb8c5,
|
|
||||||
0xb8c9,0xb8e1,0xb8e2,0xb8e5,0xb8e9,0xb8eb,
|
|
||||||
|
|
||||||
0xb8f1,0xb8f3,0xb8f5,0xb8f7,0xb8f8,0xb941,0xb942,0xb945,
|
|
||||||
0xb949,0xb951,0xb953,0xb955,0xb957,0xb961,0xb965,0xb969,
|
|
||||||
0xb971,0xb973,0xb976,0xb977,0xb981,0xb9a1,0xb9a2,0xb9a5,
|
|
||||||
0xb9a9,0xb9ab,0xb9b1,0xb9b3,0xb9b5,0xb9b7,0xb9b8,0xb9b9,
|
|
||||||
0xb9bd,0xb9c1,0xb9c2,0xb9c9,0xb9d3,0xb9d5,0xb9d7,0xb9e1,
|
|
||||||
0xb9f6,0xb9f7,0xba41,0xba45,0xba49,0xba51,0xba53,0xba55,
|
|
||||||
0xba57,0xba61,0xba62,0xba65,0xba77,0xba81,0xba82,0xba85,
|
|
||||||
0xba89,0xba8a,0xba8b,0xba91,0xba93,0xba95,0xba97,0xbaa1,
|
|
||||||
0xbab6,0xbac1,0xbae1,0xbae2,0xbae5,0xbae9,0xbaf1,0xbaf3,
|
|
||||||
0xbaf5,0xbb41,0xbb45,0xbb49,0xbb51,0xbb61,0xbb62,0xbb65,
|
|
||||||
0xbb69,0xbb71,0xbb73,0xbb75,0xbb77,0xbba1,0xbba2,0xbba5,
|
|
||||||
0xbba8,0xbba9,0xbbab,0xbbb1,0xbbb3,0xbbb5,
|
|
||||||
|
|
||||||
0xbbb7,0xbbb8,0xbbbb,0xbbbc,0xbc61,0xbc62,0xbc65,0xbc67,
|
|
||||||
0xbc69,0xbc6c,0xbc71,0xbc73,0xbc75,0xbc76,0xbc77,0xbc81,
|
|
||||||
0xbc82,0xbc85,0xbc89,0xbc91,0xbc93,0xbc95,0xbc96,0xbc97,
|
|
||||||
0xbca1,0xbca5,0xbcb7,0xbce1,0xbce2,0xbce5,0xbce9,0xbcf1,
|
|
||||||
0xbcf3,0xbcf5,0xbcf6,0xbcf7,0xbd41,0xbd57,0xbd61,0xbd76,
|
|
||||||
0xbda1,0xbda2,0xbda5,0xbda9,0xbdb1,0xbdb3,0xbdb5,0xbdb7,
|
|
||||||
0xbdb9,0xbdc1,0xbdc2,0xbdc9,0xbdd6,0xbde1,0xbdf6,0xbe41,
|
|
||||||
0xbe45,0xbe49,0xbe51,0xbe53,0xbe77,0xbe81,0xbe82,0xbe85,
|
|
||||||
0xbe89,0xbe91,0xbe93,0xbe97,0xbea1,0xbeb6,0xbeb7,0xbee1,
|
|
||||||
0xbf41,0xbf61,0xbf71,0xbf75,0xbf77,0xbfa1,0xbfa2,0xbfa5,
|
|
||||||
0xbfa9,0xbfb1,0xbfb3,0xbfb7,0xbfb8,0xbfbd,0xc061,0xc062,
|
|
||||||
0xc065,0xc067,0xc069,0xc071,0xc073,0xc075,
|
|
||||||
|
|
||||||
0xc076,0xc077,0xc078,0xc081,0xc082,0xc085,0xc089,0xc091,
|
|
||||||
0xc093,0xc095,0xc096,0xc097,0xc0a1,0xc0a5,0xc0a7,0xc0a9,
|
|
||||||
0xc0b1,0xc0b7,0xc0e1,0xc0e2,0xc0e5,0xc0e9,0xc0f1,0xc0f3,
|
|
||||||
0xc0f5,0xc0f6,0xc0f7,0xc141,0xc142,0xc145,0xc149,0xc151,
|
|
||||||
0xc153,0xc155,0xc157,0xc161,0xc165,0xc176,0xc181,0xc185,
|
|
||||||
0xc197,0xc1a1,0xc1a2,0xc1a5,0xc1a9,0xc1b1,0xc1b3,0xc1b5,
|
|
||||||
0xc1b7,0xc1c1,0xc1c5,0xc1c9,0xc1d7,0xc241,0xc245,0xc249,
|
|
||||||
0xc251,0xc253,0xc255,0xc257,0xc261,0xc271,0xc281,0xc282,
|
|
||||||
0xc285,0xc289,0xc291,0xc293,0xc295,0xc297,0xc2a1,0xc2b6,
|
|
||||||
0xc2c1,0xc2c5,0xc2e1,0xc2e5,0xc2e9,0xc2f1,0xc2f3,0xc2f5,
|
|
||||||
0xc2f7,0xc341,0xc345,0xc349,0xc351,0xc357,0xc361,0xc362,
|
|
||||||
0xc365,0xc369,0xc371,0xc373,0xc375,0xc377,
|
|
||||||
|
|
||||||
0xc3a1,0xc3a2,0xc3a5,0xc3a8,0xc3a9,0xc3aa,0xc3b1,0xc3b3,
|
|
||||||
0xc3b5,0xc3b7,0xc461,0xc462,0xc465,0xc469,0xc471,0xc473,
|
|
||||||
0xc475,0xc477,0xc481,0xc482,0xc485,0xc489,0xc491,0xc493,
|
|
||||||
0xc495,0xc496,0xc497,0xc4a1,0xc4a2,0xc4b7,0xc4e1,0xc4e2,
|
|
||||||
0xc4e5,0xc4e8,0xc4e9,0xc4f1,0xc4f3,0xc4f5,0xc4f6,0xc4f7,
|
|
||||||
0xc541,0xc542,0xc545,0xc549,0xc551,0xc553,0xc555,0xc557,
|
|
||||||
0xc561,0xc565,0xc569,0xc571,0xc573,0xc575,0xc576,0xc577,
|
|
||||||
0xc581,0xc5a1,0xc5a2,0xc5a5,0xc5a9,0xc5b1,0xc5b3,0xc5b5,
|
|
||||||
0xc5b7,0xc5c1,0xc5c2,0xc5c5,0xc5c9,0xc5d1,0xc5d7,0xc5e1,
|
|
||||||
0xc5f7,0xc641,0xc649,0xc661,0xc681,0xc682,0xc685,0xc689,
|
|
||||||
0xc691,0xc693,0xc695,0xc697,0xc6a1,0xc6a5,0xc6a9,0xc6b7,
|
|
||||||
0xc6c1,0xc6d7,0xc6e1,0xc6e2,0xc6e5,0xc6e9,
|
|
||||||
|
|
||||||
0xc6f1,0xc6f3,0xc6f5,0xc6f7,0xc741,0xc745,0xc749,0xc751,
|
|
||||||
0xc761,0xc762,0xc765,0xc769,0xc771,0xc773,0xc777,0xc7a1,
|
|
||||||
0xc7a2,0xc7a5,0xc7a9,0xc7b1,0xc7b3,0xc7b5,0xc7b7,0xc861,
|
|
||||||
0xc862,0xc865,0xc869,0xc86a,0xc871,0xc873,0xc875,0xc876,
|
|
||||||
0xc877,0xc881,0xc882,0xc885,0xc889,0xc891,0xc893,0xc895,
|
|
||||||
0xc896,0xc897,0xc8a1,0xc8b7,0xc8e1,0xc8e2,0xc8e5,0xc8e9,
|
|
||||||
0xc8eb,0xc8f1,0xc8f3,0xc8f5,0xc8f6,0xc8f7,0xc941,0xc942,
|
|
||||||
0xc945,0xc949,0xc951,0xc953,0xc955,0xc957,0xc961,0xc965,
|
|
||||||
0xc976,0xc981,0xc985,0xc9a1,0xc9a2,0xc9a5,0xc9a9,0xc9b1,
|
|
||||||
0xc9b3,0xc9b5,0xc9b7,0xc9bc,0xc9c1,0xc9c5,0xc9e1,0xca41,
|
|
||||||
0xca45,0xca55,0xca57,0xca61,0xca81,0xca82,0xca85,0xca89,
|
|
||||||
0xca91,0xca93,0xca95,0xca97,0xcaa1,0xcab6,
|
|
||||||
|
|
||||||
0xcac1,0xcae1,0xcae2,0xcae5,0xcae9,0xcaf1,0xcaf3,0xcaf7,
|
|
||||||
0xcb41,0xcb45,0xcb49,0xcb51,0xcb57,0xcb61,0xcb62,0xcb65,
|
|
||||||
0xcb68,0xcb69,0xcb6b,0xcb71,0xcb73,0xcb75,0xcb81,0xcb85,
|
|
||||||
0xcb89,0xcb91,0xcb93,0xcba1,0xcba2,0xcba5,0xcba9,0xcbb1,
|
|
||||||
0xcbb3,0xcbb5,0xcbb7,0xcc61,0xcc62,0xcc63,0xcc65,0xcc69,
|
|
||||||
0xcc6b,0xcc71,0xcc73,0xcc75,0xcc76,0xcc77,0xcc7b,0xcc81,
|
|
||||||
0xcc82,0xcc85,0xcc89,0xcc91,0xcc93,0xcc95,0xcc96,0xcc97,
|
|
||||||
0xcca1,0xcca2,0xcce1,0xcce2,0xcce5,0xcce9,0xccf1,0xccf3,
|
|
||||||
0xccf5,0xccf6,0xccf7,0xcd41,0xcd42,0xcd45,0xcd49,0xcd51,
|
|
||||||
0xcd53,0xcd55,0xcd57,0xcd61,0xcd65,0xcd69,0xcd71,0xcd73,
|
|
||||||
0xcd76,0xcd77,0xcd81,0xcd89,0xcd93,0xcd95,0xcda1,0xcda2,
|
|
||||||
0xcda5,0xcda9,0xcdb1,0xcdb3,0xcdb5,0xcdb7,
|
|
||||||
|
|
||||||
0xcdc1,0xcdd7,0xce41,0xce45,0xce61,0xce65,0xce69,0xce73,
|
|
||||||
0xce75,0xce81,0xce82,0xce85,0xce88,0xce89,0xce8b,0xce91,
|
|
||||||
0xce93,0xce95,0xce97,0xcea1,0xceb7,0xcee1,0xcee5,0xcee9,
|
|
||||||
0xcef1,0xcef5,0xcf41,0xcf45,0xcf49,0xcf51,0xcf55,0xcf57,
|
|
||||||
0xcf61,0xcf65,0xcf69,0xcf71,0xcf73,0xcf75,0xcfa1,0xcfa2,
|
|
||||||
0xcfa5,0xcfa9,0xcfb1,0xcfb3,0xcfb5,0xcfb7,0xd061,0xd062,
|
|
||||||
0xd065,0xd069,0xd06e,0xd071,0xd073,0xd075,0xd077,0xd081,
|
|
||||||
0xd082,0xd085,0xd089,0xd091,0xd093,0xd095,0xd096,0xd097,
|
|
||||||
0xd0a1,0xd0b7,0xd0e1,0xd0e2,0xd0e5,0xd0e9,0xd0eb,0xd0f1,
|
|
||||||
0xd0f3,0xd0f5,0xd0f7,0xd141,0xd142,0xd145,0xd149,0xd151,
|
|
||||||
0xd153,0xd155,0xd157,0xd161,0xd162,0xd165,0xd169,0xd171,
|
|
||||||
0xd173,0xd175,0xd176,0xd177,0xd181,0xd185,
|
|
||||||
|
|
||||||
0xd189,0xd193,0xd1a1,0xd1a2,0xd1a5,0xd1a9,0xd1ae,0xd1b1,
|
|
||||||
0xd1b3,0xd1b5,0xd1b7,0xd1bb,0xd1c1,0xd1c2,0xd1c5,0xd1c9,
|
|
||||||
0xd1d5,0xd1d7,0xd1e1,0xd1e2,0xd1e5,0xd1f5,0xd1f7,0xd241,
|
|
||||||
0xd242,0xd245,0xd249,0xd253,0xd255,0xd257,0xd261,0xd265,
|
|
||||||
0xd269,0xd273,0xd275,0xd281,0xd282,0xd285,0xd289,0xd28e,
|
|
||||||
0xd291,0xd295,0xd297,0xd2a1,0xd2a5,0xd2a9,0xd2b1,0xd2b7,
|
|
||||||
0xd2c1,0xd2c2,0xd2c5,0xd2c9,0xd2d7,0xd2e1,0xd2e2,0xd2e5,
|
|
||||||
0xd2e9,0xd2f1,0xd2f3,0xd2f5,0xd2f7,0xd341,0xd342,0xd345,
|
|
||||||
0xd349,0xd351,0xd355,0xd357,0xd361,0xd362,0xd365,0xd367,
|
|
||||||
0xd368,0xd369,0xd36a,0xd371,0xd373,0xd375,0xd377,0xd37b,
|
|
||||||
0xd381,0xd385,0xd389,0xd391,0xd393,0xd397,0xd3a1,0xd3a2,
|
|
||||||
0xd3a5,0xd3a9,0xd3b1,0xd3b3,0xd3b5,0xd3b7
|
|
||||||
};
|
|
|
@ -61,8 +61,6 @@ int thecore_init(int fps, HEARTFUNC heartbeat_func)
|
||||||
if (!log_init() || !pid_init())
|
if (!log_init() || !pid_init())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
GOST_Init();
|
|
||||||
|
|
||||||
thecore_heart = heart_new(1000000 / fps, heartbeat_func);
|
thecore_heart = heart_new(1000000 / fps, heartbeat_func);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
/*
|
|
||||||
(c) Copyright 2000-2002 convergence integrated media GmbH.
|
|
||||||
(c) Copyright 2002 convergence GmbH.
|
|
||||||
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Written by Denis Oliver Kropp <dok@directfb.org>,
|
|
||||||
Andreas Hundt <andi@fischlustig.de> and
|
|
||||||
Sven Neumann <sven@convergence.de>.
|
|
||||||
|
|
||||||
Fast memcpy code was taken from xine (see below).
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2001 the xine project
|
|
||||||
*
|
|
||||||
* This file is part of xine, a unix video player.
|
|
||||||
*
|
|
||||||
* xine is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* xine is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
*
|
|
||||||
* These are the MMX/MMX2/SSE optimized versions of memcpy
|
|
||||||
*
|
|
||||||
* This code was adapted from Linux Kernel sources by Nick Kurshev to
|
|
||||||
* the mplayer program. (http://mplayer.sourceforge.net)
|
|
||||||
*
|
|
||||||
* Miguel Freitas split the #ifdefs into several specialized functions that
|
|
||||||
* are benchmarked at runtime by xine. Some original comments from Nick
|
|
||||||
* have been preserved documenting some MMX/SSE oddities.
|
|
||||||
* Also added kernel memcpy function that seems faster than glibc one.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Original comments from mplayer (file: aclib.c) This part of code
|
|
||||||
was taken by me from Linux-2.4.3 and slightly modified for MMX, MMX2,
|
|
||||||
SSE instruction set. I have done it since linux uses page aligned
|
|
||||||
blocks but mplayer uses weakly ordered data and original sources can
|
|
||||||
not speedup them. Only using PREFETCHNTA and MOVNTQ together have
|
|
||||||
effect!
|
|
||||||
|
|
||||||
From IA-32 Intel Architecture Software Developer's Manual Volume 1,
|
|
||||||
|
|
||||||
Order Number 245470:
|
|
||||||
"10.4.6. Cacheability Control, Prefetch, and Memory Ordering Instructions"
|
|
||||||
|
|
||||||
Data referenced by a program can be temporal (data will be used
|
|
||||||
again) or non-temporal (data will be referenced once and not reused
|
|
||||||
in the immediate future). To make efficient use of the processor's
|
|
||||||
caches, it is generally desirable to cache temporal data and not
|
|
||||||
cache non-temporal data. Overloading the processor's caches with
|
|
||||||
non-temporal data is sometimes referred to as "polluting the
|
|
||||||
caches". The non-temporal data is written to memory with
|
|
||||||
Write-Combining semantics.
|
|
||||||
|
|
||||||
The PREFETCHh instructions permits a program to load data into the
|
|
||||||
processor at a suggested cache level, so that it is closer to the
|
|
||||||
processors load and store unit when it is needed. If the data is
|
|
||||||
already present in a level of the cache hierarchy that is closer to
|
|
||||||
the processor, the PREFETCHh instruction will not result in any data
|
|
||||||
movement. But we should you PREFETCHNTA: Non-temporal data fetch
|
|
||||||
data into location close to the processor, minimizing cache
|
|
||||||
pollution.
|
|
||||||
|
|
||||||
The MOVNTQ (store quadword using non-temporal hint) instruction
|
|
||||||
stores packed integer data from an MMX register to memory, using a
|
|
||||||
non-temporal hint. The MOVNTPS (store packed single-precision
|
|
||||||
floating-point values using non-temporal hint) instruction stores
|
|
||||||
packed floating-point data from an XMM register to memory, using a
|
|
||||||
non-temporal hint.
|
|
||||||
|
|
||||||
The SFENCE (Store Fence) instruction controls write ordering by
|
|
||||||
creating a fence for memory store operations. This instruction
|
|
||||||
guarantees that the results of every store instruction that precedes
|
|
||||||
the store fence in program order is globally visible before any
|
|
||||||
store instruction that follows the fence. The SFENCE instruction
|
|
||||||
provides an efficient way of ensuring ordering between procedures
|
|
||||||
that produce weakly-ordered data and procedures that consume that
|
|
||||||
data.
|
|
||||||
|
|
||||||
If you have questions please contact with me: Nick Kurshev:
|
|
||||||
nickols_k@mail.ru.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* mmx v.1 Note: Since we added alignment of destinition it speedups
|
|
||||||
of memory copying on PentMMX, Celeron-1 and P2 upto 12% versus
|
|
||||||
standard (non MMX-optimized) version.
|
|
||||||
Note: on K6-2+ it speedups memory copying upto 25% and
|
|
||||||
on K7 and P3 about 500% (5 times).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Additional notes on gcc assembly and processors: [MF]
|
|
||||||
prefetch is specific for AMD processors, the intel ones should be
|
|
||||||
prefetch0, prefetch1, prefetch2 which are not recognized by my gcc.
|
|
||||||
prefetchnta is supported both on athlon and pentium 3.
|
|
||||||
|
|
||||||
therefore i will take off prefetchnta instructions from the mmx1
|
|
||||||
version to avoid problems on pentium mmx and k6-2.
|
|
||||||
|
|
||||||
quote of the day:
|
|
||||||
"Using prefetches efficiently is more of an art than a science"
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
void *(*thecore_memcpy) (void * to, const void * from, size_t len) = memcpy;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -266,7 +266,7 @@ socket_t socket_connect(const char* host, WORD port)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
thecore_memcpy((char* ) &server_addr.sin_addr, hp->h_addr, sizeof(server_addr.sin_addr));
|
memcpy((char* ) &server_addr.sin_addr, hp->h_addr, sizeof(server_addr.sin_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
server_addr.sin_family = AF_INET;
|
server_addr.sin_family = AF_INET;
|
||||||
|
|
|
@ -1,338 +0,0 @@
|
||||||
/*
|
|
||||||
* Filename: tea.c
|
|
||||||
* Description: TEA 암호화 모듈
|
|
||||||
*
|
|
||||||
* Author: 김한주 (aka. 비엽, Cronan), 송영진 (aka. myevan, 빗자루)
|
|
||||||
*/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TEA Encryption Module Instruction
|
|
||||||
* Edited by 김한주 aka. 비엽, Cronan
|
|
||||||
*
|
|
||||||
* void tea_code(const DWORD sz, const DWORD sy, const DWORD *key, DWORD *dest)
|
|
||||||
* void tea_decode(const DWORD sz, const DWORD sy, const DWORD *key, DWORD *dest)
|
|
||||||
* 8바이트를 암호/복호화 할때 사용된다. key 는 16 바이트여야 한다.
|
|
||||||
* sz, sy 는 8바이트의 역순으로 대입한다.
|
|
||||||
*
|
|
||||||
* int tea_decrypt(DWORD *dest, const DWORD *src, const DWORD *key, int size);
|
|
||||||
* int tea_encrypt(DWORD *dest, const DWORD *src, const DWORD *key, int size);
|
|
||||||
* 한꺼번에 8 바이트 이상을 암호/복호화 할때 사용한다. 만약 size 가
|
|
||||||
* 8의 배수가 아니면 8의 배수로 크기를 "늘려서" 암호화 한다.
|
|
||||||
*
|
|
||||||
* ex. tea_code(pdwSrc[1], pdwSrc[0], pdwKey, pdwDest);
|
|
||||||
* tea_decrypt(pdwDest, pdwSrc, pdwKey, nSize);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TEA_ROUND 32 // 32 를 권장하며, 높을 수록 결과가 난해해 진다.
|
|
||||||
#define DELTA 0x9E3779B9 // DELTA 값 바꾸지 말것.
|
|
||||||
|
|
||||||
char tea_nilbuf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
||||||
|
|
||||||
INLINE void tea_code(const DWORD sz, const DWORD sy, const DWORD *key, DWORD *dest)
|
|
||||||
{
|
|
||||||
register DWORD y = sy, z = sz, sum = 0;
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 1
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 2
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 3
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 4
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 5
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 6
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 7
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 8
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 9
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 10
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 11
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 12
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 13
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 14
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 15
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 16
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 17
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 18
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 19
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 20
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 21
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 22
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 23
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 24
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 25
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 26
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 27
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 28
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 29
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 30
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 31
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
y += ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]); // 32
|
|
||||||
sum += DELTA;
|
|
||||||
z += ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]);
|
|
||||||
|
|
||||||
*(dest++) = y;
|
|
||||||
*dest = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void tea_decode(const DWORD sz, const DWORD sy, const DWORD *key, DWORD *dest)
|
|
||||||
{
|
|
||||||
register DWORD y = sy, z = sz, sum = DELTA * TEA_ROUND;
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 1
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 2
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 3
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 4
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 5
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 6
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 7
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 8
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 9
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 10
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 11
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 12
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 13
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 14
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 15
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 16
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 17
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 18
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 19
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 20
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 21
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 22
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 23
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 24
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 25
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 26
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 27
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 28
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 29
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 30
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 31
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
z -= ((y << 4 ^ y >> 5) + y) ^ (sum + key[sum >> 11 & 3]); // 32
|
|
||||||
sum -= DELTA;
|
|
||||||
y -= ((z << 4 ^ z >> 5) + z) ^ (sum + key[sum & 3]);
|
|
||||||
|
|
||||||
*(dest++) = y;
|
|
||||||
*dest = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TEA_Encrypt(DWORD *dest, const DWORD *src, const DWORD * key, int size)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int resize;
|
|
||||||
|
|
||||||
if (size % 8 != 0)
|
|
||||||
{
|
|
||||||
resize = size + 8 - (size % 8);
|
|
||||||
memset((char *) src + size, 0, resize - size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
resize = size;
|
|
||||||
|
|
||||||
for (i = 0; i < resize >> 3; i++, dest += 2, src += 2)
|
|
||||||
tea_code(*(src + 1), *src, key, dest);
|
|
||||||
|
|
||||||
return (resize);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TEA_Decrypt(DWORD *dest, const DWORD *src, const DWORD * key, int size)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int resize;
|
|
||||||
|
|
||||||
if (size % 8 != 0)
|
|
||||||
resize = size + 8 - (size % 8);
|
|
||||||
else
|
|
||||||
resize = size;
|
|
||||||
|
|
||||||
for (i = 0; i < resize >> 3; i++, dest += 2, src += 2)
|
|
||||||
tea_decode(*(src + 1), *src, key, dest);
|
|
||||||
|
|
||||||
return (resize);
|
|
||||||
}
|
|
||||||
|
|
8682
libthecore/src/tea.s
8682
libthecore/src/tea.s
File diff suppressed because it is too large
Load Diff
|
@ -137,7 +137,7 @@ void trim_and_lower(const char * src, char * dest, size_t dest_size)
|
||||||
// 앞에 빈칸 건너 뛰기
|
// 앞에 빈칸 건너 뛰기
|
||||||
while (*tmp)
|
while (*tmp)
|
||||||
{
|
{
|
||||||
if (!isnhspace(*tmp))
|
if (!isspace(*tmp))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tmp++;
|
tmp++;
|
||||||
|
@ -160,7 +160,7 @@ void trim_and_lower(const char * src, char * dest, size_t dest_size)
|
||||||
// 뒤에 빈칸 지우기
|
// 뒤에 빈칸 지우기
|
||||||
--dest;
|
--dest;
|
||||||
|
|
||||||
while (*dest && isnhspace(*dest) && len--)
|
while (*dest && isspace(*dest) && len--)
|
||||||
*(dest--) = '\0';
|
*(dest--) = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ void parse_token(char *src, char *token, char *value)
|
||||||
|
|
||||||
for (tmp = src; *tmp && *tmp != ':'; tmp++)
|
for (tmp = src; *tmp && *tmp != ':'; tmp++)
|
||||||
{
|
{
|
||||||
if (isnhspace(*tmp))
|
if (isspace(*tmp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
*(token++) = LOWER(*tmp);
|
*(token++) = LOWER(*tmp);
|
||||||
|
@ -272,7 +272,7 @@ struct tm * tm_calc(const struct tm * curr_tm, int days)
|
||||||
new_tm = *localtime(&time_s);
|
new_tm = *localtime(&time_s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
thecore_memcpy(&new_tm, curr_tm, sizeof(struct tm));
|
memcpy(&new_tm, curr_tm, sizeof(struct tm));
|
||||||
|
|
||||||
if (new_tm.tm_mon == 1)
|
if (new_tm.tm_mon == 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,345 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#ifndef __FreeBSD__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* luau (Lib Update/Auto-Update): Simple Update Library
|
|
||||||
* Copyright (C) 2003 David Eklund
|
|
||||||
*
|
|
||||||
* - This library is free software; you can redistribute it and/or -
|
|
||||||
* - modify it under the terms of the GNU Lesser General Public -
|
|
||||||
* - License as published by the Free Software Foundation; either -
|
|
||||||
* - version 2.1 of the License, or (at your option) any later version. -
|
|
||||||
* - -
|
|
||||||
* - This library is distributed in the hope that it will be useful, -
|
|
||||||
* - but WITHOUT ANY WARRANTY; without even the implied warranty of -
|
|
||||||
* - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -
|
|
||||||
* - Lesser General Public License for more details. -
|
|
||||||
* - -
|
|
||||||
* - You should have received a copy of the GNU Lesser General Public -
|
|
||||||
* - License along with this library; if not, write to the Free Software -
|
|
||||||
* - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* md5.h and md5.c are based off of md5hl.c, md5c.c, and md5.h from libmd, which in turn is
|
|
||||||
* based off the FreeBSD libmd library. Their respective copyright notices follow:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This code implements the MD5 message-digest algorithm.
|
|
||||||
* The algorithm is due to Ron Rivest. This code was
|
|
||||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
|
||||||
* This code is in the public domain; do with it what you wish.
|
|
||||||
*
|
|
||||||
* Equivalent code is available from RSA Data Security, Inc.
|
|
||||||
* This code has been tested against that, and is equivalent,
|
|
||||||
* except that you don't need to include two pages of legalese
|
|
||||||
* with every copy.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
||||||
* <phk@login.dkuug.dk> wrote this file. As long as you retain this notice you
|
|
||||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
||||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* $Id: md5.c,v 1.1.1.1 2004/04/02 05:11:38 deklund2 Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "xmd5.h"
|
|
||||||
|
|
||||||
#if __BYTE_ORDER == 1234
|
|
||||||
#define byteReverse(buf, len) /* Nothing */
|
|
||||||
#else
|
|
||||||
void byteReverse(unsigned char *buf, unsigned longs);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: this code is harmless on little-endian machines.
|
|
||||||
*/
|
|
||||||
void byteReverse(unsigned char *buf, unsigned longs)
|
|
||||||
{
|
|
||||||
uint32_t t;
|
|
||||||
do {
|
|
||||||
t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
|
|
||||||
((unsigned) buf[1] << 8 | buf[0]);
|
|
||||||
*(uint32_t *) buf = t;
|
|
||||||
buf += 4;
|
|
||||||
} while (--longs);
|
|
||||||
}
|
|
||||||
#endif /* ! __BYTE_ORDER == 1234 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
lutil_md5_file (const char *filename, char *buf)
|
|
||||||
{
|
|
||||||
unsigned char buffer[BUFSIZ];
|
|
||||||
MD5_CTX ctx;
|
|
||||||
int f,i,j;
|
|
||||||
|
|
||||||
MD5Init(&ctx);
|
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
f = open(filename,O_RDONLY);
|
|
||||||
#else
|
|
||||||
f = _open(filename, _O_RDONLY);
|
|
||||||
#endif
|
|
||||||
if (f < 0) return 0;
|
|
||||||
while ((i = read(f,buffer,sizeof buffer)) > 0) {
|
|
||||||
MD5Update(&ctx,buffer,i);
|
|
||||||
}
|
|
||||||
j = errno;
|
|
||||||
close(f);
|
|
||||||
errno = j;
|
|
||||||
if (i < 0) return 0;
|
|
||||||
return MD5End(&ctx, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
lutil_md5_data (const unsigned char *data, unsigned int len, char *buf)
|
|
||||||
{
|
|
||||||
MD5_CTX ctx;
|
|
||||||
|
|
||||||
MD5Init(&ctx);
|
|
||||||
MD5Update(&ctx,data,len);
|
|
||||||
return MD5End(&ctx, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Non-Interface Methods */
|
|
||||||
|
|
||||||
/* from md5hl.c */
|
|
||||||
|
|
||||||
char *
|
|
||||||
MD5End(MD5_CTX *ctx, char *buf)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned char digest[MD5_HASHBYTES];
|
|
||||||
static const char hex[]="0123456789abcdef";
|
|
||||||
|
|
||||||
if (!buf)
|
|
||||||
buf = (char*)malloc(33);
|
|
||||||
if (!buf)
|
|
||||||
return 0;
|
|
||||||
MD5Final(digest,ctx);
|
|
||||||
for (i=0;i<MD5_HASHBYTES;i++) {
|
|
||||||
buf[i+i] = hex[digest[i] >> 4];
|
|
||||||
buf[i+i+1] = hex[digest[i] & 0x0f];
|
|
||||||
}
|
|
||||||
buf[i+i] = '\0';
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
|
||||||
* initialization constants.
|
|
||||||
*/
|
|
||||||
void MD5Init(MD5_CTX *ctx)
|
|
||||||
{
|
|
||||||
ctx->buf[0] = 0x67452301;
|
|
||||||
ctx->buf[1] = 0xefcdab89;
|
|
||||||
ctx->buf[2] = 0x98badcfe;
|
|
||||||
ctx->buf[3] = 0x10325476;
|
|
||||||
|
|
||||||
ctx->bits[0] = 0;
|
|
||||||
ctx->bits[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update context to reflect the concatenation of another buffer full
|
|
||||||
* of bytes.
|
|
||||||
*/
|
|
||||||
void MD5Update(MD5_CTX *ctx, unsigned char const *buf, unsigned len)
|
|
||||||
{
|
|
||||||
uint32_t t;
|
|
||||||
|
|
||||||
/* Update bitcount */
|
|
||||||
|
|
||||||
t = ctx->bits[0];
|
|
||||||
if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
|
|
||||||
ctx->bits[1]++; /* Carry from low to high */
|
|
||||||
ctx->bits[1] += len >> 29;
|
|
||||||
|
|
||||||
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
|
|
||||||
|
|
||||||
/* Handle any leading odd-sized chunks */
|
|
||||||
|
|
||||||
if (t) {
|
|
||||||
unsigned char *p = (unsigned char *) ctx->in + t;
|
|
||||||
|
|
||||||
t = 64 - t;
|
|
||||||
if (len < t) {
|
|
||||||
memcpy(p, buf, len);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
memcpy(p, buf, t);
|
|
||||||
byteReverse(ctx->in, 16);
|
|
||||||
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
|
||||||
buf += t;
|
|
||||||
len -= t;
|
|
||||||
}
|
|
||||||
/* Process data in 64-byte chunks */
|
|
||||||
|
|
||||||
while (len >= 64) {
|
|
||||||
memcpy(ctx->in, buf, 64);
|
|
||||||
byteReverse(ctx->in, 16);
|
|
||||||
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
|
||||||
buf += 64;
|
|
||||||
len -= 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle any remaining bytes of data. */
|
|
||||||
|
|
||||||
memcpy(ctx->in, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Final wrapup - pad to 64-byte boundary with the bit pattern
|
|
||||||
* 1 0* (64-bit count of bits processed, MSB-first)
|
|
||||||
*/
|
|
||||||
void MD5Final(unsigned char digest[16], MD5_CTX *ctx)
|
|
||||||
{
|
|
||||||
unsigned count;
|
|
||||||
unsigned char *p;
|
|
||||||
|
|
||||||
/* Compute number of bytes mod 64 */
|
|
||||||
count = (ctx->bits[0] >> 3) & 0x3F;
|
|
||||||
|
|
||||||
/* Set the first char of padding to 0x80. This is safe since there is
|
|
||||||
always at least one byte free */
|
|
||||||
p = ctx->in + count;
|
|
||||||
*p++ = 0x80;
|
|
||||||
|
|
||||||
/* Bytes of padding needed to make 64 bytes */
|
|
||||||
count = 64 - 1 - count;
|
|
||||||
|
|
||||||
/* Pad out to 56 mod 64 */
|
|
||||||
if (count < 8) {
|
|
||||||
/* Two lots of padding: Pad the first block to 64 bytes */
|
|
||||||
memset(p, 0, count);
|
|
||||||
byteReverse(ctx->in, 16);
|
|
||||||
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
|
||||||
|
|
||||||
/* Now fill the next block with 56 bytes */
|
|
||||||
memset(ctx->in, 0, 56);
|
|
||||||
} else {
|
|
||||||
/* Pad block to 56 bytes */
|
|
||||||
memset(p, 0, count - 8);
|
|
||||||
}
|
|
||||||
byteReverse(ctx->in, 14);
|
|
||||||
|
|
||||||
/* Append length in bits and transform */
|
|
||||||
((uint32_t *) ctx->in)[14] = ctx->bits[0];
|
|
||||||
((uint32_t *) ctx->in)[15] = ctx->bits[1];
|
|
||||||
|
|
||||||
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
|
||||||
byteReverse((unsigned char *) ctx->buf, 4);
|
|
||||||
memcpy(digest, ctx->buf, 16);
|
|
||||||
memset((char *) ctx, 0, sizeof(ctx)); /* In case it's sensitive */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The four core functions - F1 is optimized somewhat */
|
|
||||||
|
|
||||||
/* #define F1(x, y, z) (x & y | ~x & z) */
|
|
||||||
#define F1(x, y, z) (z ^ (x & (y ^ z)))
|
|
||||||
#define F2(x, y, z) F1(z, x, y)
|
|
||||||
#define F3(x, y, z) (x ^ y ^ z)
|
|
||||||
#define F4(x, y, z) (y ^ (x | ~z))
|
|
||||||
|
|
||||||
/* This is the central step in the MD5 algorithm. */
|
|
||||||
#define MD5STEP(f, w, x, y, z, data, s) \
|
|
||||||
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
|
||||||
* reflect the addition of 16 longwords of new data. MD5Update blocks
|
|
||||||
* the data and converts bytes into longwords for this routine.
|
|
||||||
*/
|
|
||||||
void MD5Transform(uint32_t buf[4], uint32_t const in[16])
|
|
||||||
{
|
|
||||||
register uint32_t a, b, c, d;
|
|
||||||
|
|
||||||
a = buf[0];
|
|
||||||
b = buf[1];
|
|
||||||
c = buf[2];
|
|
||||||
d = buf[3];
|
|
||||||
|
|
||||||
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
|
|
||||||
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
|
|
||||||
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
|
|
||||||
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
|
|
||||||
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
|
|
||||||
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
|
|
||||||
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
|
|
||||||
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
|
|
||||||
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
|
|
||||||
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
|
|
||||||
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
|
|
||||||
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
|
|
||||||
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
|
|
||||||
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
|
|
||||||
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
|
|
||||||
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
|
|
||||||
|
|
||||||
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
|
|
||||||
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
|
|
||||||
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
|
|
||||||
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
|
|
||||||
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
|
|
||||||
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
|
|
||||||
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
|
|
||||||
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
|
|
||||||
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
|
|
||||||
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
|
|
||||||
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
|
|
||||||
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
|
|
||||||
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
|
|
||||||
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
|
|
||||||
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
|
|
||||||
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
|
|
||||||
|
|
||||||
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
|
|
||||||
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
|
|
||||||
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
|
|
||||||
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
|
|
||||||
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
|
|
||||||
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
|
|
||||||
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
|
|
||||||
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
|
|
||||||
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
|
|
||||||
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
|
|
||||||
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
|
|
||||||
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
|
|
||||||
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
|
|
||||||
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
|
|
||||||
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
|
|
||||||
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
|
|
||||||
|
|
||||||
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
|
|
||||||
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
|
|
||||||
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
|
|
||||||
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
|
|
||||||
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
|
|
||||||
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
|
|
||||||
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
|
|
||||||
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
|
|
||||||
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
|
|
||||||
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
|
|
||||||
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
|
|
||||||
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
|
|
||||||
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
|
|
||||||
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
|
|
||||||
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
|
|
||||||
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
|
|
||||||
|
|
||||||
buf[0] += a;
|
|
||||||
buf[1] += b;
|
|
||||||
buf[2] += c;
|
|
||||||
buf[3] += d;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // #ifndef __FreeBSD__
|
|
Loading…
Reference in New Issue