blob: 9e5fb4604285656c6f443b75f7b1f20a4ddcfafb [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "<WebSig>" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, Institute for
* Data Communications Systems, <http://www.nue.et-inf.uni-siegen.de/>.
* The development of this software was partly funded by the European
* Commission in the <WebSig> project in the ISIS Programme.
* For more information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package ant;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
/**
* Class Md5Task
*
* @author $Author$
* @version $Revision$
*/
public class Md5Task extends Task {
/** Field _md5Str */
private byte[] _md5Str = null;
/** Field _sha1Str */
private byte[] _sha1Str = null;
/** Field _filename */
private String _filename = null;
/**
* Method execute
*
* @throws BuildException
*/
public void execute() throws BuildException {
if ((this._md5Str == null) && (this._sha1Str == null)) {
throw new BuildException(
"You must supply either a SHA1 or MD5 hash value or both, using the Sha1=\"\" and Md5=\"\" attributes");
}
if (this._filename == null) {
throw new BuildException(
"You must supply a file name using the file=\"\" attribute");
}
File f = new File(this._filename);
if (!f.isFile() ||!f.canRead() ||!f.exists()) {
throw new BuildException("Could not open " + this._filename
+ " for reading");
}
try {
byte[] bytes = Md5Task.getBytesFromFile(this._filename);
MessageDigest sha1 = MessageDigest.getInstance("SHA-1", "SUN");
MessageDigest md5 = MessageDigest.getInstance("MD5", "SUN");
sha1.update(bytes);
md5.update(bytes);
byte[] sha1dig = sha1.digest();
byte[] md5dig = md5.digest();
if (!MessageDigest.isEqual(this._sha1Str, sha1dig)
||!MessageDigest.isEqual(this._md5Str, md5dig)) {
System.out.println("Warning!!!");
if (!MessageDigest.isEqual(this._sha1Str, sha1dig)) {
System.out.println("The SHA1 hash value of " + this._filename
+ " is corrupted:");
System.out.println(" was "
+ HexDump.byteArrayToHexString(sha1dig));
System.out
.println(" but should be "
+ HexDump.byteArrayToHexString(this._sha1Str));
System.out.println("");
}
if (!MessageDigest.isEqual(this._md5Str, md5dig)) {
System.out.println("The MD5 hash value of " + this._filename
+ " is corrupted:");
System.out.println(" was "
+ HexDump.byteArrayToHexString(md5dig));
System.out.println(" but should be "
+ HexDump.byteArrayToHexString(this._md5Str));
System.out.println("");
}
throw new BuildException(
"The digest values don't match; possibly the file "
+ this._filename + " was modified during download");
}
System.out.println("The hash values of " + this._filename + " are OK");
} catch (FileNotFoundException ex) {
throw new BuildException(ex.getMessage(), ex);
} catch (IOException ex) {
throw new BuildException(ex.getMessage(), ex);
} catch (NoSuchAlgorithmException ex) {
throw new BuildException(ex.getMessage(), ex);
} catch (NoSuchProviderException ex) {
throw new BuildException(ex.getMessage(), ex);
}
}
/**
* Method getBytesFromFile
*
* @param fileName
*
* @throws FileNotFoundException
* @throws IOException
*/
public static byte[] getBytesFromFile(String fileName)
throws FileNotFoundException, IOException {
byte refBytes[] = null;
{
FileInputStream fisRef = new FileInputStream(fileName);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
while ((len = fisRef.read(buf)) > 0) {
baos.write(buf, 0, len);
}
refBytes = baos.toByteArray();
}
return refBytes;
}
/**
* Method setMd5
*
* @param md5Str
*/
public void setMd5(String md5Str) {
this._md5Str = HexDump.hexStringToByteArray(md5Str);
}
/**
* Method setSha1
*
* @param sha1Str
*/
public void setSha1(String sha1Str) {
this._sha1Str = HexDump.hexStringToByteArray(sha1Str);
}
/**
* Method setFile
*
* @param fileStr
*/
public void setFile(String fileStr) {
this._filename = fileStr;
}
}