7
7
#include " td/telegram/net/PublicRsaKeySharedMain.h"
8
8
9
9
#include " td/utils/format.h"
10
- #include " td/utils/logging.h"
11
10
#include " td/utils/Slice.h"
12
11
#include " td/utils/SliceBuilder.h"
13
12
14
- #include < algorithm>
15
-
16
13
namespace td {
17
14
18
- PublicRsaKeySharedMain::PublicRsaKeySharedMain (bool is_test) {
19
- auto add_pem = [this ](CSlice pem) {
20
- auto r_rsa = mtproto::RSA::from_pem_public_key (pem);
21
- LOG_CHECK (r_rsa.is_ok ()) << r_rsa.error () << " " << pem;
22
-
23
- if (r_rsa.is_ok ()) {
24
- auto rsa = r_rsa.move_as_ok ();
25
- auto fingerprint = rsa.get_fingerprint ();
26
- if (get_rsa_key_unsafe (fingerprint) != nullptr ) {
27
- return ;
28
- }
29
- keys_.push_back (RsaKey{std::move (rsa), fingerprint});
30
- }
15
+ std::shared_ptr<PublicRsaKeySharedMain> PublicRsaKeySharedMain::create (bool is_test) {
16
+ auto add_pem = [](vector<RsaKey> &keys, CSlice pem) {
17
+ auto rsa = mtproto::RSA::from_pem_public_key (pem).move_as_ok ();
18
+ auto fingerprint = rsa.get_fingerprint ();
19
+ keys.push_back (RsaKey{std::move (rsa), fingerprint});
31
20
};
32
21
33
22
if (is_test) {
34
- add_pem (
35
- " -----BEGIN RSA PUBLIC KEY-----\n "
36
- " MIIBCgKCAQEAyMEdY1aR+sCR3ZSJrtztKTKqigvO/vBfqACJLZtS7QMgCGXJ6XIR\n "
37
- " yy7mx66W0/sOFa7/1mAZtEoIokDP3ShoqF4fVNb6XeqgQfaUHd8wJpDWHcR2OFwv\n "
38
- " plUUI1PLTktZ9uW2WE23b+ixNwJjJGwBDJPQEQFBE+vfmH0JP503wr5INS1poWg/\n "
39
- " j25sIWeYPHYeOrFp/eXaqhISP6G+q2IeTaWTXpwZj4LzXq5YOpk4bYEQ6mvRq7D1\n "
40
- " aHWfYmlEGepfaYR8Q0YqvvhYtMte3ITnuSJs171+GDqpdKcSwHnd6FudwGO4pcCO\n "
41
- " j4WcDuXc2CTHgH8gFTNhp/Y8/SpDOhvn9QIDAQAB\n "
42
- " -----END RSA PUBLIC KEY-----" );
43
- return ;
23
+ static auto test_public_rsa_key = [&] {
24
+ vector<RsaKey> keys;
25
+ add_pem (keys,
26
+ " -----BEGIN RSA PUBLIC KEY-----\n "
27
+ " MIIBCgKCAQEAyMEdY1aR+sCR3ZSJrtztKTKqigvO/vBfqACJLZtS7QMgCGXJ6XIR\n "
28
+ " yy7mx66W0/sOFa7/1mAZtEoIokDP3ShoqF4fVNb6XeqgQfaUHd8wJpDWHcR2OFwv\n "
29
+ " plUUI1PLTktZ9uW2WE23b+ixNwJjJGwBDJPQEQFBE+vfmH0JP503wr5INS1poWg/\n "
30
+ " j25sIWeYPHYeOrFp/eXaqhISP6G+q2IeTaWTXpwZj4LzXq5YOpk4bYEQ6mvRq7D1\n "
31
+ " aHWfYmlEGepfaYR8Q0YqvvhYtMte3ITnuSJs171+GDqpdKcSwHnd6FudwGO4pcCO\n "
32
+ " j4WcDuXc2CTHgH8gFTNhp/Y8/SpDOhvn9QIDAQAB\n "
33
+ " -----END RSA PUBLIC KEY-----" );
34
+ return std::make_shared<PublicRsaKeySharedMain>(std::move (keys));
35
+ }();
36
+ return test_public_rsa_key;
37
+ } else {
38
+ static auto main_public_rsa_key = [&] {
39
+ vector<RsaKey> keys;
40
+ add_pem (keys,
41
+ " -----BEGIN RSA PUBLIC KEY-----\n "
42
+ " MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n "
43
+ " 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n "
44
+ " 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n "
45
+ " +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n "
46
+ " t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n "
47
+ " 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n "
48
+ " -----END RSA PUBLIC KEY-----" );
49
+ return std::make_shared<PublicRsaKeySharedMain>(std::move (keys));
50
+ }();
51
+ return main_public_rsa_key;
44
52
}
45
-
46
- add_pem (
47
- " -----BEGIN RSA PUBLIC KEY-----\n "
48
- " MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n "
49
- " 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n "
50
- " 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n "
51
- " +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n "
52
- " t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n "
53
- " 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n "
54
- " -----END RSA PUBLIC KEY-----" );
55
53
}
56
54
57
55
Result<mtproto::PublicRsaKeyInterface::RsaKey> PublicRsaKeySharedMain::get_rsa_key (const vector<int64> &fingerprints) {
58
56
for (auto fingerprint : fingerprints) {
59
- const auto *rsa_key = get_rsa_key_unsafe (fingerprint);
60
- if (rsa_key != nullptr ) {
61
- return RsaKey{rsa_key->rsa .clone (), fingerprint};
57
+ for (const auto &key : keys_) {
58
+ if (key.fingerprint == fingerprint) {
59
+ return RsaKey{key.rsa .clone (), fingerprint};
60
+ }
62
61
}
63
62
}
64
63
return Status::Error (PSLICE () << " Unknown fingerprints " << format::as_array (fingerprints));
@@ -68,13 +67,4 @@ void PublicRsaKeySharedMain::drop_keys() {
68
67
// nothing to do
69
68
}
70
69
71
- const mtproto::PublicRsaKeyInterface::RsaKey *PublicRsaKeySharedMain::get_rsa_key_unsafe (int64 fingerprint) const {
72
- auto it = std::find_if (keys_.begin (), keys_.end (),
73
- [fingerprint](const auto &value) { return value.fingerprint == fingerprint; });
74
- if (it == keys_.end ()) {
75
- return nullptr ;
76
- }
77
- return &*it;
78
- }
79
-
80
70
} // namespace td
0 commit comments