Commit 74e67e857ca7a1c038653e245a8deedcb2fc2594
1 parent
ec6251cd
Encryption code removed
Showing
12 changed files
with
32 additions
and
468 deletions
Makefile
1 | -CXXFLAGS = -Icryptopp -Isrc/include | |
1 | +CXXFLAGS = -Isrc/include | |
2 | 2 | LDFLAGS = -Llib |
3 | -LIBS = -lcryptopp -lpthread | |
3 | +LIBS = -lpthread | |
4 | 4 | TARGETS = bin/client bin/server bin/socket.conf |
5 | 5 | |
6 | 6 | |
... | ... | @@ -9,7 +9,7 @@ TARGETS = bin/client bin/server bin/socket.conf |
9 | 9 | CXX = g++ |
10 | 10 | endif |
11 | 11 | |
12 | -bin/client: bin/client.o bin/Socket.o lib/libcryptopp.so | |
12 | +bin/client: bin/client.o bin/Socket.o | |
13 | 13 | $(CXX) -o bin/client bin/client.o bin/Socket.o $(LDFLAGS) $(LIBS) |
14 | 14 | strip bin/client |
15 | 15 | |
... | ... | @@ -22,16 +22,13 @@ bin/server.o: src/server.cpp src/include/server.h |
22 | 22 | bin/main_server.o: src/main_server.cpp |
23 | 23 | $(CXX) -o bin/main_server.o -c src/main_server.cpp $(CXXFLAGS) |
24 | 24 | |
25 | -bin/server: bin/server.o bin/Socket.o bin/main_server.o lib/libcryptopp.so src/include/server.h | |
25 | +bin/server: bin/server.o bin/Socket.o bin/main_server.o src/include/server.h | |
26 | 26 | $(CXX) -o bin/server bin/server.o bin/Socket.o bin/main_server.o $(LDFLAGS) $(LIBS) |
27 | 27 | strip bin/server |
28 | 28 | |
29 | 29 | bin/Socket.o: src/Socket.cpp src/include/Socket.h src/include/SocketException.h |
30 | 30 | $(CXX) -o bin/Socket.o -c src/Socket.cpp $(CXXFLAGS) |
31 | 31 | |
32 | -lib/libcryptopp.so: | |
33 | - cd cryptopp;make clean; make dynamic; mv libcryptopp.so ../lib/libcryptopp.so | |
34 | - | |
35 | 32 | bin/socket.conf: |
36 | 33 | cp socket.conf bin/socket.conf |
37 | 34 | ... | ... |
bin/Socket.o
No preview for this file type
bin/client
No preview for this file type
bin/client.o
No preview for this file type
bin/main_server.o
No preview for this file type
bin/server
No preview for this file type
bin/server.o
No preview for this file type
bin/socket.conf
src/Socket.cpp
... | ... | @@ -6,24 +6,12 @@ |
6 | 6 | * En este fichero se implementan los métodos de la clase Socket definidos en Socket.h |
7 | 7 | */ |
8 | 8 | #include "Socket.h" |
9 | -#include "SocketException.h" | |
10 | -#include <sstream> | |
11 | -#include <strings.h> | |
12 | -#include <cstdlib> | |
13 | -#include <netinet/tcp.h> | |
14 | 9 | |
15 | 10 | using namespace std; |
16 | 11 | |
17 | 12 | Socket::Socket() |
18 | 13 | { |
19 | 14 | sock = -1; |
20 | - if(RSALENGTH > 0) | |
21 | - { | |
22 | - memset( myKey, 0x00, AESLENGTH); | |
23 | - memset( myIV, 0x00, AES::BLOCKSIZE ); | |
24 | - memset( theirKey, 0x00, AESLENGTH ); | |
25 | - memset( theirIV, 0x00, AES::BLOCKSIZE ); | |
26 | - } | |
27 | 15 | } |
28 | 16 | |
29 | 17 | int Socket::getSock() |
... | ... | @@ -39,7 +27,7 @@ void Socket::Create() |
39 | 27 | throw SocketException ( "TCP: Could not create socket" ); |
40 | 28 | } |
41 | 29 | setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof optval); |
42 | - setsockopt(sock, SOL_TCP, TCP_NODELAY, &optval, sizeof optval); | |
30 | + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof optval); | |
43 | 31 | } |
44 | 32 | |
45 | 33 | void Socket::Bind(string address, int port) |
... | ... | @@ -47,7 +35,7 @@ void Socket::Bind(string address, int port) |
47 | 35 | sockAddr.sin_family = AF_INET; |
48 | 36 | sockAddr.sin_port = htons(port); |
49 | 37 | sockAddr.sin_addr.s_addr = inet_addr(address.c_str()); |
50 | - if(bind(sock, (struct sockaddr *)&sockAddr, sizeof(struct sockaddr)) != 0) | |
38 | + if(::bind(sock, (struct sockaddr *)&sockAddr, sizeof(struct sockaddr)) != 0) | |
51 | 39 | { |
52 | 40 | stringstream sstream; |
53 | 41 | sstream << "TCP: Could not bind to address " << address << " on port " << port; |
... | ... | @@ -144,48 +132,32 @@ void Socket::Close() |
144 | 132 | } |
145 | 133 | } |
146 | 134 | |
147 | -void Socket::SendUnencrypted(const string& text) | |
135 | +const Socket& Socket::operator << ( const std::string& text) | |
148 | 136 | { |
149 | - stringstream sstream; | |
137 | + stringstream sstream; | |
150 | 138 | int length = text.length(); |
151 | 139 | if(!length) |
152 | 140 | { |
153 | - string s = "0"; | |
141 | + string s = "0"; | |
154 | 142 | Send(s.c_str(), 2); |
155 | - return; | |
156 | - } | |
157 | - sstream << length; | |
158 | - string len = sstream.str(); | |
159 | - Send(len.c_str(), len.length()+1); | |
160 | - Send(text.c_str(), text.length()); | |
161 | -} | |
162 | - | |
163 | -const Socket& Socket::operator << ( const std::string& text) | |
164 | -{ | |
165 | - if(RSALENGTH <= 0) | |
166 | - { | |
167 | - SendUnencrypted(text); | |
168 | 143 | return *this; |
169 | 144 | } |
170 | - stringstream sstream; | |
171 | - string length, cipher = ""; | |
172 | - int size; | |
173 | - cipher = encryptAES(text); | |
174 | - size = cipher.length(); | |
175 | - sstream << size; | |
176 | - sstream >> length; | |
177 | - length = encryptAES(length); | |
178 | - Send(length.c_str(),length.length()); | |
179 | - Send(cipher.c_str(),size); | |
145 | + sstream << length; | |
146 | + string len = sstream.str(); | |
147 | + char* msg = new char[len.length() + text.length() + 1]; | |
148 | + strcpy(msg,len.c_str()); | |
149 | + strcpy(msg+len.length()+1,text.c_str()); | |
150 | + Send(msg, text.length() + len.length() + 1); | |
151 | + delete[] msg; | |
180 | 152 | return *this; |
181 | 153 | } |
182 | 154 | |
183 | -void Socket::ReceiveUnencrypted(string& text) | |
155 | +const Socket& Socket::operator >> ( std::string& text ) | |
184 | 156 | { |
185 | 157 | text = ""; |
186 | - string len; | |
187 | - int length; | |
188 | - stringstream sstream; | |
158 | + string len; | |
159 | + int length; | |
160 | + stringstream sstream; | |
189 | 161 | char c; |
190 | 162 | while(true) |
191 | 163 | { |
... | ... | @@ -201,10 +173,10 @@ void Socket::ReceiveUnencrypted(string& text) |
201 | 173 | } |
202 | 174 | sstream << len; |
203 | 175 | sstream >> length; |
204 | - if(!length) | |
205 | - { | |
206 | - return; | |
207 | - } | |
176 | + if(!length) | |
177 | + { | |
178 | + return *this; | |
179 | + } | |
208 | 180 | char *message = new char[length]; |
209 | 181 | Receive(message,length); |
210 | 182 | text.append(message,length); |
... | ... | @@ -213,262 +185,5 @@ void Socket::ReceiveUnencrypted(string& text) |
213 | 185 | delete[] message; |
214 | 186 | message = NULL; |
215 | 187 | } |
216 | -} | |
217 | - | |
218 | -const Socket& Socket::operator >> ( std::string& text ) | |
219 | -{ | |
220 | - if(RSALENGTH <= 0) | |
221 | - { | |
222 | - ReceiveUnencrypted(text); | |
223 | - return *this; | |
224 | - } | |
225 | - int length; | |
226 | - stringstream sstream; | |
227 | - string recover = "", cipher; | |
228 | - char *c = new char[AES::BLOCKSIZE]; | |
229 | - Receive(c, AES::BLOCKSIZE); | |
230 | - cipher = string(c,AES::BLOCKSIZE); | |
231 | - recover = decryptAES(cipher); | |
232 | - sstream << recover; | |
233 | - sstream >> length; | |
234 | - if(c != NULL) | |
235 | - { | |
236 | - delete[] c; | |
237 | - c = NULL; | |
238 | - } | |
239 | - recover = ""; | |
240 | - c = new char[length]; | |
241 | - Receive(c, length); | |
242 | - cipher = string(c,length); | |
243 | - recover = decryptAES(cipher); | |
244 | - text = recover; | |
245 | - if(c != NULL) | |
246 | - { | |
247 | - delete[] c; | |
248 | - c = NULL; | |
249 | - } | |
250 | - return *this; | |
251 | -} | |
252 | - | |
253 | -void Socket::generateRSAKeys() | |
254 | -{ | |
255 | - if(RSALENGTH > 0) | |
256 | - { | |
257 | - privateKey.Initialize(rng, RSALENGTH); | |
258 | - RSAFunction publicKey(privateKey); | |
259 | - myPublicKey.Initialize(publicKey.GetModulus(),publicKey.GetPublicExponent()); | |
260 | - } | |
261 | -} | |
262 | - | |
263 | -void Socket::generateAESKeys() | |
264 | -{ | |
265 | - if(RSALENGTH > 0) | |
266 | - { | |
267 | - rng.GenerateBlock(myKey, AESLENGTH ); | |
268 | - rng.GenerateBlock(myIV, AES::BLOCKSIZE); | |
269 | - } | |
270 | -} | |
271 | - | |
272 | -bool Socket::sendPublicKey() | |
273 | -{ | |
274 | - if(RSALENGTH > 0) | |
275 | - { | |
276 | - stringstream sstream; | |
277 | - sstream << myPublicKey.GetModulus(); | |
278 | - sstream << " "; | |
279 | - sstream << myPublicKey.GetPublicExponent(); | |
280 | - string data = sstream.str(); | |
281 | - try | |
282 | - { | |
283 | - SendUnencrypted(data); | |
284 | - } | |
285 | - catch(SocketException& e) | |
286 | - { | |
287 | - return false; | |
288 | - } | |
289 | - } | |
290 | - return true; | |
291 | -} | |
292 | - | |
293 | -bool Socket::receivePublicKey() | |
294 | -{ | |
295 | - if(RSALENGTH > 0) | |
296 | - { | |
297 | - string data = ""; | |
298 | - struct timeval tv; | |
299 | - tv.tv_sec = 10; | |
300 | - tv.tv_usec = 0; | |
301 | - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); | |
302 | - try | |
303 | - { | |
304 | - ReceiveUnencrypted(data); | |
305 | - } | |
306 | - catch(SocketException& e) | |
307 | - { | |
308 | - return false; | |
309 | - } | |
310 | - tv.tv_sec = 0; | |
311 | - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); | |
312 | - stringstream sstream; | |
313 | - sstream.str(data); | |
314 | - Integer modulus,exponent; | |
315 | - sstream >> modulus; | |
316 | - sstream >> exponent; | |
317 | - theirPublicKey.Initialize(modulus,exponent); | |
318 | - if(!theirPublicKey.Validate(rng, 1)) | |
319 | - { | |
320 | - return false; | |
321 | - } | |
322 | - } | |
323 | - return true; | |
324 | -} | |
325 | - | |
326 | -void Socket::setKeys(RSAFunction *pubkey, InvertibleRSAFunction *privkey, byte *key, byte *iv) | |
327 | -{ | |
328 | - if(RSALENGTH > 0) | |
329 | - { | |
330 | - myPublicKey = *pubkey; | |
331 | - privateKey = *privkey; | |
332 | - memcpy(myIV,iv,AES::BLOCKSIZE); | |
333 | - memcpy(myKey,key,AESLENGTH); | |
334 | - } | |
335 | -} | |
336 | - | |
337 | -InvertibleRSAFunction* Socket::getPrivateKey() | |
338 | -{ | |
339 | - return &privateKey; | |
340 | -} | |
341 | - | |
342 | -RSAFunction* Socket::getPublicKey() | |
343 | -{ | |
344 | - return &myPublicKey; | |
345 | -} | |
346 | - | |
347 | -void Socket::sendAES() | |
348 | -{ | |
349 | - if(RSALENGTH > 0) | |
350 | - { | |
351 | - stringstream sstream; | |
352 | - string k((char*)myKey,AESLENGTH); | |
353 | - string i((char*)myIV,AES::BLOCKSIZE); | |
354 | - sstream << k << " " << i; | |
355 | - string key = sstream.str(); | |
356 | - string cipher = encryptRSA(key); | |
357 | - Send(cipher.c_str(), MAXLENGTH); | |
358 | - } | |
359 | -} | |
360 | - | |
361 | -void Socket::recvAES() | |
362 | -{ | |
363 | - if(RSALENGTH > 0) | |
364 | - { | |
365 | - stringstream sstream; | |
366 | - char *c = new char[MAXLENGTH]; | |
367 | - Receive(c, MAXLENGTH); | |
368 | - string key = string(c,MAXLENGTH), k, i; | |
369 | - key = decryptRSA(key); | |
370 | - k = key.substr(0,AESLENGTH); | |
371 | - i = key.substr(AESLENGTH+1); | |
372 | - memcpy(theirKey,k.c_str(),AESLENGTH); | |
373 | - memcpy(theirIV,i.c_str(),AES::BLOCKSIZE); | |
374 | - if(c != NULL) | |
375 | - { | |
376 | - delete[] c; | |
377 | - c = NULL; | |
378 | - } | |
379 | - } | |
380 | -} | |
381 | - | |
382 | -byte* Socket::getAESKey() | |
383 | -{ | |
384 | - return myKey; | |
385 | -} | |
386 | - | |
387 | -byte* Socket::getAESIV() | |
388 | -{ | |
389 | - return myIV; | |
390 | -} | |
391 | - | |
392 | -string Socket::encryptRSA(string& text) | |
393 | -{ | |
394 | - RSAES_OAEP_SHA_Encryptor e(theirPublicKey); | |
395 | - string cipher; | |
396 | - StringSource ss1(text, true, new PK_EncryptorFilter(rng, e, new StringSink(cipher))); | |
397 | - return cipher; | |
398 | -} | |
399 | - | |
400 | -string Socket::decryptRSA(string& crypt) | |
401 | -{ | |
402 | - RSAES_OAEP_SHA_Decryptor d(privateKey); | |
403 | - string recovered; | |
404 | - StringSource ss2(crypt, true,new PK_DecryptorFilter(rng, d,new StringSink(recovered))); // StringSource | |
405 | - return recovered; | |
406 | -} | |
407 | - | |
408 | -string Socket::encryptAES(const string& text) | |
409 | -{ | |
410 | - string cipher; | |
411 | - AES::Encryption aesEncryption(myKey, AESLENGTH); | |
412 | - CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, myIV ); | |
413 | - StreamTransformationFilter stfEncryptor(cbcEncryption, new StringSink( cipher ) ); | |
414 | - stfEncryptor.Put( reinterpret_cast<const unsigned char*>( text.c_str() ), text.length()); | |
415 | - stfEncryptor.MessageEnd(); | |
416 | - return cipher; | |
417 | -} | |
418 | - | |
419 | -string Socket::decryptAES(const string& crypt) | |
420 | -{ | |
421 | - string recovered; | |
422 | - AES::Decryption aesDecryption(theirKey, AESLENGTH); | |
423 | - CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, theirIV ); | |
424 | - CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( recovered ) ); | |
425 | - stfDecryptor.Put( reinterpret_cast<const unsigned char*>( crypt.c_str() ), crypt.size() ); | |
426 | - stfDecryptor.MessageEnd(); | |
427 | - return recovered; | |
428 | -} | |
429 | - | |
430 | -void Socket::LoadKey(const string& filename, PublicKey *key) | |
431 | -{ | |
432 | - ByteQueue queue; | |
433 | - FileSource file(filename.c_str(), true); | |
434 | - file.TransferTo(queue); | |
435 | - queue.MessageEnd(); | |
436 | - key->Load(queue); | |
437 | -} | |
438 | - | |
439 | -void Socket::SaveKey(const string& filename, const PublicKey *key) | |
440 | -{ | |
441 | - ByteQueue queue; | |
442 | - key->Save(queue); | |
443 | - FileSink file(filename.c_str()); | |
444 | - queue.CopyTo(file); | |
445 | - file.MessageEnd(); | |
446 | -} | |
447 | - | |
448 | -void Socket::loadKeys(string pub, string priv) | |
449 | -{ | |
450 | - if(RSALENGTH > 0) | |
451 | - { | |
452 | - ifstream pubkey,privkey; | |
453 | - pubkey.open(pub.c_str()); | |
454 | - privkey.open(priv.c_str()); | |
455 | - if(pubkey.is_open() || privkey.is_open()) | |
456 | - { | |
457 | - pubkey.close(); | |
458 | - privkey.close(); | |
459 | - LoadKey(pub, getPublicKey()); | |
460 | - LoadKey(priv, getPrivateKey()); | |
461 | - if(getPublicKey()->Validate(rng, 1) || getPrivateKey()->Validate(rng,1)) | |
462 | - { | |
463 | - generateAESKeys(); | |
464 | - return; | |
465 | - } | |
466 | - } | |
467 | - pubkey.close(); | |
468 | - privkey.close(); | |
469 | - generateRSAKeys(); | |
470 | - SaveKey(priv, getPrivateKey()); | |
471 | - SaveKey(pub, getPublicKey()); | |
472 | - generateAESKeys(); | |
473 | - } | |
188 | + return *this; | |
474 | 189 | } | ... | ... |
src/client.cpp
... | ... | @@ -12,12 +12,6 @@ |
12 | 12 | #include <signal.h> |
13 | 13 | |
14 | 14 | #include <sys/time.h> |
15 | -//! Ruta a la llave privada | |
16 | -/*! Ruta relativa o absoluta a la llave privada RSA, si no existe o es inválida, se creará una nueva en esa localización. */ | |
17 | -#define PRIVATEKEY "bin/private_client.key" | |
18 | -//! Ruta a la llave pública | |
19 | -/*! Ruta relativa o absoluta a la llave pública RSA, si no existe o es inválida, se creará una nueva en esa localización. */ | |
20 | -#define PUBLICKEY "bin/public_client.key" | |
21 | 15 | |
22 | 16 | using namespace std; |
23 | 17 | |
... | ... | @@ -30,28 +24,12 @@ void exitClient(int signal/*!<Parámetro que captura el signal recibido*/) |
30 | 24 | exit(-1); |
31 | 25 | } |
32 | 26 | |
33 | -//! Método para intercambiar llaves de encriptación | |
34 | -/*! Este método sirve para intercambiar las llaves de encriptación con el servidor al otro lado del socket. */ | |
35 | -void exchangeKeys(Socket &s/*!<Socket cliente que intercambia las llaves con el servidor*/) | |
36 | -{ | |
37 | - if(!s.receivePublicKey() || !s.sendPublicKey()) | |
38 | - { | |
39 | - cout << "Error exchanging keys" << endl << "Exiting" << endl; | |
40 | - s.Close(); | |
41 | - cout << "Socket closed" << endl; | |
42 | - exit(-1); | |
43 | - } | |
44 | - s.recvAES(); | |
45 | - s.sendAES(); | |
46 | -} | |
47 | - | |
48 | 27 | //! Método principal del cliente |
49 | 28 | /*! Este método inicializa el Socket, establece la conexión y realiza las acciones que se le hayan programado para comunicarse con el servidor.*/ |
50 | 29 | int main() |
51 | 30 | { |
52 | 31 | signal(SIGPIPE, exitClient); |
53 | 32 | Socket s; |
54 | - s.loadKeys(PUBLICKEY,PRIVATEKEY); | |
55 | 33 | string send, recv, host; |
56 | 34 | int port; |
57 | 35 | s.Create(); |
... | ... | @@ -71,7 +49,6 @@ int main() |
71 | 49 | return -1; |
72 | 50 | } |
73 | 51 | cout << "Connected" << endl; |
74 | - exchangeKeys(s); | |
75 | 52 | while(true) |
76 | 53 | { |
77 | 54 | cout << "> "; | ... | ... |
src/include/Socket.h
... | ... | @@ -9,38 +9,18 @@ |
9 | 9 | #define SOCKET_H_ |
10 | 10 | |
11 | 11 | #include <iostream> |
12 | +#include <sstream> | |
13 | +#include "SocketException.h" | |
12 | 14 | #include <sys/socket.h> |
15 | +#include <sys/types.h> | |
13 | 16 | #include <netinet/in.h> |
17 | +#include <netinet/tcp.h> | |
14 | 18 | #include <arpa/inet.h> |
15 | 19 | #include <netdb.h> |
16 | -#include <string> | |
17 | -#include <sys/types.h> | |
18 | 20 | #include <unistd.h> |
19 | -#include <rsa.h> | |
20 | -#include <sha.h> | |
21 | -#include <filters.h> | |
22 | -#include <files.h> | |
23 | -#include <osrng.h> | |
24 | -#include <secblock.h> | |
25 | -#include <cryptlib.h> | |
26 | -#include <aes.h> | |
27 | -#include <modes.h> | |
28 | - | |
29 | -//! Longitud de la llave RSA | |
30 | -/*! \brief Longitud en bits de la llava RSA usada para encriptar la llave AES. Una longitud de 0 indica que el mensaje se trasnmitirá SIN encriptar. | |
21 | +#include <cstdlib> | |
22 | +#include <cstring> | |
31 | 23 | |
32 | -__NOTA: Si se usara una longitud menor a 728 bits habria que modificar el método que envía y recibe la llave AES, ya que la longitud máxima del | |
33 | -mensaje a encriptar con RSA no sería suficiente para transmitir la llave y el IV en un solo paquete. De todas formas, se recomienda NO USAR una | |
34 | -llave de longitud inferior a 768 bits, la llave RSA de 512 bits se puede descifrar con un Pentium 4 en unas 8 horas.__ */ | |
35 | -#define RSALENGTH 1024 | |
36 | -//! Longitud de la llave AES | |
37 | -/*! \brief Longitud en bytes de la llave AES usada para encriptar el mensaje. Los valores permitidos son 16, 24 y 32 */ | |
38 | -#define AESLENGTH 16 | |
39 | -//! Longitud del paquete encriptado con RSA | |
40 | -/*! \brief Longitud en bytes del tamaño de cada paquete encriptado con RSA, esto sólo se usaría para la transmisión de la llave AES */ | |
41 | -#define MAXLENGTH (RSALENGTH/8) | |
42 | - | |
43 | -using namespace CryptoPP; | |
44 | 24 | using namespace std; |
45 | 25 | |
46 | 26 | //! Clase del socket |
... | ... | @@ -57,42 +37,6 @@ class Socket |
57 | 37 | //! Estructura de dirección de socket |
58 | 38 | /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */ |
59 | 39 | struct sockaddr_in sockAddr; |
60 | - //! Pseudo-generador de números aleatorios | |
61 | - /*! Esta variable se usa para generar los números aleatorios necesarios para la creación de las llaves criptográficas. */ | |
62 | - AutoSeededRandomPool rng; | |
63 | - //! Llave privada RSA | |
64 | - /*! Esta variable contiene la llave privada RSA generada. */ | |
65 | - RSA::PrivateKey privateKey; | |
66 | - //! Llave pública RSA própia | |
67 | - /*! Esta variable contiene la llave RSA pública generada por el própio socket. */ | |
68 | - RSA::PublicKey myPublicKey; | |
69 | - //! Llave pública RSA del peer | |
70 | - /*! Esta variable contiene la llave RSA pública recibida del peer al otro lado del socket. */ | |
71 | - RSA::PublicKey theirPublicKey; | |
72 | - //! Llave AES própia | |
73 | - /*! Esta variable contiene la llave AES generada por el própio socket. */ | |
74 | - byte myKey[AESLENGTH]; | |
75 | - //! IV própio | |
76 | - /*! Esta variable contiene el IV generado por el própio socket. */ | |
77 | - byte myIV[ AES::BLOCKSIZE ]; | |
78 | - //! Llave AES del peer | |
79 | - /*! Esta variable contiene la llave AES recibida del peer al otro lado del socket. */ | |
80 | - byte theirKey[AESLENGTH]; | |
81 | - //! IV del peer | |
82 | - /*! Esta variable contiene el IV recibido del peer al otro lado del socket. */ | |
83 | - byte theirIV[ AES::BLOCKSIZE ]; | |
84 | - //! Método de encriptación RSA | |
85 | - /*! Este método devuelve el mensaje que se le pasa por argumento encriptado con RSA en forma de string. */ | |
86 | - string encryptRSA(string& text /*!<Texto a encriptar*/); | |
87 | - //!Método de desencriptación RSA | |
88 | - /*! Este método devuelve el mensaje que se la pasa por argumento desencriptado con RSA en forma de string. */ | |
89 | - string decryptRSA(string& crypt/*!<Mensaje a desencriptar*/); | |
90 | - //! Método de encriptación AES | |
91 | - /*! Este método devuelve el mensaje que se le pasa por argumento encriptado con AES en forma de string. */ | |
92 | - string encryptAES(const string& text/*!<Texto a encriptar*/); | |
93 | - //! Método de desencriptación AES | |
94 | - /*! Este método devuelve el mensaje que se la pasa por argumento desencriptado con AES en forma de string. */ | |
95 | - string decryptAES(const string& crypt/*!<Mensaje a desencriptar*/); | |
96 | 40 | //! Método para recibir un mensaje de longitud conocida |
97 | 41 | /*! \brief Este método se usa para recibir un mensaje de la longitud que se especifica por argumento y almacenarlo en el buffer |
98 | 42 | proporcionado. |
... | ... | @@ -105,19 +49,6 @@ class Socket |
105 | 49 | |
106 | 50 | _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/ |
107 | 51 | int Send(const char *buff/*!<Buffer con el mensaje a enviar*/, int length/*!<Longitud del mensaje*/); |
108 | - //! Método para enviar un un string en texto llano | |
109 | - /*! Este método se sirve de Send() para enviar un mensaje sin encriptar usando el \ref proto "protocolo" implementado. */ | |
110 | - void SendUnencrypted(const string& text/*!<Texto a enviar*/); | |
111 | - //! Método para recibir un string en texto llano | |
112 | - /*! Este método se sirve del método Receive() para recibir un mensaje sin encriptar de longitud arbitrária usando el | |
113 | - \ref proto "protocolo" implementado. */ | |
114 | - void ReceiveUnencrypted(string& text/*!<String donde se almacena el texto recibido*/); | |
115 | - //! Método para cargar llaves RSA | |
116 | - /*! Este método lee del disco una llave RSA y la asigna al Socket que lo invoca. */ | |
117 | - void LoadKey(const string& filename/*!<Ruta absoluta o relativa a la llave*/, PublicKey *key/*!<Llave donde se almacenan los datos leídos*/); | |
118 | - //! Método para guardar llaves RSA | |
119 | - /*! Este método guarda al disco una llave RSA proporcionada por argumento. */ | |
120 | - void SaveKey(const string& filename/*!<Ruta absoluta o relativa a la llave*/, const PublicKey *key/*!<Llave a almacenar*/); | |
121 | 52 | |
122 | 53 | public: |
123 | 54 | //! Constructor de la clase Socket |
... | ... | @@ -147,47 +78,6 @@ class Socket |
147 | 78 | //! Getter para el file descriptor del socket |
148 | 79 | /*! Este método devuelve el file descriptor del socket. */ |
149 | 80 | int getSock(); |
150 | - //! Método para generar las llaves RSA | |
151 | - /*! Este método genera las llaves pública y privada RSA y las asigna la instancia de Socket que lo ha invocado. */ | |
152 | - void generateRSAKeys(); | |
153 | - //! Método para generar las llaves AES | |
154 | - /*! Este método genera la llave y el IV de AES y los asigna a la instancia de Socket que lo ha invocado. */ | |
155 | - void generateAESKeys(); | |
156 | - //! Método para mandar la llave pública | |
157 | - /*! Este método manda la llave pública RSA sin encriptar por el socket. */ | |
158 | - bool sendPublicKey(); | |
159 | - //! Método para recibir la llave pública | |
160 | - /*! Este método sirve para recibir la llave pública RSA de otro Socket. */ | |
161 | - bool receivePublicKey(); | |
162 | - //! Método para transferir llaves entre objetos Socket | |
163 | - /*! Este método sirve para que dos instancias de Socket intercambien sus llaves criptológicas dentro de la misma | |
164 | - máquina. | |
165 | - | |
166 | - _Se usa para cuando un Socket de tipo servidor genere una instancia de otro Socket para comunicarse con el cliente, el primero | |
167 | - le transfiera las llaves generadas al segundo para poder realizar la comunicación._*/ | |
168 | - void setKeys(RSAFunction *pubkey/*!<Llave pública RSA*/, InvertibleRSAFunction *privkey/*!<Llave privada RSA*/, byte *key/*!<Llave AES*/, byte *iv/*!<IV AES*/); | |
169 | - //! Getter de la llave pública RSA | |
170 | - /*! Este método devuelve la llave pública RSA para poder transferirla a otro Socket usando setKeys(). */ | |
171 | - RSAFunction* getPublicKey(); | |
172 | - //! Getter de la llave privada RSA | |
173 | - /*! Este método devuelve la llave privada RSA para poder transferirla a otro Socket usando setKeys(). */ | |
174 | - InvertibleRSAFunction* getPrivateKey(); | |
175 | - //! Método para mandar la llave AES | |
176 | - /*! Este método manda la llave AES y el IV del Socket que lo invoca encriptados con RSA. */ | |
177 | - void sendAES(); | |
178 | - //! Método para recibir la llave AES | |
179 | - /*! Este método sirve para recibir la llave AES y el IV de otro Socket encriptados por RSA. */ | |
180 | - void recvAES(); | |
181 | - //! Getter de la llave AES | |
182 | - /*! Este método devuelve la llave AES para poder transferirla a otro Socket usando setKeys(). */ | |
183 | - byte* getAESKey(); | |
184 | - //! Getter del IV AES | |
185 | - /*! Este método devuelve el IV AES para poder transferirla a otro Socket usando setKeys(). */ | |
186 | - byte* getAESIV(); | |
187 | - //! Método para cargar las llaves del disco | |
188 | - /*! Este método lee las llaves RSA del disco o las genera y guarda de nuevo si no existen o son inválidas. También genera | |
189 | - las llaves AES. */ | |
190 | - void loadKeys(string pub/*!<Ruta absoluta o relativa a la llave pública RSA*/, string priv/*!<Ruta absoluta o relativa a la llave privada RSA*/); | |
191 | 81 | //! Método para enviar mensajes |
192 | 82 | /*! Este método envía el mensaje que se le proporciona a través del Socket con o sin encriptación según |
193 | 83 | las \ref defines "opciones de compilación" usando el \ref proto "protocolo" implementado. */ | ... | ... |
src/server.cpp
... | ... | @@ -54,7 +54,6 @@ void Server::requestExit() |
54 | 54 | void Server::startServer(string i, int p) |
55 | 55 | { |
56 | 56 | Socket ss; |
57 | - ss.loadKeys(PUBLICKEY,PRIVATEKEY); | |
58 | 57 | string ip = i; |
59 | 58 | int port = p; |
60 | 59 | signal(SIGPIPE, SIG_IGN); |
... | ... | @@ -96,20 +95,6 @@ void Server::startServer(string i, int p) |
96 | 95 | break; |
97 | 96 | } |
98 | 97 | pthread_mutex_lock(&m_mutex); |
99 | - cs->setKeys(ss.getPublicKey(), ss.getPrivateKey(), ss.getAESKey(), ss.getAESIV()); | |
100 | - if(!cs->sendPublicKey() || !cs->receivePublicKey()) | |
101 | - { | |
102 | - cs->Close(); | |
103 | - if(cs != 0) | |
104 | - { | |
105 | - delete cs; | |
106 | - cs = 0; | |
107 | - } | |
108 | - pthread_mutex_unlock(&m_mutex); | |
109 | - continue; | |
110 | - } | |
111 | - cs->sendAES(); | |
112 | - cs->recvAES(); | |
113 | 98 | thread_args *t_args = new thread_args; |
114 | 99 | pthread_t *thread = new pthread_t; |
115 | 100 | t_args->mutex = &m_mutex; | ... | ... |