Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
at main 162 lines 5.6 kB view raw
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