forked from lulululichuan/GroupCommu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
m_top.cpp
122 lines (109 loc) · 3.61 KB
/
m_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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//1552212 端启航
#include <iostream>
#include "MMX/RsaSignature.h"
#include <sstream>
#include "TCPClient.h"
#include "Member.h"
using namespace std;
TCPClient *client;
group_sig::member *m;
string m_id;//id,由命令行输入
ZZ m_psk;//id,由命令行输入
void send_req(u_int8_t type, string msg = "") {
auto Log = get("console");
Log->info("Client sending request...");
header_t head;
head.proto_ori = PROTO_C2S;
head.proto_type = type;
if (msg == "") {
head.len = 0;
client->SendPacket((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());
client->SendPacket(buffer, HEADLEN + msg.size());
}
}
void onRecv_m(ClientData *data) {
header_t *header;
header = (header_t *) (data->recv_playload);
string msg;
switch (header->proto_type) {
case PROTO_PUB_PARA: {
auto Log = get("console");
Log->info("Client recv public para msg");
// group_sig::public_para* p=new group_sig::public_para;
char *p = new char[header->len + 1];
memcpy(p, data->recv_playload + HEADLEN, header->len);
stringstream stream(p);
group_sig::public_para *para = new group_sig::public_para;
string temp;
stream >> temp;
para->a = Cryptography::stringToNumber(temp, false);
stream >> temp;
para->b = Cryptography::stringToNumber(temp, false);
stream >> temp;
para->epsilon = Cryptography::stringToNumber(temp, false);
stream >> temp;
para->G = Cryptography::stringToNumber(temp, false);
stream >> temp;
para->g = Cryptography::stringToNumber(temp, false);
stream >> temp;
para->n = Cryptography::stringToNumber(temp, false);
long l;
stream >> l;
para->lambda = l;
m = new group_sig::member(m_id, para, m_psk);
//send PROTO_JOIN_GROUP
send_req(PROTO_JOIN_GROUP, m->JoinGroupMsg(m_psk));
break;
}
case PROTO_JOIN_GROUP: {
auto Log = get("console");
Log->info("Client recv join group msg");
msg = get_str(data->recv_playload);
m->onRecvV(msg);
break;
}
case PROTO_KEY_EX: {
auto Log = get("console");
Log->info("Client recv key exchg msg");
msg = get_str(data->recv_playload);
m->onKeyExchangeRequestRecv(msg);
break;
}
case PROTO_KEY_BROADCAST: {
auto Log = get("console");
Log->info("Client recv broadcast msg");
msg = get_str(data->recv_playload);
m->onGroupKeyBoardcastRecv(msg);
break;
}
default:
break;
}
}
void onConnected(ClientData */*data*/) {
auto Log = get("console");
Log->info("Client requesting public para msg...");
send_req(PROTO_PUB_PARA, m_id);
}
void onFin(ClientData */*data*/) {
auto Log = get("console");
Log->info("Connection fin!");
exit(0);
}
int main_m(string ip, u_int16_t port, string id, ZZ psk) {
m_id = id;
m_psk = psk;
auto Log = get("console");
Log->info("starting member at " + ip);
client = new TCPClient(inet_addr(ip.c_str()), port);
client->setOnConnectedCallBack(onConnected);
client->setOnRecvCallBack(onRecv_m);
client->setOnFinCallBack(onFin);
client->ConnectServer();
return 0;
}