code: func (ks *Pss) processAsym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) {
  	metrics.GetOrRegisterCounter("pss.process.asym", nil).Inc(1)
  
  	recvmsg, err := envelope.OpenAsymmetric(ks.privateKey)
  	if err != nil {
  		return nil, "", nil, fmt.Errorf("could not decrypt message: %s", err)
  	}
  	// check signature (if signed), strip padding
  	if !recvmsg.ValidateAndParse() {
  		return nil, "", nil, errors.New("invalid message")
  	}
  	pubkeyid := common.ToHex(crypto.FromECDSAPub(recvmsg.Src))
  	var from PssAddress
  	ks.mx.RLock()
  	if ks.pubKeyPool[pubkeyid][Topic(envelope.Topic)] != nil {
  		from = ks.pubKeyPool[pubkeyid][Topic(envelope.Topic)].address
  	}
  	ks.mx.RUnlock()
  	return recvmsg, pubkeyid, from, nil
  }
docs: // Attempt to decrypt, validate and unpack an asymmetrically encrypted message.
  // If successful, returns the unpacked whisper ReceivedMessage struct
  // encapsulating the decrypted message, and the byte representation of
  // the public key used to decrypt the message.
  // It fails if decryption of message fails, or if the message is corrupted.