Server.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  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( __int64 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. bool SKlient::waitForNextMessage() const // wartet bis es etwas zu empfangen gibt
  306. {
  307. char c;
  308. int l = (int)recv( sock, &c, 1, (empfangTimeout ? 0 : MSG_WAITALL) | MSG_PEEK );
  309. if( l <= 0 )
  310. return 0; // Fehler
  311. return 1;
  312. }
  313. // Inhalt der SSLServer Klasse
  314. // Konstruktor
  315. SSLServer::SSLServer()
  316. : ReferenceCounter()
  317. {
  318. s = 0;
  319. const SSL_METHOD* method = TLS_server_method();
  320. ctx = SSL_CTX_new( method );
  321. SSLErrorCheck( SSL_CTX_set_min_proto_version( ctx, TLS1_2_VERSION ), "SSL_CTX_set_min_proto_version" );
  322. SSLErrorCheck( SSL_CTX_set_max_proto_version( ctx, TLS1_3_VERSION ), "SSL_CTX_set_max_proto_version" );
  323. SSL_CTX_set_verify( ctx, SSL_VERIFY_NONE, 0 );
  324. SSL_CTX_set_default_passwd_cb( ctx, pem_passwd_cb );
  325. passw = new Text();
  326. SSL_CTX_set_default_passwd_cb_userdata( ctx, passw );
  327. addr.sin_family = AF_INET;
  328. addr.sin_addr.s_addr = htonl( INADDR_ANY );
  329. klients = 0;
  330. }
  331. // Destruktor
  332. SSLServer::~SSLServer()
  333. {
  334. trenne();
  335. SSL_CTX_free( ctx );
  336. passw->release();
  337. #ifdef WIN32
  338. OPENSSL_thread_stop();
  339. #endif
  340. }
  341. // nicht constant
  342. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  343. bool SSLServer::setCertificateFile( const char* file )
  344. {
  345. return SSLErrorCheck( SSL_CTX_use_certificate_file( ctx, file, SSL_FILETYPE_PEM ), "SSL_CTX_use_certificate_file" );
  346. }
  347. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  348. bool SSLServer::setPrivateKeyFile( const char* file )
  349. {
  350. return SSLErrorCheck( SSL_CTX_use_PrivateKey_file( ctx, file, SSL_FILETYPE_PEM ), "SSL_CTX_use_PrivateKey_file" );
  351. }
  352. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen werden)
  353. void SSLServer::setPrivateKeyPassword( const char* password )
  354. {
  355. passw->setText( password );
  356. }
  357. // Öffnet das Socket
  358. bool SSLServer::verbinde( unsigned short port, int warteschlangenLen )
  359. {
  360. addr.sin_port = htons( port );
  361. s = socket( AF_INET, SOCK_STREAM, 0 );
  362. if( s < 0 )
  363. {
  364. s = 0;
  365. return 0;
  366. }
  367. if( bind( s, (struct sockaddr*)&addr, sizeof( addr ) ) < 0 )
  368. {
  369. trenne();
  370. return 0;
  371. }
  372. if( listen( s, warteschlangenLen ) < 0 )
  373. {
  374. trenne();
  375. return 0;
  376. }
  377. return 1;
  378. }
  379. // nimmt Klient an
  380. SSLSKlient* SSLServer::getKlient()
  381. {
  382. if( !s )
  383. return 0;
  384. int len = sizeof( addr );
  385. struct sockaddr_in addr;
  386. #ifdef WIN32
  387. SOCKET client = accept( s, (struct sockaddr*)&addr, &len );
  388. if( client == INVALID_SOCKET )
  389. {
  390. trenne();
  391. return 0;
  392. }
  393. #else
  394. SOCKET client = accept( s, (sockaddr*)&addr, (socklen_t*)&len ); // Klient empfangen
  395. if( !client )
  396. {
  397. if( errno == ECONNABORTED || errno == EBADF )
  398. trenne();
  399. return 0;
  400. }
  401. #endif
  402. addr.sin_port = this->addr.sin_port;
  403. SSL* ssl = SSL_new( ctx );
  404. if( ssl == 0 && !SSLErrorCheck( 0, "SSL_new" ) )
  405. {
  406. closesocket( client );
  407. return 0;
  408. }
  409. if( !SSLErrorCheck( SSL_set_fd( ssl, (int)client ), ssl, "SSL_set_fd" ) )
  410. {
  411. SSL_free( ssl );
  412. closesocket( client );
  413. return 0;
  414. }
  415. if( !SSLErrorCheck( SSL_accept( ssl ), ssl, "SSL_accept" ) )
  416. {
  417. SSL_free( ssl );
  418. closesocket( client );
  419. return 0;
  420. }
  421. klients++;
  422. return new SSLSKlient( addr, ssl, client );
  423. }
  424. // gibt die Anzahl der Klients zurück
  425. int SSLServer::getKlients( bool reset )
  426. {
  427. int ret = klients;
  428. if( reset )
  429. klients = 0;
  430. return ret;
  431. }
  432. // beendet den Server
  433. bool SSLServer::trenne()
  434. {
  435. if( !s )
  436. return 1;
  437. if( closesocket( s ) < 0 ) // socket schließen
  438. return 0;
  439. s = 0;
  440. return 1;
  441. }
  442. // constant
  443. // gibt den Port zurück
  444. unsigned short SSLServer::getPort() const
  445. {
  446. return htons( addr.sin_port );
  447. }
  448. // giebt 1 zurück, falls der Server verbunden ist
  449. bool SSLServer::isConnected() const
  450. {
  451. return s != 0;
  452. }
  453. // Inhalt der SSLSKlient Klasse
  454. // Konstruktor
  455. SSLSKlient::SSLSKlient( sockaddr_in client, SSL* ssl, SOCKET s )
  456. : ReferenceCounter()
  457. {
  458. this->s = s;
  459. clientAddr = client;
  460. this->ssl = ssl;
  461. downStreamBytes = 0;
  462. upStreamBytes = 0;
  463. empfangTimeout = 0;
  464. }
  465. // Destruktor
  466. SSLSKlient::~SSLSKlient()
  467. {
  468. trenne();
  469. #ifdef WIN32
  470. OPENSSL_thread_stop();
  471. #endif
  472. }
  473. // nicht constant
  474. void SSLSKlient::setEmpfangTimeout( int miliseconds ) // Setzt ein timeout fürs empfangen von daten
  475. {
  476. empfangTimeout = miliseconds;
  477. if( empfangTimeout )
  478. {
  479. #ifdef WIN32
  480. DWORD timeout = miliseconds;
  481. setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout );
  482. #else
  483. struct timeval tv;
  484. tv.tv_sec = miliseconds / 1000;
  485. tv.tv_usec = (miliseconds % 1000) * 1000;
  486. setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv );
  487. #endif
  488. }
  489. }
  490. bool SSLSKlient::sende( const char* nachricht, int len ) // sendet zum Klient
  491. {
  492. if( !ssl )
  493. return 0;
  494. int ll = 0;
  495. while( len > 0 )
  496. {
  497. int l = SSL_write( ssl, nachricht + ll, len );
  498. if( l <= 0 )
  499. return 0; // Fehler
  500. len -= l;
  501. ll += l;
  502. }
  503. upStreamBytes += ll;
  504. return 1;
  505. }
  506. bool SSLSKlient::getNachricht( char* nachricht, int len ) // empfängt Nachricht von Klient
  507. {
  508. if( !ssl )
  509. return 0;
  510. int ll = 0;
  511. while( len > 0 )
  512. {
  513. int l = (int)SSL_read( ssl, nachricht + ll, len );
  514. if( l <= 0 )
  515. return 0; // Fehler
  516. len -= l;
  517. ll += l;
  518. }
  519. downStreamBytes += ll;
  520. return 1;
  521. }
  522. int SSLSKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  523. {
  524. int ret = downStreamBytes;
  525. if( reset )
  526. downStreamBytes = 0;
  527. return ret;
  528. }
  529. int SSLSKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  530. {
  531. int ret = upStreamBytes;
  532. if( reset )
  533. upStreamBytes = 0;
  534. return ret;
  535. }
  536. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  537. {
  538. if( !ssl )
  539. return 0;
  540. SSL_free( ssl );
  541. if( closesocket( s ) < 0 ) // trennen
  542. return 0;
  543. ssl = 0;
  544. s = 0;
  545. return 1;
  546. }
  547. // constant
  548. bool SSLSKlient::hatNachricht( int zeit ) const // Wartet eine Zeit Lang auf eine Nachricht
  549. {
  550. fd_set set;
  551. FD_ZERO( &set );
  552. FD_SET( SSL_get_rfd( ssl ), &set );
  553. timeval time = { zeit / 1000, zeit };
  554. return SSL_pending( ssl ) > 0 || select( 0, &set, 0, 0, &time ) == 1;
  555. }
  556. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  557. {
  558. return htons( clientAddr.sin_port );
  559. }
  560. const char* SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  561. {
  562. return inet_ntoa( clientAddr.sin_addr );
  563. }