diff --git a/scapy/layers/tls/handshake.py b/scapy/layers/tls/handshake.py index 990c69c68b3afde3e4779a5308f623a8f86deb12..db3bcfeb8e4ebc70eec429bc3618c65ff0a0326e 100644 --- a/scapy/layers/tls/handshake.py +++ b/scapy/layers/tls/handshake.py @@ -37,8 +37,7 @@ from scapy.layers.tls.crypto.compression import (_tls_compression_algs, from scapy.layers.tls.crypto.suites import (_tls_cipher_suites, _tls_cipher_suites_cls, _GenericCipherSuite, - _GenericCipherSuiteMetaclass, - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) + _GenericCipherSuiteMetaclass) ############################################################################### @@ -156,6 +155,8 @@ class _CipherSuitesField(StrLenField): return self.i2s.get(x, fmt % x) def any2i(self, pkt, x): + if x is None: + return None if not isinstance(x, list): x = [x] return [self.any2i_one(pkt, z) for z in x] @@ -184,6 +185,8 @@ class _CipherSuitesField(StrLenField): return res def i2len(self, pkt, i): + if i is None: + return 0 return len(i)*self.itemsize @@ -227,8 +230,7 @@ class TLSClientHello(_TLSHandshake): FieldLenField("cipherslen", None, fmt="!H", length_of="ciphers"), - _CipherSuitesField("ciphers", - [TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256], + _CipherSuitesField("ciphers", None, _tls_cipher_suites, itemfmt="!H", length_from=lambda pkt: pkt.cipherslen), @@ -250,6 +252,21 @@ class TLSClientHello(_TLSHandshake): def post_build(self, p, pay): if self.random_bytes is None: p = p[:10] + randstring(28) + p[10+28:] + + # if no ciphersuites were provided, we add a few usual, supported + # ciphersuites along with the appropriate extensions + if self.ciphers is None: + cipherstart = 39 + (self.sidlen or 0) + s = b"001ac02bc023c02fc027009e0067009c003cc009c0130033002f000a" + p = p[:cipherstart] + bytes.decode(s, 'hex') + p[cipherstart+2:] + if self.ext is None: + ext_len = b'\x00\x2c' + ext_reneg = b'\xff\x01\x00\x01\x00' + ext_sn = b'\x00\x00\x00\x0f\x00\r\x00\x00\nsecdev.org' + ext_sigalg = b'\x00\r\x00\x08\x00\x06\x04\x03\x04\x01\x02\x01' + ext_supgroups = b'\x00\n\x00\x04\x00\x02\x00\x17' + p += ext_len + ext_reneg + ext_sn + ext_sigalg + ext_supgroups + return super(TLSClientHello, self).post_build(p, pay) def tls_session_update(self, msg_str): @@ -320,6 +337,11 @@ class TLSServerHello(TLSClientHello): return TLS13ServerHello return TLSServerHello + def post_build(self, p, pay): + if self.random_bytes is None: + p = p[:10] + randstring(28) + p[10+28:] + return super(TLSClientHello, self).post_build(p, pay) + def tls_session_update(self, msg_str): """ Either for parsing or building, we store the server_random