Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. @Override
  2. protected boolean doDecode(IoSession session, IoBuffer buffer, ProtocolDecoderOutput out) throws Exception {
  3. LoginStage stage = (LoginStage) session.getAttribute("loginStage", LoginStage.REQUEST);
  4. switch (stage) {
  5. case REQUEST:
  6. if (buffer.remaining() < 2) {
  7. buffer.rewind();
  8. return false;
  9. }
  10. int loginOpcode = buffer.get() & 0xff;
  11. if (loginOpcode != 14) {
  12. session.close(false);
  13. return false;
  14. }
  15. buffer.position(buffer.position() + 1);
  16. int responseCode = 0x0;
  17. long key = random.nextLong();
  18. session.setAttribute("serverKey", key);
  19. session.write(new Streams().put(INITIAL_RESPONSE).put((byte) responseCode).putLong(key).toPacket());
  20. session.setAttribute("loginStage", LoginStage.INFO_BLOCK);
  21. return true;
  22.  
  23. case INFO_BLOCK:
  24. if (buffer.remaining() < 7) {
  25. buffer.rewind();
  26. return false;
  27. }
  28. int sessionStatus = buffer.get() & 0xff;
  29. if (sessionStatus != 16 && sessionStatus != 18) {
  30. session.close(false);
  31. return false;
  32. }
  33. int encryptedBlockSize = (buffer.get() & 0xff) - 40;
  34. int magicId = buffer.get() & 0xff;
  35.  
  36. if (magicId != 255) {
  37. session.close(false);
  38. return false;
  39. }
  40. int clientRevision = buffer.getShort() & 0xffff;
  41. if (clientRevision != 317) {
  42. session.close(false);
  43. return false;
  44. }
  45. buffer.position(buffer.position() + 37);
  46. encryptedBlockSize--;
  47. int reportedSize = buffer.get() & 0xff;
  48. if (reportedSize != encryptedBlockSize) {
  49. buffer.rewind();
  50. return false;
  51. }
  52. int rsaOpcode = buffer.get();
  53. if (rsaOpcode != 10) {
  54. session.close(false);
  55. return false;
  56. }
  57. long clientKey = buffer.getLong();
  58. long serverKey = (Long) session.getAttribute("serverKey");
  59. if (serverKey != buffer.getLong()) {
  60. System.out.println("" + serverKey + " -- ");
  61. session.close(false);
  62. return false;
  63. }
  64. buffer.position(buffer.position() + 4);
  65. String username = ProtocolUtils.getRs2String(buffer);
  66. String password = ProtocolUtils.getRs2String(buffer);
  67.  
  68. Player player = new Player(3200, 3200, 0, username, password);
  69. session.setAttribute("player", player);
  70. World.getInstance().register(player);
  71.  
  72. int[] isaacSeed = new int[] {
  73. (int) (clientKey >> 0x20), (int) clientKey, (int) (serverKey >> 0x20), (int) serverKey
  74. };
  75. session.setAttribute("decrypter", new ISAACCipher(isaacSeed));
  76. for (int i = 0; i < isaacSeed.length; i++)
  77. isaacSeed[i] += 0x32;
  78. session.setAttribute("encrypter", new ISAACCipher(isaacSeed));
  79. session.removeAttribute("loginStage");
  80. session.removeAttribute("serverKey");
  81. session.write(new Streams().put((byte) 2).put((Byte) player.getAttribute("staffStatus")).put((byte) 0).toPacket());
  82. session.getFilterChain().remove("protocol");
  83. session.getFilterChain().addFirst("protocol", new ProtocolCodecFilter(Rs2CodecFactory.GAME));
  84.  
  85. player.setSession(session, true);
  86. player.getSender().sendLogin();
  87. return true;
  88. }
  89. return false;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement