Improve AuthKeyHandshake private field names.
This commit is contained in:
parent
040e0deb31
commit
c60693cc7e
|
@ -105,7 +105,7 @@ class DhHandshake {
|
||||||
string prime_str_;
|
string prime_str_;
|
||||||
BigNum prime_;
|
BigNum prime_;
|
||||||
BigNum g_;
|
BigNum g_;
|
||||||
int32 g_int_;
|
int32 g_int_ = 0;
|
||||||
BigNum b_;
|
BigNum b_;
|
||||||
BigNum g_b_;
|
BigNum g_b_;
|
||||||
BigNum g_a_;
|
BigNum g_a_;
|
||||||
|
|
|
@ -53,7 +53,7 @@ bool AuthKeyHandshake::is_ready_for_start() const {
|
||||||
return state_ == Start;
|
return state_ == Start;
|
||||||
}
|
}
|
||||||
bool AuthKeyHandshake::is_ready_for_message(const UInt128 &message_nonce) const {
|
bool AuthKeyHandshake::is_ready_for_message(const UInt128 &message_nonce) const {
|
||||||
return state_ != Finish && state_ != Start && nonce == message_nonce;
|
return state_ != Finish && state_ != Start && nonce_ == message_nonce;
|
||||||
}
|
}
|
||||||
bool AuthKeyHandshake::is_ready_for_finish() const {
|
bool AuthKeyHandshake::is_ready_for_finish() const {
|
||||||
return state_ == Finish;
|
return state_ == Finish;
|
||||||
|
@ -73,11 +73,11 @@ string AuthKeyHandshake::store_object(const mtproto_api::Object &object) {
|
||||||
|
|
||||||
Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRsaKeyInterface *public_rsa_key) {
|
Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRsaKeyInterface *public_rsa_key) {
|
||||||
TRY_RESULT(res_pq, fetch_result<mtproto_api::req_pq_multi>(message, false));
|
TRY_RESULT(res_pq, fetch_result<mtproto_api::req_pq_multi>(message, false));
|
||||||
if (res_pq->nonce_ != nonce) {
|
if (res_pq->nonce_ != nonce_) {
|
||||||
return Status::Error("Nonce mismatch");
|
return Status::Error("Nonce mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
server_nonce = res_pq->server_nonce_;
|
server_nonce_ = res_pq->server_nonce_;
|
||||||
|
|
||||||
auto r_rsa = public_rsa_key->get_rsa(res_pq->server_public_key_fingerprints_);
|
auto r_rsa = public_rsa_key->get_rsa(res_pq->server_public_key_fingerprints_);
|
||||||
if (r_rsa.is_error()) {
|
if (r_rsa.is_error()) {
|
||||||
|
@ -92,16 +92,16 @@ Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRs
|
||||||
return Status::Error("Failed to factorize");
|
return Status::Error("Failed to factorize");
|
||||||
}
|
}
|
||||||
|
|
||||||
Random::secure_bytes(new_nonce.raw, sizeof(new_nonce));
|
Random::secure_bytes(new_nonce_.raw, sizeof(new_nonce_));
|
||||||
|
|
||||||
string data;
|
string data;
|
||||||
switch (mode_) {
|
switch (mode_) {
|
||||||
case Mode::Main:
|
case Mode::Main:
|
||||||
data = store_object(mtproto_api::p_q_inner_data_dc(res_pq->pq_, p, q, nonce, server_nonce, new_nonce, dc_id_));
|
data = store_object(mtproto_api::p_q_inner_data_dc(res_pq->pq_, p, q, nonce_, server_nonce_, new_nonce_, dc_id_));
|
||||||
break;
|
break;
|
||||||
case Mode::Temp:
|
case Mode::Temp:
|
||||||
data = store_object(
|
data = store_object(mtproto_api::p_q_inner_data_temp_dc(res_pq->pq_, p, q, nonce_, server_nonce_, new_nonce_,
|
||||||
mtproto_api::p_q_inner_data_temp_dc(res_pq->pq_, p, q, nonce, server_nonce, new_nonce, dc_id_, expires_in_));
|
dc_id_, expires_in_));
|
||||||
expires_at_ = Time::now() + expires_in_;
|
expires_at_ = Time::now() + expires_in_;
|
||||||
break;
|
break;
|
||||||
case Mode::Unknown:
|
case Mode::Unknown:
|
||||||
|
@ -127,7 +127,7 @@ Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRs
|
||||||
|
|
||||||
// req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long
|
// req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long
|
||||||
// encrypted_data:string = Server_DH_Params
|
// encrypted_data:string = Server_DH_Params
|
||||||
mtproto_api::req_DH_params req_dh_params(nonce, server_nonce, p, q, rsa_fingerprint, encrypted_data);
|
mtproto_api::req_DH_params req_dh_params(nonce_, server_nonce_, p, q, rsa_fingerprint, encrypted_data);
|
||||||
|
|
||||||
send(connection, create_storer(req_dh_params));
|
send(connection, create_storer(req_dh_params));
|
||||||
state_ = ServerDHParams;
|
state_ = ServerDHParams;
|
||||||
|
@ -138,17 +138,19 @@ Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection
|
||||||
TRY_RESULT(dh_params, fetch_result<mtproto_api::req_DH_params>(message, false));
|
TRY_RESULT(dh_params, fetch_result<mtproto_api::req_DH_params>(message, false));
|
||||||
|
|
||||||
// server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;
|
// server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;
|
||||||
if (dh_params->nonce_ != nonce) {
|
if (dh_params->nonce_ != nonce_) {
|
||||||
return Status::Error("Nonce mismatch");
|
return Status::Error("Nonce mismatch");
|
||||||
}
|
}
|
||||||
if (dh_params->server_nonce_ != server_nonce) {
|
if (dh_params->server_nonce_ != server_nonce_) {
|
||||||
return Status::Error("Server nonce mismatch");
|
return Status::Error("Server nonce mismatch");
|
||||||
}
|
}
|
||||||
if (dh_params->encrypted_answer_.size() & 15) {
|
if (dh_params->encrypted_answer_.size() & 15) {
|
||||||
return Status::Error("Bad padding for encrypted part");
|
return Status::Error("Bad padding for encrypted part");
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_KDF(server_nonce, new_nonce, &tmp_aes_key, &tmp_aes_iv);
|
UInt256 tmp_aes_key;
|
||||||
|
UInt256 tmp_aes_iv;
|
||||||
|
tmp_KDF(server_nonce_, new_nonce_, &tmp_aes_key, &tmp_aes_iv);
|
||||||
auto save_tmp_aes_iv = tmp_aes_iv;
|
auto save_tmp_aes_iv = tmp_aes_iv;
|
||||||
// encrypted_answer := AES256_ige_encrypt (answer_with_hash, tmp_aes_key, tmp_aes_iv);
|
// encrypted_answer := AES256_ige_encrypt (answer_with_hash, tmp_aes_key, tmp_aes_iv);
|
||||||
MutableSlice answer(const_cast<char *>(dh_params->encrypted_answer_.begin()), dh_params->encrypted_answer_.size());
|
MutableSlice answer(const_cast<char *>(dh_params->encrypted_answer_.begin()), dh_params->encrypted_answer_.size());
|
||||||
|
@ -179,10 +181,10 @@ Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection
|
||||||
return Status::Error("SHA1 mismatch");
|
return Status::Error("SHA1 mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dh_inner_data.nonce_ != nonce) {
|
if (dh_inner_data.nonce_ != nonce_) {
|
||||||
return Status::Error("Nonce mismatch");
|
return Status::Error("Nonce mismatch");
|
||||||
}
|
}
|
||||||
if (dh_inner_data.server_nonce_ != server_nonce) {
|
if (dh_inner_data.server_nonce_ != server_nonce_) {
|
||||||
return Status::Error("Server nonce mismatch");
|
return Status::Error("Server nonce mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +197,7 @@ Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection
|
||||||
string g_b = handshake.get_g_b();
|
string g_b = handshake.get_g_b();
|
||||||
auto auth_key_params = handshake.gen_key();
|
auto auth_key_params = handshake.gen_key();
|
||||||
|
|
||||||
auto data = store_object(mtproto_api::client_DH_inner_data(nonce, server_nonce, 0, g_b));
|
auto data = store_object(mtproto_api::client_DH_inner_data(nonce_, server_nonce_, 0, g_b));
|
||||||
size_t encrypted_data_size = 20 + data.size();
|
size_t encrypted_data_size = 20 + data.size();
|
||||||
size_t encrypted_data_size_with_pad = (encrypted_data_size + 15) & -16;
|
size_t encrypted_data_size_with_pad = (encrypted_data_size + 15) & -16;
|
||||||
string encrypted_data_str(encrypted_data_size_with_pad, '\0');
|
string encrypted_data_str(encrypted_data_size_with_pad, '\0');
|
||||||
|
@ -204,10 +206,10 @@ Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection
|
||||||
encrypted_data.substr(20, data.size()).copy_from(data);
|
encrypted_data.substr(20, data.size()).copy_from(data);
|
||||||
Random::secure_bytes(encrypted_data.ubegin() + encrypted_data_size,
|
Random::secure_bytes(encrypted_data.ubegin() + encrypted_data_size,
|
||||||
encrypted_data_size_with_pad - encrypted_data_size);
|
encrypted_data_size_with_pad - encrypted_data_size);
|
||||||
tmp_KDF(server_nonce, new_nonce, &tmp_aes_key, &tmp_aes_iv);
|
tmp_KDF(server_nonce_, new_nonce_, &tmp_aes_key, &tmp_aes_iv);
|
||||||
aes_ige_encrypt(as_slice(tmp_aes_key), as_slice(tmp_aes_iv), encrypted_data, encrypted_data);
|
aes_ige_encrypt(as_slice(tmp_aes_key), as_slice(tmp_aes_iv), encrypted_data, encrypted_data);
|
||||||
|
|
||||||
mtproto_api::set_client_DH_params set_client_dh_params(nonce, server_nonce, encrypted_data);
|
mtproto_api::set_client_DH_params set_client_dh_params(nonce_, server_nonce_, encrypted_data);
|
||||||
send(connection, create_storer(set_client_dh_params));
|
send(connection, create_storer(set_client_dh_params));
|
||||||
|
|
||||||
auth_key_ = AuthKey(auth_key_params.first, std::move(auth_key_params.second));
|
auth_key_ = AuthKey(auth_key_params.first, std::move(auth_key_params.second));
|
||||||
|
@ -216,7 +218,7 @@ Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection
|
||||||
}
|
}
|
||||||
auth_key_.set_created_at(dh_inner_data.server_time_);
|
auth_key_.set_created_at(dh_inner_data.server_time_);
|
||||||
|
|
||||||
server_salt_ = as<int64>(new_nonce.raw) ^ as<int64>(server_nonce.raw);
|
server_salt_ = as<int64>(new_nonce_.raw) ^ as<int64>(server_nonce_.raw);
|
||||||
|
|
||||||
state_ = DHGenResponse;
|
state_ = DHGenResponse;
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
|
@ -283,8 +285,8 @@ Status AuthKeyHandshake::on_start(Callback *connection) {
|
||||||
clear();
|
clear();
|
||||||
return Status::Error(PSLICE() << "on_start called after start " << tag("state", state_));
|
return Status::Error(PSLICE() << "on_start called after start " << tag("state", state_));
|
||||||
}
|
}
|
||||||
Random::secure_bytes(nonce.raw, sizeof(nonce));
|
Random::secure_bytes(nonce_.raw, sizeof(nonce_));
|
||||||
send(connection, create_storer(mtproto_api::req_pq_multi(nonce)));
|
send(connection, create_storer(mtproto_api::req_pq_multi(nonce_)));
|
||||||
state_ = ResPQ;
|
state_ = ResPQ;
|
||||||
|
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
|
|
|
@ -113,11 +113,9 @@ class AuthKeyHandshake {
|
||||||
double server_time_diff_ = 0;
|
double server_time_diff_ = 0;
|
||||||
uint64 server_salt_ = 0;
|
uint64 server_salt_ = 0;
|
||||||
|
|
||||||
UInt128 nonce;
|
UInt128 nonce_;
|
||||||
UInt128 server_nonce;
|
UInt128 server_nonce_;
|
||||||
UInt256 new_nonce;
|
UInt256 new_nonce_;
|
||||||
UInt256 tmp_aes_key;
|
|
||||||
UInt256 tmp_aes_iv;
|
|
||||||
|
|
||||||
BufferSlice last_query_;
|
BufferSlice last_query_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user