Bonjour, je travaille actuellement sur un bot socket pour dofus 2.54 (dernière version) en c++ et je bloque au moment de l'authentification.
Il me semble faire tout bien comme il faut mais le serveur le répond un IdentificationFailedMessage lorsque je lui envoie mon IdentificationMessage. A part pour les credentials, je suis sûr à 99% que mon message contient les bonnes valeurs. Le cas des credentials est plus compliqué car je peux pas comparer avec mes messages avec ceux envoyés par un client classique, à cause du cryptage RSA. Je vous demande donc de l'aide pour savoir ce que j'ai de faux dans mon calcul des credentials.
Lorsque je me connecte au seveur, je reçois un HelloConnectMessage, avec lequel je récupère la clé publique du serveur (à l'aide de la verification Key du client) et le salt.
Ensuite, je contruis une liste contenant : le Salt, une clé AES de 32 octets générés aléatoirement, la taille du login sur un octet, le login et enfin le password.
Je met tout à la suite sous forme hexadécimale, puis je rajoute en préfixe : 0002XXXXXXXXXXXXXXXX00 avec XX correspondant à un octet aléatoire. Celà correspond (?) à la fonction pkcs1pad de la classe RsaKey (02 correspond au padType).
private function pkcs1pad(src:ByteArray, end:int, n:uint, type:uint = 2) : ByteArray
{
var rng:Random = null;
var x:int = 0;
var out:ByteArray = new ByteArray();
var p:uint = src.position;
end = Math.min(end,src.length,p + n - 11);
src.position = end;
var i:int = end - 1;
while(i >= p && n > 11)
{
out[--n] = src[i--];
}
out[_loc10_] = 0;
if(type == 2)
{
rng = new Random();
x = 0;
while(n > 2)
{
do
{
x = rng.nextByte();
}
while(x == 0);
out[--n] = x;
}
}
else
{
while(n > 2)
{
out[--n] = 255;
}
}
out[_loc11_] = type;
var _loc12_:* = --n;
out[_loc12_] = 0;
return out;
}
Cela me donne donc une chaine de cette forme (avec salt = k861416r4#V?yJ}VZviB9]L~R%&j-`p):
0002527b7cdf7b97d536006b383631343136723423563f794a7d565a766942395d4c7e5225266a2d607029e00b0f3ac5945858d8f7b36199084bd181d34bdde28ece35094b1485e2e9bbc308757365726e616d6570617373776f7264
Enfin, je transforme cette chaine en BigInt et je l'encypte avec la clé RSA : c = (b^E)%N (avec c les credentials, b le BigInt et E et N les caractéristiques de la clé RSA publique du serveur)
J'obtiens donc les credentials, de taille 256, que j'incorpore dans mon IdentificationMessage pour obtenir un message de ce type (les credentials commencent à l'octet 0x4D et finissent à l'octet 0x14C) :
00 00 00 12 00 00 00 03 01 14 01 02
0040 36 10 00 00 01 58 00 00 02 66 72 80 02 12 f3 c5
0050 f4 77 fa 4c a2 9c 22 1c 24 b9 13 b1 f2 2c 1c 2a
0060 62 16 77 a7 0b 8d fe 3d d7 8e f8 df 71 c4 0a 0f
0070 58 85 eb a9 12 fe 73 cc c5 76 b7 2a 80 21 1a b9
0080 09 9e cb ba e4 70 50 05 14 dc 38 df 51 43 3c cd
0090 85 47 aa ab 42 ca af 9b 93 ba af a9 99 d0 b7 01
00a0 91 b0 1f 89 91 31 a5 1e e0 a5 0f 18 f3 ee 11 9e
00b0 aa c8 6a 72 ea f0 51 2e 19 56 9c ca 5a 4f 1e 52
00c0 78 21 31 65 22 34 93 30 d2 b1 89 f8 44 78 57 00
00d0 50 5d 77 4b 96 c7 a4 cf 80 6e 33 91 92 10 fa 59
00e0 8a 58 4b cc dc d6 38 86 32 29 94 98 ed 08 1e b9
00f0 82 92 49 a4 ac 12 b3 71 d8 c5 a6 40 28 4c c0 03
0100 35 86 f6 0b 4f f1 eb 31 9d dd 75 aa 33 a6 0f 4f
0110 91 64 22 f0 4c 25 7d b5 97 7c d5 9b 6c e1 cf fd
0120 1f d7 79 e4 79 96 85 75 b3 78 1c 60 91 22 a8 2a
0130 ba 66 8e 2e 4d 6b ef 1e 8e 2c 9c 02 41 da e9 61
0140 04 21 1b 59 3a 4c 9d a5 5e 62 07 64 10 00 00 00
0150 00 00
J'envoie aussi mon ClientKeyMessage, mais tout ce que je reçois du serveur sont 2 packets de type 10 (LoginQueueStatusMessage) et un paquet de type 20 (IdentificationFailed) qui a pour erreur : 2; WRONG_CREDENTIALS.
Où est mon erreur ? Je me demande si le password est hashé avant le calcul des crédentials mais ca n'a pas l'air d'être le cas.
Sinon je pense m'être trompé sur la compréhension de la fonction pkcs1pad, mais dans ce cas je ne vois vraiment pas ce que j'ai mal compris.
Si vous avez besoin de précisions, n'hésitez sutout pas à me demander.
Merci d'avance ! :)