(self, pkt, pay)
| 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) |
nothing calls this directly
no test coverage detected