MCPcopy Create free account
hub / github.com/secdev/scapy / post_build

Method post_build

scapy/layers/tls/handshake_sslv2.py:283–345  ·  view source on GitHub ↗
(self, pkt, pay)

Source from the content-addressed store, hash-verified

281 return s
282
283 def post_build(self, pkt, pay):
284 cs_val = None
285 if self.cipher is None:
286 common_cs = self.tls_session.sslv2_common_cs
287 cs_vals = get_usable_ciphersuites(common_cs, "SSLv2")
288 if len(cs_vals) == 0:
289 warning("No known common cipher suite between SSLv2 Hellos.")
290 cs_val = 0x0700c0
291 cipher = b"\x07\x00\xc0"
292 else:
293 cs_val = cs_vals[0] # XXX choose the best one
294 cipher = struct.pack(">BH", cs_val >> 16, cs_val & 0x00ffff)
295 cs_cls = _tls_cipher_suites_cls[cs_val]
296 self.cipher = cs_val
297 else:
298 cipher = pkt[1:4]
299 cs_val = struct.unpack("!I", b"\x00" + cipher)[0]
300 if cs_val not in _tls_cipher_suites_cls:
301 warning("Unknown cipher suite %d from ClientMasterKey", cs_val)
302 cs_cls = None
303 else:
304 cs_cls = _tls_cipher_suites_cls[cs_val]
305
306 if cs_cls:
307 if (self.encryptedkey == b"" and
308 len(self.tls_session.server_certs) > 0):
309 # else, the user is responsible for export slicing & encryption
310 key = randstring(cs_cls.cipher_alg.key_len)
311
312 if self.clearkey == b"" and cs_cls.kx_alg.export:
313 self.clearkey = key[:-5]
314
315 if self.decryptedkey == b"":
316 if cs_cls.kx_alg.export:
317 self.decryptedkey = key[-5:]
318 else:
319 self.decryptedkey = key
320
321 pubkey = self.tls_session.server_certs[0].pubkey
322 self.encryptedkey = pubkey.encrypt(self.decryptedkey)
323
324 if self.keyarg == b"" and cs_cls.cipher_alg.type == "block":
325 self.keyarg = randstring(cs_cls.cipher_alg.block_size)
326
327 clearkey = self.clearkey or b""
328 if self.clearkeylen is None:
329 self.clearkeylen = len(clearkey)
330 clearkeylen = struct.pack("!H", self.clearkeylen)
331
332 encryptedkey = self.encryptedkey or b""
333 if self.encryptedkeylen is None:
334 self.encryptedkeylen = len(encryptedkey)
335 encryptedkeylen = struct.pack("!H", self.encryptedkeylen)
336
337 keyarg = self.keyarg or b""
338 if self.keyarglen is None:
339 self.keyarglen = len(keyarg)
340 keyarglen = struct.pack("!H", self.keyarglen)

Callers

nothing calls this directly

Calls 4

get_usable_ciphersuitesFunction · 0.90
warningFunction · 0.90
randstringFunction · 0.90
encryptMethod · 0.45

Tested by

no test coverage detected