forked from lulululichuan/GroupCommu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gm_top.cpp
101 lines (90 loc) · 3.16 KB
/
gm_top.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//1552212 端启航
#include <iostream>
#include "MMX/RsaSignature.h"
#include "TCPServer.h"
#include "Member.h"
#include "GM.h"
using namespace std;
TCPServer *server;
group_sig::GM *gm;
string hardware_id;//id,由命令行输入
void send_r(string id, u_int8_t type, string msg = "") {
auto Log = get("console");
Log->info("GM sending response...");
header_t head;
head.proto_ori = PROTO_S2C;
head.proto_type = type;
if (msg == "") {
head.len = 0;
server->SendPacket(id, (char *) &head, HEADLEN);
} else {
head.len = msg.size();
char *buffer = new char[HEADLEN + msg.size()];
memcpy(buffer, &head, HEADLEN);
memcpy(buffer + HEADLEN, msg.c_str(), msg.size());
server->SendPacket(id, buffer, HEADLEN + msg.size());
}
}
void onRecv_gm(ClientData *data) {
header_t *header;
header = (header_t *) (data->recv_playload);
string msg, y, z, m, sig, vv;
ZZ v;
switch (header->proto_type) {
case PROTO_PUB_PARA: {
auto Log = get("console");
Log->info("GM recv public para request");
string id = get_str(data->recv_playload);
data->id = id;
group_sig::public_para p = gm->getPublicPara();
header_t head;
head.proto_ori = PROTO_S2C;
head.proto_type = PROTO_PUB_PARA;
string str;
str += Cryptography::numberToString(p.a, false) + " ";
str += Cryptography::numberToString(p.b, false) + " ";
str += Cryptography::numberToString(p.epsilon, false) + " ";
str += Cryptography::numberToString(p.G, false) + " ";
str += Cryptography::numberToString(p.g, false) + " ";
str += Cryptography::numberToString(p.n, false) + " ";
str += to_string(p.lambda);
head.len = str.size();
char *buffer = new char[HEADLEN + head.len];
memcpy(buffer, &head, HEADLEN);
memcpy(buffer + HEADLEN, str.c_str(), head.len);
server->SendPacket(data->id, buffer, HEADLEN + head.len);
break;
}
case PROTO_JOIN_GROUP: {
auto Log = get("console");
Log->info("GM recv join group request");
msg = get_str(data->recv_playload);
v = gm->verify(data->id, msg);
vv = Cryptography::numberToString(v, false);
send_r(data->id, PROTO_JOIN_GROUP, vv);
gm->keyExchangeRequest(data->id);
break;
}
case PROTO_KEY_EX: {
auto Log = get("console");
Log->info("GM recv key exchg msg");
msg = get_str(data->recv_playload);
gm->onKeyExchangeResponseRecv(msg);
msg = gm->getBroadcastMsg();
// TODO
// server->broadcast(msg, msg.size());
break;
}
default:
break;
}
}
int main_gm(string ip, u_int16_t port, ZZ psk) {
auto Log = get("console");
Log->info("starting GM");
gm = new group_sig::GM(1234, psk);
server = new TCPServer(inet_addr(ip.c_str()), port);
server->setOnRecvCallBack(onRecv_gm);
server->StartServer();
return 0;
}