code: func (msg *ReceivedMessage) decryptSymmetric(key []byte) error {
  	// symmetric messages are expected to contain the 12-byte nonce at the end of the payload
  	if len(msg.Raw) < aesNonceLength {
  		return errors.New("missing salt or invalid payload in symmetric message")
  	}
  	salt := msg.Raw[len(msg.Raw)-aesNonceLength:]
  
  	block, err := aes.NewCipher(key)
  	if err != nil {
  		return err
  	}
  	aesgcm, err := cipher.NewGCM(block)
  	if err != nil {
  		return err
  	}
  	decrypted, err := aesgcm.Open(nil, salt, msg.Raw[:len(msg.Raw)-aesNonceLength], nil)
  	if err != nil {
  		return err
  	}
  	msg.Raw = decrypted
  	msg.Salt = salt
  	return nil
  }
docs: // decryptSymmetric decrypts a message with a topic key, using AES-GCM-256.
  // nonce size should be 12 bytes (see cipher.gcmStandardNonceSize).