Hi all --

I'm using XStream to process large streams of objects via ObjectInputStream. As one of my requirements, I have to validate the SHA1 digest of the entire stream received against what was sent. To accomplish this, I'd hoped to be able to just wrap the InputStream that gets passed to XStream.getObjectInputStream() with a plain old java.security.DigestInputStream, and read the digest off the stream at the end.

Here's where it gets strange:

InputStream is;
InputStream is2; // Known to feed the same bytes as is.
XStream xstream;

DigestInputStream dis = new DigestInputStream(is, "SHA1");
ObjectInputStream ois = xstream.createObjectInputStream(dis);
while(ois.hasNext()) {
    ois.next();
}
byte[] digest = dis.getDigest().digest();

DigestInputStream dis2 = new DigestInputStream(is2, "SHA1");
while(dis2.read() != -1) {
}
byte[] digest2 = dis2.getDigest().digest();

At this point, digest and digest2 do /not/ contain the same bytes. digest2 jives with what I get from third-party SHA1 tools. I'd really prefer not to have to buffer the whole stream to disk, digest it, and then feed it to xstream: the latency this would introduce is prohibitive.

It's quite possible that I've misunderstood the intent of the API, but if that's the case, I'd be happier hearing it from someone else.

Josh Turner


Reply via email to