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}