Add LoginStart_Sig, EncryptionResponse_Sig

This commit is contained in:
ice_iix 2022-08-07 12:42:06 -07:00
parent e5547945b1
commit 7531ea7b31
3 changed files with 46 additions and 7 deletions

View File

@ -2359,15 +2359,34 @@ state_packets!(
}
login Login {
serverbound Serverbound {
/// LoginStart is sent immeditately after switching into the login
/// LoginStart is sent immediately after switching into the login
/// state. The passed username is used by the server to authenticate
/// the player in online mode.
packet LoginStart_Sig {
field username: String =,
field has_sign_data: bool =,
field timestamp: Option<u64> = when(|p: &LoginStart_Sig| p.has_sign_data),
field public_key: Option<LenPrefixedBytes<VarInt>> = when(|p: &LoginStart_Sig| p.has_sign_data),
field signature: Option<LenPrefixedBytes<VarInt>> = when(|p: &LoginStart_Sig| p.has_sign_data),
}
packet LoginStart {
field username: String =,
}
/// EncryptionResponse is sent as a reply to EncryptionRequest. All
/// packets following this one must be encrypted with AES/CFB8
/// encryption.
packet EncryptionResponse_Sig {
/// The key for the AES/CFB8 cipher encrypted with the
/// public key
field shared_secret: LenPrefixedBytes<VarInt> =,
/// Whether or not the Verify Token should be sent. If not, then the salt and signature will be sent.
field has_verify_token: bool =,
/// The verify token from the request encrypted with the
/// public key
field verify_token: Option<LenPrefixedBytes<VarInt>> = when(|p: &EncryptionResponse_Sig| p.has_verify_token),
field salt: Option<u64> = when(|p: &EncryptionResponse_Sig| !p.has_verify_token),
field signature: Option<LenPrefixedBytes<VarInt>> = when(|p: &EncryptionResponse_Sig| !p.has_verify_token),
}
packet EncryptionResponse {
/// The key for the AES/CFB8 cipher encrypted with the
/// public key

View File

@ -166,8 +166,8 @@ protocol_packet_ids!(
}
login Login {
serverbound Serverbound {
0x00 => LoginStart
0x01 => EncryptionResponse
0x00 => LoginStart_Sig
0x01 => EncryptionResponse_Sig
0x02 => LoginPluginResponse
}
clientbound Clientbound {

View File

@ -132,9 +132,19 @@ impl Server {
next: protocol::VarInt(2),
})?;
conn.state = protocol::State::Login;
conn.write_packet(protocol::packet::login::serverbound::LoginStart {
username: profile.username.clone(),
})?;
if protocol_version >= 759 {
conn.write_packet(protocol::packet::login::serverbound::LoginStart_Sig {
username: profile.username.clone(),
has_sign_data: false,
public_key: None,
signature: None,
timestamp: None,
})?;
} else {
conn.write_packet(protocol::packet::login::serverbound::LoginStart {
username: profile.username.clone(),
})?;
}
use std::rc::Rc;
let (server_id, public_key, verify_token);
@ -207,7 +217,17 @@ impl Server {
profile.join_server(&server_id, &shared, &public_key)?;
}
if protocol_version >= 47 {
if protocol_version >= 759 {
conn.write_packet(
protocol::packet::login::serverbound::EncryptionResponse_Sig {
shared_secret: protocol::LenPrefixedBytes::new(shared_e),
verify_token: Some(protocol::LenPrefixedBytes::new(token_e)),
has_verify_token: true,
salt: None,
signature: None,
},
)?;
} else if protocol_version >= 47 {
conn.write_packet(protocol::packet::login::serverbound::EncryptionResponse {
shared_secret: protocol::LenPrefixedBytes::new(shared_e),
verify_token: protocol::LenPrefixedBytes::new(token_e),