Initial commit: server + serverfiles
This commit is contained in:
Executable
+99
@@ -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;
|
||||
}
|
||||
Executable
+3
@@ -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
|
||||
Executable
+80
@@ -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
|
||||
Executable
+149
@@ -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
|
||||
Executable
+546
@@ -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;
|
||||
}
|
||||
}
|
||||
Executable
+108
@@ -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
|
||||
|
||||
Executable
+487
@@ -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;
|
||||
}
|
||||
}
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
========================================================================
|
||||
정적 라이브러리 : libserverkey 프로젝트 개요
|
||||
========================================================================
|
||||
|
||||
응용 프로그램 마법사에서 이 libserverkey 라이브러리를 만들었습니다.
|
||||
|
||||
프로젝트에 대해 소스 파일은 만들어지지 않았습니다.
|
||||
|
||||
|
||||
libserverkey.vcproj
|
||||
응용 프로그램 마법사를 사용하여 생성한 VC++ 프로젝트의 기본 프로젝트 파일입니다.
|
||||
파일을 생성한 Visual C++ 버전에 대한 정보와
|
||||
응용 프로그램 마법사를 사용하여 선택한 플랫폼, 구성 및 프로젝트 기능에 대한
|
||||
정보가 들어 있습니다.
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
기타 참고:
|
||||
|
||||
응용 프로그램 마법사에서 사용하는 "TODO:" 주석은 사용자가 추가하거나 사용자 지정해야 하는
|
||||
소스 코드 부분을 나타냅니다.
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
Executable
+374
@@ -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;
|
||||
};
|
||||
Executable
+759
@@ -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
|
||||
Executable
+50
@@ -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;
|
||||
}
|
||||
Executable
+7
@@ -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
|
||||
Executable
+201
@@ -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
@@ -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"
|
||||
}
|
||||
Executable
+103
@@ -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
@@ -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>
|
||||
Reference in New Issue
Block a user