mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Merge branch 'testnet' into accelerator
This commit is contained in:
commit
4826f7665f
20 changed files with 234 additions and 32 deletions
|
@ -3466,6 +3466,70 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_sign &que
|
|||
std::move(query.data_), std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_exportAllPrivateKeys &query,
|
||||
td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm,
|
||||
td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_unsafe)) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized")));
|
||||
return;
|
||||
}
|
||||
if (keyring_.empty()) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started keyring")));
|
||||
return;
|
||||
}
|
||||
|
||||
ton::PublicKey client_pubkey = ton::PublicKey{query.encryption_key_};
|
||||
if (!client_pubkey.is_ed25519()) {
|
||||
promise.set_value(
|
||||
create_control_query_error(td::Status::Error(ton::ErrorCode::protoviolation, "encryption key is not Ed25519")));
|
||||
return;
|
||||
}
|
||||
|
||||
td::actor::send_closure(
|
||||
keyring_, &ton::keyring::Keyring::export_all_private_keys,
|
||||
[promise = std::move(promise),
|
||||
client_pubkey = std::move(client_pubkey)](td::Result<std::vector<ton::PrivateKey>> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_value(create_control_query_error(R.move_as_error()));
|
||||
return;
|
||||
}
|
||||
// Private keys are encrypted using client-provided public key to avoid storing them in
|
||||
// non-secure buffers (not td::SecureString)
|
||||
std::vector<td::SecureString> serialized_keys;
|
||||
size_t data_size = 32;
|
||||
for (const ton::PrivateKey &key : R.ok()) {
|
||||
serialized_keys.push_back(key.export_as_slice());
|
||||
data_size += serialized_keys.back().size() + 4;
|
||||
}
|
||||
td::SecureString data{data_size};
|
||||
td::MutableSlice slice = data.as_mutable_slice();
|
||||
for (const td::SecureString &s : serialized_keys) {
|
||||
td::uint32 size = td::narrow_cast_safe<td::uint32>(s.size()).move_as_ok();
|
||||
CHECK(slice.size() >= size + 4);
|
||||
slice.copy_from(td::Slice{reinterpret_cast<const td::uint8 *>(&size), 4});
|
||||
slice.remove_prefix(4);
|
||||
slice.copy_from(s.as_slice());
|
||||
slice.remove_prefix(s.size());
|
||||
}
|
||||
CHECK(slice.size() == 32);
|
||||
td::Random::secure_bytes(slice);
|
||||
|
||||
auto r_encryptor = client_pubkey.create_encryptor();
|
||||
if (r_encryptor.is_error()) {
|
||||
promise.set_value(create_control_query_error(r_encryptor.move_as_error_prefix("cannot create encryptor: ")));
|
||||
return;
|
||||
}
|
||||
auto encryptor = r_encryptor.move_as_ok();
|
||||
auto r_encrypted = encryptor->encrypt(data.as_slice());
|
||||
if (r_encryptor.is_error()) {
|
||||
promise.set_value(create_control_query_error(r_encrypted.move_as_error_prefix("cannot encrypt data: ")));
|
||||
return;
|
||||
}
|
||||
promise.set_value(ton::create_serialize_tl_object<ton::ton_api::engine_validator_exportedPrivateKeys>(
|
||||
r_encrypted.move_as_ok()));
|
||||
});
|
||||
}
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_setVerbosity &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_default)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue