/*
* 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.util.Arrays;
import javax.crypto.interfaces.DHPublicKey;
/** @author George Politis */
public class DataMessage extends AbstractEncodedMessage {
// Fields.
public byte[] mac;
public byte[] oldMACKeys;
public int flags;
public int senderKeyID;
public int recipientKeyID;
public DHPublicKey nextDH;
public byte[] ctr;
public byte[] encryptedMessage;
// Ctor.
public DataMessage(int protocolVersion, int flags, int senderKeyID, int recipientKeyID,
DHPublicKey nextDH, byte[] ctr, byte[] encryptedMessage, byte[] mac, byte[] oldMacKeys) {
super(MESSAGE_DATA, protocolVersion);
this.flags = flags;
this.senderKeyID = senderKeyID;
this.recipientKeyID = recipientKeyID;
this.nextDH = nextDH;
this.ctr = ctr;
this.encryptedMessage = encryptedMessage;
this.mac = mac;
this.oldMACKeys = oldMacKeys;
}
public DataMessage(MysteriousT t, byte[] mac, byte[] oldMacKeys) {
this(t.protocolVersion, t.flags, t.senderKeyID, t.recipientKeyID, t.nextDH, t.ctr,
t.encryptedMessage, mac, oldMacKeys);
}
// Methods.
public MysteriousT getT() {
return new MysteriousT(protocolVersion, flags, senderKeyID, recipientKeyID, nextDH, ctr,
encryptedMessage);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Arrays.hashCode(ctr);
result = prime * result + Arrays.hashCode(encryptedMessage);
result = prime * result + flags;
result = prime * result + Arrays.hashCode(mac);
// TODO: Needs work.
result = prime * result + ((nextDH == null) ? 0 : nextDH.hashCode());
result = prime * result + Arrays.hashCode(oldMACKeys);
result = prime * result + recipientKeyID;
result = prime * result + senderKeyID;
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;
DataMessage other = (DataMessage) obj;
if (!Arrays.equals(ctr, other.ctr))
return false;
if (!Arrays.equals(encryptedMessage, other.encryptedMessage))
return false;
if (flags != other.flags)
return false;
if (!Arrays.equals(mac, other.mac))
return false;
if (nextDH == null) {
if (other.nextDH != null)
return false;
} else if (!nextDH.equals(other.nextDH))
return false;
if (!Arrays.equals(oldMACKeys, other.oldMACKeys))
return false;
if (recipientKeyID != other.recipientKeyID)
return false;
if (senderKeyID != other.senderKeyID)
return false;
return true;
}
}