def from_stream(body): # Parse the TLS Record content_type, version_major, version_minor, length = ( struct.unpack_from("!BBBH", body, 0)) fragment = body[5:5 + length] # Sanity check if length != len(fragment): raise ValueError("Not enough data in fragment") # Check this is a Handshake message type = TlsRecord.type_map.get(content_type, OpaqueFragment) objs = [] if fragment == "": obj, size = type.from_stream(fragment) objs.append(obj) while fragment != "": obj, size = type.from_stream(fragment) objs.append(obj) fragment = fragment[size:] return TlsRecord(content_type, Version(version_major, version_minor), objs), 5 + length