Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
1#!/usr/bin/python2
2from gevent import monkey
3monkey.patch_all()
4import os
5import time
6import sys
7import socket
8import ssl
9sys.path.append(os.path.abspath("..")) # Imports relative to src dir
10
11import io as StringIO
12import gevent
13
14from gevent.server import StreamServer
15from gevent.pool import Pool
16from Config import config
17config.parse()
18from util import SslPatch
19
20# Server
21socks = []
22data = os.urandom(1024 * 100)
23data += "\n"
24
25
26def handle(sock_raw, addr):
27 socks.append(sock_raw)
28 sock = sock_raw
29 # sock = ctx.wrap_socket(sock, server_side=True)
30 # if sock_raw.recv( 1, gevent.socket.MSG_PEEK ) == "\x16":
31 # sock = gevent.ssl.wrap_socket(sock_raw, server_side=True, keyfile='key-cz.pem',
32 # certfile='cert-cz.pem', ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1)
33 # fp = os.fdopen(sock.fileno(), 'rb', 1024*512)
34 try:
35 while True:
36 line = sock.recv(16 * 1024)
37 if not line:
38 break
39 if line == "bye\n":
40 break
41 elif line == "gotssl\n":
42 sock.sendall("yes\n")
43 sock = gevent.ssl.wrap_socket(
44 sock_raw, server_side=True, keyfile='../../data/key-rsa.pem', certfile='../../data/cert-rsa.pem',
45 ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1
46 )
47 else:
48 sock.sendall(data)
49 except Exception as err:
50 print(err)
51 try:
52 sock.shutdown(gevent.socket.SHUT_WR)
53 sock.close()
54 except:
55 pass
56 socks.remove(sock_raw)
57
58pool = Pool(1000) # do not accept more than 10000 connections
59server = StreamServer(('127.0.0.1', 1234), handle)
60server.start()
61
62
63# Client
64
65
66total_num = 0
67total_bytes = 0
68clipher = None
69ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDH+AES128:ECDHE-RSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:HIGH:" + \
70 "!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK"
71
72# ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
73
74
75def getData():
76 global total_num, total_bytes, clipher
77 data = None
78 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
79 # sock = socket.ssl(s)
80 # sock = ssl.wrap_socket(sock)
81 sock.connect(("127.0.0.1", 1234))
82 # sock.do_handshake()
83 # clipher = sock.cipher()
84 sock.send("gotssl\n")
85 if sock.recv(128) == "yes\n":
86 sock = ssl.wrap_socket(sock, ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1)
87 sock.do_handshake()
88 clipher = sock.cipher()
89
90 for req in range(20):
91 sock.sendall("req\n")
92 buff = StringIO.StringIO()
93 data = sock.recv(16 * 1024)
94 buff.write(data)
95 if not data:
96 break
97 while not data.endswith("\n"):
98 data = sock.recv(16 * 1024)
99 if not data:
100 break
101 buff.write(data)
102 total_num += 1
103 total_bytes += buff.tell()
104 if not data:
105 print("No data")
106
107 sock.shutdown(gevent.socket.SHUT_WR)
108 sock.close()
109
110s = time.time()
111
112
113def info():
114 import psutil
115 import os
116 process = psutil.Process(os.getpid())
117 if "memory_info" in dir(process):
118 memory_info = process.memory_info
119 else:
120 memory_info = process.get_memory_info
121 while 1:
122 print(total_num, "req", (total_bytes / 1024), "kbytes", "transfered in", time.time() - s, end=' ')
123 print("using", clipher, "Mem:", memory_info()[0] / float(2 ** 20))
124 time.sleep(1)
125
126gevent.spawn(info)
127
128for test in range(1):
129 clients = []
130 for i in range(500): # Thread
131 clients.append(gevent.spawn(getData))
132 gevent.joinall(clients)
133
134
135print(total_num, "req", (total_bytes / 1024), "kbytes", "transfered in", time.time() - s)
136
137# Separate client/server process:
138# 10*10*100:
139# Raw: 10000 req 1000009 kbytes transfered in 5.39999985695
140# RSA 2048: 10000 req 1000009 kbytes transfered in 27.7890000343 using ('ECDHE-RSA-AES256-SHA', 'TLSv1/SSLv3', 256)
141# ECC: 10000 req 1000009 kbytes transfered in 26.1959998608 using ('ECDHE-ECDSA-AES256-SHA', 'TLSv1/SSLv3', 256)
142# ECC: 10000 req 1000009 kbytes transfered in 28.2410001755 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 13.3828125
143#
144# 10*100*10:
145# Raw: 10000 req 1000009 kbytes transfered in 7.02700018883 Mem: 14.328125
146# RSA 2048: 10000 req 1000009 kbytes transfered in 44.8860001564 using ('ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 20.078125
147# ECC: 10000 req 1000009 kbytes transfered in 37.9430000782 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 20.0234375
148#
149# 1*100*100:
150# Raw: 10000 req 1000009 kbytes transfered in 4.64400005341 Mem: 14.06640625
151# RSA: 10000 req 1000009 kbytes transfered in 24.2300000191 using ('ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 19.7734375
152# ECC: 10000 req 1000009 kbytes transfered in 22.8849999905 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 17.8125
153# AES128: 10000 req 1000009 kbytes transfered in 21.2839999199 using ('AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.1328125
154# ECC+128: 10000 req 1000009 kbytes transfered in 20.496999979 using ('ECDHE-ECDSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.40234375
155#
156#
157# Single process:
158# 1*100*100
159# RSA: 10000 req 1000009 kbytes transfered in 41.7899999619 using ('ECDHE-RSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 26.91015625
160#
161# 10*10*100
162# RSA: 10000 req 1000009 kbytes transfered in 40.1640000343 using ('ECDHE-RSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.94921875