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-net.git
commit deb24bf22b1f75e4dc1bc981f2bcd37f5c407ceb Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon May 27 09:02:08 2024 -0400 Internal refactoring --- .../java/org/apache/commons/net/util/Base64.java | 131 ++------------------- 1 file changed, 10 insertions(+), 121 deletions(-) diff --git a/src/main/java/org/apache/commons/net/util/Base64.java b/src/main/java/org/apache/commons/net/util/Base64.java index 50d58372..c9eff4b3 100644 --- a/src/main/java/org/apache/commons/net/util/Base64.java +++ b/src/main/java/org/apache/commons/net/util/Base64.java @@ -46,10 +46,13 @@ import java.util.Objects; */ @Deprecated public class Base64 { + private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2; private static final int DEFAULT_BUFFER_SIZE = 8192; + private static final Base64 DECODER = new Base64(); + /** * Chunk size per RFC 2045 section 6.8. * @@ -108,9 +111,6 @@ public class Base64 { /** Mask used to extract 6 bits, used when encoding */ private static final int MASK_6BITS = 0x3f; - /** Mask used to extract 8 bits, used in decoding base64 bytes */ - private static final int MASK_8BITS = 0xff; - // The static final fields above are used for the original static byte[] methods on Base64. // The private member fields below are used with the new streaming approach, which requires // some state be preserved between calls of encode() and decode(). @@ -137,7 +137,7 @@ public class Base64 { * @return Array containing decoded data. */ public static byte[] decodeBase64(final byte[] base64Data) { - return new Base64().decode(base64Data); + return DECODER.decode(base64Data); } /** @@ -148,18 +148,18 @@ public class Base64 { * @since 1.4 */ public static byte[] decodeBase64(final String base64String) { - return new Base64().decode(base64String); + return DECODER.decode(base64String); } /** * Decodes a byte64-encoded integer according to crypto standards such as W3C's XML-Signature * - * @param pArray a byte array containing base64 character data + * @param source a byte array containing base64 character data * @return A BigInteger * @since 1.4 */ - public static BigInteger decodeInteger(final byte[] pArray) { - return new BigInteger(1, decodeBase64(pArray)); + public static BigInteger decodeInteger(final byte[] source) { + return new BigInteger(1, decodeBase64(source)); } /** @@ -213,13 +213,11 @@ public class Base64 { if (binaryData == null || binaryData.length == 0) { return binaryData; } - final long len = getEncodeLength(binaryData, isChunked ? CHUNK_SIZE : 0, isChunked ? CHUNK_SEPARATOR : NetConstants.EMPTY_BTYE_ARRAY); if (len > maxResultSize) { throw new IllegalArgumentException( "Input array too big, the output array would be bigger (" + len + ") than the specified maxium size of " + maxResultSize); } - final Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe); return b64.encode(binaryData); } @@ -328,7 +326,6 @@ public class Base64 { private static long getEncodeLength(final byte[] pArray, int chunkSize, final byte[] chunkSeparator) { // base64 always encodes to multiples of 4. chunkSize = chunkSize / 4 * 4; - long len = pArray.length * 4 / 3; final long mod = len % 4; if (mod != 0) { @@ -404,7 +401,6 @@ public class Base64 { // round bitlen bitlen = bitlen + 7 >> 3 << 3; final byte[] bigBytes = bigInt.toByteArray(); - if (bigInt.bitLength() % 8 != 0 && bigInt.bitLength() / 8 + 1 == bitlen / 8) { return bigBytes; } @@ -439,12 +435,6 @@ public class Base64 { */ private final byte[] lineSeparator; - /** - * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing. - * <code>decodeSize = 3 + lineSeparator.length;</code> - */ - private final int decodeSize; - /** * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing. * <code>encodeSize = 4 + lineSeparator.length;</code> @@ -594,7 +584,6 @@ public class Base64 { } else { this.encodeSize = 4; } - this.decodeSize = this.encodeSize - 1; if (containsBase64Byte(lineSeparator)) { final String sep = newStringUtf8(lineSeparator); throw new IllegalArgumentException("lineSeperator must not contain base64 characters: [" + sep + "]"); @@ -622,94 +611,7 @@ public class Base64 { if (source == null || source.length == 0) { return source; } - final long len = source.length * 3 / 4; - final byte[] buf = new byte[(int) len]; - setInitialBuffer(buf, 0, buf.length); - decode(source, 0, source.length); - decode(source, 0, -1); // Notify decoder of EOF. - - // Would be nice to just return buf (like we sometimes do in the encode - // logic), but we have no idea what the line-length was (could even be - // variable). So we cannot determine ahead of time exactly how big an - // array is necessary. Hence, the need to construct a 2nd byte array to - // hold the final result: - - final byte[] result = new byte[pos]; - readResults(result, 0, result.length); - return result; - } - - /** - * <p> - * Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once with the data to decode, and once with - * inAvail set to "-1" to alert decoder that EOF has been reached. The "-1" call is not necessary when decoding, but it doesn't hurt, either. - * </p> - * <p> - * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled, since CR and LF are silently ignored, but has implications - * for other bytes, too. This method subscribes to the garbage-in, garbage-out philosophy: it will not check the provided data for validity. - * </p> - * <p> - * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach. - * <p> - * See: <a href="https://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/"> - * https://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - * </a> - * - * </p> - * - * @param in byte[] array of ASCII data to base64 decode. - * @param inPos Position to start reading data from. - * @param inAvail Amount of bytes available from input for encoding. - */ - void decode(final byte[] in, int inPos, final int inAvail) { - if (eof) { - return; - } - if (inAvail < 0) { - eof = true; - } - for (int i = 0; i < inAvail; i++) { - if (buffer == null || buffer.length - pos < decodeSize) { - resizeBuffer(); - } - final byte b = in[inPos++]; - if (b == PAD) { - // We're done. - eof = true; - break; - } - if (b >= 0 && b < DECODE_TABLE.length) { - final int result = DECODE_TABLE[b]; - if (result >= 0) { - modulus = ++modulus % 4; - x = (x << 6) + result; - if (modulus == 0) { - buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); - buffer[pos++] = (byte) (x >> 8 & MASK_8BITS); - buffer[pos++] = (byte) (x & MASK_8BITS); - } - } - } - } - - // Two forms of EOF as far as base64 decoder is concerned: actual - // EOF (-1) and first time '=' character is encountered in stream. - // This approach makes the '=' padding characters completely optional. - if (eof && modulus != 0) { - x = x << 6; - switch (modulus) { - case 2: - x = x << 6; - buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); - break; - case 3: - buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); - buffer[pos++] = (byte) (x >> 8 & MASK_8BITS); - break; - default: - break; // other values ignored - } - } + return java.util.Base64.getDecoder().decode(source); } /** @@ -720,7 +622,7 @@ public class Base64 { * @since 1.4 */ public byte[] decode(final String source) { - return decode(getBytesUtf8(source)); + return java.util.Base64.getDecoder().decode(source); } /** @@ -846,10 +748,6 @@ public class Base64 { return newStringUtf8(encode(source)); } - private byte[] getBytesUtf8(final String source) { - return source.getBytes(StandardCharsets.UTF_8); - } - int getLineLength() { return lineLength; } @@ -858,15 +756,6 @@ public class Base64 { return lineSeparator.clone(); } - /** - * Tests whether this Base64 object has buffered data for reading. - * - * @return true if there is Base64 object still available for reading. - */ - boolean hasData() { - return this.buffer != null; - } - /** * Tests whether our current encoding mode. True if we're URL-SAFE, false otherwise. *