From 53df67d4908152b6edaa7a1643d7f24598360e78 Mon Sep 17 00:00:00 2001 From: Michael Schierl Date: Thu, 7 Sep 2017 22:01:31 +0200 Subject: [PATCH] More arraycopy improvements In fact, most arraycopy and copyOfRange calls in the class are unneeded, since Kerl can also directly operate on array slices. Care has been taken not to introduce new side effects, therefore one copyOfRange call in `digests` needs to stay. Existing side effects are kept, although probably undesirable (`signatureFragment` clobbers the `keyFragment` input parameter). --- src/main/java/jota/utils/Signing.java | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/main/java/jota/utils/Signing.java b/src/main/java/jota/utils/Signing.java index 9119f3f..e03543c 100644 --- a/src/main/java/jota/utils/Signing.java +++ b/src/main/java/jota/utils/Signing.java @@ -81,19 +81,12 @@ public class Signing { public int[] signatureFragment(int[] normalizedBundleFragment, int[] keyFragment) { - int[] hash; - for (int i = 0; i < 27; i++) { - - hash = Arrays.copyOfRange(keyFragment, i * 243, (i + 1) * 243); - for (int j = 0; j < 13 - normalizedBundleFragment[i]; j++) { curl.reset() - .absorb(hash, 0, hash.length) - .squeeze(hash, 0, hash.length); + .absorb(keyFragment, i * 243, 243) + .squeeze(keyFragment, i * 243, 243); } - - System.arraycopy(hash, 0, keyFragment, i * 243, 243); } return keyFragment; @@ -110,41 +103,34 @@ public class Signing { public int[] digests(int[] key) { int[] digests = new int[(int) Math.floor(key.length / 6561) * 243]; - int[] buffer = new int[243]; for (int i = 0; i < Math.floor(key.length / 6561); i++) { int[] keyFragment = Arrays.copyOfRange(key, i * 6561, (i + 1) * 6561); for (int j = 0; j < 27; j++) { - - buffer = Arrays.copyOfRange(keyFragment, j * 243, (j + 1) * 243); for (int k = 0; k < 26; k++) { curl.reset() - .absorb(buffer) - .squeeze(buffer); + .absorb(keyFragment, j * 243, 243) + .squeeze(keyFragment, j * 243, 243); } - System.arraycopy(buffer, 0, keyFragment, j * 243, 243); } curl.reset(); curl.absorb(keyFragment, 0, keyFragment.length); - curl.squeeze(buffer, 0, buffer.length); - - System.arraycopy(buffer, 0, digests, i * 243, 243); + curl.squeeze(digests, i * 243, 243); } return digests; } public int[] digest(int[] normalizedBundleFragment, int[] signatureFragment) { curl.reset(); + ICurl jCurl = SpongeFactory.create(SpongeFactory.Mode.KERL); int[] buffer = new int[243]; for (int i = 0; i < 27; i++) { buffer = Arrays.copyOfRange(signatureFragment, i * 243, (i + 1) * 243); for (int j = normalizedBundleFragment[i] + 13; j-- > 0; ) { - - ICurl jCurl = SpongeFactory.create(SpongeFactory.Mode.KERL); jCurl.reset(); jCurl.absorb(buffer); jCurl.squeeze(buffer);