code: func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
  	if watcher == nil {
  		return nil
  	}
  
  	// The API interface forbids filters doing both symmetric and asymmetric encryption.
  	if watcher.expectsAsymmetricEncryption() && watcher.expectsSymmetricEncryption() {
  		return nil
  	}
  
  	if watcher.expectsAsymmetricEncryption() {
  		msg, _ = e.OpenAsymmetric(watcher.KeyAsym)
  		if msg != nil {
  			msg.Dst = &watcher.KeyAsym.PublicKey
  		}
  	} else if watcher.expectsSymmetricEncryption() {
  		msg, _ = e.OpenSymmetric(watcher.KeySym)
  		if msg != nil {
  			msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)
  		}
  	}
  
  	if msg != nil {
  		ok := msg.ValidateAndParse()
  		if !ok {
  			return nil
  		}
  		msg.Topic = e.Topic
  		msg.PoW = e.PoW()
  		msg.TTL = e.TTL
  		msg.Sent = e.Expiry - e.TTL
  		msg.EnvelopeHash = e.Hash()
  	}
  	return msg
  }
docs: // Open tries to decrypt an envelope, and populates the message fields in case of success.