-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathMD5InputStream.java
More file actions
143 lines (123 loc) · 3.75 KB
/
MD5InputStream.java
File metadata and controls
143 lines (123 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
* @(#)MD5InputStream.java 0.3-3 06/05/2001
*
* This file is part of the HTTPClient package
* Copyright (C) 1996-2001 Ronald Tschal�r
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307, USA
*
* For questions, suggestions, bug-reports, enhancement-requests etc.
* I may be contacted at:
*
* ronald@innovation.ch
*
* The HTTPClient's home page is located at:
*
* http://www.innovation.ch/java/HTTPClient/
*
*/
package HTTPClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.FilterInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* This class calculates a running md5 digest of the data read. When the
* stream is closed the calculated digest is passed to a HashVerifier which
* is expected to verify this digest and to throw an Exception if it fails.
*
* @version 0.3-3 06/05/2001
* @author Ronald Tschal�r
*/
class MD5InputStream extends FilterInputStream
{
private HashVerifier verifier;
private MessageDigest md5;
private long rcvd = 0;
private boolean closed = false;
/**
* @param is the input stream over which the md5 hash is to be calculated
* @param verifier the HashVerifier to invoke when the stream is closed
*/
public MD5InputStream(InputStream is, HashVerifier verifier)
{
super(is);
this.verifier = verifier;
try
{ md5 = MessageDigest.getInstance("MD5"); }
catch (NoSuchAlgorithmException nsae)
{ throw new Error(nsae.toString()); }
}
public synchronized int read() throws IOException
{
int b = in.read();
if (b != -1)
md5.update((byte) b);
else
real_close();
rcvd++;
return b;
}
public synchronized int read(byte[] buf, int off, int len)
throws IOException
{
int num = in.read(buf, off, len);
if (num > 0)
md5.update(buf, off, num);
else
real_close();
rcvd += num;
return num;
}
public synchronized long skip(long num) throws IOException
{
byte[] tmp = new byte[(int) num];
int got = read(tmp, 0, (int) num);
if (got > 0)
return (long) got;
else
return 0L;
}
/**
* Close the stream and check the digest. If the stream has not been
* fully read then the rest of the data will first be read (and discarded)
* to complete the digest calculation.
*
* @exception IOException if the close()'ing the underlying stream throws
* an IOException, or if the expected digest and
* the calculated digest don't match.
*/
public synchronized void close() throws IOException
{
while (skip(10000) > 0) ;
real_close();
}
/**
* Close the stream and check the digest.
*
* @exception IOException if the close()'ing the underlying stream throws
* an IOException, or if the expected digest and
* the calculated digest don't match.
*/
private void real_close() throws IOException
{
if (closed) return;
closed = true;
in.close();
verifier.verifyHash(md5.digest(), rcvd);
}
}