def test_no_extensions(self): c = tls.ClientHello(CLIENT_HELLO_NO_EXTENSIONS) assert repr(c) assert c.sni is None assert c.cipher_suites == [53, 47, 10, 5, 4, 9, 3, 6, 8, 96, 97, 98, 100] assert c.alpn_protocols == [] assert c.extensions == []
def test_extensions(self): data = bytes.fromhex( "03033b70638d2523e1cba15f8364868295305e9c52aceabda4b5147210abc783e6e1000022c02bc02fc02cc030" "cca9cca8cc14cc13c009c013c00ac014009c009d002f0035000a0100006cff0100010000000010000e00000b65" "78616d706c652e636f6d0017000000230000000d00120010060106030501050304010403020102030005000501" "00000000001200000010000e000c02683208687474702f312e3175500000000b00020100000a00080006001d00" "170018" ) c = tls.ClientHello(data) assert repr(c) assert c.sni == 'example.com' assert c.cipher_suites == [ 49195, 49199, 49196, 49200, 52393, 52392, 52244, 52243, 49161, 49171, 49162, 49172, 156, 157, 47, 53, 10 ] assert c.alpn_protocols == [b'h2', b'http/1.1'] assert c.extensions == [ (65281, b'\x00'), (0, b'\x00\x0e\x00\x00\x0bexample.com'), (23, b''), (35, b''), (13, b'\x00\x10\x06\x01\x06\x03\x05\x01\x05\x03\x04\x01\x04\x03\x02\x01\x02\x03'), (5, b'\x01\x00\x00\x00\x00'), (18, b''), (16, b'\x00\x0c\x02h2\x08http/1.1'), (30032, b''), (11, b'\x01\x00'), (10, b'\x00\x06\x00\x1d\x00\x17\x00\x18') ]
def parse_client_hello(data: bytes) -> Optional[net_tls.ClientHello]: """ Check if the supplied bytes contain a full ClientHello message, and if so, parse it. Returns: - A ClientHello object on success - None, if the TLS record is not complete Raises: - A ValueError, if the passed ClientHello is invalid """ # Check if ClientHello is complete client_hello = get_client_hello(data) if client_hello: try: return net_tls.ClientHello(client_hello[4:]) except EOFError as e: raise ValueError("Invalid ClientHello") from e return None