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();
}
}