From 93db75293db4e3a8f0b3301d9c303d27c8487865 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 6 Apr 2018 16:26:32 +0300 Subject: [PATCH] Various fixes. GitOrigin-RevId: e3a710c085e465c44c850db0b41fae19061c2dc5 --- td/telegram/PasswordManager.cpp | 40 ++++++++++++++++----------------- td/telegram/SecureStorage.cpp | 9 +++++--- td/telegram/SecureValue.cpp | 10 ++++----- td/telegram/SecureValue.h | 2 +- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/td/telegram/PasswordManager.cpp b/td/telegram/PasswordManager.cpp index a482c3da..78996471 100644 --- a/td/telegram/PasswordManager.cpp +++ b/td/telegram/PasswordManager.cpp @@ -196,29 +196,27 @@ void PasswordManager::get_full_state(string password, Promise void PasswordManager::do_get_full_state(string password, PasswordState state, Promise promise) { auto current_salt = state.current_salt; - send_with_promise(G()->net_query_creator().create(create_storer( - telegram_api::account_getPasswordSettings(calc_password_hash(password, current_salt)))), - PromiseCreator::lambda([promise = std::move(promise), state = std::move(state), - password](Result r_query) mutable { - promise.set_result([&]() -> Result { - TRY_RESULT(query, std::move(r_query)); - TRY_RESULT(result, fetch_result(std::move(query))); - PasswordPrivateState private_state; - private_state.email = result->email_; + send_with_promise( + G()->net_query_creator().create( + create_storer(telegram_api::account_getPasswordSettings(calc_password_hash(password, current_salt)))), + PromiseCreator::lambda([promise = std::move(promise), state = std::move(state), + password](Result r_query) mutable { + promise.set_result([&]() -> Result { + TRY_RESULT(query, std::move(r_query)); + TRY_RESULT(result, fetch_result(std::move(query))); + PasswordPrivateState private_state; + private_state.email = result->email_; - namespace ss = secure_storage; - auto r_secret = [&]() -> Result { - TRY_RESULT(encrypted_secret, ss::EncryptedSecret::create(result->secure_secret_.as_slice())); - return encrypted_secret.decrypt(PSLICE() << result->secure_salt_.as_slice() << password - << result->secure_salt_.as_slice()); - }(); + auto r_secret = [&]() -> Result { + TRY_RESULT(encrypted_secret, secure_storage::EncryptedSecret::create(result->secure_secret_.as_slice())); + return encrypted_secret.decrypt(PSLICE() << result->secure_salt_.as_slice() << password + << result->secure_salt_.as_slice()); + }(); - LOG_IF(ERROR, r_secret.is_error()) << r_secret.error(); - LOG_IF(ERROR, r_secret.is_ok()) << "HAS SECRET"; - private_state.secret = std::move(r_secret); - return PasswordFullState{std::move(state), std::move(private_state)}; - }()); - })); + private_state.secret = std::move(r_secret); + return PasswordFullState{std::move(state), std::move(private_state)}; + }()); + })); } void PasswordManager::get_recovery_email_address(string password, diff --git a/td/telegram/SecureStorage.cpp b/td/telegram/SecureStorage.cpp index c0fd4579..c0b2192f 100644 --- a/td/telegram/SecureStorage.cpp +++ b/td/telegram/SecureStorage.cpp @@ -35,7 +35,7 @@ AesCbcState calc_aes_cbc_state(Slice seed) { } template -Status data_view_for_each(DataView &data, F &&f) { +static Status data_view_for_each(DataView &data, F &&f) { const int64 step = 128 << 10; for (int64 i = 0, size = data.size(); i < size; i += step) { TRY_RESULT(bytes, data.pread(i, min(step, size - i))); @@ -159,7 +159,7 @@ Result Secret::create(Slice secret) { } uint32 checksum = secret_checksum(secret); if (checksum != 0) { - return Status::Error(PSLICE() << "Wrong cheksum " << checksum); + return Status::Error(PSLICE() << "Wrong checksum " << checksum); } UInt256 res; td::as_slice(res).copy_from(secret); @@ -206,7 +206,7 @@ Secret::Secret(UInt256 secret, int64 hash) : secret_(secret), hash_(hash) { //EncryptedSecret Result EncryptedSecret::create(Slice encrypted_secret) { if (encrypted_secret.size() != 32) { - return Status::Error("Wrong encrypte secret size"); + return Status::Error("Wrong encrypted secret size"); } UInt256 res; td::as_slice(res).copy_from(encrypted_secret); @@ -242,6 +242,9 @@ Result Decryptor::append(BufferSlice data) { if (!skipped_prefix_) { to_skip_ = data.as_slice().ubegin()[0]; size_t to_skip = min(to_skip_, data.size()); + if (to_skip_ > data.size()) { + to_skip_ = 0; // to fail final to_skip check + } skipped_prefix_ = true; data = data.from_slice(data.as_slice().remove_prefix(to_skip)); } diff --git a/td/telegram/SecureValue.cpp b/td/telegram/SecureValue.cpp index dcc65a61..15df9301 100644 --- a/td/telegram/SecureValue.cpp +++ b/td/telegram/SecureValue.cpp @@ -488,9 +488,8 @@ vector encrypt_secure_files(FileManager *file_manager, const secure_ } SecureData encrypt_secure_data(const secure_storage::Secret &master_secret, Slice data, string &to_hash) { - namespace ss = secure_storage; - auto secret = ss::Secret::create_new(); - auto encrypted = ss::encrypt_value(secret, data).move_as_ok(); + auto secret = secure_storage::Secret::create_new(); + auto encrypted = encrypt_value(secret, data).move_as_ok(); SecureData res; res.encrypted_secret = secret.encrypt(PSLICE() << master_secret.as_slice() << encrypted.hash.as_slice()).as_slice().str(); @@ -503,21 +502,20 @@ SecureData encrypt_secure_data(const secure_storage::Secret &master_secret, Slic EncryptedSecureValue encrypt_secure_value(FileManager *file_manager, const secure_storage::Secret &master_secret, const SecureValue &secure_value) { - namespace ss = secure_storage; EncryptedSecureValue res; res.type = secure_value.type; switch (res.type) { case SecureValueType::EmailAddress: case SecureValueType::PhoneNumber: res.data = SecureData{secure_value.data, "", ""}; - res.hash = ss::calc_value_hash(secure_value.data).as_slice().str(); + res.hash = secure_storage::calc_value_hash(secure_value.data).as_slice().str(); break; default: { string to_hash; res.data = encrypt_secure_data(master_secret, secure_value.data, to_hash); res.files = encrypt_secure_files(file_manager, master_secret, secure_value.files, to_hash); res.selfie = encrypt_secure_file(file_manager, master_secret, secure_value.selfie, to_hash); - res.hash = ss::calc_value_hash(to_hash).as_slice().str(); + res.hash = secure_storage::calc_value_hash(to_hash).as_slice().str(); break; } } diff --git a/td/telegram/SecureValue.h b/td/telegram/SecureValue.h index 6ba72164..03af3cbf 100644 --- a/td/telegram/SecureValue.h +++ b/td/telegram/SecureValue.h @@ -130,7 +130,7 @@ td_api::object_ptr get_encrypted_credentials_objec class SecureValue { public: - SecureValueType type; + SecureValueType type = SecureValueType::None string data; vector files; FileId selfie;