You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2025/03/15 19:22:56 UTC
(commons-codec) 02/02: Add HmacUtils.hmac[Hex](Path)
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-codec.git
commit e5d7a7942a4049739904e40845fb5e6b083f3509
Author: Gary D. Gregory <ga...@gmail.com>
AuthorDate: Sat Mar 15 15:22:48 2025 -0400
Add HmacUtils.hmac[Hex](Path)
- Add HmacUtils.hmacHex(Path)
- Add HmacUtils.hmac(Path)
- Next version will be 1.19.0
- Add missing tests
---
pom.xml | 8 ++---
src/changes/changes.xml | 4 ++-
.../org/apache/commons/codec/digest/HmacUtils.java | 36 +++++++++++++++++++---
.../commons/codec/digest/HmacAlgorithmsTest.java | 33 +++++++++++++++++++-
4 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/pom.xml b/pom.xml
index e2787f39..2343d1c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@ limitations under the License.
</parent>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
- <version>1.18.1-SNAPSHOT</version>
+ <version>1.19.0-SNAPSHOT</version>
<name>Apache Commons Codec</name>
<inceptionYear>2002</inceptionYear>
<description>
@@ -93,9 +93,9 @@ limitations under the License.
<checkstyle.header.file>${basedir}/src/conf/checkstyle-header.txt</checkstyle.header.file>
<checkstyle.config.file>${basedir}/src/conf/checkstyle.xml</checkstyle.config.file>
<!-- Commons Release Plugin -->
- <commons.release.version>1.18.0</commons.release.version>
- <commons.bc.version>1.17.1</commons.bc.version>
- <commons.release.next>1.18.1</commons.release.next>
+ <commons.release.version>1.19.0</commons.release.version>
+ <commons.bc.version>1.18.0</commons.bc.version>
+ <commons.release.next>1.19.1</commons.release.next>
<commons.rc.version>RC1</commons.rc.version>
<commons.release.isDistModule>true</commons.release.isDistModule>
<commons.distSvnStagingUrl>scm:svn:https://dist.apache.org/repos/dist/dev/commons/${commons.componentid}</commons.distSvnStagingUrl>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 26257f40..d4ea2a0b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -43,11 +43,13 @@ The <action> type attribute can be add,update,fix,remove.
<author>Apache Commons Developers</author>
</properties>
<body>
- <release version="1.18.1" date="YYYY-MM-DD" description="This is a feature and maintenance release. Java 8 or later is required.">
+ <release version="1.19.0" date="YYYY-MM-DD" description="This is a feature and maintenance release. Java 8 or later is required.">
<!-- FIX -->
<action type="fix" dev="ggregory" due-to="Gary Gregory">Remove -nouses directive from maven-bundle-plugin. OSGi package imports now state 'uses' definitions for package imports, this doesn't affect JPMS (from org.apache.commons:commons-parent:80).</action>
<action type="fix" dev="ggregory" due-to="Gary Gregory">Refactor DigestUtils.updateDigest(MessageDigest, File) to use NIO.</action>
<!-- ADD -->
+ <action type="add" dev="ggregory" due-to="Gary Gregory">Add HmacUtils.hmac(Path).</action>
+ <action type="add" dev="ggregory" due-to="Gary Gregory">Add HmacUtils.hmacHex(Path).</action>
<!-- UPDATE -->
<action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 79 to 81.</action>
</release>
diff --git a/src/main/java/org/apache/commons/codec/digest/HmacUtils.java b/src/main/java/org/apache/commons/codec/digest/HmacUtils.java
index 90dc337d..89bceb6d 100644
--- a/src/main/java/org/apache/commons/codec/digest/HmacUtils.java
+++ b/src/main/java/org/apache/commons/codec/digest/HmacUtils.java
@@ -19,10 +19,11 @@ package org.apache.commons.codec.digest;
import java.io.BufferedInputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
@@ -971,9 +972,7 @@ public final class HmacUtils {
* @since 1.11
*/
public byte[] hmac(final File valueToDigest) throws IOException {
- try (BufferedInputStream stream = new BufferedInputStream(new FileInputStream(valueToDigest))) {
- return hmac(stream);
- }
+ return hmac(valueToDigest.toPath());
}
/**
@@ -992,13 +991,27 @@ public final class HmacUtils {
public byte[] hmac(final InputStream valueToDigest) throws IOException {
final byte[] buffer = new byte[STREAM_BUFFER_LENGTH];
int read;
-
while ((read = valueToDigest.read(buffer, 0, STREAM_BUFFER_LENGTH)) > -1) {
mac.update(buffer, 0, read);
}
return mac.doFinal();
}
+ /**
+ * Returns the digest for the file.
+ *
+ * @param valueToDigest the path to use
+ * @return the digest
+ * @throws IOException
+ * If an I/O error occurs.
+ * @since 1.19.0
+ */
+ public byte[] hmac(final Path valueToDigest) throws IOException {
+ try (BufferedInputStream stream = new BufferedInputStream(Files.newInputStream(valueToDigest))) {
+ return hmac(stream);
+ }
+ }
+
/**
* Returns the digest for the input data.
*
@@ -1062,6 +1075,19 @@ public final class HmacUtils {
return Hex.encodeHexString(hmac(valueToDigest));
}
+ /**
+ * Returns the digest for the path.
+ *
+ * @param valueToDigest the path to use
+ * @return the digest as a hexadecimal String
+ * @throws IOException
+ * If an I/O error occurs.
+ * @since 1.19.0
+ */
+ public String hmacHex(final Path valueToDigest) throws IOException {
+ return Hex.encodeHexString(hmac(valueToDigest));
+ }
+
/**
* Returns the digest for the input data.
*
diff --git a/src/test/java/org/apache/commons/codec/digest/HmacAlgorithmsTest.java b/src/test/java/org/apache/commons/codec/digest/HmacAlgorithmsTest.java
index 722b2e1d..43f6a92a 100644
--- a/src/test/java/org/apache/commons/codec/digest/HmacAlgorithmsTest.java
+++ b/src/test/java/org/apache/commons/codec/digest/HmacAlgorithmsTest.java
@@ -25,6 +25,9 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -36,7 +39,9 @@ import javax.crypto.Mac;
import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.SystemUtils;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
@@ -87,6 +92,11 @@ public class HmacAlgorithmsTest {
private static final byte[] EMPTY_BYTE_ARRAY = {};
+ @TempDir
+ static Path TempDir;
+
+ static Path TempFile;
+
// TODO HMAC_SHA_224
public static Stream<Arguments> data() {
List<Arguments> list = Arrays.asList(
@@ -104,8 +114,13 @@ public class HmacAlgorithmsTest {
return list.stream();
}
- private DigestUtilsTest digestUtilsTest;
+ @BeforeAll
+ public static void init() throws IOException {
+ TempFile = Files.createFile(TempDir.resolve(HmacAlgorithmsTest.class.getSimpleName()));
+ Files.write(TempFile, STANDARD_PHRASE_BYTES, StandardOpenOption.CREATE);
+ }
+ private DigestUtilsTest digestUtilsTest;
@BeforeEach
public void setUp() throws Exception {
digestUtilsTest = new DigestUtilsTest();
@@ -210,6 +225,22 @@ public class HmacAlgorithmsTest {
assertEquals(standardResultString, new HmacUtils(hmacAlgorithm, STANDARD_KEY_BYTES).hmacHex(STANDARD_PHRASE_BYTES));
}
+ @ParameterizedTest
+ @MethodSource("data")
+ public void testMacHexFile(final HmacAlgorithms hmacAlgorithm, final byte[] standardResultBytes, final String standardResultString)
+ throws IOException {
+ assumeTrue(HmacUtils.isAvailable(hmacAlgorithm));
+ assertEquals(standardResultString, new HmacUtils(hmacAlgorithm, STANDARD_KEY_BYTES).hmacHex(TempFile.toFile()));
+ }
+
+ @ParameterizedTest
+ @MethodSource("data")
+ public void testMacHexPath(final HmacAlgorithms hmacAlgorithm, final byte[] standardResultBytes, final String standardResultString)
+ throws IOException {
+ assumeTrue(HmacUtils.isAvailable(hmacAlgorithm));
+ assertEquals(standardResultString, new HmacUtils(hmacAlgorithm, STANDARD_KEY_BYTES).hmacHex(TempFile));
+ }
+
@ParameterizedTest
@MethodSource("data")
public void testMacHexInputStream(final HmacAlgorithms hmacAlgorithm, final byte[] standardResultBytes, final String standardResultString)