/** * Constant time comparison to prevent against timing attacks. * @param expected * @param actual * @return */ static boolean equals(String expected, String actual) { byte[] expectedBytes = bytesUtf8(expected); byte[] actualBytes = bytesUtf8(actual); int expectedLength = expectedBytes == null ? -1 : expectedBytes.length; int actualLength = actualBytes == null ? -1 : actualBytes.length; int result = expectedLength == actualLength ? 0 : 1; for (int i = 0; i < actualLength; i++) { byte expectedByte = expectedLength <= 0 ? 0 : expectedBytes[i % expectedLength]; byte actualByte = actualBytes[i % actualLength]; result |= expectedByte ^ actualByte; } return result == 0; }
/** * Constant time comparison to prevent against timing attacks. * @param expected * @param actual * @return */ static boolean equals(String expected, String actual) { byte[] expectedBytes = bytesUtf8(expected); byte[] actualBytes = bytesUtf8(actual); int expectedLength = expectedBytes == null ? -1 : expectedBytes.length; int actualLength = actualBytes == null ? -1 : actualBytes.length; int result = expectedLength == actualLength ? 0 : 1; for (int i = 0; i < actualLength; i++) { byte expectedByte = expectedLength <= 0 ? 0 : expectedBytes[i % expectedLength]; byte actualByte = actualBytes[i % actualLength]; result |= expectedByte ^ actualByte; } return result == 0; }
/** * Constant time comparison to prevent against timing attacks. * @param expected * @param actual * @return */ static boolean equals(String expected, String actual) { byte[] expectedBytes = bytesUtf8(expected); byte[] actualBytes = bytesUtf8(actual); int expectedLength = expectedBytes == null ? -1 : expectedBytes.length; int actualLength = actualBytes == null ? -1 : actualBytes.length; int result = expectedLength == actualLength ? 0 : 1; for (int i = 0; i < actualLength; i++) { byte expectedByte = expectedLength <= 0 ? 0 : expectedBytes[i % expectedLength]; byte actualByte = actualBytes[i % actualLength]; result |= expectedByte ^ actualByte; } return result == 0; }
/** * Constant time comparison to prevent against timing attacks. * @param expected * @param actual * @return */ static boolean equals(String expected, String actual) { byte[] expectedBytes = bytesUtf8(expected); byte[] actualBytes = bytesUtf8(actual); int expectedLength = expectedBytes == null ? -1 : expectedBytes.length; int actualLength = actualBytes == null ? -1 : actualBytes.length; int result = expectedLength == actualLength ? 0 : 1; for (int i = 0; i < actualLength; i++) { byte expectedByte = expectedLength <= 0 ? 0 : expectedBytes[i % expectedLength]; byte actualByte = actualBytes[i % actualLength]; result |= expectedByte ^ actualByte; } return result == 0; }
/** * Constant time comparison to prevent against timing attacks. * @param expected * @param actual * @return */ static boolean equals(String expected, String actual) { byte[] expectedBytes = bytesUtf8(expected); byte[] actualBytes = bytesUtf8(actual); int expectedLength = expectedBytes == null ? -1 : expectedBytes.length; int actualLength = actualBytes == null ? -1 : actualBytes.length; int result = expectedLength == actualLength ? 0 : 1; for (int i = 0; i < actualLength; i++) { byte expectedByte = expectedLength <= 0 ? 0 : expectedBytes[i % expectedLength]; byte actualByte = actualBytes[i % actualLength]; result |= expectedByte ^ actualByte; } return result == 0; }