diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp')
-rw-r--r-- | protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp | 126 |
1 files changed, 47 insertions, 79 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp b/protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp index 44169c66dc..1d361b421e 100644 --- a/protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp +++ b/protocols/Telegram/tdlib/td/td/telegram/net/PublicRsaKeyShared.cpp @@ -1,145 +1,113 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/telegram/net/PublicRsaKeyShared.h" +#include "td/utils/algorithm.h" +#include "td/utils/format.h" #include "td/utils/logging.h" #include "td/utils/Slice.h" +#include "td/utils/SliceBuilder.h" #include "td/utils/Status.h" #include <algorithm> namespace td { -PublicRsaKeyShared::PublicRsaKeyShared(DcId dc_id) : dc_id_(dc_id) { +PublicRsaKeyShared::PublicRsaKeyShared(DcId dc_id, bool is_test) : dc_id_(dc_id) { if (!dc_id_.is_empty()) { return; } auto add_pem = [this](CSlice pem) { - auto r_rsa = RSA::from_pem(pem); - CHECK(r_rsa.is_ok()) << r_rsa.error(); + auto r_rsa = mtproto::RSA::from_pem_public_key(pem); + LOG_CHECK(r_rsa.is_ok()) << r_rsa.error() << " " << pem; if (r_rsa.is_ok()) { - this->add_rsa(r_rsa.move_as_ok()); + add_rsa(r_rsa.move_as_ok()); } }; - //old_key - add_pem( - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n" - "lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n" - "an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n" - "Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n" - "8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n" - "Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n" - "-----END RSA PUBLIC KEY-----"); - - // a35e0b92d00f9b61c351ce30526cb855649b12a35e01fe39b5b315e81b515779 key1.pub - add_pem( - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIIBCgKCAQEAruw2yP/BCcsJliRoW5eB\n" - "VBVle9dtjJw+OYED160Wybum9SXtBBLXriwt4rROd9csv0t0OHCaTmRqBcQ0J8fx\n" - "hN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvd\n" - "l84Kd9ORYjDEAyFnEA7dD556OptgLQQ2e2iVNq8NZLYTzLp5YpOdO1doK+ttrltg\n" - "gTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnSLj16yE5HvJQn0CNpRdENvRUXe6tBP78O\n" - "39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wFXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5\n" - "JwIDAQAB\n" - "-----END RSA PUBLIC KEY-----\n"); - // f1c346bd6de0c3365658e0740de42372e51262099d47ee097c3ff1e238ebf985 key2.pub - add_pem( - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIIBCgKCAQEAvfLHfYH2r9R70w8prHbl\n" - "Wt/nDkh+XkgpflqQVcnAfSuTtO05lNPspQmL8Y2XjVT4t8cT6xAkdgfmmvnvRPOO\n" - "KPi0OfJXoRVylFzAQG/j83u5K3kRLbae7fLccVhKZhY46lvsueI1hQdLgNV9n1cQ\n" - "3TDS2pQOCtovG4eDl9wacrXOJTG2990VjgnIKNA0UMoP+KF03qzryqIt3oTvZq03\n" - "DyWdGK+AZjgBLaDKSnC6qD2cFY81UryRWOab8zKkWAnhw2kFpcqhI0jdV5QaSCEx\n" - "vnsjVaX0Y1N0870931/5Jb9ICe4nweZ9kSDF/gip3kWLG0o8XQpChDfyvsqB9OLV\n" - "/wIDAQAB\n" - "-----END RSA PUBLIC KEY-----\n"); - - // 129e129a464a2b515f579fd568f5579e8a6ea2832a362b07f282a7c271acfead key3.pub - add_pem( - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIIBCgKCAQEAs/ditzm+mPND6xkhzwFI\n" - "z6J/968CtkcSE/7Z2qAJiXbmZ3UDJPGrzqTDHkO30R8VeRM/Kz2f4nR05GIFiITl\n" - "4bEjvpy7xqRDspJcCFIOcyXm8abVDhF+th6knSU0yLtNKuQVP6voMrnt9MV1X92L\n" - "GZQLgdHZbPQz0Z5qIpaKhdyA8DEvWWvSUwwc+yi1/gGaybwlzZwqXYoPOhwMebzK\n" - "Uk0xW14htcJrRrq+PXXQbRzTMynseCoPIoke0dtCodbA3qQxQovE16q9zz4Otv2k\n" - "4j63cz53J+mhkVWAeWxVGI0lltJmWtEYK6er8VqqWot3nqmWMXogrgRLggv/Nbbo\n" - "oQIDAQAB\n" - "-----END RSA PUBLIC KEY-----\n"); + if (is_test) { + add_pem( + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIIBCgKCAQEAyMEdY1aR+sCR3ZSJrtztKTKqigvO/vBfqACJLZtS7QMgCGXJ6XIR\n" + "yy7mx66W0/sOFa7/1mAZtEoIokDP3ShoqF4fVNb6XeqgQfaUHd8wJpDWHcR2OFwv\n" + "plUUI1PLTktZ9uW2WE23b+ixNwJjJGwBDJPQEQFBE+vfmH0JP503wr5INS1poWg/\n" + "j25sIWeYPHYeOrFp/eXaqhISP6G+q2IeTaWTXpwZj4LzXq5YOpk4bYEQ6mvRq7D1\n" + "aHWfYmlEGepfaYR8Q0YqvvhYtMte3ITnuSJs171+GDqpdKcSwHnd6FudwGO4pcCO\n" + "j4WcDuXc2CTHgH8gFTNhp/Y8/SpDOhvn9QIDAQAB\n" + "-----END RSA PUBLIC KEY-----"); + return; + } - // f9e47d59fbe0fa338ac8c5085201a0dd58dfd88f44abb16756ee5e9d50d52949 key4.pub add_pem( "-----BEGIN RSA PUBLIC KEY-----\n" - "MIIBCgKCAQEAvmpxVY7ld/8DAjz6F6q0\n" - "5shjg8/4p6047bn6/m8yPy1RBsvIyvuDuGnP/RzPEhzXQ9UJ5Ynmh2XJZgHoE9xb\n" - "nfxL5BXHplJhMtADXKM9bWB11PU1Eioc3+AXBB8QiNFBn2XI5UkO5hPhbb9mJpjA\n" - "9Uhw8EdfqJP8QetVsI/xrCEbwEXe0xvifRLJbY08/Gp66KpQvy7g8w7VB8wlgePe\n" - "xW3pT13Ap6vuC+mQuJPyiHvSxjEKHgqePji9NP3tJUFQjcECqcm0yV7/2d0t/pbC\n" - "m+ZH1sadZspQCEPPrtbkQBlvHb4OLiIWPGHKSMeRFvp3IWcmdJqXahxLCUS1Eh6M\n" - "AQIDAQAB\n" - "-----END RSA PUBLIC KEY-----\n"); + "MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n" + "5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n" + "62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n" + "+aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n" + "t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n" + "5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n" + "-----END RSA PUBLIC KEY-----"); } -void PublicRsaKeyShared::add_rsa(RSA rsa) { +void PublicRsaKeyShared::add_rsa(mtproto::RSA rsa) { auto lock = rw_mutex_.lock_write(); auto fingerprint = rsa.get_fingerprint(); - auto *has_rsa = get_rsa_locked(fingerprint); - if (has_rsa) { + if (get_rsa_key_unsafe(fingerprint) != nullptr) { return; } - options_.push_back(RsaOption{fingerprint, std::move(rsa)}); + keys_.push_back(RsaKey{std::move(rsa), fingerprint}); } -Result<std::pair<RSA, int64>> PublicRsaKeyShared::get_rsa(const vector<int64> &fingerprints) { +Result<mtproto::PublicRsaKeyInterface::RsaKey> PublicRsaKeyShared::get_rsa_key(const vector<int64> &fingerprints) { auto lock = rw_mutex_.lock_read(); for (auto fingerprint : fingerprints) { - auto *rsa = get_rsa_locked(fingerprint); - if (rsa) { - return std::make_pair(rsa->clone(), fingerprint); + auto *rsa_key = get_rsa_key_unsafe(fingerprint); + if (rsa_key != nullptr) { + return RsaKey{rsa_key->rsa.clone(), fingerprint}; } } - return Status::Error("Unknown fingerprints"); + return Status::Error(PSLICE() << "Unknown fingerprints " << format::as_array(fingerprints)); } void PublicRsaKeyShared::drop_keys() { if (dc_id_.is_empty()) { + // not CDN return; } auto lock = rw_mutex_.lock_write(); - options_.clear(); + LOG(INFO) << "Drop " << keys_.size() << " keys for " << dc_id_; + keys_.clear(); + notify(); } bool PublicRsaKeyShared::has_keys() { auto lock = rw_mutex_.lock_read(); - return !options_.empty(); + return !keys_.empty(); } -void PublicRsaKeyShared::add_listener(std::unique_ptr<Listener> listener) { +void PublicRsaKeyShared::add_listener(unique_ptr<Listener> listener) { if (listener->notify()) { auto lock = rw_mutex_.lock_write(); listeners_.push_back(std::move(listener)); } } -RSA *PublicRsaKeyShared::get_rsa_locked(int64 fingerprint) { - auto it = std::find_if(options_.begin(), options_.end(), - [&](const auto &value) { return value.fingerprint == fingerprint; }); - if (it == options_.end()) { +mtproto::PublicRsaKeyInterface::RsaKey *PublicRsaKeyShared::get_rsa_key_unsafe(int64 fingerprint) { + auto it = std::find_if(keys_.begin(), keys_.end(), + [fingerprint](const auto &value) { return value.fingerprint == fingerprint; }); + if (it == keys_.end()) { return nullptr; } - return &it->rsa; + return &*it; } void PublicRsaKeyShared::notify() { - auto lock = rw_mutex_.lock_read(); - auto it = std::remove_if(listeners_.begin(), listeners_.end(), [&](auto &listener) { return !listener->notify(); }); - listeners_.erase(it, listeners_.end()); + td::remove_if(listeners_, [&](auto &listener) { return !listener->notify(); }); } } // namespace td |