Server.cpp 11 KB

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