code: func (m *Memberlist) decryptRemoteState(bufConn io.Reader) ([]byte, error) {
  	// Read in enough to determine message length
  	cipherText := bytes.NewBuffer(nil)
  	cipherText.WriteByte(byte(encryptMsg))
  	_, err := io.CopyN(cipherText, bufConn, 4)
  	if err != nil {
  		return nil, err
  	}
  
  	// Ensure we aren't asked to download too much. This is to guard against
  	// an attack vector where a huge amount of state is sent
  	moreBytes := binary.BigEndian.Uint32(cipherText.Bytes()[1:5])
  	if moreBytes > maxPushStateBytes {
  		return nil, fmt.Errorf("Remote node state is larger than limit (%d)", moreBytes)
  	}
  
  	// Read in the rest of the payload
  	_, err = io.CopyN(cipherText, bufConn, int64(moreBytes))
  	if err != nil {
  		return nil, err
  	}
  
  	// Decrypt the cipherText
  	dataBytes := cipherText.Bytes()[:5]
  	cipherBytes := cipherText.Bytes()[5:]
  
  	// Decrypt the payload
  	keys := m.config.Keyring.GetKeys()
  	return decryptPayload(keys, cipherBytes, dataBytes)
  }
docs: // decryptRemoteState is used to help decrypt the remote state