| 162 | } |
| 163 | |
| 164 | void KeyManagerRunner::process_db_key(td::Slice key, td::Slice value) { |
| 165 | auto key_parts = td::split(key, '_'); |
| 166 | auto key_type = key_parts.first; |
| 167 | key = key_parts.second; |
| 168 | |
| 169 | CHECK(value.size() >= 64); |
| 170 | auto signature = value.copy().remove_prefix(value.size() - 64); |
| 171 | value.remove_suffix(64); |
| 172 | |
| 173 | public_key_obj_->verify_signature(value, signature).ensure(); |
| 174 | |
| 175 | if (key_type == "key") { |
| 176 | auto obj = cocoon::fetch_tl_object<cocoon_api::keyManagerDb_key>(value, true).move_as_ok(); |
| 177 | |
| 178 | auto P = std::make_unique<PrivateKey>(); |
| 179 | P->private_key = obj->private_key_; |
| 180 | |
| 181 | P->public_key.as_slice().copy_from(td::Ed25519::PrivateKey(td::SecureString(P->private_key.as_slice())) |
| 182 | .get_public_key() |
| 183 | .move_as_ok() |
| 184 | .as_octet_string()); |
| 185 | CHECK(P->public_key.to_hex() == key); |
| 186 | P->key_type_ = (td::uint8)obj->key_type_; |
| 187 | P->valid_since_ = obj->valid_since_utime_; |
| 188 | P->valid_until_ = obj->valid_until_utime_; |
| 189 | P->valid_since_config_version_ = obj->valid_since_config_version_; |
| 190 | CHECK(active_config_version_ >= (td::uint32)P->valid_since_config_version_); |
| 191 | |
| 192 | if ((td::uint32)P->valid_until_ > td::Clocks::system()) { |
| 193 | private_keys_.push_back(std::move(P)); |
| 194 | } |
| 195 | } else if (key_type == "config") { |
| 196 | } else { |
| 197 | LOG(FATAL) << "unknown key type in db: " << key; |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | void KeyManagerRunner::config_to_db() { |
| 202 | auto conf = cocoon::create_serialize_tl_object<cocoon_api::keyManagerDb_configV1>( |
nothing calls this directly
no test coverage detected