Added anf fixed.
This commit is contained in:
parent
726ee78691
commit
1d3b8ef25f
@ -21,7 +21,7 @@
|
|||||||
92C34C282205C94600AB38D3 /* addr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15221FD725F009C5F11 /* addr.cpp */; };
|
92C34C282205C94600AB38D3 /* addr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15221FD725F009C5F11 /* addr.cpp */; };
|
||||||
92C34C292205C95F00AB38D3 /* socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15321FD725F009C5F11 /* socket.cpp */; };
|
92C34C292205C95F00AB38D3 /* socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15321FD725F009C5F11 /* socket.cpp */; };
|
||||||
92C34C37220747A200AB38D3 /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C36220747A200AB38D3 /* sha1.cpp */; };
|
92C34C37220747A200AB38D3 /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C36220747A200AB38D3 /* sha1.cpp */; };
|
||||||
92C34C3B22074B6500AB38D3 /* rsa.c in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C3A22074B6500AB38D3 /* rsa.c */; };
|
92C34C3B22074B6500AB38D3 /* rsa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C3A22074B6500AB38D3 /* rsa.cpp */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
@ -68,7 +68,8 @@
|
|||||||
92C34C36220747A200AB38D3 /* sha1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sha1.cpp; path = src/sha1.cpp; sourceTree = "<group>"; };
|
92C34C36220747A200AB38D3 /* sha1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sha1.cpp; path = src/sha1.cpp; sourceTree = "<group>"; };
|
||||||
92C34C38220747B300AB38D3 /* sha1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sha1.h; path = include/sha1.h; sourceTree = "<group>"; };
|
92C34C38220747B300AB38D3 /* sha1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sha1.h; path = include/sha1.h; sourceTree = "<group>"; };
|
||||||
92C34C3922074B5B00AB38D3 /* rsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rsa.h; path = include/rsa.h; sourceTree = "<group>"; };
|
92C34C3922074B5B00AB38D3 /* rsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rsa.h; path = include/rsa.h; sourceTree = "<group>"; };
|
||||||
92C34C3A22074B6500AB38D3 /* rsa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rsa.c; path = src/rsa.c; sourceTree = "<group>"; };
|
92C34C3A22074B6500AB38D3 /* rsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rsa.cpp; path = src/rsa.cpp; sourceTree = "<group>"; };
|
||||||
|
92C34C3C2207F37A00AB38D3 /* rng.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rng.h; path = include/rng.h; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -118,6 +119,7 @@
|
|||||||
9277A14C21FD7246009C5F11 /* clock.h */,
|
9277A14C21FD7246009C5F11 /* clock.h */,
|
||||||
9277A14621FD7246009C5F11 /* cmap.h */,
|
9277A14621FD7246009C5F11 /* cmap.h */,
|
||||||
9277A14921FD7246009C5F11 /* compute.h */,
|
9277A14921FD7246009C5F11 /* compute.h */,
|
||||||
|
92C34C3C2207F37A00AB38D3 /* rng.h */,
|
||||||
92C34C38220747B300AB38D3 /* sha1.h */,
|
92C34C38220747B300AB38D3 /* sha1.h */,
|
||||||
9277A14B21FD7246009C5F11 /* cpart.h */,
|
9277A14B21FD7246009C5F11 /* cpart.h */,
|
||||||
9277A14A21FD7246009C5F11 /* cthread.h */,
|
9277A14A21FD7246009C5F11 /* cthread.h */,
|
||||||
@ -134,7 +136,7 @@
|
|||||||
9277A15121FD724C009C5F11 /* src */ = {
|
9277A15121FD724C009C5F11 /* src */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
92C34C3A22074B6500AB38D3 /* rsa.c */,
|
92C34C3A22074B6500AB38D3 /* rsa.cpp */,
|
||||||
9277A15221FD725F009C5F11 /* addr.cpp */,
|
9277A15221FD725F009C5F11 /* addr.cpp */,
|
||||||
9277A15C21FD725F009C5F11 /* clock.cpp */,
|
9277A15C21FD725F009C5F11 /* clock.cpp */,
|
||||||
9277A15921FD725F009C5F11 /* cmap.cpp */,
|
9277A15921FD725F009C5F11 /* cmap.cpp */,
|
||||||
@ -225,7 +227,7 @@
|
|||||||
9277A190220079DB009C5F11 /* cproj_proj.cpp in Sources */,
|
9277A190220079DB009C5F11 /* cproj_proj.cpp in Sources */,
|
||||||
92C34C37220747A200AB38D3 /* sha1.cpp in Sources */,
|
92C34C37220747A200AB38D3 /* sha1.cpp in Sources */,
|
||||||
9277A16021FD725F009C5F11 /* md5.cpp in Sources */,
|
9277A16021FD725F009C5F11 /* md5.cpp in Sources */,
|
||||||
92C34C3B22074B6500AB38D3 /* rsa.c in Sources */,
|
92C34C3B22074B6500AB38D3 /* rsa.cpp in Sources */,
|
||||||
9277A16521FD725F009C5F11 /* cmap.cpp in Sources */,
|
9277A16521FD725F009C5F11 /* cmap.cpp in Sources */,
|
||||||
9277A16221FD725F009C5F11 /* main.cpp in Sources */,
|
9277A16221FD725F009C5F11 /* main.cpp in Sources */,
|
||||||
92C34C272205C63A00AB38D3 /* server.cpp in Sources */,
|
92C34C272205C63A00AB38D3 /* server.cpp in Sources */,
|
||||||
|
185
include/rng.h
Executable file
185
include/rng.h
Executable file
@ -0,0 +1,185 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
//
|
||||||
|
// The code in this file is free and unencumbered software released
|
||||||
|
// into the public domain.
|
||||||
|
//
|
||||||
|
// <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef RNG_H
|
||||||
|
#define RNG_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <random>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
/* Microsoft C/C++-compatible compiler
|
||||||
|
* Adaptive implementations
|
||||||
|
*/
|
||||||
|
#include <intrin.h>
|
||||||
|
#define _rdtsc() __rdtsc()
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
|
||||||
|
/* GCC-compatible compiler, targeting x86/x86-64
|
||||||
|
* NO implementation needed
|
||||||
|
*/
|
||||||
|
#include <x86intrin.h>
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && defined(__ARM_NEON__)
|
||||||
|
/* GCC-compatible compiler, targeting ARM with NEON
|
||||||
|
* Adaptive implementations
|
||||||
|
*/
|
||||||
|
#include <arm_neon.h>
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && defined(__IWMMXT__)
|
||||||
|
/* GCC-compatible compiler, targeting ARM with WMMX
|
||||||
|
* Adaptive implementations
|
||||||
|
*/
|
||||||
|
#include <mmintrin.h>
|
||||||
|
|
||||||
|
#elif (defined(__GNUC__) || defined(__xlC__)) && (defined(__VEC__) || defined(__ALTIVEC__))
|
||||||
|
/* XLC or GCC-compatible compiler, targeting PowerPC with VMX/VSX
|
||||||
|
* Adaptive implementations
|
||||||
|
*/
|
||||||
|
#include <altivec.h>
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && defined(__SPE__)
|
||||||
|
/* GCC-compatible compiler, targeting PowerPC with SPE
|
||||||
|
* Adaptive implementations
|
||||||
|
*/
|
||||||
|
#include <spe.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rng {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bitwise circular left shift.
|
||||||
|
//
|
||||||
|
static inline std::uint64_t
|
||||||
|
rotl(const std::uint64_t x, int k)
|
||||||
|
{
|
||||||
|
return (x << k) | (x >> (64 - k));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// A simple random seed generator based on the entropy coming from the
|
||||||
|
// system thread/process scheduler. This is rather slow but seeds are
|
||||||
|
// normally generated very infrequently.
|
||||||
|
//
|
||||||
|
struct tsc_seed
|
||||||
|
{
|
||||||
|
using result_type = std::uint64_t;
|
||||||
|
|
||||||
|
result_type operator()()
|
||||||
|
{
|
||||||
|
std::uint64_t base = _rdtsc();
|
||||||
|
std::uint64_t seed = base & 0xff;
|
||||||
|
for (int i = 1; i < 8; i++) {
|
||||||
|
std::this_thread::yield();
|
||||||
|
seed |= ((_rdtsc() - base) & 0xff) << (i << 3);
|
||||||
|
}
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// A random seed generator based on std::random_device.
|
||||||
|
//
|
||||||
|
struct random_device_seed
|
||||||
|
{
|
||||||
|
using result_type = std::uint64_t;
|
||||||
|
|
||||||
|
result_type operator()()
|
||||||
|
{
|
||||||
|
std::random_device rd;
|
||||||
|
if (sizeof(result_type) > sizeof(std::random_device::result_type))
|
||||||
|
return rd() | (result_type{rd()} << 32);
|
||||||
|
else
|
||||||
|
return rd();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// A random number generator with 64-bit internal state. It is based on
|
||||||
|
// the code from here: http://xoroshiro.di.unimi.it/splitmix64.c
|
||||||
|
//
|
||||||
|
struct rng64
|
||||||
|
{
|
||||||
|
using result_type = std::uint64_t;
|
||||||
|
|
||||||
|
std::uint64_t state;
|
||||||
|
|
||||||
|
rng64(std::uint64_t seed = 1) : state{seed} {}
|
||||||
|
|
||||||
|
result_type operator()()
|
||||||
|
{
|
||||||
|
std::uint64_t z = (state += UINT64_C(0x9E3779B97F4A7C15));
|
||||||
|
z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9);
|
||||||
|
z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB);
|
||||||
|
return z ^ (z >> 31);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// A random number generator with 128-bit internal state. It is based on
|
||||||
|
// the code from here: http://xoroshiro.di.unimi.it/xoroshiro128plus.c
|
||||||
|
//
|
||||||
|
struct rng128
|
||||||
|
{
|
||||||
|
using result_type = std::uint64_t;
|
||||||
|
|
||||||
|
std::uint64_t state[2];
|
||||||
|
|
||||||
|
rng128(std::uint64_t seed[2]) : state{seed[0], seed[1]} {}
|
||||||
|
|
||||||
|
rng128(std::uint64_t s0, std::uint64_t s1) : state{s0, s1} {}
|
||||||
|
|
||||||
|
rng128(std::uint64_t seed = 1)
|
||||||
|
{
|
||||||
|
rng64 seeder(seed);
|
||||||
|
state[0] = seeder();
|
||||||
|
state[1] = seeder();
|
||||||
|
}
|
||||||
|
|
||||||
|
result_type operator()()
|
||||||
|
{
|
||||||
|
const uint64_t s0 = state[0];
|
||||||
|
uint64_t s1 = state[1];
|
||||||
|
const uint64_t value = s0 + s1;
|
||||||
|
|
||||||
|
s1 ^= s0;
|
||||||
|
state[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14);
|
||||||
|
state[1] = rotl(s1, 36);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is the jump function for the generator. It is equivalent
|
||||||
|
// to 2 ^ 64 calls to next(); it can be used to generate 2 ^ 64
|
||||||
|
// non-overlapping subsequences for parallel computations.
|
||||||
|
void jump()
|
||||||
|
{
|
||||||
|
static const std::uint64_t j[] = {0xbeac0467eba5facb, 0xd86b048b86aa9922};
|
||||||
|
|
||||||
|
std::uint64_t s0 = 0, s1 = 0;
|
||||||
|
for (std::size_t i = 0; i < sizeof j / sizeof j[0]; i++) {
|
||||||
|
for (int b = 0; b < 64; b++) {
|
||||||
|
if ((j[i] & UINT64_C(1) << b) != 0) {
|
||||||
|
s0 ^= state[0];
|
||||||
|
s1 ^= state[1];
|
||||||
|
}
|
||||||
|
operator()();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state[0] = s0;
|
||||||
|
state[1] = s1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace rng
|
||||||
|
|
||||||
|
#endif // RNG_H
|
@ -5,9 +5,6 @@
|
|||||||
|
|
||||||
// This is the header file for the library librsaencrypt.a
|
// This is the header file for the library librsaencrypt.a
|
||||||
|
|
||||||
// Change this line to the file you'd like to use as a source of primes.
|
|
||||||
// The format of the file should be one prime per line.
|
|
||||||
char *PRIME_SOURCE_FILE = "primes.txt";
|
|
||||||
|
|
||||||
|
|
||||||
struct public_key_class{
|
struct public_key_class{
|
||||||
@ -23,7 +20,7 @@ struct private_key_class{
|
|||||||
// This function generates public and private keys, then stores them in the structures you
|
// This function generates public and private keys, then stores them in the structures you
|
||||||
// provide pointers to. The 3rd argument should be the text PRIME_SOURCE_FILE to have it use
|
// provide pointers to. The 3rd argument should be the text PRIME_SOURCE_FILE to have it use
|
||||||
// the location specified above in this header.
|
// the location specified above in this header.
|
||||||
void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, const char *PRIME_SOURCE_FILE);
|
void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, string PRIME_SOURCE_FILE);
|
||||||
|
|
||||||
// This function will encrypt the data pointed to by message. It returns a pointer to a heap
|
// This function will encrypt the data pointed to by message. It returns a pointer to a heap
|
||||||
// array containing the encrypted data, or NULL upon failure. This pointer should be freed when
|
// array containing the encrypted data, or NULL upon failure. This pointer should be freed when
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "cpart.h"
|
#include "cpart.h"
|
||||||
#include "cthread.h"
|
#include "cthread.h"
|
||||||
|
#include "rsa.h"
|
||||||
|
|
||||||
class Server;
|
class Server;
|
||||||
|
|
||||||
@ -25,6 +26,12 @@ struct compute_result{
|
|||||||
vector<int> *fargs_out;
|
vector<int> *fargs_out;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//请求数据包
|
||||||
|
struct request {
|
||||||
|
uint64_t r_id;
|
||||||
|
string type;
|
||||||
|
string data;
|
||||||
|
};
|
||||||
|
|
||||||
//通用数据包类
|
//通用数据包类
|
||||||
class packet{
|
class packet{
|
||||||
@ -67,10 +74,11 @@ struct server_info{
|
|||||||
class Server{
|
class Server{
|
||||||
protected:
|
protected:
|
||||||
// 缓存通用数据包
|
// 缓存通用数据包
|
||||||
vector<packet> packets_in;
|
list<packet *> packets_in;
|
||||||
// 缓存带标签的二进制串管理结构
|
// 缓存带标签的二进制串管理结构
|
||||||
vector<raw_data> rawdata_in;
|
list<raw_data *> rawdata_in;
|
||||||
struct server_info tsi;
|
struct server_info tsi;
|
||||||
|
sqlite3 *psql;
|
||||||
public:
|
public:
|
||||||
// 服务器类的接收套接字对象与发送套接字对象
|
// 服务器类的接收套接字对象与发送套接字对象
|
||||||
SocketUDPServer socket;
|
SocketUDPServer socket;
|
||||||
@ -83,13 +91,14 @@ public:
|
|||||||
// 重新设置服务器的发送IP地址
|
// 重新设置服务器的发送IP地址
|
||||||
void SetSendIP(string ip_addr);
|
void SetSendIP(string ip_addr);
|
||||||
// 将结构数据包转换成二进制串
|
// 将结构数据包转换成二进制串
|
||||||
static raw_data Packet2Rawdata(packet tpkt);
|
static void Packet2Rawdata(packet &tpkt, raw_data &rdt);
|
||||||
// 将通用二进制串转换为通用数据包
|
// 将通用二进制串转换为通用数据包
|
||||||
static packet Rawdata2Packet(raw_data trdta);
|
static packet Rawdata2Packet(raw_data trdta);
|
||||||
// 释放二进制串占用的空间
|
// 释放二进制串占用的空间
|
||||||
static void freeRawdataServer(struct raw_data trdt);
|
static void freeRawdataServer(struct raw_data trdt);
|
||||||
// 释放通用数据包包占用
|
// 释放通用数据包包占用
|
||||||
static void freePcaketServer(struct packet tpkt);
|
static void freePcaketServer(struct packet tpkt);
|
||||||
|
|
||||||
// 释放计算结果包占用的空间
|
// 释放计算结果包占用的空间
|
||||||
static void freeCPURServer(struct compute_result tcpur);
|
static void freeCPURServer(struct compute_result tcpur);
|
||||||
// 给二进制串贴上识别标签
|
// 给二进制串贴上识别标签
|
||||||
@ -99,9 +108,11 @@ public:
|
|||||||
// 检查消息串是否为一个贴上标签的二进制串
|
// 检查消息串是否为一个贴上标签的二进制串
|
||||||
static bool CheckRawMsg(char *p_rdt, ssize_t size);
|
static bool CheckRawMsg(char *p_rdt, ssize_t size);
|
||||||
// 处理一个已贴上标签的原始二进制串,获得其包含的信息
|
// 处理一个已贴上标签的原始二进制串,获得其包含的信息
|
||||||
static raw_data ProcessSignedRawMsg(char *p_rdt, ssize_t size);
|
static void ProcessSignedRawMsg(char *p_rdt, ssize_t size, raw_data &rdt);
|
||||||
// 服务器守护线程
|
// 服务器守护线程
|
||||||
friend void *serverDeamon(void *psvr);
|
friend void *serverDeamon(void *psvr);
|
||||||
|
// 处理RawData
|
||||||
|
void ProcessRawData(void);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -116,6 +127,17 @@ public:
|
|||||||
static compute_result Packet2CPUR(packet *tpkt);
|
static compute_result Packet2CPUR(packet *tpkt);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SQEServer:public Server{
|
||||||
|
protected:
|
||||||
|
// 请求数据包
|
||||||
|
list<request> req_list;
|
||||||
|
// 服务器公私钥
|
||||||
|
public_key_class pkc;
|
||||||
|
private_key_class prc;
|
||||||
|
public:
|
||||||
|
SQEServer(void);
|
||||||
|
};
|
||||||
|
|
||||||
//设置服务器守护程序的时钟
|
//设置服务器守护程序的时钟
|
||||||
void setServerClock(Server *psvr, int clicks);
|
void setServerClock(Server *psvr, int clicks);
|
||||||
//服务器守护线程
|
//服务器守护线程
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
100% Public Domain
|
100% Public Domain
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "type.h"
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -41,4 +42,6 @@ void SHA1(
|
|||||||
const char *str,
|
const char *str,
|
||||||
int len);
|
int len);
|
||||||
|
|
||||||
|
void SHA1_Easy(string &hexresult , string &str, size_t len);
|
||||||
|
|
||||||
#endif /* SHA1_H */
|
#endif /* SHA1_H */
|
||||||
|
143
src/main.cpp
143
src/main.cpp
@ -14,6 +14,10 @@
|
|||||||
#include "cpart.h"
|
#include "cpart.h"
|
||||||
#include "cmap.h"
|
#include "cmap.h"
|
||||||
#include "cthread.h"
|
#include "cthread.h"
|
||||||
|
#include "sha1.h"
|
||||||
|
#include "rsa.h"
|
||||||
|
|
||||||
|
extern string PRIME_SOURCE_FILE;
|
||||||
|
|
||||||
int update(string instruct, vector<string> &configs, vector<string> &lconfigs, vector<string> &targets);
|
int update(string instruct, vector<string> &configs, vector<string> &lconfigs, vector<string> &targets);
|
||||||
int construct(string instruct,vector<string> &config, vector<string> &lconfig, vector<string> &target);
|
int construct(string instruct,vector<string> &config, vector<string> &lconfig, vector<string> &target);
|
||||||
@ -119,48 +123,81 @@ int init(string instruct, vector<string> &configs, vector<string> &lconfigs, vec
|
|||||||
sqlite3_stmt *psqlsmt;
|
sqlite3_stmt *psqlsmt;
|
||||||
sqlite3_open("info.db", &psql);
|
sqlite3_open("info.db", &psql);
|
||||||
const char *pzTail;
|
const char *pzTail;
|
||||||
try {
|
if(targets[0] == "server"){
|
||||||
sql::table_create(psql, "server_info", {
|
sql::table_create(psql, "server_info", {
|
||||||
{"name","TEXT"},
|
{"sqes_public","NONE"},
|
||||||
{"tag","TEXT"},
|
{"sqes_private","NONE"},
|
||||||
{"admin_key_sha1","TEXT"},
|
{"key_sha1","TEXT"}
|
||||||
{"msqes_ip","TEXT"},
|
|
||||||
{"msqes_port","INT"},
|
|
||||||
{"msqes_key","TEXT"},
|
|
||||||
{"msqes_rsa_public","TEXT"},
|
|
||||||
});
|
});
|
||||||
sql::table_create(psql, "sqes_info", {
|
sql::insert_info(psql, &psqlsmt, "server_info", {
|
||||||
{"sqes_ip","TEXT PRIMARY KEY"},
|
{"sqes_public","?1"},
|
||||||
{"sqes_port","INT"},
|
{"sqes_private","?2"},
|
||||||
{"sqes_key","TEXT"},
|
{"key_sha1","?3"},
|
||||||
{"rsa_public","TEXT"},
|
|
||||||
});
|
});
|
||||||
} catch (const char *error_info) {
|
struct public_key_class npbkc;
|
||||||
if(!strcmp(error_info, "fail to create table")){
|
struct private_key_class nprkc;
|
||||||
if(!config_search(configs, "-f")){
|
rsa_gen_keys(&npbkc, &nprkc, PRIME_SOURCE_FILE);
|
||||||
printf("\033[33mWarning: Have Already run init process.Try configure -f to continue.\n\033[0m");
|
sqlite3_bind_blob(psqlsmt, 1, &npbkc, sizeof(public_key_class), SQLITE_TRANSIENT);
|
||||||
return 0;
|
sqlite3_bind_blob(psqlsmt, 2, &nprkc, sizeof(private_key_class), SQLITE_TRANSIENT);
|
||||||
}
|
if(targets[1].size() < 6) error::printWarning("Key is too weak.");
|
||||||
else{
|
string sha1_hex;
|
||||||
string sql_quote = "DELETE FROM server_info;";
|
SHA1_Easy(sha1_hex, targets[1], targets.size());
|
||||||
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
sqlite3_bind_text(psqlsmt, 3, sha1_hex.data(), -1, SQLITE_TRANSIENT);
|
||||||
int rtn = sqlite3_step(psqlsmt);
|
|
||||||
if(rtn == SQLITE_DONE){
|
if(sqlite3_step(psqlsmt) != SQLITE_DONE){
|
||||||
|
sql::printError(psql);
|
||||||
|
}
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
|
error::printSuccess("Succeed.");
|
||||||
|
sqlite3_close(psql);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
try {
|
||||||
|
sql::table_create(psql, "client_info", {
|
||||||
|
{"name","TEXT"},
|
||||||
|
{"tag","TEXT"},
|
||||||
|
{"admin_key_sha1","TEXT"},
|
||||||
|
{"msqes_ip","TEXT"},
|
||||||
|
{"msqes_port","INT"},
|
||||||
|
{"msqes_key","TEXT"},
|
||||||
|
{"msqes_rsa_public","TEXT"},
|
||||||
|
});
|
||||||
|
sql::table_create(psql, "sqes_info", {
|
||||||
|
{"sqes_ip","TEXT PRIMARY KEY"},
|
||||||
|
{"sqes_port","INT"},
|
||||||
|
{"sqes_key","TEXT"},
|
||||||
|
{"rsa_public","TEXT"},
|
||||||
|
});
|
||||||
|
} catch (const char *error_info) {
|
||||||
|
if(!strcmp(error_info, "fail to create table")){
|
||||||
|
if(!config_search(configs, "-f")){
|
||||||
|
printf("\033[33mWarning: Have Already run init process.Try configure -f to continue.\n\033[0m");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
const char *error = sqlite3_errmsg(psql);
|
string sql_quote = "DELETE FROM client_info;";
|
||||||
int errorcode = sqlite3_extended_errcode(psql);
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
||||||
printf("\033[31mSQL Error: [%d]%s\n\033[0m",errorcode,error);
|
int rtn = sqlite3_step(psqlsmt);
|
||||||
throw error;
|
if(rtn == SQLITE_DONE){
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
const char *error = sqlite3_errmsg(psql);
|
||||||
|
int errorcode = sqlite3_extended_errcode(psql);
|
||||||
|
printf("\033[31mSQL Error: [%d]%s\n\033[0m",errorcode,error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
}
|
}
|
||||||
sqlite3_finalize(psqlsmt);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sql::insert_info(psql, &psqlsmt, "server_info", {
|
sql::insert_info(psql, &psqlsmt, "client_info", {
|
||||||
{"name","?1"},
|
{"name","?1"},
|
||||||
{"tag","?2"}
|
{"tag","?2"}
|
||||||
});
|
});
|
||||||
@ -191,7 +228,7 @@ int set(string instruct, vector<string> &configs, vector<string> &lconfigs, vect
|
|||||||
if(sqlite3_open("info.db", &psql) == SQLITE_ERROR){
|
if(sqlite3_open("info.db", &psql) == SQLITE_ERROR){
|
||||||
sql::printError(psql);
|
sql::printError(psql);
|
||||||
}
|
}
|
||||||
string sql_quote = "SELECT count(*) FROM sqlite_master WHERE name = 'server_info';";
|
string sql_quote = "SELECT count(*) FROM sqlite_master WHERE name = 'client_info';";
|
||||||
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
||||||
sqlite3_step(psqlsmt);
|
sqlite3_step(psqlsmt);
|
||||||
int if_find = sqlite3_column_int(psqlsmt, 0);
|
int if_find = sqlite3_column_int(psqlsmt, 0);
|
||||||
@ -202,11 +239,11 @@ int set(string instruct, vector<string> &configs, vector<string> &lconfigs, vect
|
|||||||
}
|
}
|
||||||
sqlite3_finalize(psqlsmt);
|
sqlite3_finalize(psqlsmt);
|
||||||
if(targets[0] == "square"){
|
if(targets[0] == "square"){
|
||||||
sql_quote = "UPDATE server_info SET msqes_ip = ?1, msqes_port = ?2 WHERE rowid = 1;";
|
sql_quote = "UPDATE client_info SET msqes_ip = ?1, msqes_port = ?2 WHERE rowid = 1;";
|
||||||
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
||||||
|
|
||||||
if(!Addr::checkValidIP(targets[1])){
|
if(!Addr::checkValidIP(targets[1])){
|
||||||
error::printError("Args(ipaddr) abnomal.");
|
error::printError("Args(ipaddr) is abnomal.");
|
||||||
sqlite3_finalize(psqlsmt);
|
sqlite3_finalize(psqlsmt);
|
||||||
sqlite3_close(psql);
|
sqlite3_close(psql);
|
||||||
return -1;
|
return -1;
|
||||||
@ -219,7 +256,7 @@ int set(string instruct, vector<string> &configs, vector<string> &lconfigs, vect
|
|||||||
ss>>port;
|
ss>>port;
|
||||||
if(port > 0 && port <= 65535);
|
if(port > 0 && port <= 65535);
|
||||||
else{
|
else{
|
||||||
error::printError("Args(port) abnomal.");
|
error::printError("Args(port) is abnomal.");
|
||||||
sqlite3_finalize(psqlsmt);
|
sqlite3_finalize(psqlsmt);
|
||||||
sqlite3_close(psql);
|
sqlite3_close(psql);
|
||||||
return -1;
|
return -1;
|
||||||
@ -231,8 +268,34 @@ int set(string instruct, vector<string> &configs, vector<string> &lconfigs, vect
|
|||||||
}
|
}
|
||||||
sqlite3_finalize(psqlsmt);
|
sqlite3_finalize(psqlsmt);
|
||||||
}
|
}
|
||||||
else if (targets[1] == "key"){
|
else if (targets[0] == "key"){
|
||||||
|
if(targets[1] == "admin"){
|
||||||
|
string hexresult;
|
||||||
|
SHA1_Easy(hexresult, targets[2], targets[2].size());
|
||||||
|
if(targets[1].size() < 6){
|
||||||
|
error::printWarning("Key is too weak.");
|
||||||
|
}
|
||||||
|
sql_quote = "UPDATE client_info SET admin_key_sha1 = ?1 WHERE rowid = 1;";
|
||||||
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
||||||
|
sqlite3_bind_text(psqlsmt, 1, hexresult.data(), -1, SQLITE_TRANSIENT);
|
||||||
|
if(sqlite3_step(psqlsmt) != SQLITE_DONE){
|
||||||
|
sql::printError(psql);
|
||||||
|
}
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
|
}
|
||||||
|
else if(targets[1] == "square"){
|
||||||
|
sql_quote = "UPDATE client_info SET msqes_key = ?1 WHERE rowid = 1;";
|
||||||
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail);
|
||||||
|
sqlite3_bind_text(psqlsmt, 1, targets[2].data(), -1, SQLITE_TRANSIENT);
|
||||||
|
if(sqlite3_step(psqlsmt) != SQLITE_DONE){
|
||||||
|
sql::printError(psql);
|
||||||
|
}
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
error::printError("Args(type) is abnormal.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
error::printSuccess("Succeed.");
|
error::printSuccess("Succeed.");
|
||||||
sqlite3_close(psql);
|
sqlite3_close(psql);
|
||||||
@ -240,6 +303,10 @@ int set(string instruct, vector<string> &configs, vector<string> &lconfigs, vect
|
|||||||
}
|
}
|
||||||
|
|
||||||
int server(string instruct, vector<string> &configs, vector<string> &lconfigs, vector<string> &targets){
|
int server(string instruct, vector<string> &configs, vector<string> &lconfigs, vector<string> &targets){
|
||||||
|
sqlite3 *psql;
|
||||||
|
sqlite3_stmt *psqlsmt;
|
||||||
|
const char *pzTail;
|
||||||
|
|
||||||
initClock();
|
initClock();
|
||||||
setThreadsClock();
|
setThreadsClock();
|
||||||
Server nsvr;
|
Server nsvr;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include "type.h"
|
||||||
|
#include "rsa.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -5,21 +7,14 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
// Change this line to the file you'd like to use as a source of primes.
|
||||||
|
// The format of the file should be one prime per line.
|
||||||
|
string PRIME_SOURCE_FILE = "primes.txt";
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
const int MAX_DIGITS = 50;
|
const int MAX_DIGITS = 50;
|
||||||
int i,j = 0;
|
int i,j = 0;
|
||||||
|
|
||||||
struct public_key_class{
|
|
||||||
long long modulus;
|
|
||||||
long long exponent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct private_key_class{
|
|
||||||
long long modulus;
|
|
||||||
long long exponent;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// This should totally be in the math library.
|
// This should totally be in the math library.
|
||||||
long long gcd(long long a, long long b)
|
long long gcd(long long a, long long b)
|
||||||
@ -61,11 +56,11 @@ long long rsa_modExp(long long b, long long e, long long m)
|
|||||||
|
|
||||||
// Calling this function will generate a public and private key and store them in the pointers
|
// Calling this function will generate a public and private key and store them in the pointers
|
||||||
// it is given.
|
// it is given.
|
||||||
void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, char *PRIME_SOURCE_FILE)
|
void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, string PRIME_SOURCE_FILE)
|
||||||
{
|
{
|
||||||
FILE *primes_list;
|
FILE *primes_list;
|
||||||
if(!(primes_list = fopen(PRIME_SOURCE_FILE, "r"))){
|
if(!(primes_list = fopen(PRIME_SOURCE_FILE.data(), "r"))){
|
||||||
fprintf(stderr, "Problem reading %s\n", PRIME_SOURCE_FILE);
|
fprintf(stderr, "Problem reading %s\n", PRIME_SOURCE_FILE.data());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +142,7 @@ void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv,
|
|||||||
long long *rsa_encrypt(const char *message, const unsigned long message_size,
|
long long *rsa_encrypt(const char *message, const unsigned long message_size,
|
||||||
const struct public_key_class *pub)
|
const struct public_key_class *pub)
|
||||||
{
|
{
|
||||||
long long *encrypted = malloc(sizeof(long long)*message_size);
|
long long *encrypted = (long long *) malloc(sizeof(long long)*message_size);
|
||||||
if(encrypted == NULL){
|
if(encrypted == NULL){
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: Heap allocation failed.\n");
|
"Error: Heap allocation failed.\n");
|
||||||
@ -172,8 +167,8 @@ char *rsa_decrypt(const long long *message,
|
|||||||
}
|
}
|
||||||
// We allocate space to do the decryption (temp) and space for the output as a char array
|
// We allocate space to do the decryption (temp) and space for the output as a char array
|
||||||
// (decrypted)
|
// (decrypted)
|
||||||
char *decrypted = malloc(message_size/sizeof(long long));
|
char *decrypted = (char *) malloc(message_size/sizeof(long long));
|
||||||
char *temp = malloc(message_size);
|
char *temp = (char *) malloc(message_size);
|
||||||
if((decrypted == NULL) || (temp == NULL)){
|
if((decrypted == NULL) || (temp == NULL)){
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: Heap allocation failed.\n");
|
"Error: Heap allocation failed.\n");
|
@ -24,6 +24,7 @@ void setServerClock(Server *psvr, int clicks){
|
|||||||
|
|
||||||
Server::Server(int port, string send_ip,int send_port):socket(port),send_socket(send_ip,send_port){
|
Server::Server(int port, string send_ip,int send_port):socket(port),send_socket(send_ip,send_port){
|
||||||
socket.UDPSetFCNTL();
|
socket.UDPSetFCNTL();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::SetSendPort(int port){
|
void Server::SetSendPort(int port){
|
||||||
@ -82,11 +83,10 @@ packet CNodeServer::CPURS2Packet(compute_result tcpur){
|
|||||||
return rawpkt;
|
return rawpkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_data Server::Packet2Rawdata(packet tpkt){
|
void Server::Packet2Rawdata(packet &tpkt, raw_data &rdt){
|
||||||
raw_data rdta;
|
|
||||||
char *data = (char *)malloc(BUFSIZ);
|
char *data = (char *)malloc(BUFSIZ);
|
||||||
memset(data, 0, BUFSIZ);
|
memset(data, 0, BUFSIZ);
|
||||||
rdta.data = data;
|
rdt.data = data;
|
||||||
char *idx = data;
|
char *idx = data;
|
||||||
string fdata;
|
string fdata;
|
||||||
// 写入包ID信息
|
// 写入包ID信息
|
||||||
@ -100,27 +100,24 @@ raw_data Server::Packet2Rawdata(packet tpkt){
|
|||||||
memcpy(idx, (*i).second, (*i).first);
|
memcpy(idx, (*i).second, (*i).first);
|
||||||
idx += (*i).first;
|
idx += (*i).first;
|
||||||
}
|
}
|
||||||
rdta.size = idx - data;
|
rdt.size = idx - data;
|
||||||
return rdta;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
packet Server::Rawdata2Packet(raw_data trdta){
|
Server::Rawdata2Packet(packet &tpkt, raw_data &trdt){
|
||||||
packet pkt;
|
char *idx = trdt.data;
|
||||||
char *idx = trdta.data;
|
|
||||||
// 数据包ID
|
// 数据包ID
|
||||||
uint32_t uint;
|
uint32_t uint;
|
||||||
memcpy(&pkt.type, idx, sizeof(uint32_t));
|
memcpy(&tpkt.type, idx, sizeof(uint32_t));
|
||||||
idx += sizeof(uint32_t);
|
idx += sizeof(uint32_t);
|
||||||
// 数据包主体
|
// 数据包主体
|
||||||
while(idx - trdta.data < trdta.size){
|
while(idx - trdt.data < trdt.size){
|
||||||
memcpy(&uint, idx, sizeof(uint32_t));
|
memcpy(&uint, idx, sizeof(uint32_t));
|
||||||
idx += sizeof(uint32_t);
|
idx += sizeof(uint32_t);
|
||||||
void *data = malloc(uint);
|
void *data = malloc(uint);
|
||||||
memcpy(data, idx, uint);
|
memcpy(data, idx, uint);
|
||||||
idx += uint;
|
idx += uint;
|
||||||
pkt.buffs.push_back({uint,data});
|
tpkt.buffs.push_back({uint,data});
|
||||||
}
|
}
|
||||||
return pkt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
compute_result CNodeServer::Packet2CPUR(packet *tpkt){
|
compute_result CNodeServer::Packet2CPUR(packet *tpkt){
|
||||||
@ -184,6 +181,7 @@ void Server::SignedRawdata(struct raw_data *trdt,string info){
|
|||||||
idx += trdt->size;
|
idx += trdt->size;
|
||||||
memcpy(idx, &trdt->tail, sizeof(uint32_t));
|
memcpy(idx, &trdt->tail, sizeof(uint32_t));
|
||||||
trdt->msg = msg;
|
trdt->msg = msg;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Server::SentRawdata(struct raw_data *trdt){
|
int Server::SentRawdata(struct raw_data *trdt){
|
||||||
@ -204,17 +202,14 @@ bool Server::CheckRawMsg(char *p_rdt, ssize_t size){
|
|||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_data Server::ProcessSignedRawMsg(char *p_rdt, ssize_t size){
|
void ProcessSignedRawMsg(char *p_rdt, ssize_t size, raw_data &rdt){
|
||||||
raw_data trdt;
|
rdt.data = (char *)malloc(size-3*sizeof(uint32_t));
|
||||||
trdt.data = (char *)malloc(size-3*sizeof(uint32_t));
|
memcpy(&rdt.info, p_rdt+sizeof(uint32_t), sizeof(uint32_t));
|
||||||
memcpy(&trdt.info, p_rdt+sizeof(uint32_t), sizeof(uint32_t));
|
memcpy(rdt.data, p_rdt+sizeof(uint32_t)*2, size-3*sizeof(uint32_t));
|
||||||
memcpy(trdt.data, p_rdt+sizeof(uint32_t)*2, size-3*sizeof(uint32_t));
|
rdt.size = size-3*sizeof(uint32_t);
|
||||||
trdt.size = size-3*sizeof(uint32_t);
|
|
||||||
return trdt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *serverDeamon(void *pvcti){
|
void *serverDeamon(void *pvcti){
|
||||||
|
|
||||||
clock_thread_info *pcti = (clock_thread_info *) pvcti;
|
clock_thread_info *pcti = (clock_thread_info *) pvcti;
|
||||||
Server *psvr = (Server *) pcti->args;
|
Server *psvr = (Server *) pcti->args;
|
||||||
//cout<<"Server Deamon Checked."<<endl;
|
//cout<<"Server Deamon Checked."<<endl;
|
||||||
@ -230,8 +225,9 @@ void *serverDeamon(void *pvcti){
|
|||||||
// 记录有效数据包
|
// 记录有效数据包
|
||||||
if(Server::CheckRawMsg(str, tlen)){
|
if(Server::CheckRawMsg(str, tlen)){
|
||||||
printf("Get\n");
|
printf("Get\n");
|
||||||
raw_data trdt = Server::ProcessSignedRawMsg(str, tlen);
|
raw_data *ptrdt = new raw_data();
|
||||||
psvr->rawdata_in.push_back(trdt);
|
Server::ProcessSignedRawMsg(str, tlen, *ptrdt);
|
||||||
|
psvr->rawdata_in.push_back(ptrdt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(str);
|
free(str);
|
||||||
@ -239,3 +235,41 @@ void *serverDeamon(void *pvcti){
|
|||||||
clockThreadFinish(pcti->tid);
|
clockThreadFinish(pcti->tid);
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::ProcessRawData(void){
|
||||||
|
for(auto prdt : rawdata_in){
|
||||||
|
if(memcmp(prdt->info, "SPKT", sizeof(uint32_t))){
|
||||||
|
packet *pnpkt = new packet();
|
||||||
|
Rawdata2Packet(pnpkt,prdt);
|
||||||
|
packets_in.push_back(pnpkt);
|
||||||
|
delete prdt;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
delete prdt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rawdata_in.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
SQEServer::SQEServer(void){
|
||||||
|
if(sqlite3_open("info.db", &psql) == SQLITE_ERROR){
|
||||||
|
sql::printError(psql);
|
||||||
|
throw "database is abnormal";
|
||||||
|
}
|
||||||
|
sqlite3_stmt psqlsmt;
|
||||||
|
const char *pzTail;
|
||||||
|
// 从数据库获得服务器的公私钥
|
||||||
|
string sql_quote = "select sqes_public,sqes_private from server_info where rowid = 1;";
|
||||||
|
sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, pzTail);
|
||||||
|
if(sqlite3_step(psqlsmt) != SQLITE_ROW){
|
||||||
|
sql::printError(psql);
|
||||||
|
throw "database is abnormal";
|
||||||
|
}
|
||||||
|
Byte *tbyt = sqlite3_column_blob(psqlsmt, 0);
|
||||||
|
memcpy(&pkc, tbyt, sizeof(public_key_class));
|
||||||
|
|
||||||
|
tbyt = sqlite3_column_blob(psqlsmt, 1);
|
||||||
|
memcpy(&prc, tbyt, sizeof(private_key_class));
|
||||||
|
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
|
}
|
||||||
|
11
src/sha1.cpp
11
src/sha1.cpp
@ -294,3 +294,14 @@ void SHA1(
|
|||||||
hash_out[20] = '\0';
|
hash_out[20] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHA1_Easy(string &hexresult , string &str, size_t len){
|
||||||
|
char thexresult[41];
|
||||||
|
char result[20];
|
||||||
|
SHA1( result, str.data(), (int)str.size());
|
||||||
|
/*format the hash for comparison */
|
||||||
|
for(int offset = 0; offset < 20; offset++) {
|
||||||
|
sprintf( ( thexresult + (2*offset)), "%02x", result[offset]&0xff);
|
||||||
|
}
|
||||||
|
hexresult = thexresult;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user