From b2e80fce3d49ccb4b437f05c84dd24b8ae52040d Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Fri, 7 Feb 2025 11:44:35 -0500
Subject: [PATCH] Crypto: Allow external use of pooled SHA256 instances

---
 .../src/net/i2p/crypto/SHA256Generator.java   | 31 ++++++++++++++++---
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/core/java/src/net/i2p/crypto/SHA256Generator.java b/core/java/src/net/i2p/crypto/SHA256Generator.java
index 7f79575d4b..af3dbd149e 100644
--- a/core/java/src/net/i2p/crypto/SHA256Generator.java
+++ b/core/java/src/net/i2p/crypto/SHA256Generator.java
@@ -47,7 +47,7 @@ public final class SHA256Generator {
         MessageDigest digest = acquire();
         digest.update(source, start, len);
         byte rv[] = digest.digest();
-        release(digest);
+        releaseit(digest);
         return Hash.create(rv);
     }
     
@@ -64,11 +64,19 @@ public final class SHA256Generator {
         } catch (DigestException e) {
             throw new RuntimeException(e);
         } finally {
-            release(digest);
+            releaseit(digest);
         }
     }
     
-    private MessageDigest acquire() {
+    /**
+     *  Get a MessageDigest instance from the pool,
+     *  for uses where the one-shot calculateHash()
+     *  would require copying the data.
+     *  Return the instance via release() when done.
+     *
+     *  @since public since 0.9.66
+     */
+    public MessageDigest acquire() {
         MessageDigest rv = _digests.poll();
         if (rv != null)
             rv.reset();
@@ -77,7 +85,22 @@ public final class SHA256Generator {
         return rv;
     }
     
-    private void release(MessageDigest digest) {
+    /**
+     *  Release a digest back to the pool
+     *  @param digest must be SHA-256
+     *  @since public since 0.9.66
+     */
+    public void release(MessageDigest digest) {
+        if (!digest.getAlgorithm().equals("SHA-256"))
+            throw new IllegalArgumentException();
+        _digests.offer(digest);
+    }
+    
+    /**
+     *  Release a digest back to the pool - internal version
+     *  @since 0.9.66 renamed from release()
+     */
+    private void releaseit(MessageDigest digest) {
         _digests.offer(digest);
     }
     
-- 
GitLab