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