001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package java.security;
028:
029: /**
030: * This MessageDigest class provides applications the functionality of a
031: * message digest algorithm, such as MD5 or SHA.
032: * Message digests are secure one-way hash functions that take arbitrary-sized
033: * data and output a fixed-length hash value.
034: *
035: * <p>A <code>MessageDigest</code> object starts out initialized. The data is
036: * processed through it using the <code>update</code>
037: * method. At any point {@link #reset() reset} can be called
038: * to reset the digest. Once all the data to be updated has been
039: * updated, the <code>digest</code> method should
040: * be called to complete the hash computation.
041: *
042: * <p>The <code>digest</code> method can be called once for a given number
043: * of updates. After <code>digest</code> has been called,
044: * the <code>MessageDigest</code>
045: * object is reset to its initialized state.
046: */
047:
048: public abstract class MessageDigest {
049:
050: /**
051: * Message digest implementation.
052: */
053: com.sun.midp.crypto.MessageDigest messageDigest;
054:
055: /**
056: * Creates a message digest with the specified algorithm name.
057: *
058: * @param algorithm the standard name of the digest algorithm.
059: * See Appendix A in the
060: * Java Cryptography Architecture API Specification & Reference
061: * for information about standard algorithm names.
062: */
063: MessageDigest(String algorithm) {
064: }
065:
066: /**
067: * Generates a <code>MessageDigest</code> object that implements
068: * the specified digest
069: * algorithm.
070: *
071: * @param algorithm the name of the algorithm requested.
072: * See Appendix A in the
073: * Java Cryptography Architecture API Specification & Reference
074: * for information about standard algorithm names.
075: *
076: * @return a MessageDigest object implementing the specified
077: * algorithm.
078: *
079: * @exception NoSuchAlgorithmException if the algorithm is
080: * not available in the caller's environment.
081: */
082: public static MessageDigest getInstance(String algorithm)
083: throws NoSuchAlgorithmException {
084:
085: try {
086: return new MessageDigestImpl(algorithm,
087: com.sun.midp.crypto.MessageDigest
088: .getInstance(algorithm));
089: } catch (com.sun.midp.crypto.NoSuchAlgorithmException e) {
090: throw new NoSuchAlgorithmException(e.getMessage());
091: }
092: }
093:
094: /**
095: * Updates the digest using the specified array of bytes, starting
096: * at the specified offset.
097: *
098: * @param input the array of bytes.
099: *
100: * @param offset the offset to start from in the array of bytes.
101: *
102: * @param len the number of bytes to use, starting at
103: * <code>offset</code>.
104: */
105: public void update(byte[] input, int offset, int len) {
106: messageDigest.update(input, offset, len);
107: }
108:
109: /**
110: * Completes the hash computation by performing final operations
111: * such as padding. The digest is reset after this call is made.
112: *
113: * @param buf output buffer for the computed digest
114: *
115: * @param offset offset into the output buffer to begin storing the digest
116: *
117: * @param len number of bytes within buf allotted for the digest
118: *
119: * @return the number of bytes placed into <code>buf</code>
120: *
121: * @exception DigestException if an error occurs.
122: */
123: public int digest(byte[] buf, int offset, int len)
124: throws DigestException {
125: try {
126: return messageDigest.digest(buf, offset, len);
127: } catch (com.sun.midp.crypto.DigestException e) {
128: throw new DigestException(e.getMessage());
129: }
130: }
131:
132: /**
133: * Resets the digest for further use.
134: */
135: public void reset() {
136: messageDigest.reset();
137: }
138: }
139:
140: /**
141: * The non-abstract MessageDigest.
142: */
143: class MessageDigestImpl extends MessageDigest {
144:
145: /**
146: * Creates a message digest with the specified algorithm name.
147: *
148: * @param algorithm the standard name of the digest algorithm.
149: * See Appendix A in the
150: * Java Cryptography Architecture API Specification & Reference
151: * for information about standard algorithm names.
152: * @param messageDigest MessageDigest implementation
153: */
154: MessageDigestImpl(String algorithm,
155: com.sun.midp.crypto.MessageDigest messageDigest) {
156: super(algorithm);
157: this.messageDigest = messageDigest;
158: }
159: }
|