001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: /**
019: * @author Vladimir N. Molotkov
020: * @version $Revision$
021: */package java.security;
022:
023: import java.io.FilterInputStream;
024: import java.io.IOException;
025: import java.io.InputStream;
026:
027: /**
028: * @com.intel.drl.spec_ref
029: *
030: */
031: public class DigestInputStream extends FilterInputStream {
032:
033: /**
034: * @com.intel.drl.spec_ref
035: */
036: protected MessageDigest digest;
037:
038: // Indicates whether digest functionality is on or off
039: private boolean isOn = true;
040:
041: /**
042: * @com.intel.drl.spec_ref
043: */
044: public DigestInputStream(InputStream stream, MessageDigest digest) {
045: super (stream);
046: this .digest = digest;
047: }
048:
049: /**
050: * Answers the MessageDigest which the receiver uses when computing the
051: * hash.
052: *
053: *
054: * @return MessageDigest the digest the receiver uses when computing the
055: * hash.
056: *
057: */
058: public MessageDigest getMessageDigest() {
059: return digest;
060: }
061:
062: /**
063: * Sets the MessageDigest which the receiver will use when computing the
064: * hash.
065: *
066: *
067: * @param digest
068: * MessageDigest the digest to use when computing the hash.
069: *
070: * @see MessageDigest
071: * @see #on
072: */
073: public void setMessageDigest(MessageDigest digest) {
074: this .digest = digest;
075: }
076:
077: /**
078: * Reads the next byte and answers it as an int. Updates the digest for the
079: * byte if this function is enabled.
080: *
081: *
082: * @return int the byte which was read or -1 at end of stream.
083: *
084: * @exception java.io.IOException
085: * If reading the source stream causes an IOException.
086: */
087: public int read() throws IOException {
088: // read the next byte
089: int byteRead = in.read();
090: // update digest only if
091: // - digest functionality is on
092: // - eos has not been reached
093: if (isOn && (byteRead != -1)) {
094: digest.update((byte) byteRead);
095: }
096: // return byte read
097: return byteRead;
098: }
099:
100: /**
101: * @com.intel.drl.spec_ref
102: */
103: public int read(byte[] b, int off, int len) throws IOException {
104: // read next up to len bytes
105: int bytesRead = in.read(b, off, len);
106: // update digest only if
107: // - digest functionality is on
108: // - eos has not been reached
109: if (isOn && (bytesRead != -1)) {
110: digest.update(b, off, bytesRead);
111: }
112: // return number of bytes read
113: return bytesRead;
114: }
115:
116: /**
117: * Enables or disables the digest function (default is on).
118: *
119: *
120: * @param on
121: * boolean true if the digest should be computed, and false
122: * otherwise.
123: *
124: * @see MessageDigest
125: */
126: public void on(boolean on) {
127: isOn = on;
128: }
129:
130: /**
131: * Answers a string containing a concise, human-readable description of the
132: * receiver.
133: *
134: *
135: * @return String a printable representation for the receiver.
136: */
137: public String toString() {
138: return super .toString() + ", " + digest.toString() + //$NON-NLS-1$
139: (isOn ? ", is on" : ", is off"); //$NON-NLS-1$ //$NON-NLS-2$
140: }
141: }
|