code: def deserialize_header(stream):
      # type: (IO) -> MessageHeader
      
      _LOGGER.debug("Starting header deserialization")
      tee = io.BytesIO()
      tee_stream = TeeStream(stream, tee)
      version_id, message_type_id = unpack_values(">BB", tee_stream)
      header = dict()
      header["version"] = _verified_version_from_id(version_id)
      header["type"] = _verified_message_type_from_id(message_type_id)
  
      algorithm_id, message_id, ser_encryption_context_length = unpack_values(">H16sH", tee_stream)
  
      header["algorithm"] = _verified_algorithm_from_id(algorithm_id)
      header["message_id"] = message_id
  
      header["encryption_context"] = deserialize_encryption_context(tee_stream.read(ser_encryption_context_length))
  
      header["encrypted_data_keys"] = _deserialize_encrypted_data_keys(tee_stream)
  
      (content_type_id,) = unpack_values(">B", tee_stream)
      header["content_type"] = _verified_content_type_from_id(content_type_id)
  
      (content_aad_length,) = unpack_values(">I", tee_stream)
      header["content_aad_length"] = _verified_content_aad_length(content_aad_length)
  
      (iv_length,) = unpack_values(">B", tee_stream)
      header["header_iv_length"] = _verified_iv_length(iv_length, header["algorithm"])
  
      (frame_length,) = unpack_values(">I", tee_stream)
      header["frame_length"] = _verified_frame_length(frame_length, header["content_type"])
  
      return MessageHeader(**header), tee.getvalue()
docs: Deserializes the header from a source stream
  
      :param stream: Source data stream
      :type stream: io.BytesIO
      :returns: Deserialized MessageHeader object
      :rtype: :class:`aws_encryption_sdk.structures.MessageHeader` and bytes
      :raises NotSupportedError: if unsupported data types are found
      :raises UnknownIdentityError: if unknown data types are found
      :raises SerializationError: if IV length does not match algorithm