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