diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 6adba3022f..c4d1e70883 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1927,4 +1927,29 @@ public class Util { private static PathRemover newPathRemover(@NonNull PathRemover.PathChecker pathChecker) { return PathRemover.newFilteredRobustRemover(pathChecker, DELETION_RETRIES, GC_AFTER_FAILED_DELETE, WAIT_BETWEEN_DELETION_RETRIES); } + + /** + * Returns SHA-256 Digest of input bytes + */ + @Restricted(NoExternalUse.class) + public static byte[] getSHA256DigestOf(@NonNull byte[] input) { + try { + MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); + messageDigest.update(input); + return messageDigest.digest(); + } catch (NoSuchAlgorithmException noSuchAlgorithmException) { + throw new IllegalStateException("SHA-256 could not be instantiated, but is required to" + + " be implemented by the language specification", noSuchAlgorithmException); + } + } + + /** + * Returns Hex string of SHA-256 Digest of passed input + */ + @Restricted(NoExternalUse.class) + public static String getHexOfSHA256DigestOf(byte[] input) throws IOException { + //get hex string of sha 256 of payload + byte[] payloadDigest = Util.getSHA256DigestOf(input); + return (payloadDigest != null) ? Util.toHexString(payloadDigest) : null; + } } diff --git a/core/src/main/java/jenkins/security/ConfidentialStore.java b/core/src/main/java/jenkins/security/ConfidentialStore.java index 61b279a4a4..10082c9318 100644 --- a/core/src/main/java/jenkins/security/ConfidentialStore.java +++ b/core/src/main/java/jenkins/security/ConfidentialStore.java @@ -122,14 +122,16 @@ public abstract class ConfidentialStore { @Override protected void store(ConfidentialKey key, byte[] payload) throws IOException { - LOGGER.fine(() -> "storing " + key.getId() + " " + Util.getDigestOf(Util.toHexString(payload))); + //called only from tests, get hex string of sha 256 for logging payload + LOGGER.fine("storing " + key.getId() + " " + Util.getHexOfSHA256DigestOf(payload)); data.put(key.getId(), payload); } @Override protected byte[] load(ConfidentialKey key) throws IOException { byte[] payload = data.get(key.getId()); - LOGGER.fine(() -> "loading " + key.getId() + " " + (payload != null ? Util.getDigestOf(Util.toHexString(payload)) : "null")); + //called only from tests, get hex string of sha 256 for logging payload + LOGGER.fine("loading " + key.getId() + " " + (payload != null ? Util.getHexOfSHA256DigestOf(payload) : "null")); return payload; } diff --git a/core/src/test/java/hudson/UtilTest.java b/core/src/test/java/hudson/UtilTest.java index d4ecd94f1a..3fd34ff5c2 100644 --- a/core/src/test/java/hudson/UtilTest.java +++ b/core/src/test/java/hudson/UtilTest.java @@ -28,6 +28,7 @@ package hudson; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -726,6 +727,24 @@ public class UtilTest { assertEquals("The class " + DerivedClassFailure.class.getName() + " must override at least one of the BaseClass.method methods", error.getMessage()); } + @Test + public void testGetHexOfSHA256DigestOf() throws IOException { + byte[] input = new byte[] {12, 34, 16}; + String str = Util.getHexOfSHA256DigestOf(input); + assertEquals(str, "134fefbd329986726407a5208107ef07c9e33da779f5068bff191733268fe997"); + } + + @Test + public void testGetSHA256DigestOf() { + byte[] input = new byte[] {12, 34, 16}; + byte[] sha256DigestActual = Util.getSHA256DigestOf(input); + + byte[] expected = new byte[] + { 19, 79, -17, -67, 50, -103, -122, 114, 100, 7, -91, 32, -127, 7, -17, 7, -55, -29, 61, -89, 121, -11, + 6, -117, -1, 25, 23, 51, 38, -113, -23, -105}; + assertArrayEquals(expected, sha256DigestActual); + } + public static class BaseClass { protected String method() { return "base";