Server.cpp 12 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(const 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(const 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. }