package org.graylog2.syslog4j.impl.message.modifier.mac;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.Mac;
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;
/**
* MacSyslogMessageModifier is an implementation of SyslogMessageModifierIF
* that provides support for Java Cryptographic signed hashes (HmacSHA1, 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: MacSyslogMessageModifier.java,v 1.5 2010/10/28 05:10:57 cvs Exp $
*/
public class MacSyslogMessageModifier extends AbstractSyslogMessageModifier {
private static final long serialVersionUID = 5054979194802197540L;
protected MacSyslogMessageModifierConfig config = null;
protected Mac mac = null;
public MacSyslogMessageModifier(MacSyslogMessageModifierConfig config) throws SyslogRuntimeException {
super(config);
this.config = config;
try {
this.mac = Mac.getInstance(config.getMacAlgorithm());
this.mac.init(config.getKey());
} catch (NoSuchAlgorithmException nsae) {
throw new SyslogRuntimeException(nsae);
} catch (InvalidKeyException ike) {
throw new SyslogRuntimeException(ike);
}
}
public static MacSyslogMessageModifier createHmacSHA1(Key key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA1(key));
}
public static MacSyslogMessageModifier createHmacSHA1(String base64Key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA1(base64Key));
}
public static MacSyslogMessageModifier createHmacSHA256(Key key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA256(key));
}
public static MacSyslogMessageModifier createHmacSHA256(String base64Key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA256(base64Key));
}
public static MacSyslogMessageModifier createHmacSHA512(Key key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA512(key));
}
public static MacSyslogMessageModifier createHmacSHA512(String base64Key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacSHA512(base64Key));
}
public static MacSyslogMessageModifier createHmacMD5(Key key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacMD5(key));
}
public static MacSyslogMessageModifier createHmacMD5(String base64Key) {
return new MacSyslogMessageModifier(MacSyslogMessageModifierConfig.createHmacMD5(base64Key));
}
public MacSyslogMessageModifierConfig getConfig() {
return this.config;
}
public String modify(SyslogIF syslog, int facility, int level, String message) {
synchronized (this.mac) {
byte[] messageBytes = SyslogUtility.getBytes(syslog.getConfig(), message);
StringBuffer buffer = new StringBuffer(message);
byte[] macBytes = this.mac.doFinal(messageBytes);
String macString = Base64.encodeBytes(macBytes, Base64.DONT_BREAK_LINES);
buffer.append(this.config.getPrefix());
buffer.append(macString);
buffer.append(this.config.getSuffix());
return buffer.toString();
}
}
public boolean verify(String message, String base64Signature) {
byte[] signature = Base64.decode(base64Signature);
return verify(message, signature);
}
public boolean verify(String message, byte[] signature) {
synchronized (this.mac) {
byte[] messageBytes = SyslogUtility.getBytes(this.config, message);
byte[] macBytes = this.mac.doFinal(messageBytes);
return Arrays.equals(macBytes, signature);
}
}
}