Server.cpp 12 KB

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