MessageDigest.java revision 51b1b6997fd3f980076b8081f7f1165ccc2a4008
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() {
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ByteArrayOutputStream baos = new ByteArrayOutputStream();
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        PrintStream p = new PrintStream(baos);
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        p.print(algorithm+" Message Digest from "+provider.getName()+", ");
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        switch (state) {
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case INITIAL:
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            p.print("<initialized>");
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case IN_PROGRESS:
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            p.print("<in progress>");
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        p.println();
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (baos.toString());
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares two digests for equality. Does a simple byte compare.
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param digesta one of the digests to compare.
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param digestb the other digest to compare.
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return true if the digests are equal, false otherwise.
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static boolean isEqual(byte[] digesta, byte[] digestb) {
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (digesta.length != digestb.length) {
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int result = 0;
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // time-constant comparison
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < digesta.length; i++) {
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            result |= digesta[i] ^ digestb[i];
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return result == 0;
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Resets the digest for further use.
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void reset() {
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        engineReset();
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        state = INITIAL;
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a string that identifies the algorithm, independent of
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implementation details. The name should be a standard
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Java Security name (such as "SHA", "MD5", and so on).
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * See the MessageDigest section in the <a href=
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "{@docRoot}/../technotes/guides/security/StandardNames.html#MessageDigest">
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for information about standard algorithm names.
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the name of the algorithm
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final String getAlgorithm() {
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this.algorithm;
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the length of the digest in bytes, or 0 if this operation is
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * not supported by the provider and the implementation is not cloneable.
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the digest length in bytes, or 0 if this operation is not
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * supported by the provider and the implementation is not cloneable.
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final int getDigestLength() {
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int digestLen = engineGetDigestLength();
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (digestLen == 0) {
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                MessageDigest md = (MessageDigest)clone();
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                byte[] digest = md.digest();
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return digest.length;
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (CloneNotSupportedException e) {
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return digestLen;
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return digestLen;
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a clone if the implementation is cloneable.
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a clone if the implementation is cloneable.
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception CloneNotSupportedException if this is called on an
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implementation that does not support <code>Cloneable</code>.
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object clone() throws CloneNotSupportedException {
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (this instanceof Cloneable) {
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return super.clone();
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new CloneNotSupportedException();
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The following class allows providers to extend from MessageDigestSpi
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rather than from MessageDigest. It represents a MessageDigest with an
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * encapsulated, provider-supplied SPI object (of type MessageDigestSpi).
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If the provider implementation is an instance of MessageDigestSpi,
51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the getInstance() methods above return an instance of this class, with
51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the SPI object encapsulated.
51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Note: All SPI methods from the original MessageDigest class have been
51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * moved up the hierarchy into a new class (MessageDigestSpi), which has
51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * been interposed in the hierarchy between the API (MessageDigest)
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and its original parent (Object).
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static class Delegate extends MessageDigest {
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // The provider implementation (delegate)
52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        private MessageDigestSpi digestSpi;
52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // constructor
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        public Delegate(MessageDigestSpi digestSpi, String algorithm) {
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            super(algorithm);
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            this.digestSpi = digestSpi;
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /**
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * Returns a clone if the delegate is cloneable.
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         *
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * @return a clone if the delegate is cloneable.
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         *
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * @exception CloneNotSupportedException if this is called on a
53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * delegate that does not support <code>Cloneable</code>.
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         */
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        public Object clone() throws CloneNotSupportedException {
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (digestSpi instanceof Cloneable) {
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                MessageDigestSpi digestSpiClone =
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    (MessageDigestSpi)digestSpi.clone();
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // Because 'algorithm', 'provider', and 'state' are private
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // members of our supertype, we must perform a cast to
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // access them.
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                MessageDigest that =
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    new Delegate(digestSpiClone,
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                 ((MessageDigest)this).algorithm);
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                that.provider = ((MessageDigest)this).provider;
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                that.state = ((MessageDigest)this).state;
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return that;
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                throw new CloneNotSupportedException();
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected int engineGetDigestLength() {
56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return digestSpi.engineGetDigestLength();
56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected void engineUpdate(byte input) {
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            digestSpi.engineUpdate(input);
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected void engineUpdate(byte[] input, int offset, int len) {
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            digestSpi.engineUpdate(input, offset, len);
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected void engineUpdate(ByteBuffer input) {
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            digestSpi.engineUpdate(input);
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected byte[] engineDigest() {
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return digestSpi.engineDigest();
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected int engineDigest(byte[] buf, int offset, int len)
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws DigestException {
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return digestSpi.engineDigest(buf, offset, len);
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected void engineReset() {
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            digestSpi.engineReset();
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
589