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 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
1 1 bind-ip = 192.168.0.10
2   -port = 3001
  2 +port = 5700
... ...
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&amp; 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&amp; 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/*!&lt;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;
... ...