/*
* otr4j, the open source java otr library.
*
* Distributable under LGPL license. See terms of license at gnu.org.
*/
package net.java.otr4j.io.messages;
import java.io.IOException;
import java.util.Arrays;
import net.java.otr4j.OtrException;
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
import net.java.otr4j.io.SerializationUtils;
/** @author George Politis */
public class SignatureMessage extends AbstractEncodedMessage {
// Fields.
public byte[] xEncrypted;
public byte[] xEncryptedMAC;
// Ctor.
protected SignatureMessage(int messageType, int protocolVersion, byte[] xEncrypted,
byte[] xEncryptedMAC) {
super(messageType, protocolVersion);
this.xEncrypted = xEncrypted;
this.xEncryptedMAC = xEncryptedMAC;
}
public SignatureMessage(int protocolVersion, byte[] xEncrypted, byte[] xEncryptedMAC) {
this(MESSAGE_SIGNATURE, protocolVersion, xEncrypted, xEncryptedMAC);
}
// Memthods.
public byte[] decrypt(byte[] key) throws OtrException {
return new OtrCryptoEngineImpl().aesDecrypt(key, null, xEncrypted);
}
public boolean verify(byte[] key) throws OtrException {
// Hash the key.
byte[] xbEncrypted;
try {
xbEncrypted = SerializationUtils.writeData(xEncrypted);
} catch (IOException e) {
throw new OtrException(e);
}
byte[] xEncryptedMAC = new OtrCryptoEngineImpl().sha256Hmac160(xbEncrypted, key);
// Verify signature.
return Arrays.equals(this.xEncryptedMAC, xEncryptedMAC);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Arrays.hashCode(xEncrypted);
result = prime * result + Arrays.hashCode(xEncryptedMAC);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
SignatureMessage other = (SignatureMessage) obj;
if (!Arrays.equals(xEncrypted, other.xEncrypted))
return false;
if (!Arrays.equals(xEncryptedMAC, other.xEncryptedMAC))
return false;
return true;
}
}