From db254a977b40c4ba3e176dbf6d57aa079f67433c Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 3 Mar 2024 22:34:09 -0800 Subject: [PATCH] fix long credentials on 11/2000 --- src/ReceiveCommands.cc | 52 +++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index a664af9a..a02d728e 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -564,9 +564,17 @@ static void on_90_DC(shared_ptr c, uint16_t, uint32_t, string& data) { c->config.set_flags_for_version(c->version(), -1); c->log.info("Game version changed to DC_V1"); - uint32_t serial_number = stoul(cmd.serial_number.decode(), nullptr, 16); + string serial_number_str = cmd.serial_number.decode(); + string access_key_str = cmd.access_key.decode(); + uint32_t serial_number = 0; try { - shared_ptr l = s->license_index->verify_v1_v2(serial_number, cmd.access_key.decode(), ""); + shared_ptr l; + if (serial_number_str.size() > 8 || access_key_str.size() > 8) { + l = s->license_index->verify_dc_nte(serial_number_str, access_key_str); + } else { + serial_number = stoull(serial_number_str, nullptr, 16); + l = s->license_index->verify_v1_v2(serial_number, access_key_str, ""); + } c->set_license(l); send_command(c, 0x90, 0x02); @@ -586,8 +594,18 @@ static void on_90_DC(shared_ptr c, uint16_t, uint32_t, string& data) { } else { c->config.set_flag(Client::Flag::LICENSE_WAS_CREATED); auto l = s->license_index->create_license(); - l->serial_number = serial_number; - l->access_key = cmd.access_key.decode(); + if (serial_number_str.size() > 8 || access_key_str.size() > 8) { + l->dc_nte_serial_number = serial_number_str; + l->dc_nte_access_key = access_key_str; + l->serial_number = fnv1a32(l->dc_nte_serial_number) & 0x7FFFFFFF; + } else if (serial_number != 0) { + l->serial_number = serial_number; + l->access_key = cmd.access_key.decode(); + } else { + send_command(c, 0x90, 0x03); + c->should_disconnect = true; + return; + } s->license_index->add(l); if (!s->is_replay) { l->save(); @@ -621,9 +639,17 @@ static void on_93_DC(shared_ptr c, uint16_t, uint32_t, string& data) { set_console_client_flags(c, cmd.sub_version); } - uint32_t serial_number = stoul(cmd.serial_number.decode(), nullptr, 16); + string serial_number_str = cmd.serial_number.decode(); + string access_key_str = cmd.access_key.decode(); + uint32_t serial_number = 0; try { - shared_ptr l = s->license_index->verify_v1_v2(serial_number, cmd.access_key.decode(), cmd.name.decode()); + shared_ptr l; + if (serial_number_str.size() > 8 || access_key_str.size() > 8) { + l = s->license_index->verify_dc_nte(serial_number_str, access_key_str); + } else { + serial_number = stoull(serial_number_str, nullptr, 16); + l = s->license_index->verify_v1_v2(serial_number, access_key_str, cmd.name.decode()); + } c->set_license(l); } catch (const LicenseIndex::no_username& e) { @@ -644,8 +670,18 @@ static void on_93_DC(shared_ptr c, uint16_t, uint32_t, string& data) { } else { c->config.set_flag(Client::Flag::LICENSE_WAS_CREATED); auto l = s->license_index->create_license(); - l->serial_number = serial_number; - l->access_key = cmd.access_key.decode(); + if (serial_number_str.size() > 8 || access_key_str.size() > 8) { + l->dc_nte_serial_number = serial_number_str; + l->dc_nte_access_key = access_key_str; + l->serial_number = fnv1a32(l->dc_nte_serial_number) & 0x7FFFFFFF; + } else if (serial_number != 0) { + l->serial_number = serial_number; + l->access_key = cmd.access_key.decode(); + } else { + send_command(c, 0x90, 0x03); + c->should_disconnect = true; + return; + } s->license_index->add(l); if (!s->is_replay) { l->save();