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