что то я застрял...вроде все нормально, или глаз уже замылен
в общем, делаю реалм...
коннект - отсылаю SMSG_AUTH_CHALLENGE
приходит CMSG_AUTH_SESSION...проверяю, все гуд, sha1 digest совпадает с заданым клиентом...
инициализирую криптосистему сессионным ключом
отсылаю SMSG_AUTH_RESPONSE
отсылаю SMSG_ADDON_INFO
а в ответ тишина, только через секунд 10 клиент шлет пакет( нормально не расшифровывается) и разрывает соединение.
Чувствую ошибка в кодировании(декодировании) заголовка...
в HmacSHA1 ну не может быть ошибки...стандартная 3 строчки кода.
в SARC4 использовал реализацию от JCE...не прокатило, на просторах гугла нарыл частную реализацию...заголовки как и положено уходят кодированными в 4 байта ( первые маленькие)...но клиент молчит
Crypt
Код:
package org.wowemu.realm.network.crypt;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.log4j.Logger;
public class Crypt {
private static final Logger log = Logger
.getLogger(Crypt.class);
byte[] ServerEncryptionKey = { (byte) 0xCC, (byte)0x98, (byte)0xAE, 0x04,
(byte)0xE8, (byte)0x97, (byte)0xEA, (byte)0xCA, 0x12,
(byte)0xDD, (byte)0xC0, (byte)0x93, 0x42, (byte)0x91, 0x53,
0x57 };
byte[] ServerDecryptionKey = { (byte) 0xC2, (byte) 0xB3, 0x72, 0x3C, (byte) 0xC6, (byte) 0xAE, (byte) 0xD9,
(byte) 0xB5, 0x34, 0x3C, 0x53, (byte) 0xEE, 0x2F, 0x43, 0x67, (byte) 0xCE };
private boolean isEnabled = false;
private SARC4 _clientDecrypt = new SARC4();
private SARC4 _serverEncrypt = new SARC4();
public Crypt() {
}
public byte[] decrypt(byte[] data) {
if (!isEnabled)
return data;
return _clientDecrypt.Update(data);
}
public byte[] encrypt(byte[] data) {
if (!isEnabled)
return data;
return _serverEncrypt.Update(data);
}
public void init(byte[] key){
byte[] encryptHash = getKey(ServerEncryptionKey,key);
_clientDecrypt.init(encryptHash);
byte[] decryptHash = getKey(ServerDecryptionKey,key);
_serverEncrypt.init(decryptHash);
byte[] tar = new byte[1024];
for(int i = 0; i < tar.length; i++)
{
tar[i] = 0;
}
_serverEncrypt.Update(tar);
for(int i = 0; i < tar.length; i++)
{
tar[i] = 0;
}
_clientDecrypt.Update(tar);
this.isEnabled = true;
}
private byte[] getKey(byte[] EncryptionKey,byte[] key) {
SecretKeySpec ds = new SecretKeySpec(EncryptionKey, "HmacSHA1");
Mac m;
try {
m = Mac.getInstance("HmacSHA1");
m.init(ds);
return m.doFinal(key);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
SARC4
Код:
package org.wowemu.realm.network.crypt;
public class SARC4 {
private byte state[] = new byte[256];
private int x;
private int y;
public boolean init(byte[] key) {
for (int i=0; i < 256; i++) {
state[i] = (byte)i;
}
x = 0;
y = 0;
int index1 = 0;
int index2 = 0;
byte tmp;
if (key == null || key.length == 0) {
throw new NullPointerException();
}
for (int i=0; i < 256; i++) {
index2 = ((key[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff;
tmp = state[i];
state[i] = state[index2];
state[index2] = tmp;
index1 = (index1 + 1) % key.length;
}
return true;
}
public byte[] Update(byte[] buf){
int xorIndex;
byte tmp;
if (buf == null) {
return null;
}
byte[] result = new byte[buf.length];
for (int i=0; i < buf.length; i++) {
x = (x + 1) & 0xff;
y = ((state[x] & 0xff) + y) & 0xff;
tmp = state[x];
state[x] = state[y];
state[y] = tmp;
xorIndex = ((state[x] &0xff) + (state[y] & 0xff)) & 0xff;
result[i] = (byte)(buf[i] ^ state[xorIndex]);
}
return result;
}
}
может кто увидит ошибку? а то меня уже колбасит