package org.graylog2.syslog4j.impl.message.modifier.hash;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import org.graylog2.syslog4j.SyslogIF;
import org.graylog2.syslog4j.SyslogRuntimeException;
import org.graylog2.syslog4j.impl.message.modifier.AbstractSyslogMessageModifier;
import org.graylog2.syslog4j.util.Base64;
import org.graylog2.syslog4j.util.SyslogUtility;
/**
* HashSyslogMessageModifier is an implementation of SyslogMessageModifierIF
* that provides support for Java Cryptographic hashes (MD5, SHA1, SHA256, etc.).
* <p/>
* <p>Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
* of the LGPL license is available in the META-INF folder in all
* distributions of Syslog4j and in the base directory of the "doc" ZIP.</p>
*
* @author <syslog4j@productivity.org>
* @version $Id: HashSyslogMessageModifier.java,v 1.5 2010/10/28 05:10:57 cvs Exp $
*/
public class HashSyslogMessageModifier extends AbstractSyslogMessageModifier {
private static final long serialVersionUID = 7335757344826206953L;
protected HashSyslogMessageModifierConfig config = null;
public static final HashSyslogMessageModifier createMD5() {
HashSyslogMessageModifier md5 = new HashSyslogMessageModifier(HashSyslogMessageModifierConfig.createMD5());
return md5;
}
public static final HashSyslogMessageModifier createSHA1() {
HashSyslogMessageModifier sha1 = new HashSyslogMessageModifier(HashSyslogMessageModifierConfig.createSHA1());
return sha1;
}
public static final HashSyslogMessageModifier createSHA160() {
return createSHA1();
}
public static final HashSyslogMessageModifier createSHA256() {
HashSyslogMessageModifier sha256 = new HashSyslogMessageModifier(HashSyslogMessageModifierConfig.createSHA256());
return sha256;
}
public static final HashSyslogMessageModifier createSHA384() {
HashSyslogMessageModifier sha384 = new HashSyslogMessageModifier(HashSyslogMessageModifierConfig.createSHA384());
return sha384;
}
public static final HashSyslogMessageModifier createSHA512() {
HashSyslogMessageModifier sha512 = new HashSyslogMessageModifier(HashSyslogMessageModifierConfig.createSHA512());
return sha512;
}
public HashSyslogMessageModifier(HashSyslogMessageModifierConfig config) throws SyslogRuntimeException {
super(config);
this.config = config;
if (this.config == null) {
throw new SyslogRuntimeException("Hash config object cannot be null");
}
if (this.config.getHashAlgorithm() == null) {
throw new SyslogRuntimeException("Hash algorithm cannot be null");
}
try {
MessageDigest.getInstance(config.getHashAlgorithm());
} catch (NoSuchAlgorithmException nsae) {
throw new SyslogRuntimeException(nsae);
}
}
protected MessageDigest obtainMessageDigest() {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance(this.config.getHashAlgorithm());
} catch (NoSuchAlgorithmException nsae) {
throw new SyslogRuntimeException(nsae);
}
return digest;
}
public HashSyslogMessageModifierConfig getConfig() {
return this.config;
}
public String modify(SyslogIF syslog, int facility, int level, String message) {
byte[] messageBytes = SyslogUtility.getBytes(syslog.getConfig(), message);
MessageDigest digest = obtainMessageDigest();
byte[] digestBytes = digest.digest(messageBytes);
String digestString = Base64.encodeBytes(digestBytes, Base64.DONT_BREAK_LINES);
StringBuffer buffer = new StringBuffer(message);
buffer.append(this.config.getPrefix());
buffer.append(digestString);
buffer.append(this.config.getSuffix());
return buffer.toString();
}
public boolean verify(String message, String base64Hash) {
byte[] hash = Base64.decode(base64Hash);
return verify(message, hash);
}
public boolean verify(String message, byte[] hash) {
byte[] messageBytes = SyslogUtility.getBytes(this.config, message);
MessageDigest digest = obtainMessageDigest();
byte[] digestBytes = digest.digest(messageBytes);
return Arrays.equals(digestBytes, hash);
}
}