connector.py 7.9 KB

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