connector.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import socket
  2. import threading
  3. import os
  4. import config as cfg
  5. from connection.socket import SocketServer
  6. from connection.socket import SocketHTTP
  7. from tls import models
  8. import time
  9. from tls import utils
  10. import tls as t
  11. from types import SimpleNamespace
  12. import subprocess
  13. from Crypto.Util.number import long_to_bytes, bytes_to_long
  14. from Crypto.Cipher import AES
  15. from tls.ghash import GhashCon
  16. from Utils import *
  17. from smartcontract.script import main
  18. import json
  19. import sys
  20. class Connector:
  21. def __init__(self, parser, socket):
  22. self.parser = parser
  23. self.server = None
  24. self.serverDomain = None
  25. self.serverIP = None
  26. self.h = False
  27. self.s = SocketServer(socket, self.parser, "Connector")
  28. self.buffer = []
  29. self.handshaked = False
  30. gBackPrint("CONNECTOR", "")
  31. self.dataLen = 0
  32. self.auth_key = None
  33. self.last_key = None
  34. self.GhashCon = None
  35. self.key = None
  36. self.cipher = b""
  37. stream = os.popen("pwd")
  38. output = stream.read()
  39. self.path = output[:-1]
  40. self.t = threading.Thread(target=self.toCryptor)
  41. self.doneThread = threading.Thread(target=self.done)
  42. self.doneTime = 5
  43. self.t.start()
  44. def done(self):
  45. try:
  46. while(self.doneTime > 0):
  47. time.sleep(1)
  48. self.doneTime = self.doneTime - 1
  49. self.server.close()
  50. d = {}
  51. c = ""
  52. for x in self.buffer:
  53. c = c + x
  54. self.parser.add(d,"cipher",c)
  55. res = self.parser.encrypt(self.key,self.parser.toSTRING(d))
  56. file_path= "./Player-Data/connector.txt"
  57. f = open(file_path, "w")
  58. f.write(res)
  59. f.close()
  60. data_to_user = main(file_path)
  61. self.parser.parserSend(data_to_user,self.parser.user,"connectorDone")
  62. sys.exit()
  63. except Exception as e:
  64. rBackPrint("An exception occurred done", e)
  65. def recv(self, data):
  66. try:
  67. self.buffer.append(data)
  68. if(self.h):
  69. self.doneTime = self.doneTime + 1
  70. except Exception as e:
  71. rBackPrint("An exception occurred recv", e)
  72. def oracleInitial(self, data):
  73. try:
  74. while len(self.s.connected) < 2:
  75. time.sleep(0.5)
  76. if len(self.s.connected) == 2:
  77. self.bearer = self.s.connected[1]
  78. self.cryptor = self.s.connected[0]
  79. self.key = data["key"]
  80. dataLen = data["dataLen"]
  81. if 0 == dataLen % 16:
  82. datalen = dataLen // 16
  83. else:
  84. datalen = (dataLen + (16 - dataLen % 16)) // 16
  85. self.dataLenBase = data["dataLen"]
  86. self.dataLen = datalen
  87. self.serverDomain = data["server"]
  88. self.serverIP = socket.gethostbyname(data["server"])
  89. bPrint("server IP", self.serverIP)
  90. if type(self.serverDomain) == str:
  91. self.serverDomain = [self.serverDomain]
  92. self.server = SocketHTTP(self.serverIP, 443, self)
  93. except Exception as e:
  94. rBackPrint("An exception occurred oracleInitial", e)
  95. def keyExchange(self, data):
  96. try:
  97. while not self.server:
  98. time.sleep(0.1)
  99. self.key_exchange = bytes.fromhex(data["keyExchange"])
  100. self.server.send(bytes.fromhex(self.client_hello()))
  101. except Exception as e:
  102. rBackPrint("An exception occurred keyExchange", e)
  103. def client_hello(self):
  104. try:
  105. print("Done 1")
  106. extensions = [
  107. models.ClientExtension.server_names(self.serverDomain),
  108. models.ClientExtension.supported_versions([b"\x03\x04"]),
  109. models.ClientExtension.key_share(
  110. [models.KeyShareEntry(
  111. models.NamedGroup.x25519, self.key_exchange)]
  112. ),
  113. models.ClientExtension.signature_algorithms(
  114. list(models.SignatureScheme)
  115. ),
  116. models.ClientExtension.supported_groups(
  117. list(models.NamedGroup)),
  118. models.ClientExtension.psk_key_exchange_modes(
  119. list(models.PskKeyExchangeMode)
  120. ),
  121. ]
  122. compatibility_mode = True
  123. handshake = models.Handshake(
  124. models.HandshakeType.client_hello,
  125. models.ClientHello(
  126. ...,
  127. os.urandom(32),
  128. os.urandom(32) if compatibility_mode else b"",
  129. list(models.CipherSuite),
  130. ...,
  131. extensions,
  132. ),
  133. )
  134. self.client_hello_data = handshake.binary
  135. self.handshake_context = bytearray(self.client_hello_data)
  136. self.parser.parserSend(
  137. bytes(self.client_hello_data).hex(),
  138. self.cryptor,
  139. "fromContoCryHelloCLient",
  140. )
  141. data = models.ContentType.handshake.tls_plaintext(
  142. self.client_hello_data)
  143. return bytes.hex(data)
  144. except Exception as e:
  145. rBackPrint("An exception occurred client_hello", e)
  146. def toCryptor(self):
  147. try:
  148. while not self.h:
  149. while self.buffer and self.buffer[0] and len(self.buffer[0]) >= 10:
  150. s = self.buffer[0][6:10]
  151. l = int(s, 16) * 2 + 10
  152. a = self.lenCalc(l)
  153. if not self.handshaked:
  154. self.parser.parserSend(a, self.cryptor, "fromContoCry")
  155. except Exception as e:
  156. rBackPrint("An exception occurred toCryptor", e)
  157. def lenCalc(self, len2):
  158. if self.buffer:
  159. if len(self.buffer[0]) > len2:
  160. a = self.buffer[0][:len2]
  161. self.buffer[0] = self.buffer[0][len2:]
  162. return a
  163. elif len(self.buffer[0]) == len2:
  164. return self.buffer.pop(0)
  165. elif len(self.buffer[0]) < len2:
  166. if self.buffer[1]:
  167. self.buffer[0] = self.buffer[0] + self.buffer[1]
  168. self.buffer.pop(1)
  169. return self.lenCalc(len2)
  170. else:
  171. self.lenCalc(len2)
  172. else:
  173. self.lenCalc(len2)
  174. def MPC(self):
  175. try:
  176. for i in range(self.dataLen * 4):
  177. print("send req to others")
  178. self.parser.parserSend(str(i), self.cryptor, "MPC")
  179. self.parser.parserSend(str(i), self.bearer, "MPC")
  180. s = [
  181. self.path + "/MP-SPDZ/mascot-party.x",
  182. "0",
  183. "xor",
  184. "-pn",
  185. "12023",
  186. "-h",
  187. "192.168.178.105",
  188. "-N",
  189. "3",
  190. ]
  191. proc = subprocess.Popen(s, stdout=subprocess.PIPE)
  192. d = proc.stdout.readline()
  193. self.cipher = self.cipher + long_to_bytes(d, 4)
  194. self.cipher = self.cipher[: self.dataLenBase]
  195. head = b"\x17\x03\x03" + (self.dataLenBase + 16).to_bytes(2, "big")
  196. tag = self.GhashCon.ghash(head, self.cipher)
  197. tag = long_to_bytes(tag)
  198. bPrint("Tag", tag)
  199. Message = head + self.cipher + tag
  200. return Message
  201. except Exception as e:
  202. rBackPrint("An exception occurred MPC", e)
  203. def fromCrytoCon(self, data):
  204. try:
  205. self.server.send(bytes.fromhex(data["data"]))
  206. except Exception as e:
  207. rBackPrint("An exception occurred fromCrytoCon", e)
  208. def fromCrytoConDone(self, data):
  209. try:
  210. time.sleep(2)
  211. self.auth_key = data["auth_key"]
  212. self.last_key = data["last_key"]
  213. self.change = data["change"]
  214. self.finish = data["finish"]
  215. self.h = True
  216. gPrint("auth_key", self.auth_key)
  217. gPrint("last_key ", self.last_key)
  218. self.GhashCon = GhashCon(self.auth_key, self.last_key)
  219. m = self.MPC()
  220. self.server.send(bytes.fromhex(data["change"]))
  221. self.server.send(bytes.fromhex(data["finish"]))
  222. time.sleep(1)
  223. self.server.send((m))
  224. self.doneThread.start()
  225. except Exception as e:
  226. rBackPrint("An exception occurred fromCrytoConDone", e)