docs: public byte[] decrypt(byte[] cipherData) throws SignatureException {
      checkArgument(cipherData.length >= OVERHEAD_SIZE,
          "Invalid cipherData, %s bytes", cipherData.length);
  
      // workBytes := initVector || E(payload) || I(signature)
      byte[] workBytes = cipherData.clone();
      ByteBuffer workBuffer = ByteBuffer.wrap(workBytes);
      boolean success = false;
  
      try {
        // workBytes := initVector || payload || I(signature)
        xorPayloadToHmacPad(workBytes);
        // workBytes := initVector || payload || I'(signature)
        int confirmationSignature = hmacSignature(workBytes);
        int integritySignature = workBuffer.getInt(workBytes.length - SIGNATURE_SIZE);
        workBuffer.putInt(workBytes.length - SIGNATURE_SIZE, confirmationSignature);
  
        if (confirmationSignature != integritySignature) {
          throw new SignatureException("Signature mismatch: "
              + Integer.toHexString(confirmationSignature)
              + " vs " + Integer.toHexString(integritySignature));
        }
  
        if (logger.isDebugEnabled()) {
          logger.debug(dump("Decrypted", cipherData, workBytes));
        }
  
        success = true;
        return workBytes;
      } finally {
        if (!success && logger.isDebugEnabled()) {
          logger.debug(dump("Decrypted (failed)", cipherData, workBytes));
        }
      }
    }