Commit 74e67e857ca7a1c038653e245a8deedcb2fc2594

Authored by Imanol-Mikel Barba Sabariego
1 parent ec6251cd

Encryption code removed

Makefile
1 -CXXFLAGS = -Icryptopp -Isrc/include 1 +CXXFLAGS = -Isrc/include
2 LDFLAGS = -Llib 2 LDFLAGS = -Llib
3 -LIBS = -lcryptopp -lpthread 3 +LIBS = -lpthread
4 TARGETS = bin/client bin/server bin/socket.conf 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,7 +9,7 @@ TARGETS = bin/client bin/server bin/socket.conf
9 CXX = g++ 9 CXX = g++
10 endif 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 $(CXX) -o bin/client bin/client.o bin/Socket.o $(LDFLAGS) $(LIBS) 13 $(CXX) -o bin/client bin/client.o bin/Socket.o $(LDFLAGS) $(LIBS)
14 strip bin/client 14 strip bin/client
15 15
@@ -22,16 +22,13 @@ bin/server.o: src/server.cpp src/include/server.h @@ -22,16 +22,13 @@ bin/server.o: src/server.cpp src/include/server.h
22 bin/main_server.o: src/main_server.cpp 22 bin/main_server.o: src/main_server.cpp
23 $(CXX) -o bin/main_server.o -c src/main_server.cpp $(CXXFLAGS) 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 $(CXX) -o bin/server bin/server.o bin/Socket.o bin/main_server.o $(LDFLAGS) $(LIBS) 26 $(CXX) -o bin/server bin/server.o bin/Socket.o bin/main_server.o $(LDFLAGS) $(LIBS)
27 strip bin/server 27 strip bin/server
28 28
29 bin/Socket.o: src/Socket.cpp src/include/Socket.h src/include/SocketException.h 29 bin/Socket.o: src/Socket.cpp src/include/Socket.h src/include/SocketException.h
30 $(CXX) -o bin/Socket.o -c src/Socket.cpp $(CXXFLAGS) 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 bin/socket.conf: 32 bin/socket.conf:
36 cp socket.conf bin/socket.conf 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
1 bind-ip = 192.168.0.10 1 bind-ip = 192.168.0.10
2 -port = 3001 2 +port = 5700
src/Socket.cpp
@@ -6,24 +6,12 @@ @@ -6,24 +6,12 @@
6 * En este fichero se implementan los métodos de la clase Socket definidos en Socket.h 6 * En este fichero se implementan los métodos de la clase Socket definidos en Socket.h
7 */ 7 */
8 #include "Socket.h" 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 using namespace std; 10 using namespace std;
16 11
17 Socket::Socket() 12 Socket::Socket()
18 { 13 {
19 sock = -1; 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 int Socket::getSock() 17 int Socket::getSock()
@@ -39,7 +27,7 @@ void Socket::Create() @@ -39,7 +27,7 @@ void Socket::Create()
39 throw SocketException ( "TCP: Could not create socket" ); 27 throw SocketException ( "TCP: Could not create socket" );
40 } 28 }
41 setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof optval); 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 void Socket::Bind(string address, int port) 33 void Socket::Bind(string address, int port)
@@ -47,7 +35,7 @@ void Socket::Bind(string address, int port) @@ -47,7 +35,7 @@ void Socket::Bind(string address, int port)
47 sockAddr.sin_family = AF_INET; 35 sockAddr.sin_family = AF_INET;
48 sockAddr.sin_port = htons(port); 36 sockAddr.sin_port = htons(port);
49 sockAddr.sin_addr.s_addr = inet_addr(address.c_str()); 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 stringstream sstream; 40 stringstream sstream;
53 sstream << "TCP: Could not bind to address " << address << " on port " << port; 41 sstream << "TCP: Could not bind to address " << address << " on port " << port;
@@ -144,48 +132,32 @@ void Socket::Close() @@ -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 int length = text.length(); 138 int length = text.length();
151 if(!length) 139 if(!length)
152 { 140 {
153 - string s = "0"; 141 + string s = "0";
154 Send(s.c_str(), 2); 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 return *this; 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 return *this; 152 return *this;
181 } 153 }
182 154
183 -void Socket::ReceiveUnencrypted(string& text) 155 +const Socket& Socket::operator >> ( std::string& text )
184 { 156 {
185 text = ""; 157 text = "";
186 - string len;  
187 - int length;  
188 - stringstream sstream; 158 + string len;
  159 + int length;
  160 + stringstream sstream;
189 char c; 161 char c;
190 while(true) 162 while(true)
191 { 163 {
@@ -201,10 +173,10 @@ void Socket::ReceiveUnencrypted(string&amp; text) @@ -201,10 +173,10 @@ void Socket::ReceiveUnencrypted(string&amp; text)
201 } 173 }
202 sstream << len; 174 sstream << len;
203 sstream >> length; 175 sstream >> length;
204 - if(!length)  
205 - {  
206 - return;  
207 - } 176 + if(!length)
  177 + {
  178 + return *this;
  179 + }
208 char *message = new char[length]; 180 char *message = new char[length];
209 Receive(message,length); 181 Receive(message,length);
210 text.append(message,length); 182 text.append(message,length);
@@ -213,262 +185,5 @@ void Socket::ReceiveUnencrypted(string&amp; text) @@ -213,262 +185,5 @@ void Socket::ReceiveUnencrypted(string&amp; text)
213 delete[] message; 185 delete[] message;
214 message = NULL; 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 +12,6 @@
12 #include <signal.h> 12 #include <signal.h>
13 13
14 #include <sys/time.h> 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 using namespace std; 16 using namespace std;
23 17
@@ -30,28 +24,12 @@ void exitClient(int signal/*!&lt;Parámetro que captura el signal recibido*/) @@ -30,28 +24,12 @@ void exitClient(int signal/*!&lt;Parámetro que captura el signal recibido*/)
30 exit(-1); 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 //! Método principal del cliente 27 //! Método principal del cliente
49 /*! Este método inicializa el Socket, establece la conexión y realiza las acciones que se le hayan programado para comunicarse con el servidor.*/ 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 int main() 29 int main()
51 { 30 {
52 signal(SIGPIPE, exitClient); 31 signal(SIGPIPE, exitClient);
53 Socket s; 32 Socket s;
54 - s.loadKeys(PUBLICKEY,PRIVATEKEY);  
55 string send, recv, host; 33 string send, recv, host;
56 int port; 34 int port;
57 s.Create(); 35 s.Create();
@@ -71,7 +49,6 @@ int main() @@ -71,7 +49,6 @@ int main()
71 return -1; 49 return -1;
72 } 50 }
73 cout << "Connected" << endl; 51 cout << "Connected" << endl;
74 - exchangeKeys(s);  
75 while(true) 52 while(true)
76 { 53 {
77 cout << "> "; 54 cout << "> ";
src/include/Socket.h
@@ -9,38 +9,18 @@ @@ -9,38 +9,18 @@
9 #define SOCKET_H_ 9 #define SOCKET_H_
10 10
11 #include <iostream> 11 #include <iostream>
  12 +#include <sstream>
  13 +#include "SocketException.h"
12 #include <sys/socket.h> 14 #include <sys/socket.h>
  15 +#include <sys/types.h>
13 #include <netinet/in.h> 16 #include <netinet/in.h>
  17 +#include <netinet/tcp.h>
14 #include <arpa/inet.h> 18 #include <arpa/inet.h>
15 #include <netdb.h> 19 #include <netdb.h>
16 -#include <string>  
17 -#include <sys/types.h>  
18 #include <unistd.h> 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 using namespace std; 24 using namespace std;
45 25
46 //! Clase del socket 26 //! Clase del socket
@@ -57,42 +37,6 @@ class Socket @@ -57,42 +37,6 @@ class Socket
57 //! Estructura de dirección de socket 37 //! Estructura de dirección de socket
58 /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */ 38 /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */
59 struct sockaddr_in sockAddr; 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 //! Método para recibir un mensaje de longitud conocida 40 //! Método para recibir un mensaje de longitud conocida
97 /*! \brief Este método se usa para recibir un mensaje de la longitud que se especifica por argumento y almacenarlo en el buffer 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 proporcionado. 42 proporcionado.
@@ -105,19 +49,6 @@ class Socket @@ -105,19 +49,6 @@ class Socket
105 49
106 _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/ 50 _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/
107 int Send(const char *buff/*!<Buffer con el mensaje a enviar*/, int length/*!<Longitud del mensaje*/); 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 public: 53 public:
123 //! Constructor de la clase Socket 54 //! Constructor de la clase Socket
@@ -147,47 +78,6 @@ class Socket @@ -147,47 +78,6 @@ class Socket
147 //! Getter para el file descriptor del socket 78 //! Getter para el file descriptor del socket
148 /*! Este método devuelve el file descriptor del socket. */ 79 /*! Este método devuelve el file descriptor del socket. */
149 int getSock(); 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 //! Método para enviar mensajes 81 //! Método para enviar mensajes
192 /*! Este método envía el mensaje que se le proporciona a través del Socket con o sin encriptación según 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 las \ref defines "opciones de compilación" usando el \ref proto "protocolo" implementado. */ 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,7 +54,6 @@ void Server::requestExit()
54 void Server::startServer(string i, int p) 54 void Server::startServer(string i, int p)
55 { 55 {
56 Socket ss; 56 Socket ss;
57 - ss.loadKeys(PUBLICKEY,PRIVATEKEY);  
58 string ip = i; 57 string ip = i;
59 int port = p; 58 int port = p;
60 signal(SIGPIPE, SIG_IGN); 59 signal(SIGPIPE, SIG_IGN);
@@ -96,20 +95,6 @@ void Server::startServer(string i, int p) @@ -96,20 +95,6 @@ void Server::startServer(string i, int p)
96 break; 95 break;
97 } 96 }
98 pthread_mutex_lock(&m_mutex); 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 thread_args *t_args = new thread_args; 98 thread_args *t_args = new thread_args;
114 pthread_t *thread = new pthread_t; 99 pthread_t *thread = new pthread_t;
115 t_args->mutex = &m_mutex; 100 t_args->mutex = &m_mutex;