/** @file * \brief Header de la clase Socket * \author Imanol Barba Sabariego * \date 12/06/2013 * * En este fichero se define la clase Socket, que es la clase que se abstraer toda la comunicación con sockets al programador */ #ifndef SOCKET_H_ #define SOCKET_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //! Longitud de la llave RSA /*! \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. __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 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 llave de longitud inferior a 768 bits, la llave RSA de 512 bits se puede descifrar con un Pentium 4 en unas 8 horas.__ */ #define RSALENGTH 1024 //! Longitud de la llave AES /*! \brief Longitud en bytes de la llave AES usada para encriptar el mensaje. Los valores permitidos son 16, 24 y 32 */ #define AESLENGTH 16 //! Longitud del paquete encriptado con RSA /*! \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 */ #define MAXLENGTH (RSALENGTH/8) using namespace CryptoPP; using namespace std; //! Clase del socket /** Esta clase define un objeto con los métodos y atributos necesarios para realizar comunicación encriptada o en texto llano a través de un socket TCP/IP en un entorno UNIX abstrayendo la implementación de sockets y de encriptación al programador. */ class Socket { private: //! Descriptor del fichero del socket /*! Esta variable contiene el file descriptor del socket abierto por el SO. */ int sock; //! Estructura de dirección de socket /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */ struct sockaddr_in sockAddr; //! Pseudo-generador de números aleatorios /*! Esta variable se usa para generar los números aleatorios necesarios para la creación de las llaves criptográficas. */ AutoSeededRandomPool rng; //! Llave privada RSA /*! Esta variable contiene la llave privada RSA generada. */ RSA::PrivateKey privateKey; //! Llave pública RSA própia /*! Esta variable contiene la llave RSA pública generada por el própio socket. */ RSA::PublicKey myPublicKey; //! Llave pública RSA del peer /*! Esta variable contiene la llave RSA pública recibida del peer al otro lado del socket. */ RSA::PublicKey theirPublicKey; //! Llave AES própia /*! Esta variable contiene la llave AES generada por el própio socket. */ byte myKey[AESLENGTH]; //! IV própio /*! Esta variable contiene el IV generado por el própio socket. */ byte myIV[ AES::BLOCKSIZE ]; //! Llave AES del peer /*! Esta variable contiene la llave AES recibida del peer al otro lado del socket. */ byte theirKey[AESLENGTH]; //! IV del peer /*! Esta variable contiene el IV recibido del peer al otro lado del socket. */ byte theirIV[ AES::BLOCKSIZE ]; //! Método de encriptación RSA /*! Este método devuelve el mensaje que se le pasa por argumento encriptado con RSA en forma de string. */ string encryptRSA(string& text /*!> ( string& /*!