- /*
 - * @(#)DigestOutputStream.java 1.28 00/02/02
 - *
 - * Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
 - *
 - * This software is the proprietary information of Sun Microsystems, Inc.
 - * Use is subject to license terms.
 - *
 - */
 - package java.security;
 - import java.io.IOException;
 - import java.io.EOFException;
 - import java.io.OutputStream;
 - import java.io.FilterOutputStream;
 - import java.io.PrintStream;
 - import java.io.ByteArrayOutputStream;
 - /**
 - * A transparent stream that updates the associated message digest using
 - * the bits going through the stream.
 - *
 - * <p>To complete the message digest computation, call one of the
 - * <code>digest</code> methods on the associated message
 - * digest after your calls to one of this digest ouput stream's
 - * {@link #write(int) write} methods.
 - *
 - * <p>It is possible to turn this stream on or off (see
 - * {@link #on(boolean) on}). When it is on, a call to one of the
 - * <code>write</code> methods results in
 - * an update on the message digest. But when it is off, the message
 - * digest is not updated. The default is for the stream to be on.
 - *
 - * @see MessageDigest
 - * @see DigestInputStream
 - *
 - * @version 1.28 00/02/02
 - * @author Benjamin Renaud
 - */
 - public class DigestOutputStream extends FilterOutputStream {
 - private boolean on = true;
 - /**
 - * The message digest associated with this stream.
 - */
 - protected MessageDigest digest;
 - /**
 - * Creates a digest output stream, using the specified output stream
 - * and message digest.
 - *
 - * @param stream the output stream.
 - *
 - * @param digest the message digest to associate with this stream.
 - */
 - public DigestOutputStream(OutputStream stream, MessageDigest digest) {
 - super(stream);
 - setMessageDigest(digest);
 - }
 - /**
 - * Returns the message digest associated with this stream.
 - *
 - * @return the message digest associated with this stream.
 - * @see #setMessageDigest(java.security.MessageDigest)
 - */
 - public MessageDigest getMessageDigest() {
 - return digest;
 - }
 - /**
 - * Associates the specified message digest with this stream.
 - *
 - * @param digest the message digest to be associated with this stream.
 - * @see #getMessageDigest()
 - */
 - public void setMessageDigest(MessageDigest digest) {
 - this.digest = digest;
 - }
 - /**
 - * Updates the message digest (if the digest function is on) using
 - * the specified byte, and in any case writes the byte
 - * to the output stream. That is, if the digest function is on
 - * (see {@link #on(boolean) on}), this method calls
 - * <code>update</code> on the message digest associated with this
 - * stream, passing it the byte <code>b</code>. This method then
 - * writes the byte to the output stream, blocking until the byte
 - * is actually written.
 - *
 - * @param b the byte to be used for updating and writing to the
 - * output stream.
 - *
 - * @exception IOException if an I/O error occurs.
 - *
 - * @see MessageDigest#update(byte)
 - */
 - public void write(int b) throws IOException {
 - if (on) {
 - digest.update((byte)b);
 - }
 - out.write(b);
 - }
 - /**
 - * Updates the message digest (if the digest function is on) using
 - * the specified subarray, and in any case writes the subarray to
 - * the output stream. That is, if the digest function is on (see
 - * {@link #on(boolean) on}), this method calls <code>update</code>
 - * on the message digest associated with this stream, passing it
 - * the subarray specifications. This method then writes the subarray
 - * bytes to the output stream, blocking until the bytes are actually
 - * written.
 - *
 - * @param b the array containing the subarray to be used for updating
 - * and writing to the output stream.
 - *
 - * @param off the offset into <code>b</code> of the first byte to
 - * be updated and written.
 - *
 - * @param len the number of bytes of data to be updated and written
 - * from <code>b</code>, starting at offset <code>off</code>.
 - *
 - * @exception IOException if an I/O error occurs.
 - *
 - * @see MessageDigest#update(byte[], int, int)
 - */
 - public void write(byte[] b, int off, int len) throws IOException {
 - if (on) {
 - digest.update(b, off, len);
 - }
 - out.write(b, off, len);
 - }
 - /**
 - * Turns the digest function on or off. The default is on. When
 - * it is on, a call to one of the <code>write</code> methods results in an
 - * update on the message digest. But when it is off, the message
 - * digest is not updated.
 - *
 - * @param on true to turn the digest function on, false to turn it
 - * off.
 - */
 - public void on(boolean on) {
 - this.on = on;
 - }
 - /**
 - * Prints a string representation of this digest output stream and
 - * its associated message digest object.
 - */
 - public String toString() {
 - return "[Digest Output Stream] " + digest.toString();
 - }
 - }