package com.cwa.msg.mac;
import com.cwa.gamecore.io.GameInput;
import com.cwa.gamecore.util.MessageUtil;
import com.cwa.msg.WrapperRequest;
import java.util.Arrays;
/**
* 带消息验证码(MAC)的请求消息。
*
* MacRequest数据由消息数据和MAC两部分组成,如下所示:
* [消息数据][MAC]
*
* MAC由消息数据和秘密数据摘要产生:
* [消息数据] + [秘密数据] = [MAC]
*/
public abstract class MacRequest extends WrapperRequest {
private byte[] msgData;
private byte[] msgMac;
private byte[] msgMac2; // 服务器计算得到的MAC
/**
* 返回消息数据。
*/
public byte[] getMsgData() {
return msgData;
}
/**
* 返回消息MAC。
*/
public byte[] getMsgMac() {
return msgMac;
}
/**
* 返回服务器计算得到的MAC。
*/
public byte[] getMsgMac2() {
return msgMac2;
}
@Override
public void decodeBody(GameInput in) {
msgData = in.getBytes();
msgMac = in.getBytes();
}
/**
* 验证MAC。
* @param secretData
* @return true 如果验证成功
* false 如果验证失败
*/
public boolean checkMac(byte[] secretData) {
msgMac2 = mac(msgData, secretData);
boolean isMatch = Arrays.equals(msgMac, msgMac2);
if (isMatch) {
// MAC校验通过
wrappedRequest = MessageUtil.decode(msgData);
}
return isMatch;
}
/**
* 计算消息验证码(MAC)。算法由子类确定。
* @param msgData 消息数据
* @param secretData
* @return MAC
*/
protected abstract byte[] mac(byte[] msgData, byte[] secretData);
}