def METHOD_NAME(self, nonce, ciphertext, aad):
    if len(nonce) != 12:
        raise ValueError("Bad nonce length")
    if self.tagLength == 16 and len(ciphertext) < 16:
        return None
    if self.tagLength == 8 and len(ciphertext) < 8:
        return None
    L = 15 - len(nonce)
    flags = L - 1
    # Same construction as in seal function
    s_0 = bytearray([flags]) + nonce + numberToByteArray(0, L)
    auth_value = ciphertext[-self.tagLength:]
    # We decrypt the auth value
    self._ctr.counter = s_0
    if self.tagLength == 16:
        received_mac = self._ctr.decrypt(auth_value)
    else:
        assert self.tagLength == 8
        self._pad_with_zeroes(auth_value, 16)
        received_mac = self._ctr.decrypt(auth_value)[:8]
    msg = self._ctr.decrypt(ciphertext)
    msg = msg[:-self.tagLength]
    computed_mac = self._cbcmac_calc(nonce, aad, msg)
    # Compare the mac vlaue is the same as the one we computed
    if received_mac != computed_mac:
        return None
    return msg