From 7dcaa2a994c374d71303bd32ae2b7693aad48008 Mon Sep 17 00:00:00 2001 From: OldTruckDriver Date: Wed, 17 Jun 2026 22:28:52 +1000 Subject: [PATCH] [CODEC-343] Fix Base32 hex decode table builder Configure setHexDecodeTable(boolean) with the matching encode table instead of passing a decode lookup table to setEncodeTable(byte...). Add a regression test showing the configured codec encodes with the Base32-Hex alphabet and decodes its own output. Reviewed-by: OpenAI Codex Reviewed-by: Anthropic Claude Code --- src/changes/changes.xml | 1 + .../java/org/apache/commons/codec/binary/Base32.java | 4 ++-- .../java/org/apache/commons/codec/binary/Base32Test.java | 9 +++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 3dc2f6c409..a74637c174 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -45,6 +45,7 @@ The type attribute can be add,update,fix,remove. + Base32.Builder.setHexDecodeTable(boolean) sets the encode table to a decode lookup table. Digest ALL reuses System.in, so only the first algorithm sees the real input (#431). diff --git a/src/main/java/org/apache/commons/codec/binary/Base32.java b/src/main/java/org/apache/commons/codec/binary/Base32.java index 1de642387e..a1206c6732 100644 --- a/src/main/java/org/apache/commons/codec/binary/Base32.java +++ b/src/main/java/org/apache/commons/codec/binary/Base32.java @@ -103,7 +103,7 @@ public Builder setEncodeTable(final byte... encodeTable) { } /** - * Sets the decode table to use Base32 hexadecimal if {@code true}, otherwise use the Base32 alphabet. + * Sets the encode and decode tables to use Base32 hexadecimal if {@code true}, otherwise use the Base32 alphabet. *

* This overrides a value previously set with {@link #setEncodeTable(byte...)}. *

@@ -113,7 +113,7 @@ public Builder setEncodeTable(final byte... encodeTable) { * @since 1.18.0 */ public Builder setHexDecodeTable(final boolean useHex) { - return setEncodeTable(decodeTable(useHex)); + return setEncodeTable(encodeTable(useHex)); } /** diff --git a/src/test/java/org/apache/commons/codec/binary/Base32Test.java b/src/test/java/org/apache/commons/codec/binary/Base32Test.java index c332c448d0..ed3e0b9c46 100644 --- a/src/test/java/org/apache/commons/codec/binary/Base32Test.java +++ b/src/test/java/org/apache/commons/codec/binary/Base32Test.java @@ -319,6 +319,15 @@ void testBase32HexImpossibleSamples() { // @formatter:on } + @Test + void testBuilderSetHexDecodeTableDecodesOwnOutput() { + final Base32 base32 = Base32.builder().setHexDecodeTable(true).setLineLength(0).get(); + final byte[] data = { 0 }; + final byte[] encoded = base32.encode(data); + assertEquals("00======", new String(encoded, StandardCharsets.US_ASCII)); + assertArrayEquals(data, base32.decode(encoded)); + } + @Test void testBase32HexSamples() throws Exception { final Base32 codec = new Base32(true);