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