protected synchronized boolean engineVerify()

in src/com/amazon/corretto/crypto/provider/EvpSignature.java [524:580]


    protected synchronized boolean engineVerify(byte[] sigBytes, int off, int len)
            throws SignatureException {
        ensureInitialized(false);
        byte[] tempSig = maybeConvertSignatureToVerify(sigBytes, off, len);
        final byte[] finalSigBytes;
        final int finalOff;
        final int finalLen;
        if (tempSig != null) {
            finalSigBytes = tempSig;
            finalOff = 0;
            finalLen = finalSigBytes.length;
        } else {
            finalSigBytes = sigBytes;
            finalOff = off;
            finalLen = len;
        }
        try {
            return verifyingBuffer
                .withDoFinal((ignored) -> {
                    final boolean result;
                    if (keyUsageCount_ > KEY_REUSE_THRESHOLD) {
                      result = ctx_.use(c -> verifyFinish(c, finalSigBytes, finalOff, finalLen, true));
                    } else {
                      try {
                        result = verifyFinish(ctx_.take(), finalSigBytes, finalOff, finalLen, false);
                      } finally {
                        ctx_ = null;
                      }
                    }
                    keyUsageCount_++;
                    return result;
                })
                .withSinglePass((src, offset, length) -> {
                  final boolean result;
                  if (ctx_ != null) {
                    result = ctx_.use(c -> verify(keyDer_, new long[]{c}, keyType_.nativeValue,
                            digestName_, paddingType_, null, 0,
                            src, offset, length, finalSigBytes, finalOff, finalLen));
                  } else {
                    final long[] handle = keyUsageCount_ > KEY_REUSE_THRESHOLD ? new long[1] : null;
                    result = verify(keyDer_, handle, keyType_.nativeValue,
                        digestName_, paddingType_, null, 0,
                        src, offset, length, finalSigBytes, finalOff, finalLen);
                    if (handle != null) {
                      ctx_ = new EvpContext(handle[0]);
                    }
                  }
                  keyUsageCount_++;
                  return result;
                })
                .doFinal();
        } finally {
            // Clear the handlers which we don't need anymore.
            verifyingBuffer.withDoFinal(null).withSinglePass(null);
            engineReset();
        }
    }