docs: def auth_decrypt(self, A, C, seq_num):
          """
          Decrypt the data and verify the authentication code (in this order).
          Note that TLS 1.3 is not supposed to use any additional data A.
          If the verification fails, an AEADTagError is raised. It is the user's
          responsibility to catch it if deemed useful. If we lack the key, we
          raise a CipherError which contains the encrypted input.
          """
          C, mac = C[:-self.tag_len], C[-self.tag_len:]
          if False in six.itervalues(self.ready):
              raise CipherError(C, mac)
  
          if hasattr(self, "pc_cls"):
              self._cipher.mode._initialization_vector = self._get_nonce(seq_num)
              self._cipher.mode._tag = mac
              decryptor = self._cipher.decryptor()
              decryptor.authenticate_additional_data(A)
              P = decryptor.update(C)
              try:
                  decryptor.finalize()
              except InvalidTag:
                  raise AEADTagError(P, mac)
          else:
              try:
                  if (conf.crypto_valid_advanced and
                          isinstance(self._cipher, AESCCM)):
                      P = self._cipher.decrypt(self._get_nonce(seq_num), C + mac, A,  # noqa: E501
                                               tag_length=self.tag_len)
                  else:
                      if (conf.crypto_valid_advanced and
                              isinstance(self, Cipher_CHACHA20_POLY1305)):
                          A += struct.pack("!H", len(C))
                      P = self._cipher.decrypt(self._get_nonce(seq_num), C + mac, A)  # noqa: E501
              except InvalidTag:
                  raise AEADTagError("<unauthenticated data>", mac)
          return P, mac