code: func (p *Protocol) Handle(msg []byte, peer *p2p.Peer, asymmetric bool, keyid string) error {
  	var vrw *PssReadWriter
  	if p.Asymmetric != asymmetric && p.Symmetric == !asymmetric {
  		return fmt.Errorf("invalid protocol encryption")
  	} else if (!p.isActiveSymKey(keyid, *p.topic) && !asymmetric) ||
  		(!p.isActiveAsymKey(keyid, *p.topic) && asymmetric) {
  
  		rw, err := p.AddPeer(peer, *p.topic, asymmetric, keyid)
  		if err != nil {
  			return err
  		} else if rw == nil {
  			return fmt.Errorf("handle called on nil MsgReadWriter for new key " + keyid)
  		}
  		vrw = rw.(*PssReadWriter)
  	}
  
  	pmsg, err := ToP2pMsg(msg)
  	if err != nil {
  		return fmt.Errorf("could not decode pssmsg")
  	}
  	if asymmetric {
  		if p.pubKeyRWPool[keyid] == nil {
  			return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid)
  		}
  		vrw = p.pubKeyRWPool[keyid].(*PssReadWriter)
  	} else {
  		if p.symKeyRWPool[keyid] == nil {
  			return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid)
  		}
  		vrw = p.symKeyRWPool[keyid].(*PssReadWriter)
  	}
  	vrw.injectMsg(pmsg)
  	return nil
  }
docs: // Generic handler for incoming messages over devp2p emulation
  //
  // To be passed to pss.Register()
  //
  // Will run the protocol on a new incoming peer, provided that
  // the encryption key of the message has a match in the internal
  // pss keypool
  //
  // Fails if protocol is not valid for the message encryption scheme,
  // if adding a new peer fails, or if the message is not a serialized
  // p2p.Msg (which it always will be if it is sent from this object).