aboutsummaryrefslogtreecommitdiffhomepage
path: root/tde2e/td/e2e/EncryptedKey.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tde2e/td/e2e/EncryptedKey.cpp')
-rw-r--r--tde2e/td/e2e/EncryptedKey.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/tde2e/td/e2e/EncryptedKey.cpp b/tde2e/td/e2e/EncryptedKey.cpp
new file mode 100644
index 000000000..5b8894be7
--- /dev/null
+++ b/tde2e/td/e2e/EncryptedKey.cpp
@@ -0,0 +1,38 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2025
+//
+// 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/e2e/EncryptedKey.h"
+
+#include "td/e2e/DecryptedKey.h"
+#include "td/e2e/MessageEncryption.h"
+
+#include "td/utils/tl_helpers.h"
+
+namespace tde2e_core {
+
+td::Result<DecryptedKey> EncryptedKey::decrypt(td::Slice local_password, bool check_public_key) const {
+ /*
+ if (secret.size() != 32) {
+ return td::Status::Error("Failed to decrypt key: invalid secret size");
+ }
+ */
+ auto decrypted_secret = MessageEncryption::hmac_sha512(secret, local_password);
+
+ td::SecureString encryption_secret =
+ MessageEncryption::kdf(as_slice(decrypted_secret), "tde2e local key", EncryptedKey::PBKDF_ITERATIONS);
+
+ TRY_RESULT(decrypted_data, MessageEncryption::decrypt_data(as_slice(encrypted_data), as_slice(encryption_secret)));
+
+ RawDecryptedKey raw_decrypted_key;
+ TRY_STATUS(td::unserialize(raw_decrypted_key, decrypted_data));
+ DecryptedKey res(std::move(raw_decrypted_key));
+ if (check_public_key && !(res.private_key.to_public_key() == this->o_public_key)) {
+ return td::Status::Error("Something wrong: public key of decrypted private key differs from requested public key");
+ }
+ return std::move(res);
+}
+
+} // namespace tde2e_core