-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.c
117 lines (91 loc) · 2.96 KB
/
server.c
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
#include "server.h"
// Spuštění serveru pro specifickou verzi paketů
void run_version(int ver){
struct icmp_packet packet;
int socket_id;
socket_id = open_icmp_socket(ver, 1);
bind_icmp_socket(socket_id, ver);
uint32_t packet_count = 0;
int last_size = 0;
int cipher_len = 0;
int original_size = 0;
unsigned char iv[IV_SIZE];
char filename[MAX_FILENAME];
// Cyklus pro nekonečný běh serveru
while(1){
// Přijímaní prvního paketu
do{
recieve_icmp_packet(socket_id, &packet, ver);
}while(packet.file_type != FILE_MV);
unsigned char *buff[packet.count];
cipher_len = packet.cipher_len;
original_size = packet.src_len;
memcpy(iv, packet.iv, IV_SIZE);
memcpy(filename, packet.filename, MAX_FILENAME);
// Cyklus pro přijímaní paketu pro momentálně přenášený soubor
// Ostatní pakety stejného druhu jsou zahozeny
while(1){
// Alokace paměti
buff[packet.order] = (unsigned char *)malloc(packet.part_size * sizeof(unsigned char));
if(buff[packet.order] == NULL){
perror("No memory available \n");
close_icmp_socket(socket_id);
exit(-1);
}
memcpy(buff[packet.order], packet.payload, packet.part_size);
packet_count++;
free(packet.payload);
if(packet.order == packet_count -1){
last_size = packet.part_size;
}
// Kontrola zda jsou všechny pakety přeneseny
if(packet.count == packet_count){
break;
}
// Přijímaní dalších paketů aktuálně přenášeného souboru
do{
recieve_icmp_packet(socket_id, &packet, ver);
}while(packet.file_type != FILE_MV || packet.type == (ver == 4? ICMP_ECHOREPLY:ICMP6_ECHO_REPLY) || strcmp(filename, packet.filename) != 0);
}
// Sloučení veškerých dat souboru
unsigned char *merged_buff = marge_payload(buff, packet_count, last_size);
// Alokace paměti před dešifrováním
unsigned char *decrypted = (unsigned char *)malloc(original_size * sizeof(unsigned char) * 4);
unsigned char *original = (unsigned char *)malloc(original_size * sizeof(unsigned char));
if(decrypted == NULL){
perror("No memory available 1\n");
close_icmp_socket(socket_id);
exit(-1);
}
// Dešifrování dat
aes_encryption(merged_buff, decrypted, AES_DECRYPT, cipher_len, iv);
memcpy(original, decrypted, original_size);
// Zapsaní dat do souboru ve složce, kde je aplikace spuštěna
write_file_as_byte_array(filename, original, original_size);
// Uvolnění zdrojů aktuálního souboru
for(uint32_t i = 0; i < packet_count; i++){
free(buff[i]);
}
free(original);
free(decrypted);
free(merged_buff);
printf("File: %s saved...\n", filename);
packet_count = 0;
}
close_icmp_socket(socket_id);
}
void *run_server_4(){
run_version(4);
return NULL;
}
void *run_server_6(){
run_version(6);
return NULL;
}
void run_server(){
pthread_t ver_4, ver_6;
pthread_create(&ver_4, NULL, run_server_4, NULL);
pthread_create(&ver_6, NULL, run_server_6, NULL);
pthread_join(ver_4, NULL);
pthread_join(ver_6, NULL);
}