Server.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. #include <openssl/ssl.h>
  2. #include <openssl/err.h>
  3. #include "Server.h"
  4. #ifndef WIN32
  5. #include <string.h>
  6. #endif
  7. #include <Key.h>
  8. #include <Text.h>
  9. using namespace Network;
  10. // Inhalt der Server Klasse aus Server.h
  11. // Konstruktor
  12. Server::Server()
  13. : ReferenceCounter()
  14. {
  15. sock = 0;
  16. memset( &addresse, 0, sizeof( addresse ) ); // Adresse setzen
  17. addresse.sin_family = AF_INET;
  18. addresse.sin_addr.s_addr = ADDR_ANY;
  19. klients = 0;
  20. }
  21. // Destruktor
  22. Server::~Server()
  23. {
  24. trenne();
  25. }
  26. // nicht constant
  27. bool Server::verbinde( unsigned short port, int warteschlangenLen ) // Öffnet das Socket
  28. {
  29. sock = socket( AF_INET, SOCK_STREAM, 0 ); // Socket erstellen
  30. addresse.sin_port = htons( port ); // port setzen
  31. if( bind( sock, (struct sockaddr *)&addresse, sizeof( addresse ) ) == -1 ) // socket öffnen
  32. {
  33. trenne();
  34. return 0; // Fehler
  35. }
  36. if( listen( sock, warteschlangenLen ) == -1 ) // Klients annehmen
  37. {
  38. trenne();
  39. return 0; // Fehler
  40. }
  41. return 1;
  42. }
  43. SKlient *Server::getKlient() // nimmt Klient an
  44. {
  45. if( !sock )
  46. return 0;
  47. sockaddr_in client;
  48. int len = sizeof( addresse );
  49. #ifdef WIN32
  50. SOCKET cls = accept( sock, (sockaddr *)&client, &len ); // Klient empfangen
  51. if( cls == INVALID_SOCKET )
  52. {
  53. trenne();
  54. return 0;
  55. }
  56. #else
  57. SOCKET cls = accept( sock, (sockaddr *)&client, (socklen_t *)&len ); // Klient empfangen
  58. if( !cls )
  59. {
  60. if( errno == ECONNABORTED || errno == EBADF )
  61. trenne();
  62. return 0;
  63. }
  64. #endif
  65. client.sin_port = addresse.sin_port;
  66. klients++;
  67. return new SKlient( client, cls ); // Klient Handle Klasse zurückgeben
  68. }
  69. int Server::getKlients( bool reset ) // gibt die Anzahl der Klients zurück
  70. {
  71. int ret = klients;
  72. if( reset )
  73. klients = 0;
  74. return ret;
  75. }
  76. bool Server::trenne() // beendet den Server
  77. {
  78. if( !sock )
  79. return 1;
  80. if( closesocket( sock ) < 0 ) // socket schließen
  81. return 0;
  82. sock = 0;
  83. return 1;
  84. }
  85. // constant
  86. unsigned short Server::getPort() const // gibt den Port zurück
  87. {
  88. return htons( addresse.sin_port );
  89. }
  90. bool Server::isConnected() const // giebt 1 zurück, falls der Server verbunden ist
  91. {
  92. return sock != 0;
  93. }
  94. // Inhalt der SKlient Klasse aus Server.h
  95. // Konstruktor
  96. SKlient::SKlient( sockaddr_in addresse, SOCKET sock )
  97. : ReferenceCounter()
  98. {
  99. clientAddr = addresse;
  100. this->sock = sock;
  101. downStreamBytes = 0;
  102. upStreamBytes = 0;
  103. sendeKey = 0;
  104. empfangKey = 0;
  105. }
  106. // Destruktor
  107. SKlient::~SKlient()
  108. {
  109. trenne();
  110. if( sendeKey )
  111. sendeKey->release();
  112. if( empfangKey )
  113. empfangKey->release();
  114. }
  115. // nicht constant
  116. void SKlient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
  117. {
  118. if( sendeKey )
  119. sendeKey->release();
  120. sendeKey = key;
  121. }
  122. void SKlient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
  123. {
  124. if( empfangKey )
  125. empfangKey->release();
  126. empfangKey = key;
  127. }
  128. void SKlient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
  129. {
  130. if( !sendeKey )
  131. sendeKey = new Encryption::Key();
  132. sendeKey->setKey( key, len );
  133. }
  134. void SKlient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
  135. {
  136. if( !empfangKey )
  137. empfangKey = new Encryption::Key();
  138. empfangKey->setKey( key, len );
  139. }
  140. bool SKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  141. {
  142. if( !sock )
  143. return 0;
  144. int ll = 0;
  145. while( len > 0 )
  146. {
  147. #ifdef WIN32
  148. int l = send( sock, nachricht + ll, len, 0 );
  149. #else
  150. int l = (int)send( sock, nachricht + ll, len, MSG_NOSIGNAL );
  151. #endif
  152. if( l <= 0 )
  153. return 0; // Fehler
  154. len -= l;
  155. ll += l;
  156. }
  157. upStreamBytes += ll;
  158. return 1;
  159. }
  160. bool SKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  161. {
  162. if( !sock )
  163. return 0;
  164. int ll = 0;
  165. while( len > 0 )
  166. {
  167. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  168. if( l <= 0 )
  169. return 0; // Fehler
  170. len -= l;
  171. ll += l;
  172. }
  173. downStreamBytes += ll;
  174. return 1;
  175. }
  176. bool SKlient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
  177. {
  178. if( !sendeKey )
  179. return sende( nachricht, len );
  180. Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
  181. sendeKey->codieren( dynamic_cast<Encryption::Bytes *>( n->getThis() ) ); int ll = 0;
  182. while( len > 0 )
  183. {
  184. #ifdef WIN32
  185. int l = send( sock, n->getBytes() + ll, len, 0 );
  186. #else
  187. int l = (int)send( sock, n->getBytes() + ll, len, MSG_NOSIGNAL );
  188. #endif
  189. if( l <= 0 )
  190. {
  191. n->release();
  192. return 0; // Fehler
  193. }
  194. len -= l;
  195. ll += l;
  196. }
  197. upStreamBytes += ll;
  198. n->release();
  199. return 1;
  200. }
  201. bool SKlient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
  202. {
  203. if( !empfangKey )
  204. return getNachricht( nachricht, len );
  205. int ll = 0;
  206. while( len > 0 )
  207. {
  208. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  209. if( l <= 0 )
  210. return 0; // Fehler
  211. len -= l;
  212. ll += l;
  213. }
  214. Encryption::Bytes *n = new Encryption::Bytes();
  215. n->setBytesZ( nachricht, ll );
  216. empfangKey->decodieren( n );
  217. downStreamBytes += ll;
  218. return 1;
  219. }
  220. int SKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  221. {
  222. int ret = downStreamBytes;
  223. if( reset )
  224. downStreamBytes = 0;
  225. return ret;
  226. }
  227. int SKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  228. {
  229. int ret = upStreamBytes;
  230. if( reset )
  231. upStreamBytes = 0;
  232. return ret;
  233. }
  234. bool SKlient::trenne() // trennt die Verbindung zum Klient
  235. {
  236. if( !sock )
  237. return 0;
  238. if( closesocket( sock ) < 0 ) // trennen
  239. return 0;
  240. sock = 0;
  241. return 1;
  242. }
  243. // constant
  244. unsigned short SKlient::getPort() const // gibt den Port zurück
  245. {
  246. return htons( clientAddr.sin_port );
  247. }
  248. const char *SKlient::getIp() const // gibt die Ip des Klients zurück
  249. {
  250. return inet_ntoa( clientAddr.sin_addr );
  251. }
  252. int pem_passwd_cb( char *buf, int size, int rwflag, void *userdata )
  253. {
  254. const char *passw = ( (Text *)userdata )->getText();
  255. memcpy( buf, passw, MIN( (unsigned int)size, strlen( passw ) + 1 ) );
  256. return (int)strlen( buf );
  257. }
  258. bool SSLErrorCheck( int result, SSL *ssl, const char *action )
  259. {
  260. if( result <= 0 )
  261. {
  262. std::cout << "ERROR: '" << action << "' returned error code: " << SSL_get_error( ssl, result ) << "\n";
  263. std::cout.flush();
  264. return 0;
  265. }
  266. return 1;
  267. }
  268. bool SSLErrorCheck( int result, const char *action )
  269. {
  270. if( result <= 0 )
  271. {
  272. unsigned long error = ERR_get_error();
  273. std::cout << "ERROR: '" << action << "' returned " << result << " error code: " << error << "(" << ERR_reason_error_string( error ) << ")\n";
  274. std::cout.flush();
  275. return 0;
  276. }
  277. return 1;
  278. }
  279. // Inhalt der SSLServer Klasse
  280. // Konstruktor
  281. SSLServer::SSLServer()
  282. : ReferenceCounter()
  283. {
  284. s = 0;
  285. ctx = SSL_CTX_new( SSLv23_server_method() );
  286. SSL_CTX_set_min_proto_version( ctx, TLS1_2_VERSION );
  287. SSL_CTX_set_default_passwd_cb( ctx, pem_passwd_cb );
  288. passw = new Text();
  289. SSL_CTX_set_default_passwd_cb_userdata( ctx, passw );
  290. addr.sin_family = AF_INET;
  291. addr.sin_addr.s_addr = htonl( INADDR_ANY );
  292. klients = 0;
  293. }
  294. // Destruktor
  295. SSLServer::~SSLServer()
  296. {
  297. trenne();
  298. SSL_CTX_free( ctx );
  299. passw->release();
  300. #ifdef WIN32
  301. OPENSSL_thread_stop();
  302. #endif
  303. }
  304. // nicht constant
  305. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  306. bool SSLServer::setCertificateFile( const char *file )
  307. {
  308. return SSLErrorCheck( SSL_CTX_use_certificate_file( ctx, file, SSL_FILETYPE_PEM ), "SSL_CTX_use_certificate_file" );
  309. }
  310. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  311. bool SSLServer::setPrivateKeyFile( const char *file )
  312. {
  313. return SSLErrorCheck( SSL_CTX_use_PrivateKey_file( ctx, file, SSL_FILETYPE_PEM ), "SSL_CTX_use_PrivateKey_file" );
  314. }
  315. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen werden)
  316. void SSLServer::setPrivateKeyPassword( const char *password )
  317. {
  318. passw->setText( password );
  319. }
  320. // Öffnet das Socket
  321. bool SSLServer::verbinde( unsigned short port, int warteschlangenLen )
  322. {
  323. addr.sin_port = htons( port );
  324. s = socket( AF_INET, SOCK_STREAM, 0 );
  325. if( s < 0 )
  326. {
  327. s = 0;
  328. return 0;
  329. }
  330. if( bind( s, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 )
  331. {
  332. trenne();
  333. return 0;
  334. }
  335. if( listen( s, warteschlangenLen ) < 0 )
  336. {
  337. trenne();
  338. return 0;
  339. }
  340. return 1;
  341. }
  342. // nimmt Klient an
  343. SSLSKlient *SSLServer::getKlient()
  344. {
  345. if( !s )
  346. return 0;
  347. int len = sizeof( addr );
  348. struct sockaddr_in addr;
  349. #ifdef WIN32
  350. SOCKET client = accept( s, (struct sockaddr *)&addr, &len );
  351. if( client == INVALID_SOCKET )
  352. {
  353. trenne();
  354. return 0;
  355. }
  356. #else
  357. SOCKET client = accept( s, (sockaddr *)&addr, (socklen_t *)&len ); // Klient empfangen
  358. if( !client )
  359. {
  360. if( errno == ECONNABORTED || errno == EBADF )
  361. trenne();
  362. return 0;
  363. }
  364. #endif
  365. addr.sin_port = this->addr.sin_port;
  366. SSL *ssl = SSL_new( ctx );
  367. if( ssl == 0 && !SSLErrorCheck( 0, "SSL_new" ) )
  368. {
  369. closesocket( client );
  370. return 0;
  371. }
  372. if( !SSLErrorCheck( SSL_set_fd( ssl, (int)client ), ssl, "SSL_set_fd" ) )
  373. {
  374. SSL_free( ssl );
  375. closesocket( client );
  376. return 0;
  377. }
  378. if( !SSLErrorCheck( SSL_accept( ssl ), ssl, "SSL_accept" ) )
  379. {
  380. SSL_free( ssl );
  381. closesocket( client );
  382. return 0;
  383. }
  384. klients++;
  385. return new SSLSKlient( addr, ssl, client );
  386. }
  387. // gibt die Anzahl der Klients zurück
  388. int SSLServer::getKlients( bool reset )
  389. {
  390. int ret = klients;
  391. if( reset )
  392. klients = 0;
  393. return ret;
  394. }
  395. // beendet den Server
  396. bool SSLServer::trenne()
  397. {
  398. if( !s )
  399. return 1;
  400. if( closesocket( s ) < 0 ) // socket schließen
  401. return 0;
  402. s = 0;
  403. return 1;
  404. }
  405. // constant
  406. // gibt den Port zurück
  407. unsigned short SSLServer::getPort() const
  408. {
  409. return htons( addr.sin_port );
  410. }
  411. // giebt 1 zurück, falls der Server verbunden ist
  412. bool SSLServer::isConnected() const
  413. {
  414. return s != 0;
  415. }
  416. // Inhalt der SSLSKlient Klasse
  417. // Konstruktor
  418. SSLSKlient::SSLSKlient( sockaddr_in client, SSL *ssl, SOCKET s )
  419. : ReferenceCounter()
  420. {
  421. this->s = s;
  422. clientAddr = client;
  423. this->ssl = ssl;
  424. downStreamBytes = 0;
  425. upStreamBytes = 0;
  426. }
  427. // Destruktor
  428. SSLSKlient::~SSLSKlient()
  429. {
  430. trenne();
  431. #ifdef WIN32
  432. OPENSSL_thread_stop();
  433. #endif
  434. }
  435. // nicht constant
  436. bool SSLSKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  437. {
  438. if( !ssl )
  439. return 0;
  440. int ll = 0;
  441. while( len > 0 )
  442. {
  443. int l = SSL_write( ssl, nachricht + ll, len );
  444. if( l <= 0 )
  445. return 0; // Fehler
  446. len -= l;
  447. ll += l;
  448. }
  449. upStreamBytes += ll;
  450. return 1;
  451. }
  452. bool SSLSKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  453. {
  454. if( !ssl )
  455. return 0;
  456. int ll = 0;
  457. while( len > 0 )
  458. {
  459. int l = (int)SSL_read( ssl, nachricht + ll, len );
  460. if( l <= 0 )
  461. return 0; // Fehler
  462. len -= l;
  463. ll += l;
  464. }
  465. downStreamBytes += ll;
  466. return 1;
  467. }
  468. int SSLSKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  469. {
  470. int ret = downStreamBytes;
  471. if( reset )
  472. downStreamBytes = 0;
  473. return ret;
  474. }
  475. int SSLSKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  476. {
  477. int ret = upStreamBytes;
  478. if( reset )
  479. upStreamBytes = 0;
  480. return ret;
  481. }
  482. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  483. {
  484. if( !ssl )
  485. return 0;
  486. SSL_free( ssl );
  487. if( closesocket( s ) < 0 ) // trennen
  488. return 0;
  489. ssl = 0;
  490. s = 0;
  491. return 1;
  492. }
  493. // constant
  494. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  495. {
  496. return htons( clientAddr.sin_port );
  497. }
  498. const char *SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  499. {
  500. return inet_ntoa( clientAddr.sin_addr );
  501. }