Server.cpp 14 KB

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