001: /*
002: * @(#)DigestOutputStream.java 1.34 06/10/10
003: *
004: * Copyright 1990-2006 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:
028: package java.security;
029:
030: import java.io.IOException;
031: import java.io.EOFException;
032: import java.io.OutputStream;
033: import java.io.FilterOutputStream;
034: import java.io.PrintStream;
035: import java.io.ByteArrayOutputStream;
036:
037: /**
038: * A transparent stream that updates the associated message digest using
039: * the bits going through the stream.
040: *
041: * <p>To complete the message digest computation, call one of the
042: * <code>digest</code> methods on the associated message
043: * digest after your calls to one of this digest ouput stream's
044: * {@link #write(int) write} methods.
045: *
046: * <p>It is possible to turn this stream on or off (see
047: * {@link #on(boolean) on}). When it is on, a call to one of the
048: * <code>write</code> methods results in
049: * an update on the message digest. But when it is off, the message
050: * digest is not updated. The default is for the stream to be on.
051: *
052: * @see MessageDigest
053: * @see DigestInputStream
054: *
055: * @version 1.28 00/02/02
056: * @author Benjamin Renaud
057: */
058: public class DigestOutputStream extends FilterOutputStream {
059:
060: private boolean on = true;
061:
062: /**
063: * The message digest associated with this stream.
064: */
065: protected MessageDigest digest;
066:
067: /**
068: * Creates a digest output stream, using the specified output stream
069: * and message digest.
070: *
071: * @param stream the output stream.
072: *
073: * @param digest the message digest to associate with this stream.
074: */
075: public DigestOutputStream(OutputStream stream, MessageDigest digest) {
076: super (stream);
077: setMessageDigest(digest);
078: }
079:
080: /**
081: * Returns the message digest associated with this stream.
082: *
083: * @return the message digest associated with this stream.
084: * @see #setMessageDigest(java.security.MessageDigest)
085: */
086: public MessageDigest getMessageDigest() {
087: return digest;
088: }
089:
090: /**
091: * Associates the specified message digest with this stream.
092: *
093: * @param digest the message digest to be associated with this stream.
094: * @see #getMessageDigest()
095: */
096: public void setMessageDigest(MessageDigest digest) {
097: this .digest = digest;
098: }
099:
100: /**
101: * Updates the message digest (if the digest function is on) using
102: * the specified byte, and in any case writes the byte
103: * to the output stream. That is, if the digest function is on
104: * (see {@link #on(boolean) on}), this method calls
105: * <code>update</code> on the message digest associated with this
106: * stream, passing it the byte <code>b</code>. This method then
107: * writes the byte to the output stream, blocking until the byte
108: * is actually written.
109: *
110: * @param b the byte to be used for updating and writing to the
111: * output stream.
112: *
113: * @exception IOException if an I/O error occurs.
114: *
115: * @see MessageDigest#update(byte)
116: */
117: public void write(int b) throws IOException {
118: if (on) {
119: digest.update((byte) b);
120: }
121: out.write(b);
122: }
123:
124: /**
125: * Updates the message digest (if the digest function is on) using
126: * the specified subarray, and in any case writes the subarray to
127: * the output stream. That is, if the digest function is on (see
128: * {@link #on(boolean) on}), this method calls <code>update</code>
129: * on the message digest associated with this stream, passing it
130: * the subarray specifications. This method then writes the subarray
131: * bytes to the output stream, blocking until the bytes are actually
132: * written.
133: *
134: * @param b the array containing the subarray to be used for updating
135: * and writing to the output stream.
136: *
137: * @param off the offset into <code>b</code> of the first byte to
138: * be updated and written.
139: *
140: * @param len the number of bytes of data to be updated and written
141: * from <code>b</code>, starting at offset <code>off</code>.
142: *
143: * @exception IOException if an I/O error occurs.
144: *
145: * @see MessageDigest#update(byte[], int, int)
146: */
147: public void write(byte[] b, int off, int len) throws IOException {
148: if (on) {
149: digest.update(b, off, len);
150: }
151: out.write(b, off, len);
152: }
153:
154: /**
155: * Turns the digest function on or off. The default is on. When
156: * it is on, a call to one of the <code>write</code> methods results in an
157: * update on the message digest. But when it is off, the message
158: * digest is not updated.
159: *
160: * @param on true to turn the digest function on, false to turn it
161: * off.
162: */
163: public void on(boolean on) {
164: this .on = on;
165: }
166:
167: /**
168: * Prints a string representation of this digest output stream and
169: * its associated message digest object.
170: */
171: public String toString() {
172: return "[Digest Output Stream] " + digest.toString();
173: }
174: }
|