Source code
Description: source: package: org.apache.commons.codec.digest, class: DigestUtils

    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      https://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017
    018package org.apache.commons.codec.digest;
    019
    020import java.io.BufferedInputStream;
    021import java.io.File;
    022import java.io.IOException;
    023import java.io.InputStream;
    024import java.io.RandomAccessFile;
    025import java.nio.ByteBuffer;
    026import java.nio.channels.FileChannel;
    027import java.nio.file.Files;
    028import java.nio.file.OpenOption;
    029import java.nio.file.Path;
    030import java.security.MessageDigest;
    031import java.security.NoSuchAlgorithmException;
    032
    033import org.apache.commons.codec.binary.Hex;
    034import org.apache.commons.codec.binary.StringUtils;
    035
    036/**
    037 * Operations to simplify common {@link MessageDigest} tasks. This class is immutable and thread-safe. However the {@link MessageDigest} instances
    038 * it creates generally won't be.
    039 * <p>
    040 * The {@link MessageDigestAlgorithms} class provides constants for standard digest algorithms that can be used with the {@link #getDigest(String)} method and
    041 * other methods that require the Digest algorithm name.
    042 * </p>
    043 * <p>
    044 * Note: The class has shorthand methods for all the algorithms present as standard in Java 8. This approach requires lots of methods for each algorithm, and
    045 * quickly becomes unwieldy. The following code works with all algorithms:
    046 * </p>
    047 *
    048 * <pre>
    049 * import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_224;
    050 * ...
    051 * byte [] digest = new DigestUtils(SHA_224).digest(dataToDigest);
    052 * String hdigest = new DigestUtils(SHA_224).digestAsHex(new File("pom.xml"));
    053 * </pre>
    054 * <p>
    055 * See <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA">Appendix A in the Java Cryptography Architecture
    056 * Reference Guide</a> for information about standard algorithm names.
    057 * </p>
    058 * <p>
    059 * The use of SHA3-512 requires Java 9 or higher.
    060 * </p>
    061 *
    062 * @see MessageDigestAlgorithms
    063 */
    064public class DigestUtils {
    065
    066    /**
    067     * Package-private for tests.
    068     */
    069    static final int BUFFER_SIZE = 1024;
    070
    071    /**
    072     * Reads through a byte array and returns the digest for the data. Provided for symmetry with other methods.
    073     *
    074     * @param messageDigest The MessageDigest to use (for example MD5).
    075     * @param data          Data to digest.
    076     * @return the digest.
    077     * @since 1.11
    078     */
    079    public static byte[] digest(final MessageDigest messageDigest, final byte[] data) {
    080        return messageDigest.digest(data);
    081    }
    082
    083    /**
    084     * Reads through a ByteBuffer and returns the digest for the data
    085     *
    086     * @param messageDigest The MessageDigest to use (for example MD5).
    087     * @param data          Data to digest.
    088     * @return the digest.
    089     * @since 1.11
    090     */
    091    public static byte[] digest(final MessageDigest messageDigest, final ByteBuffer data) {
    092        messageDigest.update(data);
    093        return messageDigest.digest();
    094    }
    095
    096    /**
    097     * Reads through a File and returns the digest for the data
    098     *
    099     * @param messageDigest The MessageDigest to use (for example MD5).
    100     * @param data          Data to digest.
    101     * @return the digest.
    102     * @throws IOException On error reading from the stream.
    103     * @since 1.11
    104     */
    105    public static byte[] digest(final MessageDigest messageDigest, final File data) throws IOException {
    106        return updateDigest(messageDigest, data).digest();
    107    }
    108
    109    /**
    110     * Reads through an InputStream and returns the digest for the data
    111     *
    112     * @param messageDigest The MessageDigest to use (for example MD5).
    113     * @param data          Data to digest.
    114     * @return the digest.
    115     * @throws IOException On error reading from the stream.
    116     * @since 1.11 (was private)
    117     */
    118    public static byte[] digest(final MessageDigest messageDigest, final InputStream data) throws IOException {
    119        return updateDigest(messageDigest, data).digest();
    120    }
    121
    122    /**
    123     * Reads through a File and returns the digest for the data
    124     *
    125     * @param messageDigest The MessageDigest to use (for example MD5).
    126     * @param data          Data to digest.
    127     * @param options       options How to open the file.
    128     * @return the digest.
    129     * @throws IOException On error reading from the stream.
    130     * @since 1.14
    131     */
    132    public static byte[] digest(final MessageDigest messageDigest, final Path data, final OpenOption... options) throws IOException {
    133        return updateDigest(messageDigest, data, options).digest();
    134    }
    135
    136    /**
    137     * Reads through a RandomAccessFile using non-blocking-io (NIO) and returns the digest for the data
    138     *
    139     * @param messageDigest The MessageDigest to use (for example MD5).
    140     * @param data          Data to digest.
    141     * @return the digest.
    142     * @throws IOException On error reading from the stream.
    143     * @since 1.14
    144     */
    145    public static byte[] digest(final MessageDigest messageDigest, final RandomAccessFile data) throws IOException {
    146        return updateDigest(messageDigest, data).digest();
    147    }
    148
    149    /**
    150     * Gets a {@code MessageDigest} for the given {@code algorithm}.
    151     *
    152     * @param algorithm the name of the algorithm requested. See
    153     *                  <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA">Appendix A in the Java
    154     *                  Cryptography Architecture Reference Guide</a> for information about standard algorithm names.
    155     * @return A digest instance.
    156     * @see MessageDigest#getInstance(String)
    157     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    158     */
    159    public static MessageDigest getDigest(final String algorithm) {
    160        try {
    161            return getMessageDigest(algorithm);
    162        } catch (final NoSuchAlgorithmException e) {
    163            throw new IllegalArgumentException(e);
    164        }
    165    }
    166
    167    /**
    168     * Gets a {@code MessageDigest} for the given {@code algorithm} or a default if there is a problem getting the algorithm.
    169     *
    170     * @param algorithm            the name of the algorithm requested. See
    171     *                             <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA"> Appendix A in the Java
    172     *                             Cryptography Architecture Reference Guide</a> for information about standard algorithm names.
    173     * @param defaultMessageDigest The default MessageDigest.
    174     * @return A digest instance.
    175     * @see MessageDigest#getInstance(String)
    176     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    177     * @since 1.11
    178     */
    179    public static MessageDigest getDigest(final String algorithm, final MessageDigest defaultMessageDigest) {
    180        try {
    181            return getMessageDigest(algorithm);
    182        } catch (final Exception e) {
    183            return defaultMessageDigest;
    184        }
    185    }
    186
    187    /**
    188     * Gets an MD2 MessageDigest.
    189     *
    190     * @return An MD2 digest instance.
    191     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because MD2 is a built-in algorithm.
    192     * @see MessageDigestAlgorithms#MD2
    193     * @since 1.7
    194     */
    195    public static MessageDigest getMd2Digest() {
    196        return getDigest(MessageDigestAlgorithms.MD2);
    197    }
    198
    199    /**
    200     * Gets an MD5 MessageDigest.
    201     *
    202     * @return An MD5 digest instance.
    203     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because MD5 is a built-in algorithm.
    204     * @see MessageDigestAlgorithms#MD5
    205     */
    206    public static MessageDigest getMd5Digest() {
    207        return getDigest(MessageDigestAlgorithms.MD5);
    208    }
    209
    210    /**
    211     * Gets a {@code MessageDigest} for the given {@code algorithm}.
    212     *
    213     * @param algorithm the name of the algorithm requested. See
    214     *                  <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA"> Appendix A in the Java
    215     *                  Cryptography Architecture Reference Guide</a> for information about standard algorithm names.
    216     * @return A digest instance.
    217     * @see MessageDigest#getInstance(String)
    218     * @throws NoSuchAlgorithmException if no Provider supports a MessageDigestSpi implementation for the specified algorithm.
    219     */
    220    private static MessageDigest getMessageDigest(final String algorithm) throws NoSuchAlgorithmException {
    221        return MessageDigest.getInstance(algorithm);
    222    }
    223
    224    /**
    225     * Gets an SHA-1 digest.
    226     *
    227     * @return An SHA-1 digest instance.
    228     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because SHA-1 is a built-in algorithm.
    229     * @see MessageDigestAlgorithms#SHA_1
    230     * @since 1.7
    231     */
    232    public static MessageDigest getSha1Digest() {
    233        return getDigest(MessageDigestAlgorithms.SHA_1);
    234    }
    235
    236    /**
    237     * Gets an SHA-256 digest.
    238     *
    239     * @return An SHA-256 digest instance.
    240     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because SHA-256 is a built-in algorithm.
    241     * @see MessageDigestAlgorithms#SHA_256
    242     */
    243    public static MessageDigest getSha256Digest() {
    244        return getDigest(MessageDigestAlgorithms.SHA_256);
    245    }
    246
    247    /**
    248     * Gets an SHA3-224 digest.
    249     *
    250     * @return An SHA3-224 digest instance.
    251     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 9 and greater.
    252     * @see MessageDigestAlgorithms#SHA3_224
    253     * @since 1.12
    254     */
    255    public static MessageDigest getSha3_224Digest() {
    256        return getDigest(MessageDigestAlgorithms.SHA3_224);
    257    }
    258
    259    /**
    260     * Returns an SHA3-256 digest.
    261     *
    262     * @return An SHA3-256 digest instance.
    263     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 9 and greater.
    264     * @see MessageDigestAlgorithms#SHA3_256
    265     * @since 1.12
    266     */
    267    public static MessageDigest getSha3_256Digest() {
    268        return getDigest(MessageDigestAlgorithms.SHA3_256);
    269    }
    270
    271    /**
    272     * Gets an SHA3-384 digest.
    273     *
    274     * @return An SHA3-384 digest instance.
    275     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 9 and greater.
    276     * @see MessageDigestAlgorithms#SHA3_384
    277     * @since 1.12
    278     */
    279    public static MessageDigest getSha3_384Digest() {
    280        return getDigest(MessageDigestAlgorithms.SHA3_384);
    281    }
    282
    283    /**
    284     * Gets an SHA3-512 digest.
    285     *
    286     * @return An SHA3-512 digest instance.
    287     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 9 and greater.
    288     * @see MessageDigestAlgorithms#SHA3_512
    289     * @since 1.12
    290     */
    291    public static MessageDigest getSha3_512Digest() {
    292        return getDigest(MessageDigestAlgorithms.SHA3_512);
    293    }
    294
    295    /**
    296     * Gets an SHA-384 digest.
    297     *
    298     * @return An SHA-384 digest instance.
    299     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because SHA-384 is a built-in algorithm.
    300     * @see MessageDigestAlgorithms#SHA_384
    301     */
    302    public static MessageDigest getSha384Digest() {
    303        return getDigest(MessageDigestAlgorithms.SHA_384);
    304    }
    305
    306    /**
    307     * Gets an SHA-512/224 digest.
    308     *
    309     * @return An SHA-512/224 digest instance.
    310     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    311     * @see MessageDigestAlgorithms#SHA_512_224
    312     */
    313    public static MessageDigest getSha512_224Digest() {
    314        return getDigest(MessageDigestAlgorithms.SHA_512_224);
    315    }
    316
    317    /**
    318     * Gets an SHA-512/256 digest.
    319     *
    320     * @return An SHA-512/256 digest instance.
    321     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    322     * @see MessageDigestAlgorithms#SHA_512_224
    323     */
    324    public static MessageDigest getSha512_256Digest() {
    325        return getDigest(MessageDigestAlgorithms.SHA_512_256);
    326    }
    327
    328    /**
    329     * Gets an SHA-512 digest.
    330     *
    331     * @return An SHA-512 digest instance.
    332     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should never happen because SHA-512 is a built-in algorithm.
    333     * @see MessageDigestAlgorithms#SHA_512
    334     */
    335    public static MessageDigest getSha512Digest() {
    336        return getDigest(MessageDigestAlgorithms.SHA_512);
    337    }
    338
    339    /**
    340     * Gets an SHA-1 digest.
    341     *
    342     * @return An SHA-1 digest instance.
    343     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    344     * @deprecated (1.11) Use {@link #getSha1Digest()}
    345     */
    346    @Deprecated
    347    public static MessageDigest getShaDigest() {
    348        return getSha1Digest();
    349    }
    350
    351    /**
    352     * Gets an SHAKE128_256 digest.
    353     *
    354     * @return An SHAKE128_256 digest instance.
    355     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 25 and greater.
    356     * @see MessageDigestAlgorithms#SHAKE128_256
    357     * @see <a href="https://docs.oracle.com/en/java/javase/25/docs/specs/security/standard-names.html#messagedigest-algorithms"> Java 25 Cryptography
    358     *      Architecture Standard Algorithm Name Documentation</a>
    359     * @see <a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">FIPS PUB 202 - SHA-3 Standard: Permutation-Based Hash and Extendable-Output
    360     *      Functions</a>
    361     * @since 1.20.0
    362     */
    363    public static MessageDigest getShake128_256Digest() {
    364        return getDigest(MessageDigestAlgorithms.SHAKE128_256);
    365    }
    366
    367    /**
    368     * Gets an SHAKE128_512 digest.
    369     *
    370     * @return An SHAKE128_512 digest instance.
    371     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught, which should not happen on Oracle Java 25 and greater.
    372     * @see MessageDigestAlgorithms#SHAKE256_512
    373     * @see <a href="https://docs.oracle.com/en/java/javase/25/docs/specs/security/standard-names.html#messagedigest-algorithms"> Java 25 Cryptography
    374     *      Architecture Standard Algorithm Name Documentation</a>
    375     * @see <a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">FIPS PUB 202 - SHA-3 Standard: Permutation-Based Hash and Extendable-Output
    376     *      Functions</a>
    377     * @since 1.20.0
    378     */
    379    public static MessageDigest getShake256_512Digest() {
    380        return getDigest(MessageDigestAlgorithms.SHAKE256_512);
    381    }
    382
    383    /**
    384     * Test whether the algorithm is supported.
    385     *
    386     * @param messageDigestAlgorithm the algorithm name.
    387     * @return {@code true} if the algorithm can be found.
    388     * @since 1.11
    389     */
    390    public static boolean isAvailable(final String messageDigestAlgorithm) {
    391        return getDigest(messageDigestAlgorithm, null) != null;
    392    }
    393
    394    /**
    395     * Calculates the MD2 digest and returns the value as a 16 element {@code byte[]}.
    396     *
    397     * @param data Data to digest.
    398     * @return MD2 digest.
    399     * @since 1.7
    400     */
    401    public static byte[] md2(final byte[] data) {
    402        return getMd2Digest().digest(data);
    403    }
    404
    405    /**
    406     * Calculates the MD2 digest and returns the value as a 16 element {@code byte[]}.
    407     *
    408     * @param data Data to digest.
    409     * @return MD2 digest.
    410     * @throws IOException On error reading from the stream.
    411     * @since 1.7
    412     */
    413    public static byte[] md2(final InputStream data) throws IOException {
    414        return digest(getMd2Digest(), data);
    415    }
    416
    417    /**
    418     * Calculates the MD2 digest and returns the value as a 16 element {@code byte[]}.
    419     *
    420     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    421     * @return MD2 digest.
    422     * @since 1.7
    423     */
    424    public static byte[] md2(final String data) {
    425        return md2(StringUtils.getBytesUtf8(data));
    426    }
    427
    428    /**
    429     * Calculates the MD2 digest and returns the value as a 32 character hexadecimal string.
    430     *
    431     * @param data Data to digest.
    432     * @return MD2 digest as a hexadecimal string.
    433     * @since 1.7
    434     */
    435    public static String md2Hex(final byte[] data) {
    436        return Hex.encodeHexString(md2(data));
    437    }
    438
    439    /**
    440     * Calculates the MD2 digest and returns the value as a 32 character hexadecimal string.
    441     *
    442     * @param data Data to digest.
    443     * @return MD2 digest as a hexadecimal string.
    444     * @throws IOException On error reading from the stream.
    445     * @since 1.7
    446     */
    447    public static String md2Hex(final InputStream data) throws IOException {
    448        return Hex.encodeHexString(md2(data));
    449    }
    450
    451    /**
    452     * Calculates the MD2 digest and returns the value as a 32 character hexadecimal string.
    453     *
    454     * @param data Data to digest.
    455     * @return MD2 digest as a hexadecimal string.
    456     * @since 1.7
    457     */
    458    public static String md2Hex(final String data) {
    459        return Hex.encodeHexString(md2(data));
    460    }
    461
    462    /**
    463     * Calculates the MD5 digest and returns the value as a 16 element {@code byte[]}.
    464     *
    465     * @param data Data to digest.
    466     * @return MD5 digest.
    467     */
    468    public static byte[] md5(final byte[] data) {
    469        return getMd5Digest().digest(data);
    470    }
    471
    472    /**
    473     * Calculates the MD5 digest and returns the value as a 16 element {@code byte[]}.
    474     *
    475     * @param data Data to digest.
    476     * @return MD5 digest.
    477     * @throws IOException On error reading from the stream.
    478     * @since 1.4
    479     */
    480    public static byte[] md5(final InputStream data) throws IOException {
    481        return digest(getMd5Digest(), data);
    482    }
    483
    484    /**
    485     * Calculates the MD5 digest and returns the value as a 16 element {@code byte[]}.
    486     *
    487     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    488     * @return MD5 digest.
    489     */
    490    public static byte[] md5(final String data) {
    491        return md5(StringUtils.getBytesUtf8(data));
    492    }
    493
    494    /**
    495     * Calculates the MD5 digest and returns the value as a 32 character hexadecimal string.
    496     *
    497     * @param data Data to digest.
    498     * @return MD5 digest as a hexadecimal string.
    499     */
    500    public static String md5Hex(final byte[] data) {
    501        return Hex.encodeHexString(md5(data));
    502    }
    503
    504    /**
    505     * Calculates the MD5 digest and returns the value as a 32 character hexadecimal string.
    506     *
    507     * @param data Data to digest.
    508     * @return MD5 digest as a hexadecimal string.
    509     * @throws IOException On error reading from the stream.
    510     * @since 1.4
    511     */
    512    public static String md5Hex(final InputStream data) throws IOException {
    513        return Hex.encodeHexString(md5(data));
    514    }
    515
    516    /**
    517     * Calculates the MD5 digest and returns the value as a 32 character hexadecimal string.
    518     *
    519     * @param data Data to digest.
    520     * @return MD5 digest as a hexadecimal string.
    521     */
    522    public static String md5Hex(final String data) {
    523        return Hex.encodeHexString(md5(data));
    524    }
    525
    526    /**
    527     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    528     *
    529     * @param data Data to digest.
    530     * @return SHA-1 digest.
    531     * @deprecated (1.11) Use {@link #sha1(byte[])}
    532     */
    533    @Deprecated
    534    public static byte[] sha(final byte[] data) {
    535        return sha1(data);
    536    }
    537
    538    /**
    539     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    540     *
    541     * @param data Data to digest.
    542     * @return SHA-1 digest.
    543     * @throws IOException On error reading from the stream.
    544     * @since 1.4
    545     * @deprecated (1.11) Use {@link #sha1(InputStream)}
    546     */
    547    @Deprecated
    548    public static byte[] sha(final InputStream data) throws IOException {
    549        return sha1(data);
    550    }
    551
    552    /**
    553     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    554     *
    555     * @param data Data to digest.
    556     * @return SHA-1 digest.
    557     * @deprecated (1.11) Use {@link #sha1(String)}
    558     */
    559    @Deprecated
    560    public static byte[] sha(final String data) {
    561        return sha1(data);
    562    }
    563
    564    /**
    565     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    566     *
    567     * @param data Data to digest.
    568     * @return SHA-1 digest.
    569     * @since 1.7
    570     */
    571    public static byte[] sha1(final byte[] data) {
    572        return getSha1Digest().digest(data);
    573    }
    574
    575    /**
    576     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    577     *
    578     * @param data Data to digest.
    579     * @return SHA-1 digest.
    580     * @throws IOException On error reading from the stream.
    581     * @since 1.7
    582     */
    583    public static byte[] sha1(final InputStream data) throws IOException {
    584        return digest(getSha1Digest(), data);
    585    }
    586
    587    /**
    588     * Calculates the SHA-1 digest and returns the value as a {@code byte[]}.
    589     *
    590     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    591     * @return SHA-1 digest.
    592     */
    593    public static byte[] sha1(final String data) {
    594        return sha1(StringUtils.getBytesUtf8(data));
    595    }
    596
    597    /**
    598     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    599     *
    600     * @param data Data to digest.
    601     * @return SHA-1 digest as a hexadecimal string.
    602     * @since 1.7
    603     */
    604    public static String sha1Hex(final byte[] data) {
    605        return Hex.encodeHexString(sha1(data));
    606    }
    607
    608    /**
    609     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    610     *
    611     * @param data Data to digest.
    612     * @return SHA-1 digest as a hexadecimal string.
    613     * @throws IOException On error reading from the stream.
    614     * @since 1.7
    615     */
    616    public static String sha1Hex(final InputStream data) throws IOException {
    617        return Hex.encodeHexString(sha1(data));
    618    }
    619
    620    /**
    621     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    622     *
    623     * @param data Data to digest.
    624     * @return SHA-1 digest as a hexadecimal string.
    625     * @since 1.7
    626     */
    627    public static String sha1Hex(final String data) {
    628        return Hex.encodeHexString(sha1(data));
    629    }
    630
    631    /**
    632     * Calculates the SHA-256 digest and returns the value as a {@code byte[]}.
    633     *
    634     * @param data Data to digest.
    635     * @return SHA-256 digest.
    636     * @since 1.4
    637     */
    638    public static byte[] sha256(final byte[] data) {
    639        return getSha256Digest().digest(data);
    640    }
    641
    642    /**
    643     * Calculates the SHA-256 digest and returns the value as a {@code byte[]}.
    644     *
    645     * @param data Data to digest.
    646     * @return SHA-256 digest.
    647     * @throws IOException On error reading from the stream.
    648     * @since 1.4
    649     */
    650    public static byte[] sha256(final InputStream data) throws IOException {
    651        return digest(getSha256Digest(), data);
    652    }
    653
    654    /**
    655     * Calculates the SHA-256 digest and returns the value as a {@code byte[]}.
    656     *
    657     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    658     * @return SHA-256 digest.
    659     * @since 1.4
    660     */
    661    public static byte[] sha256(final String data) {
    662        return sha256(StringUtils.getBytesUtf8(data));
    663    }
    664
    665    /**
    666     * Calculates the SHA-256 digest and returns the value as a hexadecimal string.
    667     *
    668     * @param data Data to digest.
    669     * @return SHA-256 digest as a hexadecimal string.
    670     * @since 1.4
    671     */
    672    public static String sha256Hex(final byte[] data) {
    673        return Hex.encodeHexString(sha256(data));
    674    }
    675
    676    /**
    677     * Calculates the SHA-256 digest and returns the value as a hexadecimal string.
    678     *
    679     * @param data Data to digest.
    680     * @return SHA-256 digest as a hexadecimal string.
    681     * @throws IOException On error reading from the stream.
    682     * @since 1.4
    683     */
    684    public static String sha256Hex(final InputStream data) throws IOException {
    685        return Hex.encodeHexString(sha256(data));
    686    }
    687
    688    /**
    689     * Calculates the SHA-256 digest and returns the value as a hexadecimal string.
    690     *
    691     * @param data Data to digest.
    692     * @return SHA-256 digest as a hexadecimal string.
    693     * @since 1.4
    694     */
    695    public static String sha256Hex(final String data) {
    696        return Hex.encodeHexString(sha256(data));
    697    }
    698
    699    /**
    700     * Calculates the SHA3-224 digest and returns the value as a {@code byte[]}.
    701     *
    702     * @param data Data to digest.
    703     * @return SHA3-224 digest.
    704     * @since 1.12
    705     */
    706    public static byte[] sha3_224(final byte[] data) {
    707        return getSha3_224Digest().digest(data);
    708    }
    709
    710    /**
    711     * Calculates the SHA3-224 digest and returns the value as a {@code byte[]}.
    712     *
    713     * @param data Data to digest.
    714     * @return SHA3-224 digest.
    715     * @throws IOException On error reading from the stream.
    716     * @since 1.12
    717     */
    718    public static byte[] sha3_224(final InputStream data) throws IOException {
    719        return digest(getSha3_224Digest(), data);
    720    }
    721
    722    /**
    723     * Calculates the SHA3-224 digest and returns the value as a {@code byte[]}.
    724     *
    725     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    726     * @return SHA3-224 digest.
    727     * @since 1.12
    728     */
    729    public static byte[] sha3_224(final String data) {
    730        return sha3_224(StringUtils.getBytesUtf8(data));
    731    }
    732
    733    /**
    734     * Calculates the SHA3-224 digest and returns the value as a hexadecimal string.
    735     *
    736     * @param data Data to digest.
    737     * @return SHA3-224 digest as a hexadecimal string.
    738     * @since 1.12
    739     */
    740    public static String sha3_224Hex(final byte[] data) {
    741        return Hex.encodeHexString(sha3_224(data));
    742    }
    743
    744    /**
    745     * Calculates the SHA3-224 digest and returns the value as a hexadecimal string.
    746     *
    747     * @param data Data to digest.
    748     * @return SHA3-224 digest as a hexadecimal string.
    749     * @throws IOException On error reading from the stream.
    750     * @since 1.12
    751     */
    752    public static String sha3_224Hex(final InputStream data) throws IOException {
    753        return Hex.encodeHexString(sha3_224(data));
    754    }
    755
    756    /**
    757     * Calculates the SHA3-224 digest and returns the value as a hexadecimal string.
    758     *
    759     * @param data Data to digest.
    760     * @return SHA3-224 digest as a hexadecimal string.
    761     * @since 1.12
    762     */
    763    public static String sha3_224Hex(final String data) {
    764        return Hex.encodeHexString(sha3_224(data));
    765    }
    766
    767    /**
    768     * Calculates the SHA3-256 digest and returns the value as a {@code byte[]}.
    769     *
    770     * @param data Data to digest.
    771     * @return SHA3-256 digest.
    772     * @since 1.12
    773     */
    774    public static byte[] sha3_256(final byte[] data) {
    775        return getSha3_256Digest().digest(data);
    776    }
    777
    778    /**
    779     * Calculates the SHA3-256 digest and returns the value as a {@code byte[]}.
    780     *
    781     * @param data Data to digest.
    782     * @return SHA3-256 digest.
    783     * @throws IOException On error reading from the stream.
    784     * @since 1.12
    785     */
    786    public static byte[] sha3_256(final InputStream data) throws IOException {
    787        return digest(getSha3_256Digest(), data);
    788    }
    789
    790    /**
    791     * Calculates the SHA3-256 digest and returns the value as a {@code byte[]}.
    792     *
    793     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    794     * @return SHA3-256 digest.
    795     * @since 1.12
    796     */
    797    public static byte[] sha3_256(final String data) {
    798        return sha3_256(StringUtils.getBytesUtf8(data));
    799    }
    800
    801    /**
    802     * Calculates the SHA3-256 digest and returns the value as a hexadecimal string.
    803     *
    804     * @param data Data to digest.
    805     * @return SHA3-256 digest as a hexadecimal string.
    806     * @since 1.12
    807     */
    808    public static String sha3_256Hex(final byte[] data) {
    809        return Hex.encodeHexString(sha3_256(data));
    810    }
    811
    812    /**
    813     * Calculates the SHA3-256 digest and returns the value as a hexadecimal string.
    814     *
    815     * @param data Data to digest.
    816     * @return SHA3-256 digest as a hexadecimal string.
    817     * @throws IOException On error reading from the stream.
    818     * @since 1.12
    819     */
    820    public static String sha3_256Hex(final InputStream data) throws IOException {
    821        return Hex.encodeHexString(sha3_256(data));
    822    }
    823
    824    /**
    825     * Calculates the SHA3-256 digest and returns the value as a hexadecimal string.
    826     *
    827     * @param data Data to digest.
    828     * @return SHA3-256 digest as a hexadecimal string.
    829     * @since 1.12
    830     */
    831    public static String sha3_256Hex(final String data) {
    832        return Hex.encodeHexString(sha3_256(data));
    833    }
    834
    835    /**
    836     * Calculates the SHA3-384 digest and returns the value as a {@code byte[]}.
    837     *
    838     * @param data Data to digest.
    839     * @return SHA3-384 digest.
    840     * @since 1.12
    841     */
    842    public static byte[] sha3_384(final byte[] data) {
    843        return getSha3_384Digest().digest(data);
    844    }
    845
    846    /**
    847     * Calculates the SHA3-384 digest and returns the value as a {@code byte[]}.
    848     *
    849     * @param data Data to digest.
    850     * @return SHA3-384 digest.
    851     * @throws IOException On error reading from the stream.
    852     * @since 1.12
    853     */
    854    public static byte[] sha3_384(final InputStream data) throws IOException {
    855        return digest(getSha3_384Digest(), data);
    856    }
    857
    858    /**
    859     * Calculates the SHA3-384 digest and returns the value as a {@code byte[]}.
    860     *
    861     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    862     * @return SHA3-384 digest.
    863     * @since 1.12
    864     */
    865    public static byte[] sha3_384(final String data) {
    866        return sha3_384(StringUtils.getBytesUtf8(data));
    867    }
    868
    869    /**
    870     * Calculates the SHA3-384 digest and returns the value as a hexadecimal string.
    871     *
    872     * @param data Data to digest.
    873     * @return SHA3-384 digest as a hexadecimal string.
    874     * @since 1.12
    875     */
    876    public static String sha3_384Hex(final byte[] data) {
    877        return Hex.encodeHexString(sha3_384(data));
    878    }
    879
    880    /**
    881     * Calculates the SHA3-384 digest and returns the value as a hexadecimal string.
    882     *
    883     * @param data Data to digest.
    884     * @return SHA3-384 digest as a hexadecimal string.
    885     * @throws IOException On error reading from the stream.
    886     * @since 1.12
    887     */
    888    public static String sha3_384Hex(final InputStream data) throws IOException {
    889        return Hex.encodeHexString(sha3_384(data));
    890    }
    891
    892    /**
    893     * Calculates the SHA3-384 digest and returns the value as a hexadecimal string.
    894     *
    895     * @param data Data to digest.
    896     * @return SHA3-384 digest as a hexadecimal string.
    897     * @since 1.12
    898     */
    899    public static String sha3_384Hex(final String data) {
    900        return Hex.encodeHexString(sha3_384(data));
    901    }
    902
    903    /**
    904     * Calculates the SHA3-512 digest and returns the value as a {@code byte[]}.
    905     *
    906     * @param data Data to digest.
    907     * @return SHA3-512 digest.
    908     * @since 1.12
    909     */
    910    public static byte[] sha3_512(final byte[] data) {
    911        return getSha3_512Digest().digest(data);
    912    }
    913
    914    /**
    915     * Calculates the SHA3-512 digest and returns the value as a {@code byte[]}.
    916     *
    917     * @param data Data to digest.
    918     * @return SHA3-512 digest.
    919     * @throws IOException On error reading from the stream.
    920     * @since 1.12
    921     */
    922    public static byte[] sha3_512(final InputStream data) throws IOException {
    923        return digest(getSha3_512Digest(), data);
    924    }
    925
    926    /**
    927     * Calculates the SHA3-512 digest and returns the value as a {@code byte[]}.
    928     *
    929     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    930     * @return SHA3-512 digest.
    931     * @since 1.12
    932     */
    933    public static byte[] sha3_512(final String data) {
    934        return sha3_512(StringUtils.getBytesUtf8(data));
    935    }
    936
    937    /**
    938     * Calculates the SHA3-512 digest and returns the value as a hexadecimal string.
    939     *
    940     * @param data Data to digest.
    941     * @return SHA3-512 digest as a hexadecimal string.
    942     * @since 1.12
    943     */
    944    public static String sha3_512Hex(final byte[] data) {
    945        return Hex.encodeHexString(sha3_512(data));
    946    }
    947
    948    /**
    949     * Calculates the SHA3-512 digest and returns the value as a hexadecimal string.
    950     *
    951     * @param data Data to digest.
    952     * @return SHA3-512 digest as a hexadecimal string.
    953     * @throws IOException On error reading from the stream.
    954     * @since 1.12
    955     */
    956    public static String sha3_512Hex(final InputStream data) throws IOException {
    957        return Hex.encodeHexString(sha3_512(data));
    958    }
    959
    960    /**
    961     * Calculates the SHA3-512 digest and returns the value as a hexadecimal string.
    962     *
    963     * @param data Data to digest.
    964     * @return SHA3-512 digest as a hexadecimal string.
    965     * @since 1.12
    966     */
    967    public static String sha3_512Hex(final String data) {
    968        return Hex.encodeHexString(sha3_512(data));
    969    }
    970
    971    /**
    972     * Calculates the SHA-384 digest and returns the value as a {@code byte[]}.
    973     *
    974     * @param data Data to digest.
    975     * @return SHA-384 digest.
    976     * @since 1.4
    977     */
    978    public static byte[] sha384(final byte[] data) {
    979        return getSha384Digest().digest(data);
    980    }
    981
    982    /**
    983     * Calculates the SHA-384 digest and returns the value as a {@code byte[]}.
    984     *
    985     * @param data Data to digest.
    986     * @return SHA-384 digest.
    987     * @throws IOException On error reading from the stream.
    988     * @since 1.4
    989     */
    990    public static byte[] sha384(final InputStream data) throws IOException {
    991        return digest(getSha384Digest(), data);
    992    }
    993
    994    /**
    995     * Calculates the SHA-384 digest and returns the value as a {@code byte[]}.
    996     *
    997     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    998     * @return SHA-384 digest.
    999     * @since 1.4
    1000     */
    1001    public static byte[] sha384(final String data) {
    1002        return sha384(StringUtils.getBytesUtf8(data));
    1003    }
    1004
    1005    /**
    1006     * Calculates the SHA-384 digest and returns the value as a hexadecimal string.
    1007     *
    1008     * @param data Data to digest.
    1009     * @return SHA-384 digest as a hexadecimal string.
    1010     * @since 1.4
    1011     */
    1012    public static String sha384Hex(final byte[] data) {
    1013        return Hex.encodeHexString(sha384(data));
    1014    }
    1015
    1016    /**
    1017     * Calculates the SHA-384 digest and returns the value as a hexadecimal string.
    1018     *
    1019     * @param data Data to digest.
    1020     * @return SHA-384 digest as a hexadecimal string.
    1021     * @throws IOException On error reading from the stream.
    1022     * @since 1.4
    1023     */
    1024    public static String sha384Hex(final InputStream data) throws IOException {
    1025        return Hex.encodeHexString(sha384(data));
    1026    }
    1027
    1028    /**
    1029     * Calculates the SHA-384 digest and returns the value as a hexadecimal string.
    1030     *
    1031     * @param data Data to digest.
    1032     * @return SHA-384 digest as a hexadecimal string.
    1033     * @since 1.4
    1034     */
    1035    public static String sha384Hex(final String data) {
    1036        return Hex.encodeHexString(sha384(data));
    1037    }
    1038
    1039    /**
    1040     * Calculates the SHA-512 digest and returns the value as a {@code byte[]}.
    1041     *
    1042     * @param data Data to digest.
    1043     * @return SHA-512 digest.
    1044     * @since 1.4
    1045     */
    1046    public static byte[] sha512(final byte[] data) {
    1047        return getSha512Digest().digest(data);
    1048    }
    1049
    1050    /**
    1051     * Calculates the SHA-512 digest and returns the value as a {@code byte[]}.
    1052     *
    1053     * @param data Data to digest.
    1054     * @return SHA-512 digest.
    1055     * @throws IOException On error reading from the stream.
    1056     * @since 1.4
    1057     */
    1058    public static byte[] sha512(final InputStream data) throws IOException {
    1059        return digest(getSha512Digest(), data);
    1060    }
    1061
    1062    /**
    1063     * Calculates the SHA-512 digest and returns the value as a {@code byte[]}.
    1064     *
    1065     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1066     * @return SHA-512 digest.
    1067     * @since 1.4
    1068     */
    1069    public static byte[] sha512(final String data) {
    1070        return sha512(StringUtils.getBytesUtf8(data));
    1071    }
    1072
    1073    /**
    1074     * Calculates the SHA-512/224 digest and returns the value as a {@code byte[]}.
    1075     *
    1076     * @param data Data to digest.
    1077     * @return SHA-512/224 digest.
    1078     * @since 1.14
    1079     */
    1080    public static byte[] sha512_224(final byte[] data) {
    1081        return getSha512_224Digest().digest(data);
    1082    }
    1083
    1084    /**
    1085     * Calculates the SHA-512/224 digest and returns the value as a {@code byte[]}.
    1086     *
    1087     * @param data Data to digest.
    1088     * @return SHA-512/224 digest.
    1089     * @throws IOException On error reading from the stream.
    1090     * @since 1.14
    1091     */
    1092    public static byte[] sha512_224(final InputStream data) throws IOException {
    1093        return digest(getSha512_224Digest(), data);
    1094    }
    1095
    1096    /**
    1097     * Calculates the SHA-512/224 digest and returns the value as a {@code byte[]}.
    1098     *
    1099     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1100     * @return SHA-512/224 digest.
    1101     * @since 1.14
    1102     */
    1103    public static byte[] sha512_224(final String data) {
    1104        return sha512_224(StringUtils.getBytesUtf8(data));
    1105    }
    1106
    1107    /**
    1108     * Calculates the SHA-512/224 digest and returns the value as a hexadecimal string.
    1109     *
    1110     * @param data Data to digest.
    1111     * @return SHA-512/224 digest as a hexadecimal string.
    1112     * @since 1.14
    1113     */
    1114    public static String sha512_224Hex(final byte[] data) {
    1115        return Hex.encodeHexString(sha512_224(data));
    1116    }
    1117
    1118    /**
    1119     * Calculates the SHA-512/224 digest and returns the value as a hexadecimal string.
    1120     *
    1121     * @param data Data to digest.
    1122     * @return SHA-512/224 digest as a hexadecimal string.
    1123     * @throws IOException On error reading from the stream.
    1124     * @since 1.14
    1125     */
    1126    public static String sha512_224Hex(final InputStream data) throws IOException {
    1127        return Hex.encodeHexString(sha512_224(data));
    1128    }
    1129
    1130    /**
    1131     * Calculates the SHA-512/224 digest and returns the value as a hexadecimal string.
    1132     *
    1133     * @param data Data to digest.
    1134     * @return SHA-512/224 digest as a hexadecimal string.
    1135     * @since 1.14
    1136     */
    1137    public static String sha512_224Hex(final String data) {
    1138        return Hex.encodeHexString(sha512_224(data));
    1139    }
    1140
    1141    /**
    1142     * Calculates the SHA-512/256 digest and returns the value as a {@code byte[]}.
    1143     *
    1144     * @param data Data to digest.
    1145     * @return SHA-512/256 digest.
    1146     * @since 1.14
    1147     */
    1148    public static byte[] sha512_256(final byte[] data) {
    1149        return getSha512_256Digest().digest(data);
    1150    }
    1151
    1152    /**
    1153     * Calculates the SHA-512/256 digest and returns the value as a {@code byte[]}.
    1154     *
    1155     * @param data Data to digest.
    1156     * @return SHA-512/256 digest.
    1157     * @throws IOException On error reading from the stream.
    1158     * @since 1.14
    1159     */
    1160    public static byte[] sha512_256(final InputStream data) throws IOException {
    1161        return digest(getSha512_256Digest(), data);
    1162    }
    1163
    1164    /**
    1165     * Calculates the SHA-512/256 digest and returns the value as a {@code byte[]}.
    1166     *
    1167     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1168     * @return SHA-512/224 digest.
    1169     * @since 1.14
    1170     */
    1171    public static byte[] sha512_256(final String data) {
    1172        return sha512_256(StringUtils.getBytesUtf8(data));
    1173    }
    1174
    1175    /**
    1176     * Calculates the SHA-512/256 digest and returns the value as a hexadecimal string.
    1177     *
    1178     * @param data Data to digest.
    1179     * @return SHA-512/256 digest as a hexadecimal string.
    1180     * @since 1.14
    1181     */
    1182    public static String sha512_256Hex(final byte[] data) {
    1183        return Hex.encodeHexString(sha512_256(data));
    1184    }
    1185
    1186    /**
    1187     * Calculates the SHA-512/256 digest and returns the value as a hexadecimal string.
    1188     *
    1189     * @param data Data to digest.
    1190     * @return SHA-512/256 digest as a hexadecimal string.
    1191     * @throws IOException On error reading from the stream.
    1192     * @since 1.14
    1193     */
    1194    public static String sha512_256Hex(final InputStream data) throws IOException {
    1195        return Hex.encodeHexString(sha512_256(data));
    1196    }
    1197
    1198    /**
    1199     * Calculates the SHA-512/256 digest and returns the value as a hexadecimal string.
    1200     *
    1201     * @param data Data to digest.
    1202     * @return SHA-512/256 digest as a hexadecimal string.
    1203     * @since 1.14
    1204     */
    1205    public static String sha512_256Hex(final String data) {
    1206        return Hex.encodeHexString(sha512_256(data));
    1207    }
    1208
    1209    /**
    1210     * Calculates the SHA-512 digest and returns the value as a hexadecimal string.
    1211     *
    1212     * @param data Data to digest.
    1213     * @return SHA-512 digest as a hexadecimal string.
    1214     * @since 1.4
    1215     */
    1216    public static String sha512Hex(final byte[] data) {
    1217        return Hex.encodeHexString(sha512(data));
    1218    }
    1219
    1220    /**
    1221     * Calculates the SHA-512 digest and returns the value as a hexadecimal string.
    1222     *
    1223     * @param data Data to digest.
    1224     * @return SHA-512 digest as a hexadecimal string.
    1225     * @throws IOException On error reading from the stream.
    1226     * @since 1.4
    1227     */
    1228    public static String sha512Hex(final InputStream data) throws IOException {
    1229        return Hex.encodeHexString(sha512(data));
    1230    }
    1231
    1232    /**
    1233     * Calculates the SHA-512 digest and returns the value as a hexadecimal string.
    1234     *
    1235     * @param data Data to digest.
    1236     * @return SHA-512 digest as a hexadecimal string.
    1237     * @since 1.4
    1238     */
    1239    public static String sha512Hex(final String data) {
    1240        return Hex.encodeHexString(sha512(data));
    1241    }
    1242
    1243    /**
    1244     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    1245     *
    1246     * @param data Data to digest.
    1247     * @return SHA-1 digest as a hexadecimal string.
    1248     * @deprecated (1.11) Use {@link #sha1Hex(byte[])}
    1249     */
    1250    @Deprecated
    1251    public static String shaHex(final byte[] data) {
    1252        return sha1Hex(data);
    1253    }
    1254
    1255    /**
    1256     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    1257     *
    1258     * @param data Data to digest.
    1259     * @return SHA-1 digest as a hexadecimal string.
    1260     * @throws IOException On error reading from the stream.
    1261     * @since 1.4
    1262     * @deprecated (1.11) Use {@link #sha1Hex(InputStream)}
    1263     */
    1264    @Deprecated
    1265    public static String shaHex(final InputStream data) throws IOException {
    1266        return sha1Hex(data);
    1267    }
    1268
    1269    /**
    1270     * Calculates the SHA-1 digest and returns the value as a hexadecimal string.
    1271     *
    1272     * @param data Data to digest.
    1273     * @return SHA-1 digest as a hexadecimal string.
    1274     * @deprecated (1.11) Use {@link #sha1Hex(String)}
    1275     */
    1276    @Deprecated
    1277    public static String shaHex(final String data) {
    1278        return sha1Hex(data);
    1279    }
    1280
    1281    /**
    1282     * Calculates the SHAKE128-256 digest and returns the value as a {@code byte[]}.
    1283     * <p>
    1284     * SHAKE128-256 produces a 256 bit digest.
    1285     * </p>
    1286     *
    1287     * @param data Data to digest.
    1288     * @return A 256 bit SHAKE128-256 digest.
    1289     * @since 1.20.0
    1290     */
    1291    public static byte[] shake128_256(final byte[] data) {
    1292        return getShake128_256Digest().digest(data);
    1293    }
    1294
    1295    /**
    1296     * Calculates the SHAKE128-256 digest and returns the value as a {@code byte[]}.
    1297     *
    1298     * @param data Data to digest.
    1299     * @return A 256 bit SHAKE128-256 digest.
    1300     * @throws IOException On error reading from the stream.
    1301     * @since 1.20.0
    1302     */
    1303    public static byte[] shake128_256(final InputStream data) throws IOException {
    1304        return digest(getShake128_256Digest(), data);
    1305    }
    1306
    1307    /**
    1308     * Calculates the SHAKE128-256 digest and returns the value as a {@code byte[]}.
    1309     *
    1310     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1311     * @return SHAKE128-256 digest.
    1312     * @since 1.20.0
    1313     */
    1314    public static byte[] shake128_256(final String data) {
    1315        return shake128_256(StringUtils.getBytesUtf8(data));
    1316    }
    1317
    1318    /**
    1319     * Calculates the SHAKE128-256 digest and returns the value as a hexadecimal string.
    1320     *
    1321     * @param data Data to digest.
    1322     * @return SHAKE128-256 digest as a hexadecimal string.
    1323     * @since 1.20.0
    1324     */
    1325    public static String shake128_256Hex(final byte[] data) {
    1326        return Hex.encodeHexString(shake128_256(data));
    1327    }
    1328
    1329    /**
    1330     * Calculates the SHAKE128-256 digest and returns the value as a hexadecimal string.
    1331     *
    1332     * @param data Data to digest.
    1333     * @return SHAKE128-256 digest as a hexadecimal string.
    1334     * @throws IOException On error reading from the stream.
    1335     * @since 1.20.0
    1336     */
    1337    public static String shake128_256Hex(final InputStream data) throws IOException {
    1338        return Hex.encodeHexString(shake128_256(data));
    1339    }
    1340
    1341    /**
    1342     * Calculates the SHAKE128-256 digest and returns the value as a hexadecimal string.
    1343     *
    1344     * @param data Data to digest.
    1345     * @return SHAKE128-256 digest as a hexadecimal string.
    1346     * @since 1.20.0
    1347     */
    1348    public static String shake128_256Hex(final String data) {
    1349        return Hex.encodeHexString(shake128_256(data));
    1350    }
    1351
    1352    /**
    1353     * Calculates the SHAKE256-512 digest and returns the value as a {@code byte[]}.
    1354     *
    1355     * @param data Data to digest.
    1356     * @return SHAKE256-512 digest.
    1357     * @since 1.20.0
    1358     */
    1359    public static byte[] shake256_512(final byte[] data) {
    1360        return getShake256_512Digest().digest(data);
    1361    }
    1362
    1363    /**
    1364     * Calculates the SHAKE256-512 digest and returns the value as a {@code byte[]}.
    1365     *
    1366     * @param data Data to digest.
    1367     * @return SHAKE256-512 digest.
    1368     * @throws IOException On error reading from the stream.
    1369     * @since 1.20.0
    1370     */
    1371    public static byte[] shake256_512(final InputStream data) throws IOException {
    1372        return digest(getShake256_512Digest(), data);
    1373    }
    1374
    1375    /**
    1376     * Calculates the SHAKE256-512 digest and returns the value as a {@code byte[]}.
    1377     *
    1378     * @param data Data to digest; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1379     * @return SHAKE256-512 digest.
    1380     * @since 1.20.0
    1381     */
    1382    public static byte[] shake256_512(final String data) {
    1383        return shake256_512(StringUtils.getBytesUtf8(data));
    1384    }
    1385
    1386    /**
    1387     * Calculates the SHAKE256-512 digest and returns the value as a hexadecimal string.
    1388     *
    1389     * @param data Data to digest.
    1390     * @return SHAKE256-512 digest as a hexadecimal string.
    1391     * @since 1.20.0
    1392     */
    1393    public static String shake256_512Hex(final byte[] data) {
    1394        return Hex.encodeHexString(shake256_512(data));
    1395    }
    1396
    1397    /**
    1398     * Calculates the SHAKE256-512 digest and returns the value as a hexadecimal string.
    1399     *
    1400     * @param data Data to digest.
    1401     * @return SHAKE256-512 digest as a hexadecimal string.
    1402     * @throws IOException On error reading from the stream.
    1403     * @since 1.20.0
    1404     */
    1405    public static String shake256_512Hex(final InputStream data) throws IOException {
    1406        return Hex.encodeHexString(shake256_512(data));
    1407    }
    1408
    1409    /**
    1410     * Calculates the SHAKE256-512 digest and returns the value as a hexadecimal string.
    1411     *
    1412     * @param data Data to digest.
    1413     * @return SHAKE256-512 digest as a hexadecimal string.
    1414     * @since 1.20.0
    1415     */
    1416    public static String shake256_512Hex(final String data) {
    1417        return Hex.encodeHexString(shake256_512(data));
    1418    }
    1419
    1420    /**
    1421     * Updates the given {@link MessageDigest}.
    1422     *
    1423     * @param messageDigest the {@link MessageDigest} to update.
    1424     * @param valueToDigest the value to update the {@link MessageDigest} with.
    1425     * @return the updated {@link MessageDigest}.
    1426     * @since 1.7
    1427     */
    1428    public static MessageDigest updateDigest(final MessageDigest messageDigest, final byte[] valueToDigest) {
    1429        messageDigest.update(valueToDigest);
    1430        return messageDigest;
    1431    }
    1432
    1433    /**
    1434     * Updates the given {@link MessageDigest}.
    1435     *
    1436     * @param messageDigest the {@link MessageDigest} to update.
    1437     * @param valueToDigest the value to update the {@link MessageDigest} with.
    1438     * @return the updated {@link MessageDigest}.
    1439     * @since 1.11
    1440     */
    1441    public static MessageDigest updateDigest(final MessageDigest messageDigest, final ByteBuffer valueToDigest) {
    1442        messageDigest.update(valueToDigest);
    1443        return messageDigest;
    1444    }
    1445
    1446    /**
    1447     * Reads through a File and updates the digest for the data
    1448     *
    1449     * @param digest The MessageDigest to use (for example MD5).
    1450     * @param data   Data to digest.
    1451     * @return the digest.
    1452     * @throws IOException On error reading from the stream.
    1453     * @since 1.11
    1454     */
    1455    public static MessageDigest updateDigest(final MessageDigest digest, final File data) throws IOException {
    1456        return updateDigest(digest, data.toPath());
    1457    }
    1458
    1459    /**
    1460     * Reads through a FileChannel and updates the digest for the data using non-blocking-io (NIO).
    1461     *
    1462     * TODO Decide if this should be public.
    1463     *
    1464     * @param digest The MessageDigest to use (for example MD5).
    1465     * @param data   Data to digest.
    1466     * @return the digest.
    1467     * @throws IOException On error reading from the stream.
    1468     * @since 1.14
    1469     */
    1470    private static MessageDigest updateDigest(final MessageDigest digest, final FileChannel data) throws IOException {
    1471        final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    1472        while (data.read(buffer) > 0) {
    1473            buffer.flip();
    1474            digest.update(buffer);
    1475            buffer.clear();
    1476        }
    1477        return digest;
    1478    }
    1479
    1480    /**
    1481     * Reads through an InputStream and updates the digest for the data
    1482     *
    1483     * @param digest      The MessageDigest to use (for example MD5).
    1484     * @param inputStream Data to digest.
    1485     * @return the digest.
    1486     * @throws IOException On error reading from the stream.
    1487     * @since 1.8
    1488     */
    1489    public static MessageDigest updateDigest(final MessageDigest digest, final InputStream inputStream) throws IOException {
    1490        final byte[] buffer = new byte[BUFFER_SIZE];
    1491        int read = inputStream.read(buffer, 0, BUFFER_SIZE);
    1492        while (read > -1) {
    1493            digest.update(buffer, 0, read);
    1494            read = inputStream.read(buffer, 0, BUFFER_SIZE);
    1495        }
    1496        return digest;
    1497    }
    1498
    1499    /**
    1500     * Reads through a Path and updates the digest for the data
    1501     *
    1502     * @param digest  The MessageDigest to use (for example MD5).
    1503     * @param path    Data to digest.
    1504     * @param options options How to open the file.
    1505     * @return the digest.
    1506     * @throws IOException On error reading from the stream.
    1507     * @since 1.14
    1508     */
    1509    public static MessageDigest updateDigest(final MessageDigest digest, final Path path, final OpenOption... options) throws IOException {
    1510        try (BufferedInputStream inputStream = new BufferedInputStream(Files.newInputStream(path, options))) {
    1511            return updateDigest(digest, inputStream);
    1512        }
    1513    }
    1514
    1515    /**
    1516     * Reads through a RandomAccessFile and updates the digest for the data using non-blocking-io (NIO)
    1517     *
    1518     * @param digest The MessageDigest to use (for example MD5).
    1519     * @param data   Data to digest.
    1520     * @return the digest.
    1521     * @throws IOException On error reading from the stream.
    1522     * @since 1.14
    1523     */
    1524    @SuppressWarnings("resource") // Closing RandomAccessFile closes the channel.
    1525    public static MessageDigest updateDigest(final MessageDigest digest, final RandomAccessFile data) throws IOException {
    1526        return updateDigest(digest, data.getChannel());
    1527    }
    1528
    1529    /**
    1530     * Updates the given {@link MessageDigest} from a String (converted to bytes using UTF-8).
    1531     * <p>
    1532     * To update the digest using a different charset for the conversion, convert the String to a byte array using
    1533     * {@link String#getBytes(java.nio.charset.Charset)} and pass that to the {@link DigestUtils#updateDigest(MessageDigest, byte[])} method
    1534     *
    1535     * @param messageDigest the {@link MessageDigest} to update.
    1536     * @param valueToDigest the value to update the {@link MessageDigest} with; converted to bytes using {@link StringUtils#getBytesUtf8(String)}.
    1537     * @return the updated {@link MessageDigest}.
    1538     * @since 1.7
    1539     */
    1540    public static MessageDigest updateDigest(final MessageDigest messageDigest, final String valueToDigest) {
    1541        messageDigest.update(StringUtils.getBytesUtf8(valueToDigest));
    1542        return messageDigest;
    1543    }
    1544
    1545    private final MessageDigest messageDigest;
    1546
    1547    /**
    1548     * Preserves binary compatibility only. As for previous versions does not provide useful behavior
    1549     *
    1550     * @deprecated Since 1.11; only useful to preserve binary compatibility.
    1551     */
    1552    @Deprecated
    1553    public DigestUtils() {
    1554        this.messageDigest = null;
    1555    }
    1556
    1557    /**
    1558     * Creates an instance using the provided {@link MessageDigest} parameter.
    1559     *
    1560     * This can then be used to create digests using methods such as {@link #digest(byte[])} and {@link #digestAsHex(File)}.
    1561     *
    1562     * @param digest the {@link MessageDigest} to use.
    1563     * @since 1.11
    1564     */
    1565    public DigestUtils(final MessageDigest digest) {
    1566        this.messageDigest = digest;
    1567    }
    1568
    1569    /**
    1570     * Creates an instance using the provided {@link MessageDigest} parameter.
    1571     *
    1572     * This can then be used to create digests using methods such as {@link #digest(byte[])} and {@link #digestAsHex(File)}.
    1573     *
    1574     * @param name the name of the {@link MessageDigest} to use.
    1575     * @see #getDigest(String)
    1576     * @throws IllegalArgumentException when a {@link NoSuchAlgorithmException} is caught.
    1577     * @since 1.11
    1578     */
    1579    public DigestUtils(final String name) {
    1580        this(getDigest(name));
    1581    }
    1582
    1583    /**
    1584     * Reads through a byte array and returns the digest for the data.
    1585     *
    1586     * @param data Data to digest.
    1587     * @return the digest.
    1588     * @since 1.11
    1589     */
    1590    public byte[] digest(final byte[] data) {
    1591        return updateDigest(messageDigest, data).digest();
    1592    }
    1593
    1594    /**
    1595     * Reads through a ByteBuffer and returns the digest for the data
    1596     *
    1597     * @param data Data to digest.
    1598     * @return the digest.
    1599     * @since 1.11
    1600     */
    1601    public byte[] digest(final ByteBuffer data) {
    1602        return updateDigest(messageDigest, data).digest();
    1603    }
    1604
    1605    /**
    1606     * Reads through a File and returns the digest for the data
    1607     *
    1608     * @param data Data to digest.
    1609     * @return the digest.
    1610     * @throws IOException On error reading from the stream.
    1611     * @since 1.11
    1612     */
    1613    public byte[] digest(final File data) throws IOException {
    1614        return updateDigest(messageDigest, data).digest();
    1615    }
    1616
    1617    /**
    1618     * Reads through an InputStream and returns the digest for the data
    1619     *
    1620     * @param data Data to digest.
    1621     * @return the digest.
    1622     * @throws IOException On error reading from the stream.
    1623     * @since 1.11
    1624     */
    1625    public byte[] digest(final InputStream data) throws IOException {
    1626        return updateDigest(messageDigest, data).digest();
    1627    }
    1628
    1629    /**
    1630     * Reads through a File and returns the digest for the data
    1631     *
    1632     * @param data    Data to digest.
    1633     * @param options options How to open the file.
    1634     * @return the digest.
    1635     * @throws IOException On error reading from the stream.
    1636     * @since 1.14
    1637     */
    1638    public byte[] digest(final Path data, final OpenOption... options) throws IOException {
    1639        return updateDigest(messageDigest, data, options).digest();
    1640    }
    1641
    1642    /**
    1643     * Reads through a byte array and returns the digest for the data.
    1644     *
    1645     * @param data Data to digest treated as UTF-8 string.
    1646     * @return the digest.
    1647     * @since 1.11
    1648     */
    1649    public byte[] digest(final String data) {
    1650        return updateDigest(messageDigest, data).digest();
    1651    }
    1652
    1653    /**
    1654     * Reads through a byte array and returns the digest for the data.
    1655     *
    1656     * @param data Data to digest.
    1657     * @return the digest as a hexadecimal string.
    1658     * @since 1.11
    1659     */
    1660    public String digestAsHex(final byte[] data) {
    1661        return Hex.encodeHexString(digest(data));
    1662    }
    1663
    1664    /**
    1665     * Reads through a ByteBuffer and returns the digest for the data
    1666     *
    1667     * @param data Data to digest.
    1668     * @return the digest as a hexadecimal string.
    1669     * @since 1.11
    1670     */
    1671    public String digestAsHex(final ByteBuffer data) {
    1672        return Hex.encodeHexString(digest(data));
    1673    }
    1674
    1675    /**
    1676     * Reads through a File and returns the digest for the data
    1677     *
    1678     * @param data Data to digest.
    1679     * @return the digest as a hexadecimal string.
    1680     * @throws IOException On error reading from the stream.
    1681     * @since 1.11
    1682     */
    1683    public String digestAsHex(final File data) throws IOException {
    1684        return Hex.encodeHexString(digest(data));
    1685    }
    1686
    1687    /**
    1688     * Reads through an InputStream and returns the digest for the data
    1689     *
    1690     * @param data Data to digest.
    1691     * @return the digest as a hexadecimal string.
    1692     * @throws IOException On error reading from the stream.
    1693     * @since 1.11
    1694     */
    1695    public String digestAsHex(final InputStream data) throws IOException {
    1696        return Hex.encodeHexString(digest(data));
    1697    }
    1698
    1699    /**
    1700     * Reads through a File and returns the digest for the data
    1701     *
    1702     * @param data    Data to digest.
    1703     * @param options options How to open the file.
    1704     * @return the digest as a hexadecimal string.
    1705     * @throws IOException On error reading from the stream.
    1706     * @since 1.11
    1707     */
    1708    public String digestAsHex(final Path data, final OpenOption... options) throws IOException {
    1709        return Hex.encodeHexString(digest(data, options));
    1710    }
    1711
    1712    /**
    1713     * Reads through a byte array and returns the digest for the data.
    1714     *
    1715     * @param data Data to digest treated as UTF-8 string.
    1716     * @return the digest as a hexadecimal string.
    1717     * @since 1.11
    1718     */
    1719    public String digestAsHex(final String data) {
    1720        return Hex.encodeHexString(digest(data));
    1721    }
    1722
    1723    /**
    1724     * Returns the message digest instance.
    1725     *
    1726     * @return the message digest instance.
    1727     * @since 1.11
    1728     */
    1729    public MessageDigest getMessageDigest() {
    1730        return messageDigest;
    1731    }
    1732
    1733}