Initial commit: server + serverfiles

This commit is contained in:
Game
2026-08-17 17:31:44 +00:00
commit ff1237686b
17389 changed files with 868929 additions and 0 deletions
+99
View File
@@ -0,0 +1,99 @@
#pragma once
#include "SIM.h"
#ifdef _WIN32
#include <atlenc.h>
#else
#include "base64_ssl.h"
#endif
#include "PublicKey.Gen.h"
#include "RSACrypto.h"
using namespace Security;
static FORCEINLINE bool CheckServerKey(const char* serverKey, const char* ip, const char* mac, std::string& errorString)
{
assert(serverKey);
//
// '*'À» '='À¸·Î º¯°æ
//
std::string key = serverKey;
const std::string::size_type npos = -1;
while (1)
{
std::string::size_type pos = key.find_first_of('*');
if (npos == pos)
{
break;
}
key[pos] = '=';
}
//
// base64 decoding
//
unsigned char buf[4096];
int buflen = sizeof(buf);
#ifdef _WIN32
if (FALSE == Base64Decode(key.c_str(), key.size(), buf, &buflen))
{
errorString = "base64 decode failed";
return false;
}
#else
if (false == unbase64_ssl((unsigned char *)key.c_str(), key.size(), buf, buflen))
{
errorString = "base64 decode failed";
return false;
}
buflen = strlen((const char *)buf);
#endif
//
// get public key
//
std::vector<unsigned char> publicKeyBuf;
CreatePublicKey(publicKeyBuf);
RSACrypto::PublicKey publicKey;
if (false == RSACrypto::RestorePublicKey((const char *)&publicKeyBuf[0], publicKeyBuf.size(), &publicKey))
{
errorString = "restore public key failed";
return false;
}
//
// decrypt with public key
//
Buffer plainBuf = RSACrypto::DecryptPublic(&publicKey, buf, buflen);
if (0 == plainBuf.buf)
{
errorString = "decrypt failed";
return false;
}
//
// create SIM
//
SIM sim;
if (false == sim.ParseBinary(plainBuf.buf, plainBuf.len))
{
errorString = "parse sim binary failed";
Buffer::Free(plainBuf);
return false;
}
//
// check ip and mac
//
if (false == sim.CheckIpAndMac(ip, mac))
{
errorString = "cannot find ip/mac info";
return false;
}
return true;
}
+3
View File
@@ -0,0 +1,3 @@
RSACrypto.o: RSACrypto.cpp RSACrypto.h
RSACrypto_backup.o: RSACrypto_backup.cpp RSACrypto.h
base64_ssl.o: base64_ssl.cpp base64_ssl.h
+80
View File
@@ -0,0 +1,80 @@
#CXX = distcc i386-obrien-freebsd5-g++
PLATFORM = $(shell file /bin/ls | cut -d' ' -f3 | cut -d'-' -f1)
BSD_VERSION = $(shell uname -v 2>&1 | cut -d' ' -f2 | cut -d'.' -f1)
SVN_VERSION = $(shell svnversion -n -c . | cut -d':' -f2)
BIN = ./libserverkey.a
# ---------------------------------------------------------------------------
# ### LINUX-BLOCK-BEGIN (Makefile platform detection)
# FreeBSD takes the else branch, which reproduces the original assignments
# (CXX, the commented-out ifeq/else, IFLAGS and CFLAGS) verbatim.
# ---------------------------------------------------------------------------
UNAME_S := $(shell uname -s)
# Where the 32-bit third-party libraries and their headers live. Same relative
# convention game/src/Makefile uses for "-I../../../extern/include", with the
# Linux subdirectory appended. Override on the command line if the tree moves.
EXTERN_DIR ?= ../../../extern/Linux40250
ifeq ($(UNAME_S),Linux)
CXX = g++
GCC_VERSION = $(shell $(CC) --version 2>&1 | grep "(GCC)" | cut -d' ' -f3 | cut -d'.' -f1)
# OpenSSL headers come from libssl-dev:i386 in /usr/include/openssl, which is
# already on the default search path, so only the extern tree needs adding.
# RSACrypto.cpp calls ::SHA1(), deprecated in OpenSSL 3 but still exported;
# -Wno-deprecated-declarations keeps the build output readable without hiding
# the fact (see the note in the port write-up).
IFLAGS = -I$(EXTERN_DIR)/include
CFLAGS = $(IFLAGS) -Wall -O2 -pipe -m32 -std=c++23 -D_THREAD_SAFE -fno-exceptions -Wno-deprecated-declarations
ARFLAGS_SK = cr
else
CXX = clang++-devel
GCC_VERSION = $(shell $(CC) --version 2>&1 | grep "(GCC)" | cut -d' ' -f3 | cut -d'.' -f1)
# ifeq ($(GCC_VERSION), 4)
IFLAGS =
CFLAGS = $(IFLAGS) -Wall -O2 -pipe -m32 -std=c++23 -D_THREAD_SAFE -fno-exceptions
# else
# IFLAGS =
# CFLAGS = $(IFLAGS) -Wall -O2 -pipe -mcpu=i686 -D_THREAD_SAFE -fno-exceptions
# endif
ARFLAGS_SK = cru
endif
# ### LINUX-BLOCK-END (Makefile platform detection)
LIBS =
OBJFILES = base64_ssl.o RSACrypto.o
default:
$(MAKE) $(BIN)
$(BIN): $(OBJFILES)
ar $(ARFLAGS_SK) $(BIN) $(OBJFILES) $(LIBS)
ranlib $(BIN)
chmod 700 $(BIN)
clean:
rm -f *.o
rm -f $(BIN)
dep:
touch Depend
$(CXX) $(CFLAGS) -MM *.cpp > Depend
$(OBJFILES):
$(CXX) $(CFLAGS) -c $<
sinclude Depend
+149
View File
@@ -0,0 +1,149 @@
#ifndef __GenerateRSAKey_1342601737__
#define __GenerateRSAKey_1342601737__
// created : Thu Jul 12 14:55:01 2012 (time_t = 1342601737)
#include <vector>
inline void CreatePublicKey(std::vector<unsigned char>& key)
{
key.push_back(48); // 0
key.push_back(129); // 1
key.push_back(135); // 2
key.push_back(2); // 3
key.push_back(129); // 4
key.push_back(129); // 5
key.push_back(0); // 6
key.push_back(236); // 7
key.push_back(244); // 8
key.push_back(10); // 9
key.push_back(46); // 10
key.push_back(128); // 11
key.push_back(97); // 12
key.push_back(100); // 13
key.push_back(250); // 14
key.push_back(237); // 15
key.push_back(187); // 16
key.push_back(150); // 17
key.push_back(124); // 18
key.push_back(87); // 19
key.push_back(56); // 20
key.push_back(156); // 21
key.push_back(91); // 22
key.push_back(20); // 23
key.push_back(111); // 24
key.push_back(73); // 25
key.push_back(168); // 26
key.push_back(142); // 27
key.push_back(176); // 28
key.push_back(189); // 29
key.push_back(1); // 30
key.push_back(135); // 31
key.push_back(122); // 32
key.push_back(109); // 33
key.push_back(224); // 34
key.push_back(2); // 35
key.push_back(210); // 36
key.push_back(197); // 37
key.push_back(203); // 38
key.push_back(201); // 39
key.push_back(173); // 40
key.push_back(172); // 41
key.push_back(201); // 42
key.push_back(163); // 43
key.push_back(139); // 44
key.push_back(40); // 45
key.push_back(228); // 46
key.push_back(34); // 47
key.push_back(242); // 48
key.push_back(242); // 49
key.push_back(8); // 50
key.push_back(37); // 51
key.push_back(59); // 52
key.push_back(238); // 53
key.push_back(96); // 54
key.push_back(98); // 55
key.push_back(158); // 56
key.push_back(26); // 57
key.push_back(64); // 58
key.push_back(30); // 59
key.push_back(17); // 60
key.push_back(253); // 61
key.push_back(128); // 62
key.push_back(245); // 63
key.push_back(61); // 64
key.push_back(12); // 65
key.push_back(53); // 66
key.push_back(32); // 67
key.push_back(192); // 68
key.push_back(54); // 69
key.push_back(140); // 70
key.push_back(106); // 71
key.push_back(202); // 72
key.push_back(79); // 73
key.push_back(144); // 74
key.push_back(21); // 75
key.push_back(109); // 76
key.push_back(163); // 77
key.push_back(18); // 78
key.push_back(164); // 79
key.push_back(207); // 80
key.push_back(129); // 81
key.push_back(58); // 82
key.push_back(200); // 83
key.push_back(139); // 84
key.push_back(126); // 85
key.push_back(95); // 86
key.push_back(122); // 87
key.push_back(100); // 88
key.push_back(142); // 89
key.push_back(185); // 90
key.push_back(149); // 91
key.push_back(154); // 92
key.push_back(88); // 93
key.push_back(71); // 94
key.push_back(227); // 95
key.push_back(252); // 96
key.push_back(229); // 97
key.push_back(36); // 98
key.push_back(140); // 99
key.push_back(222); // 100
key.push_back(171); // 101
key.push_back(62); // 102
key.push_back(18); // 103
key.push_back(222); // 104
key.push_back(179); // 105
key.push_back(100); // 106
key.push_back(90); // 107
key.push_back(11); // 108
key.push_back(181); // 109
key.push_back(175); // 110
key.push_back(102); // 111
key.push_back(66); // 112
key.push_back(101); // 113
key.push_back(38); // 114
key.push_back(16); // 115
key.push_back(177); // 116
key.push_back(236); // 117
key.push_back(110); // 118
key.push_back(53); // 119
key.push_back(102); // 120
key.push_back(157); // 121
key.push_back(205); // 122
key.push_back(45); // 123
key.push_back(139); // 124
key.push_back(125); // 125
key.push_back(200); // 126
key.push_back(33); // 127
key.push_back(60); // 128
key.push_back(238); // 129
key.push_back(125); // 130
key.push_back(42); // 131
key.push_back(145); // 132
key.push_back(120); // 133
key.push_back(175); // 134
key.push_back(2); // 135
key.push_back(1); // 136
key.push_back(7); // 137
}
#endif
+546
View File
@@ -0,0 +1,546 @@
#include "RSACrypto.h"
#ifdef _WIN32
#include <atlenc.h>
#endif
#include <assert.h>
#include <openssl/aes.h>
#include <openssl/rsa.h>
#include <openssl/rand.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/engine.h>
#include <openssl/sha.h>
#include <openssl/pem.h>
namespace Security
{
static const char rnd_seed[] = "alsfkdj#$^#Y$JBGVKA()#$J@J#OTJG)(@JG)@GJ)J@$)JG)$JG)GJ#@)G";
class StaticInitializer
{
public:
StaticInitializer()
{
}
~StaticInitializer()
{
RAND_cleanup();
}
void Init()
{
RAND_seed( rnd_seed, sizeof( rnd_seed ) );
}
};
void InitRandomSeed()
{
static StaticInitializer s;
s.Init();
}
// RSA cryptography
//RSACrypto::PublicKey::PublicKey(const unsigned char* n, int nsize, const unsigned char* e, int esize)
//{
// rsa_ = Alloc();
// BIGNUM* tmp = NULL;
// tmp = BN_bin2bn( n, nsize, rsa_->n );
// assert( tmp );
// tmp = BN_bin2bn( e, esize, rsa_->e );
// assert( tmp );
// //#ifdef _DEBUG
// // printf("n:");
// // BN_print_fp(stdout, rsa_->n);
// // printf("");
// // printf("e:");
// // BN_print_fp(stdout, rsa_->e);
// // printf("");
// //#endif
//}
RSACrypto::PublicKey::PublicKey(const char* n, const char* e)
{
rsa_ = Alloc();
#if OPENSSL_VERSION_NUMBER < 0x10100000L
BN_hex2bn(&rsa_->n, n);
BN_hex2bn(&rsa_->e, e);
#else
BIGNUM* rsa_n, * rsa_e, * rsa_d;
RSA_get0_key(rsa_, (const BIGNUM**)&rsa_n, (const BIGNUM**)&rsa_e, (const BIGNUM**)&rsa_d);
BN_hex2bn(&rsa_n, n);
BN_hex2bn(&rsa_e, e);
RSA_set0_key(rsa_, rsa_n, rsa_e, rsa_d);
#endif
}
RSACrypto::PublicKey::PublicKey(RSACrypto::PublicKey& p)
{
rsa_ = RSA_new();
assert( rsa_ );
Copy( rsa_, p.rsa_ );
}
RSACrypto::PublicKey::~PublicKey()
{
Free( rsa_ );
rsa_ = NULL;
}
RSACrypto::PublicKey& RSACrypto::PublicKey::operator =(const RSACrypto::PublicKey& p)
{
if ( rsa_ )
{
Free( rsa_ );
rsa_ = NULL;
}
rsa_ = RSA_new();
assert( rsa_ );
Copy( rsa_, p.rsa_ );
return *this;
}
//Buffer RSACrypto::PublicKey::GetN()
//{
// if ( rsa_ )
// {
// int len = BN_num_bytes( rsa_->n );
// Buffer n = Buffer::Alloc( len );
// if ( NULL == n.buf )
// {
// return Buffer();
// }
// BN_bn2bin( rsa_->n, (unsigned char *)n.buf );
// return n;
// }
// return Buffer();
//}
//Buffer RSACrypto::PublicKey::GetE()
//{
// if ( rsa_ )
// {
// int len = BN_num_bytes( rsa_->e );
// Buffer e = Buffer::Alloc( len );
// if ( NULL == e.buf )
// {
// return Buffer();
// }
// BN_bn2bin( rsa_->e, (unsigned char *)e.buf );
// return e;
// }
// return Buffer();
//}
RSACrypto::PublicKey::PublicKey() : rsa_( NULL )
{
}
RSA* RSACrypto::PublicKey::Alloc()
{
RSA* rsa = RSA_new();
assert( rsa );
#if OPENSSL_VERSION_NUMBER < 0x10100000L
rsa->n = BN_new();
rsa->e = BN_new();
#else
BIGNUM* n = BN_new(), * e = BN_new();
RSA_set0_key(rsa, n, e, NULL);
#endif
return rsa;
}
void RSACrypto::PublicKey::Free(rsa_st* p)
{
if ( p )
{
RSA_free( p );
}
}
void RSACrypto::PublicKey::Copy(rsa_st* to, const rsa_st* from)
{
#if OPENSSL_VERSION_NUMBER < 0x10100000L
BN_copy(to->n, from->n);
BN_copy(to->e, from->e);
#else
BIGNUM* to_n, * to_e,* to_d;
const BIGNUM* from_n = RSA_get0_n(from), * from_e = RSA_get0_e(from);
RSA_get0_key(to, (const BIGNUM**)&to_n, (const BIGNUM**)&to_e, (const BIGNUM**)&to_d);
BN_copy(to_n, from_n);
BN_copy(to_e, from_e);
RSA_set0_key(to, to_n, to_e, to_d);
#endif
}
RSACrypto::PrivateKey::PrivateKey() : rsa_( NULL )
{
}
RSACrypto::PrivateKey::PrivateKey(rsa_st* rsa) : rsa_( rsa )
{
}
RSACrypto::PrivateKey::~PrivateKey()
{
if ( rsa_ )
{
RSA_free( rsa_ );
rsa_ = NULL;
}
}
RSA* RSACrypto::PrivateKey::Alloc()
{
RSA* rsa = RSA_new();
assert( rsa );
#if OPENSSL_VERSION_NUMBER < 0x10100000L
rsa->d = BN_new();
rsa->p = BN_new();
rsa->q = BN_new();
#else
BIGNUM* d = BN_new(), * p = BN_new(), * q = BN_new();
RSA_set0_key(rsa, NULL, NULL, d);
RSA_set0_factors(rsa, p, q);
#endif
return rsa;
}
Buffer RSACrypto::EncryptPublic(const RSACrypto::PublicKey* k, const unsigned char* plain, int plainLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer cipherText = Buffer::Alloc( rsaSize );
if ( NULL == cipherText.buf )
{
return Buffer();
}
// must be checked when RSA_PKCS1_OAEP_PADDING mode
if ( plainLen >= rsaSize - 41 )
{
Buffer::Free(cipherText);
assert(false);
return Buffer();
}
int cipherTextLen = RSA_public_encrypt(
plainLen,
plain,
(unsigned char *)cipherText.buf,
k->rsa_,
RSA_PKCS1_OAEP_PADDING);
if ( -1 == cipherTextLen )
{
Buffer::Free(cipherText);
return Buffer();
}
assert( cipherTextLen == rsaSize );
//XSystem::MemoryPool::MemoryPool_Realloc( cipherText, cipherTextLen );
return cipherText;
}
Buffer RSACrypto::DecryptPrivate(const RSACrypto::PrivateKey* k, const unsigned char* cipher, int cipherLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer plainText = Buffer::Alloc( rsaSize );
if ( NULL == plainText.buf )
{
return Buffer();
}
int plainTextLen = RSA_private_decrypt(
cipherLen,
cipher,
(unsigned char *)plainText.buf,
k->rsa_,
RSA_PKCS1_OAEP_PADDING);
if ( -1 == plainTextLen )
{
Buffer::Free(plainText);
return Buffer();
}
plainText.len = plainTextLen;
return plainText;
}
Buffer RSACrypto::EncryptPrivate(const RSACrypto::PrivateKey* k, const unsigned char* plain, int plainLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer cipherText = Buffer::Alloc( rsaSize );
if ( NULL == cipherText.buf )
{
return Buffer();
}
// must be checked when RSA_PKCS1_PADDING mode (private encrypt에서는 다른 padding을 지원안한다.)
if ( plainLen >= rsaSize - 11 )
{
Buffer::Free(cipherText);
assert(false);
return Buffer();
}
int cipherTextLen = RSA_private_encrypt(
plainLen,
plain,
(unsigned char *)cipherText.buf,
k->rsa_,
RSA_PKCS1_PADDING);
if ( -1 == cipherTextLen )
{
Buffer::Free(cipherText);
return Buffer();
}
assert( cipherTextLen == rsaSize );
//XSystem::MemoryPool::MemoryPool_Realloc( cipherText, cipherTextLen );
return cipherText;
}
Buffer RSACrypto::DecryptPublic(const RSACrypto::PublicKey* k, const unsigned char* cipher, int cipherLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer plainText = Buffer::Alloc( rsaSize );
if ( NULL == plainText.buf )
{
return Buffer();
}
int plainTextLen = RSA_public_decrypt(
cipherLen,
cipher,
(unsigned char *)plainText.buf,
k->rsa_,
RSA_PKCS1_PADDING);
if ( -1 == plainTextLen )
{
Buffer::Free(plainText);
return Buffer();
}
plainText.len = plainTextLen;
return plainText;
}
bool RSACrypto::GenerateKey(RSACrypto::PublicKey* publicKey, RSACrypto::PrivateKey* privateKey)
{
RSA* rsa = RSA_generate_key( 1024, 7, NULL, NULL );
if ( NULL == rsa )
{
//ERR_get_error();
return false;
}
if ( 1 != RSA_check_key( rsa ) )
{
//ERR_get_error();
return false;
}
publicKey->rsa_ = publicKey->Alloc();
publicKey->Copy( publicKey->rsa_, rsa );
privateKey->rsa_ = rsa;
#ifdef _DEBUG
// printf("n:");
// BN_print_fp(stdout, publicKey->rsa_->n);
// printf("");
// printf("e:");
// BN_print_fp(stdout, publicKey->rsa_->e);
// printf("");
//char buf[1024];
//BIO* bp = BIO_new_mem_buf(buf, sizeof(buf));
//PEM_write_bio_RSAPrivateKey(bp, rsa, 0, 0, 0, 0, 0);
//PEM_read_bio_RSAPrivateKey(bp, )
#endif
return true;
}
bool RSACrypto::PrintKey(const PublicKey* k, std::string& e, std::string& n)
{
#if OPENSSL_VERSION_NUMBER < 0x10100000L
char* tmp = BN_bn2hex(k->rsa_->e);
#else
const BIGNUM* rsa_e = RSA_get0_e(k->rsa_);
char* tmp = BN_bn2hex(rsa_e);
#endif
if (!tmp)
{
return false;
}
e = tmp;
#if OPENSSL_VERSION_NUMBER < 0x10100000L
tmp = BN_bn2hex(k->rsa_->n);
#else
const BIGNUM* rsa_n = RSA_get0_n(k->rsa_);
tmp = BN_bn2hex(rsa_n);
#endif
if (!tmp)
{
return false;
}
n = tmp;
return true;
}
bool RSACrypto::PrintKey(const PrivateKey* k, std::string& n, std::string& e, std::string& d)
{
#if OPENSSL_VERSION_NUMBER < 0x10100000L
char* tmp = BN_bn2hex(k->rsa_->n);
#else
const BIGNUM* rsa_n = RSA_get0_n(k->rsa_);
char* tmp = BN_bn2hex(rsa_n);
#endif
if (!tmp)
{
return false;
}
n = tmp;
#if OPENSSL_VERSION_NUMBER < 0x10100000L
tmp = BN_bn2hex(k->rsa_->e);
#else
const BIGNUM* rsa_e = RSA_get0_e(k->rsa_);
tmp = BN_bn2hex(rsa_e);
#endif
if (!tmp)
{
return false;
}
e = tmp;
#if OPENSSL_VERSION_NUMBER < 0x10100000L
tmp = BN_bn2hex(k->rsa_->d);
#else
const BIGNUM* rsa_d = RSA_get0_d(k->rsa_);
tmp = BN_bn2hex(rsa_d);
#endif
if (!tmp)
{
return false;
}
d = tmp;
return true;
}
bool RSACrypto::StorePrivateKey(const PrivateKey* k, char* buf, size_t& buflen)
{
// DER 포맷으로 변환
char* tmp = NULL;
int n = i2d_RSAPrivateKey(k->rsa_, (unsigned char **)&tmp);
if (n < 0)
{
return false;
}
if (n > (int)buflen)
{
printf("RSACrypto::StorePrivateKey: buflen is too small\n");
return false;
}
memcpy(buf, tmp, n);
buflen = n;
free(tmp);
return true;
}
bool RSACrypto::RestorePrivateKey(const char* buf, size_t buflen, PrivateKey* k)
{
// DER 포맷에서 변환
char* tmp = (char *)malloc(buflen);
if (!tmp)
{
return false;
}
memcpy(tmp, buf, buflen);
if (!d2i_RSAPrivateKey(&k->rsa_, (const unsigned char **)&tmp, buflen))
{
free(tmp);
return false;
}
return true;
}
bool RSACrypto::StorePublicKey(const PublicKey* k, char* buf, size_t& buflen)
{
// DER 포맷으로 변환
char* tmp = NULL;
int n = i2d_RSAPublicKey(k->rsa_, (unsigned char **)&tmp);
if (n < 0)
{
return false;
}
if (n > (int)buflen)
{
printf("RSACrypto::StorePublicKey: buflen is too small\n");
return false;
}
memcpy(buf, tmp, n);
buflen = n;
free(tmp);
return true;
}
bool RSACrypto::RestorePublicKey(const char* buf, size_t buflen, PublicKey* k)
{
// DER 포맷에서 변환
char* tmp = (char *)malloc(buflen);
if (!tmp)
{
return false;
}
memcpy(tmp, buf, buflen);
if (!d2i_RSAPublicKey(&k->rsa_, (const unsigned char **)&tmp, buflen))
{
free(tmp);
return false;
}
return true;
}
Buffer SHA1::Digest(const Buffer& plain)
{
Buffer result = Buffer::Alloc( 20 );
::SHA1( (const unsigned char *)plain.buf,
(unsigned long)plain.len,
(unsigned char *)result.buf);
return result;
}
}
+108
View File
@@ -0,0 +1,108 @@
#ifndef __RSA_Crypto_H__
#define __RSA_Crypto_H__
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string>
#ifdef _WIN32
// needed only for using openssl
#pragma comment(lib, "libeay32")
#endif
struct rsa_st;
struct evp_cipher_ctx_st;
namespace Security
{
struct Buffer
{
Buffer(char* p = 0, size_t c = 0) : buf(p), len(c) {};
char* buf;
size_t len;
static Buffer Alloc(size_t len)
{
Buffer tmp;
tmp.len = len;
tmp.buf = new char[len];
return tmp;
}
static void Free(Buffer& buf)
{
delete [] buf.buf;
memset(&buf, 0, sizeof(Buffer));
}
};
void InitRandomSeed();
class RSACrypto
{
public:
class PublicKey
{
friend class RSACrypto;
public:
PublicKey();
PublicKey(const char* n, const char* e);
PublicKey(PublicKey& p);
~PublicKey();
PublicKey& operator=(const PublicKey& p);
//Buffer GetN();
//Buffer GetE();
private:
rsa_st* Alloc();
void Free(rsa_st* p);
void Copy(rsa_st* to, const rsa_st* from);
private:
rsa_st* rsa_;
};
class PrivateKey
{
friend class RSACrypto;
public:
PrivateKey();
PrivateKey(rsa_st* rsa);
~PrivateKey();
private:
rsa_st* Alloc();
private:
rsa_st* rsa_;
};
static Buffer EncryptPublic(const PublicKey* k, const unsigned char* plain, int plainLen);
static Buffer DecryptPrivate(const PrivateKey* k, const unsigned char* cipher, int cipherLen);
static Buffer EncryptPrivate(const PrivateKey* k, const unsigned char* plain, int plainLen);
static Buffer DecryptPublic(const PublicKey* k, const unsigned char* cipher, int cipherLen);
static bool GenerateKey(PublicKey* publicKey, PrivateKey* privateKey);
static bool PrintKey(const PublicKey* k, std::string& e, std::string& n);
static bool PrintKey(const PrivateKey* k, std::string& d, std::string& p, std::string& q);
//
// private, public key를 DER 포맷으로 변환하여 buf에 저장
//
static bool StorePrivateKey(const PrivateKey* k, char* buf, size_t& buflen);
static bool RestorePrivateKey(const char* buf, size_t buflen, PrivateKey* k);
static bool StorePublicKey(const PublicKey* k, char* buf, size_t& buflen);
static bool RestorePublicKey(const char* buf, size_t buflen, PublicKey* k);
};
class SHA1
{
public:
static Buffer Digest(const Buffer& plain);
};
}
#endif
+487
View File
@@ -0,0 +1,487 @@
#include "RSACrypto.h"
#ifdef _WIN32
#include <atlenc.h>
#endif
#include <assert.h>
#include <openssl/aes.h>
#include <openssl/rsa.h>
#include <openssl/rand.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/engine.h>
#include <openssl/sha.h>
#include <openssl/pem.h>
namespace Security
{
static const char rnd_seed[] = "alsfkdj#$^#Y$JBGVKA()#$J@J#OTJG)(@JG)@GJ)J@$)JG)$JG)GJ#@)G";
class StaticInitializer
{
public:
StaticInitializer()
{
}
~StaticInitializer()
{
RAND_cleanup();
}
void Init()
{
RAND_seed( rnd_seed, sizeof( rnd_seed ) );
}
};
void InitRandomSeed()
{
static StaticInitializer s;
s.Init();
}
// RSA cryptography
//RSACrypto::PublicKey::PublicKey(const unsigned char* n, int nsize, const unsigned char* e, int esize)
//{
// rsa_ = Alloc();
// BIGNUM* tmp = NULL;
// tmp = BN_bin2bn( n, nsize, rsa_->n );
// assert( tmp );
// tmp = BN_bin2bn( e, esize, rsa_->e );
// assert( tmp );
// //#ifdef _DEBUG
// // printf("n:");
// // BN_print_fp(stdout, rsa_->n);
// // printf("");
// // printf("e:");
// // BN_print_fp(stdout, rsa_->e);
// // printf("");
// //#endif
//}
RSACrypto::PublicKey::PublicKey(const char* n, const char* e)
{
rsa_ = Alloc();
BN_hex2bn(&rsa_->n, n);
BN_hex2bn(&rsa_->e, e);
}
RSACrypto::PublicKey::PublicKey(RSACrypto::PublicKey& p)
{
rsa_ = RSA_new();
assert( rsa_ );
Copy( rsa_, p.rsa_ );
}
RSACrypto::PublicKey::~PublicKey()
{
Free( rsa_ );
rsa_ = NULL;
}
RSACrypto::PublicKey& RSACrypto::PublicKey::operator =(const RSACrypto::PublicKey& p)
{
if ( rsa_ )
{
Free( rsa_ );
rsa_ = NULL;
}
rsa_ = RSA_new();
assert( rsa_ );
Copy( rsa_, p.rsa_ );
return *this;
}
//Buffer RSACrypto::PublicKey::GetN()
//{
// if ( rsa_ )
// {
// int len = BN_num_bytes( rsa_->n );
// Buffer n = Buffer::Alloc( len );
// if ( NULL == n.buf )
// {
// return Buffer();
// }
// BN_bn2bin( rsa_->n, (unsigned char *)n.buf );
// return n;
// }
// return Buffer();
//}
//Buffer RSACrypto::PublicKey::GetE()
//{
// if ( rsa_ )
// {
// int len = BN_num_bytes( rsa_->e );
// Buffer e = Buffer::Alloc( len );
// if ( NULL == e.buf )
// {
// return Buffer();
// }
// BN_bn2bin( rsa_->e, (unsigned char *)e.buf );
// return e;
// }
// return Buffer();
//}
RSACrypto::PublicKey::PublicKey() : rsa_( NULL )
{
}
RSA* RSACrypto::PublicKey::Alloc()
{
RSA* rsa = RSA_new();
assert( rsa );
rsa->n = BN_new();
rsa->e = BN_new();
return rsa;
}
void RSACrypto::PublicKey::Free(rsa_st* p)
{
if ( p )
{
RSA_free( p );
}
}
void RSACrypto::PublicKey::Copy(rsa_st* to, const rsa_st* from)
{
BN_copy( to->n, from->n );
BN_copy( to->e, from->e );
}
RSACrypto::PrivateKey::PrivateKey() : rsa_( NULL )
{
}
RSACrypto::PrivateKey::PrivateKey(rsa_st* rsa) : rsa_( rsa )
{
}
RSACrypto::PrivateKey::~PrivateKey()
{
if ( rsa_ )
{
RSA_free( rsa_ );
rsa_ = NULL;
}
}
RSA* RSACrypto::PrivateKey::Alloc()
{
RSA* rsa = RSA_new();
assert( rsa );
rsa->d = BN_new();
rsa->p = BN_new();
rsa->q = BN_new();
return rsa;
}
Buffer RSACrypto::EncryptPublic(const RSACrypto::PublicKey* k, const unsigned char* plain, int plainLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer cipherText = Buffer::Alloc( rsaSize );
if ( NULL == cipherText.buf )
{
return Buffer();
}
// must be checked when RSA_PKCS1_OAEP_PADDING mode
if ( plainLen >= rsaSize - 41 )
{
Buffer::Free(cipherText);
assert(false);
return Buffer();
}
int cipherTextLen = RSA_public_encrypt(
plainLen,
plain,
(unsigned char *)cipherText.buf,
k->rsa_,
RSA_PKCS1_OAEP_PADDING);
if ( -1 == cipherTextLen )
{
Buffer::Free(cipherText);
return Buffer();
}
assert( cipherTextLen == rsaSize );
//XSystem::MemoryPool::MemoryPool_Realloc( cipherText, cipherTextLen );
return cipherText;
}
Buffer RSACrypto::DecryptPrivate(const RSACrypto::PrivateKey* k, const unsigned char* cipher, int cipherLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer plainText = Buffer::Alloc( rsaSize );
if ( NULL == plainText.buf )
{
return Buffer();
}
int plainTextLen = RSA_private_decrypt(
cipherLen,
cipher,
(unsigned char *)plainText.buf,
k->rsa_,
RSA_PKCS1_OAEP_PADDING);
if ( -1 == plainTextLen )
{
Buffer::Free(plainText);
return Buffer();
}
plainText.len = plainTextLen;
return plainText;
}
Buffer RSACrypto::EncryptPrivate(const RSACrypto::PrivateKey* k, const unsigned char* plain, int plainLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer cipherText = Buffer::Alloc( rsaSize );
if ( NULL == cipherText.buf )
{
return Buffer();
}
// must be checked when RSA_PKCS1_PADDING mode (private encrypt에서는 다른 padding을 지원안한다.)
if ( plainLen >= rsaSize - 11 )
{
Buffer::Free(cipherText);
assert(false);
return Buffer();
}
int cipherTextLen = RSA_private_encrypt(
plainLen,
plain,
(unsigned char *)cipherText.buf,
k->rsa_,
RSA_PKCS1_PADDING);
if ( -1 == cipherTextLen )
{
Buffer::Free(cipherText);
return Buffer();
}
assert( cipherTextLen == rsaSize );
//XSystem::MemoryPool::MemoryPool_Realloc( cipherText, cipherTextLen );
return cipherText;
}
Buffer RSACrypto::DecryptPublic(const RSACrypto::PublicKey* k, const unsigned char* cipher, int cipherLen)
{
int rsaSize = RSA_size( k->rsa_ );
Buffer plainText = Buffer::Alloc( rsaSize );
if ( NULL == plainText.buf )
{
return Buffer();
}
int plainTextLen = RSA_public_decrypt(
cipherLen,
cipher,
(unsigned char *)plainText.buf,
k->rsa_,
RSA_PKCS1_PADDING);
if ( -1 == plainTextLen )
{
Buffer::Free(plainText);
return Buffer();
}
plainText.len = plainTextLen;
return plainText;
}
bool RSACrypto::GenerateKey(RSACrypto::PublicKey* publicKey, RSACrypto::PrivateKey* privateKey)
{
RSA* rsa = RSA_generate_key( 1024, 7, NULL, NULL );
if ( NULL == rsa )
{
//ERR_get_error();
return false;
}
if ( 1 != RSA_check_key( rsa ) )
{
//ERR_get_error();
return false;
}
publicKey->rsa_ = publicKey->Alloc();
publicKey->Copy( publicKey->rsa_, rsa );
privateKey->rsa_ = rsa;
#ifdef _DEBUG
// printf("n:");
// BN_print_fp(stdout, publicKey->rsa_->n);
// printf("");
// printf("e:");
// BN_print_fp(stdout, publicKey->rsa_->e);
// printf("");
//char buf[1024];
//BIO* bp = BIO_new_mem_buf(buf, sizeof(buf));
//PEM_write_bio_RSAPrivateKey(bp, rsa, 0, 0, 0, 0, 0);
//PEM_read_bio_RSAPrivateKey(bp, )
#endif
return true;
}
bool RSACrypto::PrintKey(const PublicKey* k, std::string& e, std::string& n)
{
char* tmp = BN_bn2hex(k->rsa_->e);
if (!tmp)
{
return false;
}
e = tmp;
tmp = BN_bn2hex(k->rsa_->n);
if (!tmp)
{
return false;
}
n = tmp;
return true;
}
bool RSACrypto::PrintKey(const PrivateKey* k, std::string& n, std::string& e, std::string& d)
{
char* tmp = BN_bn2hex(k->rsa_->n);
if (!tmp)
{
return false;
}
n = tmp;
tmp = BN_bn2hex(k->rsa_->e);
if (!tmp)
{
return false;
}
e = tmp;
tmp = BN_bn2hex(k->rsa_->d);
if (!tmp)
{
return false;
}
d = tmp;
return true;
}
bool RSACrypto::StorePrivateKey(const PrivateKey* k, char* buf, size_t& buflen)
{
// DER 포맷으로 변환
char* tmp = NULL;
int n = i2d_RSAPrivateKey(k->rsa_, (unsigned char **)&tmp);
if (n < 0)
{
return false;
}
if (n > (int)buflen)
{
printf("RSACrypto::StorePrivateKey: buflen is too small\n");
return false;
}
memcpy(buf, tmp, n);
buflen = n;
free(tmp);
return true;
}
bool RSACrypto::RestorePrivateKey(const char* buf, size_t buflen, PrivateKey* k)
{
// DER 포맷에서 변환
char* tmp = (char *)malloc(buflen);
if (!tmp)
{
return false;
}
memcpy(tmp, buf, buflen);
if (!d2i_RSAPrivateKey(&k->rsa_, (const unsigned char **)&tmp, buflen))
{
free(tmp);
return false;
}
return true;
}
bool RSACrypto::StorePublicKey(const PublicKey* k, char* buf, size_t& buflen)
{
// DER 포맷으로 변환
char* tmp = NULL;
int n = i2d_RSAPublicKey(k->rsa_, (unsigned char **)&tmp);
if (n < 0)
{
return false;
}
if (n > (int)buflen)
{
printf("RSACrypto::StorePublicKey: buflen is too small\n");
return false;
}
memcpy(buf, tmp, n);
buflen = n;
free(tmp);
return true;
}
bool RSACrypto::RestorePublicKey(const char* buf, size_t buflen, PublicKey* k)
{
// DER 포맷에서 변환
char* tmp = (char *)malloc(buflen);
if (!tmp)
{
return false;
}
memcpy(tmp, buf, buflen);
if (!d2i_RSAPublicKey(&k->rsa_, (const unsigned char **)&tmp, buflen))
{
free(tmp);
return false;
}
return true;
}
Buffer SHA1::Digest(const Buffer& plain)
{
Buffer result = Buffer::Alloc( 20 );
::SHA1( (const unsigned char *)plain.buf,
(unsigned long)plain.len,
(unsigned char *)result.buf);
return result;
}
}
+22
View File
@@ -0,0 +1,22 @@
========================================================================
정적 라이브러리 : libserverkey 프로젝트 개요
========================================================================
응용 프로그램 마법사에서 이 libserverkey 라이브러리를 만들었습니다.
프로젝트에 대해 소스 파일은 만들어지지 않았습니다.
libserverkey.vcproj
응용 프로그램 마법사를 사용하여 생성한 VC++ 프로젝트의 기본 프로젝트 파일입니다.
파일을 생성한 Visual C++ 버전에 대한 정보와
응용 프로그램 마법사를 사용하여 선택한 플랫폼, 구성 및 프로젝트 기능에 대한
정보가 들어 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 참고:
응용 프로그램 마법사에서 사용하는 "TODO:" 주석은 사용자가 추가하거나 사용자 지정해야 하는
소스 코드 부분을 나타냅니다.
/////////////////////////////////////////////////////////////////////////////
+374
View File
@@ -0,0 +1,374 @@
#pragma once
#include <string.h>
#include <string>
#include <ctype.h>
#include <map>
#include <assert.h>
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <cstdio>
// #define _snprintf snprintf
#ifdef _WIN32
#include <WinSock2.h>
#define FORCEINLINE __forceinline
#pragma comment(lib, "Ws2_32.lib")
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define FORCEINLINE inline
#define strcpy_s(__dst, __len, __src) strncpy(__dst, __src, __len)
#define _stricmp(__dst, __src) strcasecmp(__dst, __src)
#define strncpy_s(__dst, __dstlen, __src, __srclen) strncpy(__dst, __src, __srclen)
#endif
class SIM
{
public:
SIM() {};
enum
{
SIM_IP_MAC_TYPE,
SIM_IP_RANGE_TYPE,
SIM_IP_TYPE,
};
//
// SIM 파일의 한 line을 파싱한다.
//
bool ParseLine(const char* line)
{
char buf[1024];
strcpy_s(buf, sizeof(buf), line);
// \t를 찾아보고 있으면, [IP]\t[MAC]\n 규칙으로 파싱한다.
char* tpos = strchr(buf, '\t');
if (tpos)
{
*tpos = 0;
// ip와 mac
unsigned int ip = htonl(inet_addr(buf));
char* mac = tpos + 1;
if (false == checkmac(mac))
{
printf("invalid MAC address - mac(%s)\n", mac);
return false;
}
printf("IP-MAC type added - ip(%u) mac(%s)\n", ip, mac);
macips.insert(MAC_IP_map::value_type(mac, ip));
return true;
}
// ~를 찾아보고 있으면, [IP]~[IP]\n 규칙으로 파싱한다.
char* tilt = strchr(buf, '~');
if (tilt)
{
*tilt = 0;
// begin ip와 end ip
char* bip = buf;
char* eip = tilt + 1;
IPRANGE ipr;
ipr.fromip = htonl(inet_addr(bip));
ipr.toip = htonl(inet_addr(eip));
printf("IP RANGE type added - begin[%u] end[%u]\n", ipr.fromip, ipr.toip);
ipranges.push_back(ipr);
return true;
}
// \t나 ~가 없으면, [IP]\n 규칙으로 파싱한다.
unsigned int ip = htonl(inet_addr(buf));
printf("single IP type added - ip(%u)\n", ip);
ips.push_back(ip);
return true;
}
// ParseLine()으로 얻은 데이터를 binary로 변환
void MakeBinary(std::vector<unsigned char>& s)
{
//
// buf에 binary 형태로 기록
//
for (MAC_IP_map::iterator i = macips.begin(); i != macips.end(); ++i)
{
const std::string& mac = i->first;
unsigned int ip = i->second;
unsigned char macbuf[6];
mac2bin(mac, macbuf);
unsigned char type = SIM_IP_MAC_TYPE;
// [type(1)][ip(4)][mac(6)] 총 11바이트
s.push_back(type);
s.insert(s.end(), (unsigned char *)&ip, (unsigned char *)&ip + sizeof(ip));
s.insert(s.end(), macbuf, macbuf + sizeof(macbuf));
}
for (IPRanges::iterator i = ipranges.begin(); i != ipranges.end(); ++i)
{
unsigned int bip = (*i).fromip;
unsigned int eip = (*i).toip;
unsigned char type = SIM_IP_RANGE_TYPE;
// [type(1)][ip(4)][ip(4)]
s.push_back(type);
s.insert(s.end(), (unsigned char *)&bip, (unsigned char *)&bip + sizeof(bip));
s.insert(s.end(), (unsigned char *)&eip, (unsigned char *)&eip + sizeof(eip));
}
for (IPs::iterator i = ips.begin(); i != ips.end(); ++i)
{
unsigned int ip = *i;
unsigned char type = SIM_IP_TYPE;
// [type(1)][ip(4)]
s.push_back(type);
s.insert(s.end(), (unsigned char *)&ip, (unsigned char *)&ip + sizeof(ip));
}
}
// sim binary를 parsing해서 데이터 채움
bool ParseBinary(const char* buf, int buflen)
{
unsigned char* iter = (unsigned char *)buf;
while (iter != (unsigned char *)buf + buflen)
{
unsigned char type = *iter++;
switch (type)
{
case SIM_IP_MAC_TYPE:
// [type(1)][ip(4)][mac(6)]
{
unsigned int ip = 0;
memcpy(&ip, iter, sizeof(ip));
iter += sizeof(ip);
char mac[18]; // AA-BB-CC-DD-EE-FF
bin2mac(iter, mac);
iter += 6;
#ifdef _DEBUG
printf("IP-MAC type added - ip(%u) mac(%s)\n", ip, mac);
#endif
macips.insert(MAC_IP_map::value_type(mac, ip));
break;
}
case SIM_IP_RANGE_TYPE:
// [type(1)][ip(4)][ip(4)]
{
unsigned int bip = 0;
memcpy(&bip, iter, sizeof(bip));
iter += sizeof(bip);
unsigned int eip = 0;
memcpy(&eip, iter, sizeof(eip));
iter += sizeof(eip);
IPRANGE ipr;
ipr.fromip = bip;
ipr.toip = eip;
#ifdef _DEBUG
printf("IP RANGE type added - begin[%u] end[%u]\n", ipr.fromip, ipr.toip);
#endif
ipranges.push_back(ipr);
break;
}
case SIM_IP_TYPE:
// [type(1)][ip(4)]
{
unsigned int ip = 0;
memcpy(&ip, iter, sizeof(ip));
iter += sizeof(ip);
#ifdef _DEBUG
printf("single IP type added - ip(%u)\n", ip);
#endif
ips.push_back(ip);
break;
}
default:
#ifdef _DEBUG
printf("parseBinary: invalid type (%u)\n", type);
#endif
return false;
}
}
return true;
}
FORCEINLINE bool CheckIpAndMac(const char* ip, const char* mac)
{
assert(ip);
assert(mac);
unsigned int uip = htonl(inet_addr(ip));
// ip & mac 체크
for (MAC_IP_map::iterator i = macips.begin(); i != macips.end(); ++i)
{
const char* allowmac = i->first.c_str();
unsigned int allowip = i->second;
// ip는 같은데 mac이 다른 경우
if (allowip == uip && _stricmp(allowmac, mac))
{
return false;
}
// mac은 같은데 ip가 다른 경우
if (_stricmp(allowmac, mac) == 0 && allowip != uip)
{
return false;
}
// ip와 mac이 모두 같은 경우
if (allowip == uip && _stricmp(allowmac, mac) == 0)
{
return true;
}
// ip와 mac이 모두 다른 경우는 pass
}
// 범위 체크
for (size_t i = 0; i < ipranges.size(); i++)
{
if (ipranges[i].fromip <= uip && uip <= ipranges[i].toip)
{
return true;
}
}
// 싱글 ip 체크
for (size_t i = 0; i < ips.size(); i++)
{
if (uip == ips[i])
{
return true;
}
}
return false;
}
typedef std::map<std::string, unsigned int> MAC_IP_map; // MAC(string)을 키로 ip(uint)를 찾음
typedef std::vector<unsigned int> IPs; // single ip(uint)
struct IPRANGE
{
unsigned int fromip; // ip range (begin)
unsigned int toip; // ip ragne (end)
};
typedef std::vector<IPRANGE> IPRanges;
private:
bool checkmac(const char* mac)
{
size_t len = strlen(mac);
if (len != 12 && len != 17)
{
// 길이 이상
printf("checkmac - invalid length (%s)(%u)\n", mac, len);
return false;
}
for (size_t i = 0; i < len; i++)
{
// 하이픈(-) 체크
if (len == 17 && i % 3 == 2)
{
if (mac[i] == '-')
{
continue;
}
else
{
printf("checkmac - cannot find '-' (%s)\n", mac);
return false;
}
}
// 문자 범위 검사
if (mac[i] >= '0' && mac[i] <= '9') continue;
if (mac[i] >= 'A' && mac[i] <= 'F') continue;
if (mac[i] >= 'a' && mac[i] <= 'f') continue;
// 알수 없는 문자
printf("checkmac - invalid character (%s)(%c)\n", mac, mac[i]);
return false;
}
return true;
}
bool mac2bin(const std::string& mac, unsigned char* outbuf)
{
assert(mac.size() == 12 || mac.size() == 17); // AABBCCDDEEFF 형태이거나 AA-BB-CC-DD-EE-FF 형태이거나
if (mac.size() == 12)
{
for (size_t i = 0, k = 0; i < mac.size(); i += 2, k++)
{
char buf[3] = {0, };
strncpy_s(buf, sizeof(buf), &mac[i], 2);
unsigned char b = atoi(buf);
outbuf[k] = b;
}
return true;
}
else if (mac.size() == 17)
{
for (size_t i = 0, k = 0; i < mac.size(); i += 3, k++)
{
char buf[3] = {0, };
strncpy_s(buf, sizeof(buf), &mac[i], 2);
char* endptr = buf + 2;
unsigned char b = (unsigned char)strtol(buf, &endptr, 16);
outbuf[k] = b;
}
return true;
}
return false;
}
void bin2mac(unsigned char* bin, char* outbuf)
{
for (int i = 0; i < 6; i++)
{
snprintf(outbuf + (i*3), 3, "%02X", bin[i]);
// 마지막엔 하이픈(-) 안 붙임
if (i < 5)
{
strcat(outbuf, "-");
}
}
}
private:
MAC_IP_map macips; // mac-ip 조합을 먼저 검사한다. (우선순위 높음)
IPRanges ipranges;
IPs ips;
};
+759
View File
@@ -0,0 +1,759 @@
#ifndef __GenerateRSAKey_1342601737__
#define __GenerateRSAKey_1342601737__
// created : Thu Jul 12 14:55:01 2012 (time_t = 1342601737)
#include <vector>
inline void CreatePrivateKey(std::vector<unsigned char>& key)
{
key.push_back(48); // 0
key.push_back(130); // 1
key.push_back(2); // 2
key.push_back(91); // 3
key.push_back(2); // 4
key.push_back(1); // 5
key.push_back(0); // 6
key.push_back(2); // 7
key.push_back(129); // 8
key.push_back(129); // 9
key.push_back(0); // 10
key.push_back(236); // 11
key.push_back(244); // 12
key.push_back(10); // 13
key.push_back(46); // 14
key.push_back(128); // 15
key.push_back(97); // 16
key.push_back(100); // 17
key.push_back(250); // 18
key.push_back(237); // 19
key.push_back(187); // 20
key.push_back(150); // 21
key.push_back(124); // 22
key.push_back(87); // 23
key.push_back(56); // 24
key.push_back(156); // 25
key.push_back(91); // 26
key.push_back(20); // 27
key.push_back(111); // 28
key.push_back(73); // 29
key.push_back(168); // 30
key.push_back(142); // 31
key.push_back(176); // 32
key.push_back(189); // 33
key.push_back(1); // 34
key.push_back(135); // 35
key.push_back(122); // 36
key.push_back(109); // 37
key.push_back(224); // 38
key.push_back(2); // 39
key.push_back(210); // 40
key.push_back(197); // 41
key.push_back(203); // 42
key.push_back(201); // 43
key.push_back(173); // 44
key.push_back(172); // 45
key.push_back(201); // 46
key.push_back(163); // 47
key.push_back(139); // 48
key.push_back(40); // 49
key.push_back(228); // 50
key.push_back(34); // 51
key.push_back(242); // 52
key.push_back(242); // 53
key.push_back(8); // 54
key.push_back(37); // 55
key.push_back(59); // 56
key.push_back(238); // 57
key.push_back(96); // 58
key.push_back(98); // 59
key.push_back(158); // 60
key.push_back(26); // 61
key.push_back(64); // 62
key.push_back(30); // 63
key.push_back(17); // 64
key.push_back(253); // 65
key.push_back(128); // 66
key.push_back(245); // 67
key.push_back(61); // 68
key.push_back(12); // 69
key.push_back(53); // 70
key.push_back(32); // 71
key.push_back(192); // 72
key.push_back(54); // 73
key.push_back(140); // 74
key.push_back(106); // 75
key.push_back(202); // 76
key.push_back(79); // 77
key.push_back(144); // 78
key.push_back(21); // 79
key.push_back(109); // 80
key.push_back(163); // 81
key.push_back(18); // 82
key.push_back(164); // 83
key.push_back(207); // 84
key.push_back(129); // 85
key.push_back(58); // 86
key.push_back(200); // 87
key.push_back(139); // 88
key.push_back(126); // 89
key.push_back(95); // 90
key.push_back(122); // 91
key.push_back(100); // 92
key.push_back(142); // 93
key.push_back(185); // 94
key.push_back(149); // 95
key.push_back(154); // 96
key.push_back(88); // 97
key.push_back(71); // 98
key.push_back(227); // 99
key.push_back(252); // 100
key.push_back(229); // 101
key.push_back(36); // 102
key.push_back(140); // 103
key.push_back(222); // 104
key.push_back(171); // 105
key.push_back(62); // 106
key.push_back(18); // 107
key.push_back(222); // 108
key.push_back(179); // 109
key.push_back(100); // 110
key.push_back(90); // 111
key.push_back(11); // 112
key.push_back(181); // 113
key.push_back(175); // 114
key.push_back(102); // 115
key.push_back(66); // 116
key.push_back(101); // 117
key.push_back(38); // 118
key.push_back(16); // 119
key.push_back(177); // 120
key.push_back(236); // 121
key.push_back(110); // 122
key.push_back(53); // 123
key.push_back(102); // 124
key.push_back(157); // 125
key.push_back(205); // 126
key.push_back(45); // 127
key.push_back(139); // 128
key.push_back(125); // 129
key.push_back(200); // 130
key.push_back(33); // 131
key.push_back(60); // 132
key.push_back(238); // 133
key.push_back(125); // 134
key.push_back(42); // 135
key.push_back(145); // 136
key.push_back(120); // 137
key.push_back(175); // 138
key.push_back(2); // 139
key.push_back(1); // 140
key.push_back(7); // 141
key.push_back(2); // 142
key.push_back(129); // 143
key.push_back(128); // 144
key.push_back(67); // 145
key.push_back(179); // 146
key.push_back(112); // 147
key.push_back(159); // 148
key.push_back(146); // 149
key.push_back(100); // 150
key.push_back(248); // 151
key.push_back(71); // 152
key.push_back(177); // 153
key.push_back(163); // 154
key.push_back(79); // 155
key.push_back(145); // 156
key.push_back(61); // 157
key.push_back(125); // 158
key.push_back(227); // 159
key.push_back(135); // 160
key.push_back(188); // 161
key.push_back(178); // 162
key.push_back(21); // 163
key.push_back(11); // 164
key.push_back(150); // 165
key.push_back(123); // 166
key.push_back(163); // 167
key.push_back(183); // 168
key.push_back(75); // 169
key.push_back(71); // 170
key.push_back(141); // 171
key.push_back(27); // 172
key.push_back(110); // 173
key.push_back(133); // 174
key.push_back(93); // 175
key.push_back(21); // 176
key.push_back(167); // 177
key.push_back(86); // 178
key.push_back(49); // 179
key.push_back(94); // 180
key.push_back(46); // 181
key.push_back(186); // 182
key.push_back(11); // 183
key.push_back(174); // 184
key.push_back(229); // 185
key.push_back(105); // 186
key.push_back(252); // 187
key.push_back(2); // 188
key.push_back(83); // 189
key.push_back(199); // 190
key.push_back(250); // 191
key.push_back(246); // 192
key.push_back(247); // 193
key.push_back(154); // 194
key.push_back(226); // 195
key.push_back(237); // 196
key.push_back(191); // 197
key.push_back(114); // 198
key.push_back(218); // 199
key.push_back(183); // 200
key.push_back(33); // 201
key.push_back(127); // 202
key.push_back(40); // 203
key.push_back(15); // 204
key.push_back(45); // 205
key.push_back(237); // 206
key.push_back(198); // 207
key.push_back(112); // 208
key.push_back(182); // 209
key.push_back(85); // 210
key.push_back(224); // 211
key.push_back(139); // 212
key.push_back(169); // 213
key.push_back(170); // 214
key.push_back(255); // 215
key.push_back(182); // 216
key.push_back(75); // 217
key.push_back(232); // 218
key.push_back(156); // 219
key.push_back(102); // 220
key.push_back(18); // 221
key.push_back(42); // 222
key.push_back(110); // 223
key.push_back(10); // 224
key.push_back(133); // 225
key.push_back(1); // 226
key.push_back(66); // 227
key.push_back(68); // 228
key.push_back(104); // 229
key.push_back(77); // 230
key.push_back(25); // 231
key.push_back(171); // 232
key.push_back(194); // 233
key.push_back(154); // 234
key.push_back(207); // 235
key.push_back(48); // 236
key.push_back(197); // 237
key.push_back(80); // 238
key.push_back(17); // 239
key.push_back(235); // 240
key.push_back(251); // 241
key.push_back(63); // 242
key.push_back(80); // 243
key.push_back(47); // 244
key.push_back(128); // 245
key.push_back(116); // 246
key.push_back(244); // 247
key.push_back(199); // 248
key.push_back(0); // 249
key.push_back(159); // 250
key.push_back(230); // 251
key.push_back(71); // 252
key.push_back(221); // 253
key.push_back(29); // 254
key.push_back(150); // 255
key.push_back(167); // 256
key.push_back(15); // 257
key.push_back(241); // 258
key.push_back(109); // 259
key.push_back(14); // 260
key.push_back(112); // 261
key.push_back(38); // 262
key.push_back(152); // 263
key.push_back(32); // 264
key.push_back(209); // 265
key.push_back(83); // 266
key.push_back(202); // 267
key.push_back(149); // 268
key.push_back(35); // 269
key.push_back(48); // 270
key.push_back(34); // 271
key.push_back(167); // 272
key.push_back(2); // 273
key.push_back(65); // 274
key.push_back(0); // 275
key.push_back(249); // 276
key.push_back(18); // 277
key.push_back(51); // 278
key.push_back(126); // 279
key.push_back(206); // 280
key.push_back(242); // 281
key.push_back(44); // 282
key.push_back(91); // 283
key.push_back(102); // 284
key.push_back(50); // 285
key.push_back(246); // 286
key.push_back(251); // 287
key.push_back(47); // 288
key.push_back(245); // 289
key.push_back(182); // 290
key.push_back(78); // 291
key.push_back(27); // 292
key.push_back(170); // 293
key.push_back(68); // 294
key.push_back(72); // 295
key.push_back(119); // 296
key.push_back(180); // 297
key.push_back(65); // 298
key.push_back(107); // 299
key.push_back(180); // 300
key.push_back(116); // 301
key.push_back(81); // 302
key.push_back(191); // 303
key.push_back(113); // 304
key.push_back(40); // 305
key.push_back(114); // 306
key.push_back(181); // 307
key.push_back(29); // 308
key.push_back(129); // 309
key.push_back(186); // 310
key.push_back(23); // 311
key.push_back(66); // 312
key.push_back(183); // 313
key.push_back(252); // 314
key.push_back(130); // 315
key.push_back(237); // 316
key.push_back(57); // 317
key.push_back(181); // 318
key.push_back(96); // 319
key.push_back(228); // 320
key.push_back(66); // 321
key.push_back(97); // 322
key.push_back(117); // 323
key.push_back(174); // 324
key.push_back(155); // 325
key.push_back(177); // 326
key.push_back(17); // 327
key.push_back(92); // 328
key.push_back(119); // 329
key.push_back(225); // 330
key.push_back(177); // 331
key.push_back(122); // 332
key.push_back(213); // 333
key.push_back(117); // 334
key.push_back(225); // 335
key.push_back(219); // 336
key.push_back(118); // 337
key.push_back(233); // 338
key.push_back(67); // 339
key.push_back(2); // 340
key.push_back(65); // 341
key.push_back(0); // 342
key.push_back(243); // 343
key.push_back(139); // 344
key.push_back(138); // 345
key.push_back(40); // 346
key.push_back(116); // 347
key.push_back(164); // 348
key.push_back(247); // 349
key.push_back(185); // 350
key.push_back(52); // 351
key.push_back(238); // 352
key.push_back(102); // 353
key.push_back(218); // 354
key.push_back(89); // 355
key.push_back(1); // 356
key.push_back(70); // 357
key.push_back(236); // 358
key.push_back(141); // 359
key.push_back(53); // 360
key.push_back(226); // 361
key.push_back(129); // 362
key.push_back(176); // 363
key.push_back(216); // 364
key.push_back(61); // 365
key.push_back(3); // 366
key.push_back(6); // 367
key.push_back(106); // 368
key.push_back(190); // 369
key.push_back(58); // 370
key.push_back(105); // 371
key.push_back(29); // 372
key.push_back(249); // 373
key.push_back(207); // 374
key.push_back(5); // 375
key.push_back(255); // 376
key.push_back(96); // 377
key.push_back(166); // 378
key.push_back(213); // 379
key.push_back(186); // 380
key.push_back(96); // 381
key.push_back(115); // 382
key.push_back(246); // 383
key.push_back(217); // 384
key.push_back(9); // 385
key.push_back(201); // 386
key.push_back(166); // 387
key.push_back(135); // 388
key.push_back(251); // 389
key.push_back(175); // 390
key.push_back(206); // 391
key.push_back(253); // 392
key.push_back(239); // 393
key.push_back(9); // 394
key.push_back(72); // 395
key.push_back(140); // 396
key.push_back(135); // 397
key.push_back(163); // 398
key.push_back(201); // 399
key.push_back(194); // 400
key.push_back(51); // 401
key.push_back(145); // 402
key.push_back(83); // 403
key.push_back(242); // 404
key.push_back(22); // 405
key.push_back(37); // 406
key.push_back(2); // 407
key.push_back(64); // 408
key.push_back(106); // 409
key.push_back(190); // 410
key.push_back(168); // 411
key.push_back(90); // 412
key.push_back(234); // 413
key.push_back(250); // 414
key.push_back(19); // 415
key.push_back(2); // 416
key.push_back(153); // 417
key.push_back(131); // 418
key.push_back(142); // 419
key.push_back(107); // 420
key.push_back(166); // 421
key.push_back(215); // 422
key.push_back(4); // 423
key.push_back(252); // 424
key.push_back(231); // 425
key.push_back(72); // 426
key.push_back(248); // 427
key.push_back(177); // 428
key.push_back(87); // 429
key.push_back(223); // 430
key.push_back(137); // 431
key.push_back(192); // 432
key.push_back(113); // 433
key.push_back(232); // 434
key.push_back(181); // 435
key.push_back(82); // 436
key.push_back(11); // 437
key.push_back(236); // 438
key.push_back(195); // 439
key.push_back(114); // 440
key.push_back(49); // 441
key.push_back(55); // 442
key.push_back(152); // 443
key.push_back(229); // 444
key.push_back(101); // 445
key.push_back(188); // 446
key.push_back(144); // 447
key.push_back(202); // 448
key.push_back(101); // 449
key.push_back(171); // 450
key.push_back(4); // 451
key.push_back(151); // 452
key.push_back(61); // 453
key.push_back(65); // 454
key.push_back(5); // 455
key.push_back(50); // 456
key.push_back(111); // 457
key.push_back(103); // 458
key.push_back(75); // 459
key.push_back(226); // 460
key.push_back(222); // 461
key.push_back(124); // 462
key.push_back(133); // 463
key.push_back(76); // 464
key.push_back(16); // 465
key.push_back(18); // 466
key.push_back(87); // 467
key.push_back(23); // 468
key.push_back(167); // 469
key.push_back(50); // 470
key.push_back(246); // 471
key.push_back(65); // 472
key.push_back(2); // 473
key.push_back(65); // 474
key.push_back(0); // 475
key.push_back(139); // 476
key.push_back(43); // 477
key.push_back(42); // 478
key.push_back(96); // 479
key.push_back(66); // 480
key.push_back(167); // 481
key.push_back(104); // 482
key.push_back(252); // 483
key.push_back(30); // 484
key.push_back(63); // 485
key.push_back(22); // 486
key.push_back(51); // 487
key.push_back(160); // 488
key.push_back(147); // 489
key.push_back(3); // 490
key.push_back(244); // 491
key.push_back(226); // 492
key.push_back(250); // 493
key.push_back(56); // 494
key.push_back(74); // 495
key.push_back(27); // 496
key.push_back(233); // 497
key.push_back(71); // 498
key.push_back(111); // 499
key.push_back(113); // 500
key.push_back(97); // 501
key.push_back(145); // 502
key.push_back(69); // 503
key.push_back(242); // 504
key.push_back(236); // 505
key.push_back(142); // 506
key.push_back(191); // 507
key.push_back(113); // 508
key.push_back(36); // 509
key.push_back(55); // 510
key.push_back(58); // 511
key.push_back(195); // 512
key.push_back(69); // 513
key.push_back(237); // 514
key.push_back(249); // 515
key.push_back(31); // 516
key.push_back(87); // 517
key.push_back(115); // 518
key.push_back(78); // 519
key.push_back(168); // 520
key.push_back(77); // 521
key.push_back(180); // 522
key.push_back(100); // 523
key.push_back(118); // 524
key.push_back(71); // 525
key.push_back(246); // 526
key.push_back(78); // 527
key.push_back(114); // 528
key.push_back(153); // 529
key.push_back(114); // 530
key.push_back(20); // 531
key.push_back(115); // 532
key.push_back(74); // 533
key.push_back(102); // 534
key.push_back(156); // 535
key.push_back(47); // 536
key.push_back(248); // 537
key.push_back(12); // 538
key.push_back(167); // 539
key.push_back(2); // 540
key.push_back(65); // 541
key.push_back(0); // 542
key.push_back(173); // 543
key.push_back(222); // 544
key.push_back(236); // 545
key.push_back(92); // 546
key.push_back(198); // 547
key.push_back(35); // 548
key.push_back(156); // 549
key.push_back(214); // 550
key.push_back(24); // 551
key.push_back(222); // 552
key.push_back(72); // 553
key.push_back(141); // 554
key.push_back(96); // 555
key.push_back(152); // 556
key.push_back(31); // 557
key.push_back(13); // 558
key.push_back(17); // 559
key.push_back(207); // 560
key.push_back(195); // 561
key.push_back(57); // 562
key.push_back(217); // 563
key.push_back(82); // 564
key.push_back(154); // 565
key.push_back(39); // 566
key.push_back(186); // 567
key.push_back(164); // 568
key.push_back(138); // 569
key.push_back(111); // 570
key.push_back(204); // 571
key.push_back(172); // 572
key.push_back(251); // 573
key.push_back(117); // 574
key.push_back(133); // 575
key.push_back(2); // 576
key.push_back(71); // 577
key.push_back(205); // 578
key.push_back(44); // 579
key.push_back(1); // 580
key.push_back(105); // 581
key.push_back(59); // 582
key.push_back(248); // 583
key.push_back(185); // 584
key.push_back(192); // 585
key.push_back(89); // 586
key.push_back(202); // 587
key.push_back(16); // 588
key.push_back(152); // 589
key.push_back(91); // 590
key.push_back(228); // 591
key.push_back(82); // 592
key.push_back(23); // 593
key.push_back(148); // 594
key.push_back(213); // 595
key.push_back(50); // 596
key.push_back(130); // 597
key.push_back(48); // 598
key.push_back(169); // 599
key.push_back(114); // 600
key.push_back(129); // 601
key.push_back(152); // 602
key.push_back(130); // 603
key.push_back(207); // 604
key.push_back(151); // 605
key.push_back(169); // 606
}
inline void CreatePublicKey(std::vector<unsigned char>& key)
{
key.push_back(48); // 0
key.push_back(129); // 1
key.push_back(135); // 2
key.push_back(2); // 3
key.push_back(129); // 4
key.push_back(129); // 5
key.push_back(0); // 6
key.push_back(236); // 7
key.push_back(244); // 8
key.push_back(10); // 9
key.push_back(46); // 10
key.push_back(128); // 11
key.push_back(97); // 12
key.push_back(100); // 13
key.push_back(250); // 14
key.push_back(237); // 15
key.push_back(187); // 16
key.push_back(150); // 17
key.push_back(124); // 18
key.push_back(87); // 19
key.push_back(56); // 20
key.push_back(156); // 21
key.push_back(91); // 22
key.push_back(20); // 23
key.push_back(111); // 24
key.push_back(73); // 25
key.push_back(168); // 26
key.push_back(142); // 27
key.push_back(176); // 28
key.push_back(189); // 29
key.push_back(1); // 30
key.push_back(135); // 31
key.push_back(122); // 32
key.push_back(109); // 33
key.push_back(224); // 34
key.push_back(2); // 35
key.push_back(210); // 36
key.push_back(197); // 37
key.push_back(203); // 38
key.push_back(201); // 39
key.push_back(173); // 40
key.push_back(172); // 41
key.push_back(201); // 42
key.push_back(163); // 43
key.push_back(139); // 44
key.push_back(40); // 45
key.push_back(228); // 46
key.push_back(34); // 47
key.push_back(242); // 48
key.push_back(242); // 49
key.push_back(8); // 50
key.push_back(37); // 51
key.push_back(59); // 52
key.push_back(238); // 53
key.push_back(96); // 54
key.push_back(98); // 55
key.push_back(158); // 56
key.push_back(26); // 57
key.push_back(64); // 58
key.push_back(30); // 59
key.push_back(17); // 60
key.push_back(253); // 61
key.push_back(128); // 62
key.push_back(245); // 63
key.push_back(61); // 64
key.push_back(12); // 65
key.push_back(53); // 66
key.push_back(32); // 67
key.push_back(192); // 68
key.push_back(54); // 69
key.push_back(140); // 70
key.push_back(106); // 71
key.push_back(202); // 72
key.push_back(79); // 73
key.push_back(144); // 74
key.push_back(21); // 75
key.push_back(109); // 76
key.push_back(163); // 77
key.push_back(18); // 78
key.push_back(164); // 79
key.push_back(207); // 80
key.push_back(129); // 81
key.push_back(58); // 82
key.push_back(200); // 83
key.push_back(139); // 84
key.push_back(126); // 85
key.push_back(95); // 86
key.push_back(122); // 87
key.push_back(100); // 88
key.push_back(142); // 89
key.push_back(185); // 90
key.push_back(149); // 91
key.push_back(154); // 92
key.push_back(88); // 93
key.push_back(71); // 94
key.push_back(227); // 95
key.push_back(252); // 96
key.push_back(229); // 97
key.push_back(36); // 98
key.push_back(140); // 99
key.push_back(222); // 100
key.push_back(171); // 101
key.push_back(62); // 102
key.push_back(18); // 103
key.push_back(222); // 104
key.push_back(179); // 105
key.push_back(100); // 106
key.push_back(90); // 107
key.push_back(11); // 108
key.push_back(181); // 109
key.push_back(175); // 110
key.push_back(102); // 111
key.push_back(66); // 112
key.push_back(101); // 113
key.push_back(38); // 114
key.push_back(16); // 115
key.push_back(177); // 116
key.push_back(236); // 117
key.push_back(110); // 118
key.push_back(53); // 119
key.push_back(102); // 120
key.push_back(157); // 121
key.push_back(205); // 122
key.push_back(45); // 123
key.push_back(139); // 124
key.push_back(125); // 125
key.push_back(200); // 126
key.push_back(33); // 127
key.push_back(60); // 128
key.push_back(238); // 129
key.push_back(125); // 130
key.push_back(42); // 131
key.push_back(145); // 132
key.push_back(120); // 133
key.push_back(175); // 134
key.push_back(2); // 135
key.push_back(1); // 136
key.push_back(7); // 137
}
#endif
+50
View File
@@ -0,0 +1,50 @@
#include <string.h>
#include <openssl/sha.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include "base64_ssl.h"
bool base64_ssl(const unsigned char *input, int length, unsigned char* output, int outlen)
{
BIO *bmem, *b64;
BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
if (outlen < bptr->length)
{
BIO_free_all(b64);
return false;
}
memcpy(output, bptr->data, bptr->length-1);
output[bptr->length-1] = 0;
BIO_free_all(b64);
return true;
}
bool unbase64_ssl(unsigned char *input, int length, unsigned char* output, int outlen)
{
BIO *b64, *bmem;
memset(output, 0, outlen);
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new_mem_buf(input, length);
bmem = BIO_push(b64, bmem);
BIO_read(bmem, output, outlen);
BIO_free_all(bmem);
return true;
}
+7
View File
@@ -0,0 +1,7 @@
#ifndef __BASE64_USING_OPENSSL_
#define __BASE64_USING_OPENSSL_
bool base64_ssl(const unsigned char *input, int length, unsigned char* output, int outlen);
bool unbase64_ssl(unsigned char *input, int length, unsigned char* output, int outlen);
#endif
+201
View File
@@ -0,0 +1,201 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="libserverkey"
ProjectGUID="{991E4247-CB13-4CA9-B0F1-B662594935A7}"
RootNamespace="libserverkey"
SccProjectName="SAK"
SccAuxPath="SAK"
SccLocalPath="SAK"
SccProvider="SAK"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(ProjectDir)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../../Extern/openssl/include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)\$(ProjectName)_d.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="소스 파일"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\base64_ssl.cpp"
>
</File>
<File
RelativePath=".\RSACrypto.cpp"
>
</File>
</Filter>
<Filter
Name="헤더 파일"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\base64_ssl.h"
>
</File>
<File
RelativePath=".\CheckServerKey.h"
>
</File>
<File
RelativePath=".\RSACrypto.h"
>
</File>
<File
RelativePath=".\SIM.h"
>
</File>
</Filter>
<Filter
Name="리소스 파일"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
<File
RelativePath=".\ReadMe.txt"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
+10
View File
@@ -0,0 +1,10 @@
""
{
"FILE_VERSION" = "9237"
"ENLISTMENT_CHOICE" = "NEVER"
"PROJECT_FILE_RELATIVE_PATH" = ""
"NUMBER_OF_EXCLUDED_FILES" = "0"
"ORIGINAL_PROJECT_FILE_PATH" = ""
"NUMBER_OF_NESTED_PROJECTS" = "0"
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
}
+103
View File
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{991E4247-CB13-4CA9-B0F1-B662594935A7}</ProjectGuid>
<RootNamespace>libserverkey</RootNamespace>
<SccProjectName>
</SccProjectName>
<SccAuxPath>
</SccAuxPath>
<SccLocalPath>
</SccLocalPath>
<SccProvider>
</SccProvider>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)</OutDir>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../../Extern/openssl/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)$(ProjectName)_d.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="base64_ssl.cpp" />
<ClCompile Include="RSACrypto.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="base64_ssl.h" />
<ClInclude Include="CheckServerKey.h" />
<ClInclude Include="RSACrypto.h" />
<ClInclude Include="SIM.h" />
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="base64_ssl.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="RSACrypto.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="base64_ssl.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="CheckServerKey.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="RSACrypto.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="SIM.h">
<Filter>헤더 파일</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
</Project>