MessageDigest.java revision f8e1027ce0a759a6669b38830876115c4b77e557
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.security; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.lang.*; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ByteArrayOutputStream; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.PrintStream; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ByteArrayInputStream; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.ByteBuffer; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This MessageDigest class provides applications the functionality of a 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * message digest algorithm, such as SHA-1 or SHA-256. 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Message digests are secure one-way hash functions that take arbitrary-sized 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * data and output a fixed-length hash value. 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>A MessageDigest object starts out initialized. The data is 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * processed through it using the {@link #update(byte) update} 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods. At any point {@link #reset() reset} can be called 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to reset the digest. Once all the data to be updated has been 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * updated, one of the {@link #digest() digest} methods should 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be called to complete the hash computation. 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The <code>digest</code> method can be called once for a given number 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of updates. After <code>digest</code> has been called, the MessageDigest 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object is reset to its initialized state. 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Implementations are free to implement the Cloneable interface. 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Client applications can test cloneability by attempting cloning 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and catching the CloneNotSupportedException: <p> 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* <pre> 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* MessageDigest md = MessageDigest.getInstance("SHA"); 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* try { 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* md.update(toChapter1); 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* MessageDigest tc1 = md.clone(); 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* byte[] toChapter1Digest = tc1.digest(); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* md.update(toChapter2); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* ...etc. 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* } catch (CloneNotSupportedException cnse) { 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* throw new DigestException("couldn't make digest of partial content"); 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* } 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski* </pre> 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Note that if a given implementation is not cloneable, it is 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * still possible to compute intermediate digests by instantiating 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * several instances, if the number of digests is known in advance. 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Note that this class is abstract and extends from 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>MessageDigestSpi</code> for historical reasons. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Application developers should only take notice of the methods defined in 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this <code>MessageDigest</code> class; all the methods in 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the superclass are intended for cryptographic service providers who wish to 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * supply their own implementations of message digest algorithms. 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Every implementation of the Java platform is required to support 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the following standard <code>MessageDigest</code> algorithms: 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul> 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li><tt>MD5</tt></li> 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li><tt>SHA-1</tt></li> 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li><tt>SHA-256</tt></li> 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul> 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * These algorithms are described in the <a href= 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * MessageDigest section</a> of the 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation. 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Consult the release documentation for your implementation to see if any 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * other algorithms are supported. 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Benjamin Renaud 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see DigestInputStream 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see DigestOutputStream 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class MessageDigest extends MessageDigestSpi { 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String algorithm; 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The state of this digest 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int INITIAL = 0; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int IN_PROGRESS = 1; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int state = INITIAL; 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Provider provider; 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a message digest with the specified algorithm name. 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the standard name of the digest algorithm. 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the MessageDigest section in the <a href= 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected MessageDigest(String algorithm) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.algorithm = algorithm; 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a MessageDigest object that implements the specified digest 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method traverses the list of registered security Providers, 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * starting with the most preferred Provider. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A new MessageDigest object encapsulating the 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * MessageDigestSpi implementation from the first 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Provider that supports the specified algorithm is returned. 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm requested. 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the MessageDigest section in the <a href= 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a Message Digest object that implements the specified algorithm. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if no Provider supports a 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * MessageDigestSpi implementation for the 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified algorithm. 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static MessageDigest getInstance(String algorithm) 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException { 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, "MessageDigest", 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (String)null); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (objs[0] instanceof MessageDigest) { 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest md = (MessageDigest)objs[0]; 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski md.provider = (Provider)objs[1]; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return md; 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest delegate = 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Delegate((MessageDigestSpi)objs[0], algorithm); 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski delegate.provider = (Provider)objs[1]; 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return delegate; 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch(NoSuchProviderException e) { 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NoSuchAlgorithmException(algorithm + " not found"); 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a MessageDigest object that implements the specified digest 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm. 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new MessageDigest object encapsulating the 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * MessageDigestSpi implementation from the specified provider 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is returned. The specified provider must be registered 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the security provider list. 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm requested. 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the MessageDigest section in the <a href= 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the name of the provider. 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a MessageDigest object that implements the specified algorithm. 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if a MessageDigestSpi 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * available from the specified provider. 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchProviderException if the specified provider is not 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * registered in the security provider list. 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the provider name is null 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or empty. 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static MessageDigest getInstance(String algorithm, String provider) 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException, NoSuchProviderException 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider == null || provider.length() == 0) 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("missing provider"); 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, "MessageDigest", provider); 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (objs[0] instanceof MessageDigest) { 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest md = (MessageDigest)objs[0]; 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski md.provider = (Provider)objs[1]; 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return md; 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest delegate = 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Delegate((MessageDigestSpi)objs[0], algorithm); 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski delegate.provider = (Provider)objs[1]; 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return delegate; 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a MessageDigest object that implements the specified digest 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm. 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new MessageDigest object encapsulating the 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * MessageDigestSpi implementation from the specified Provider 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object is returned. Note that the specified Provider object 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not have to be registered in the provider list. 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm requested. 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the MessageDigest section in the <a href= 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the provider. 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a MessageDigest object that implements the specified algorithm. 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if a MessageDigestSpi 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not available 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the specified Provider object. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the specified provider is null. 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static MessageDigest getInstance(String algorithm, 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Provider provider) 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider == null) 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("missing provider"); 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, "MessageDigest", provider); 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (objs[0] instanceof MessageDigest) { 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest md = (MessageDigest)objs[0]; 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski md.provider = (Provider)objs[1]; 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return md; 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest delegate = 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Delegate((MessageDigestSpi)objs[0], algorithm); 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski delegate.provider = (Provider)objs[1]; 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return delegate; 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the provider of this message digest object. 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the provider of this message digest object 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final Provider getProvider() { 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.provider; 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the digest using the specified byte. 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param input the byte with which to update the digest. 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(byte input) { 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski engineUpdate(input); 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = IN_PROGRESS; 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the digest using the specified array of bytes, starting 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * at the specified offset. 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param input the array of bytes. 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset the offset to start from in the array of bytes. 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len the number of bytes to use, starting at 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>offset</code>. 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(byte[] input, int offset, int len) { 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (input == null) { 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("No input buffer given"); 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (input.length - offset < len) { 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("Input buffer too short"); 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski engineUpdate(input, offset, len); 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = IN_PROGRESS; 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Updates the digest using the specified array of bytes. 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param input the array of bytes. 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void update(byte[] input) { 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski engineUpdate(input, 0, input.length); 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = IN_PROGRESS; 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Update the digest using the specified ByteBuffer. The digest is 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * updated using the <code>input.remaining()</code> bytes starting 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * at <code>input.position()</code>. 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Upon return, the buffer's position will be equal to its limit; 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * its limit will not have changed. 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param input the ByteBuffer 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void update(ByteBuffer input) { 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (input == null) { 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski engineUpdate(input); 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = IN_PROGRESS; 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Completes the hash computation by performing final operations 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * such as padding. The digest is reset after this call is made. 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the array of bytes for the resulting hash value. 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] digest() { 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Resetting is the responsibility of implementors. */ 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] result = engineDigest(); 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = INITIAL; 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return result; 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Completes the hash computation by performing final operations 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * such as padding. The digest is reset after this call is made. 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param buf output buffer for the computed digest 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset offset into the output buffer to begin storing the digest 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len number of bytes within buf allotted for the digest 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the number of bytes placed into <code>buf</code> 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception DigestException if an error occurs. 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int digest(byte[] buf, int offset, int len) throws DigestException { 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (buf == null) { 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("No output buffer given"); 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (buf.length - offset < len) { 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("Output buffer too small for specified offset and length"); 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int numBytes = engineDigest(buf, offset, len); 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = INITIAL; 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return numBytes; 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Performs a final update on the digest using the specified array 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of bytes, then completes the digest computation. That is, this 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method first calls {@link #update(byte[]) update(input)}, 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * passing the <i>input</i> array to the <code>update</code> method, 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * then calls {@link #digest() digest()}. 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param input the input to be updated before the digest is 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * completed. 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the array of bytes for the resulting hash value. 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] digest(byte[] input) { 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski update(input); 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digest(); 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a string representation of this message digest object. 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 406f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath StringBuilder builder = new StringBuilder(); 407f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append(algorithm); 408f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append(" Message Digest from "); 409f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append(provider.getName()); 410f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append(", "); 411f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (state) { 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case INITIAL: 414f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append("<initialized>"); 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case IN_PROGRESS: 417f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath builder.append("<in progress>"); 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 420f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath 421f8e1027ce0a759a6669b38830876115c4b77e557Narayan Kamath return builder.toString(); 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares two digests for equality. Does a simple byte compare. 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param digesta one of the digests to compare. 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param digestb the other digest to compare. 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if the digests are equal, false otherwise. 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean isEqual(byte[] digesta, byte[] digestb) { 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (digesta.length != digestb.length) { 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int result = 0; 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // time-constant comparison 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < digesta.length; i++) { 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result |= digesta[i] ^ digestb[i]; 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return result == 0; 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Resets the digest for further use. 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void reset() { 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski engineReset(); 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski state = INITIAL; 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a string that identifies the algorithm, independent of 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation details. The name should be a standard 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Security name (such as "SHA", "MD5", and so on). 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the MessageDigest section in the <a href= 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest"> 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the name of the algorithm 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final String getAlgorithm() { 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.algorithm; 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the length of the digest in bytes, or 0 if this operation is 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not supported by the provider and the implementation is not cloneable. 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the digest length in bytes, or 0 if this operation is not 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * supported by the provider and the implementation is not cloneable. 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final int getDigestLength() { 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int digestLen = engineGetDigestLength(); 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (digestLen == 0) { 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest md = (MessageDigest)clone(); 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] digest = md.digest(); 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digest.length; 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (CloneNotSupportedException e) { 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digestLen; 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digestLen; 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a clone if the implementation is cloneable. 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a clone if the implementation is cloneable. 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception CloneNotSupportedException if this is called on an 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation that does not support <code>Cloneable</code>. 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object clone() throws CloneNotSupportedException { 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this instanceof Cloneable) { 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.clone(); 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new CloneNotSupportedException(); 50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The following class allows providers to extend from MessageDigestSpi 51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * rather than from MessageDigest. It represents a MessageDigest with an 51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * encapsulated, provider-supplied SPI object (of type MessageDigestSpi). 51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the provider implementation is an instance of MessageDigestSpi, 51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the getInstance() methods above return an instance of this class, with 51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the SPI object encapsulated. 51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Note: All SPI methods from the original MessageDigest class have been 52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * moved up the hierarchy into a new class (MessageDigestSpi), which has 52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * been interposed in the hierarchy between the API (MessageDigest) 52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and its original parent (Object). 52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static class Delegate extends MessageDigest { 52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider implementation (delegate) 52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private MessageDigestSpi digestSpi; 52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // constructor 53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Delegate(MessageDigestSpi digestSpi, String algorithm) { 53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(algorithm); 53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.digestSpi = digestSpi; 53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a clone if the delegate is cloneable. 53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a clone if the delegate is cloneable. 54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception CloneNotSupportedException if this is called on a 54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * delegate that does not support <code>Cloneable</code>. 54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object clone() throws CloneNotSupportedException { 54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (digestSpi instanceof Cloneable) { 54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigestSpi digestSpiClone = 54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (MessageDigestSpi)digestSpi.clone(); 54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Because 'algorithm', 'provider', and 'state' are private 54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // members of our supertype, we must perform a cast to 55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // access them. 55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MessageDigest that = 55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Delegate(digestSpiClone, 55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((MessageDigest)this).algorithm); 55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski that.provider = ((MessageDigest)this).provider; 55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski that.state = ((MessageDigest)this).state; 55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return that; 55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new CloneNotSupportedException(); 55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int engineGetDigestLength() { 56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digestSpi.engineGetDigestLength(); 56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void engineUpdate(byte input) { 56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski digestSpi.engineUpdate(input); 56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void engineUpdate(byte[] input, int offset, int len) { 57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski digestSpi.engineUpdate(input, offset, len); 57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void engineUpdate(ByteBuffer input) { 57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski digestSpi.engineUpdate(input); 57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected byte[] engineDigest() { 57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digestSpi.engineDigest(); 58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int engineDigest(byte[] buf, int offset, int len) 58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws DigestException { 58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return digestSpi.engineDigest(buf, offset, len); 58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void engineReset() { 58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski digestSpi.engineReset(); 58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 592