41 std::map<NodeId, NodeInfo> nodes_to_delete;
45 nodes_to_delete[nid] = ni;
49 for (
auto [nid, ni] : nodes_to_delete)
59 auto member_encryption_public_keys =
61 Tables::MEMBER_ENCRYPTION_PUBLIC_KEYS);
63 return member_encryption_public_keys->get(member_id).has_value();
70 auto mi = member_info->get(member_id);
83 auto member_encryption_public_keys =
85 Tables::MEMBER_ENCRYPTION_PUBLIC_KEYS);
87 std::map<MemberId, ccf::crypto::Pem> active_recovery_members;
89 member_encryption_public_keys->foreach(
90 [&active_recovery_members,
91 &member_info](
const auto& mid,
const auto& pem) {
92 auto info = member_info->get(mid);
93 if (!info.has_value())
95 throw std::logic_error(
96 fmt::format(
"Recovery member {} has no member info", mid));
101 active_recovery_members[mid] = pem;
105 return active_recovery_members;
116 auto member_cert_der =
120 auto member = member_certs->get(
id);
121 if (member.has_value())
127 member_certs->put(
id, member_pub_info.
cert);
133 auto member_encryption_public_keys =
135 Tables::MEMBER_ENCRYPTION_PUBLIC_KEYS);
136 member_encryption_public_keys->put(
140 auto s = signatures->get();
147 member_acks->put(
id,
MemberAck(s->root));
156 auto member = member_info->get(member_id);
157 if (!member.has_value())
159 throw std::logic_error(fmt::format(
160 "Member {} cannot be activated as they do not exist", member_id));
170 throw std::logic_error(fmt::format(
171 "Cannot activate new recovery member {}: no more than {} active "
172 "recovery members are allowed",
174 max_active_recovery_members));
176 member_info->put(member_id, member.
value());
184 auto member_encryption_public_keys =
186 Tables::MEMBER_ENCRYPTION_PUBLIC_KEYS);
189 auto member_gov_history =
192 auto member_to_remove = member_info->get(member_id);
193 if (!member_to_remove.has_value())
198 "Could not remove member {}: member does not exist", member_id);
211 size_t get_active_recovery_members_count_after =
214 if (get_active_recovery_members_count_after < recovery_threshold)
217 "Failed to remove recovery member {}: number of active recovery "
218 "members ({}) would be less than recovery threshold ({})",
220 get_active_recovery_members_count_after,
226 member_info->remove(member_id);
227 member_encryption_public_keys->remove(member_id);
228 member_certs->remove(member_id);
229 member_acks->remove(member_id);
230 member_gov_history->remove(member_id);
243 auto user_cert = user_certs->get(
id);
244 if (user_cert.has_value())
246 throw std::logic_error(
247 fmt::format(
"Certificate already exists for user {}",
id));
250 user_certs->put(
id, new_user.
cert);
255 auto ui = user_info->get(
id);
258 throw std::logic_error(
259 fmt::format(
"User data already exists for user {}",
id));
262 user_info->put(
id, {new_user.
user_data});
274 user_certs->remove(user_id);
275 user_info->remove(user_id);
282 node->put(
id, node_info);
287 std::map<NodeId, NodeInfo> active_nodes;
295 active_nodes[nid] = ni;
301 auto cni =
nodes->get_globally_committed(nid);
302 if (cni.has_value() && !cni->retired_committed)
304 active_nodes[nid] = ni;
318 nlohmann::json service_data =
nullptr,
319 bool recovering =
false)
323 size_t recovery_count = 0;
327 const auto prev_service_info = service->get();
329 ccf::Tables::PREVIOUS_SERVICE_IDENTITY);
330 previous_service_identity->put(prev_service_info->cert);
335 recovery_count = prev_service_info->recovery_count.value_or(0) + 1;
341 recovering ? service->get_version_of_previous_write() : std::nullopt,
351 return service.has_value() && service->cert == expected_service_cert;
358 auto active_recovery_members_count =
363 "Cannot open network as number of active recovery members ({}) is "
364 "less than recovery threshold ({})",
365 active_recovery_members_count,
370 auto active_service = service->get();
371 if (!active_service.has_value())
388 "Could not open current service: status is not OPENING or "
389 "WAITING_FOR_RECOVERY_SHARES");
394 active_service->previous_service_identity_version =
395 service->get_version_of_previous_write();
396 service->put(active_service.value());
405 auto active_service = service->get();
406 if (!active_service.has_value())
412 return active_service->status;
421 auto node_info =
nodes->get(node_id);
423 if (!node_info.has_value())
425 throw std::logic_error(fmt::format(
"Node {} does not exist", node_id));
430 throw std::logic_error(fmt::format(
"Node {} is retired", node_id));
434 node_info->ledger_secret_seqno = latest_ledger_secret_seqno;
437 LOG_INFO_FMT(
"Node {} is now {}", node_id, node_info->status);
474 throw std::logic_error(fmt::format(
475 "Unexpected quote format {} when trusting node code id", platform));
483 const std::optional<HostDataMetadata>& security_policy = std::nullopt)
486 if (security_policy.has_value())
488 auto raw_security_policy =
490 host_data_table->put(
491 host_data, {raw_security_policy.begin(), raw_security_policy.end()});
496 host_data_table->put(host_data, pal::snp::NO_SECURITY_POLICY);
501 ccf::kv::Tx& tx,
const std::optional<UVMEndorsements>& uvm_endorsements)
503 if (!uvm_endorsements.has_value())
512 uvm_endorsements->did,
513 {{uvm_endorsements->feed, {uvm_endorsements->svn}}});
522 throw std::logic_error(
523 "Cannot initialise service configuration: configuration already "
527 config->put(configuration);
540 auto service_status = get_service_status(tx);
541 if (!service_status.has_value())
547 if (service_status.value() == ServiceStatus::WAITING_FOR_RECOVERY_SHARES)
553 "Cannot set recovery threshold: service is currently waiting for "
557 else if (service_status.value() == ServiceStatus::OPEN)
559 auto get_active_recovery_members_count =
560 get_active_recovery_members(tx).size();
561 if (threshold > get_active_recovery_members_count)
564 "Cannot set recovery threshold to {} as it is greater than the "
565 "number of active recovery members ({})",
567 get_active_recovery_members_count);
572 auto current_config = config->get();
573 if (!current_config.has_value())
575 throw std::logic_error(
"Configuration should already be set");
578 current_config->recovery_threshold = threshold;
579 config->put(current_config.value());
586 auto current_config = config->get();
587 if (!current_config.has_value())
589 throw std::logic_error(
590 "Failed to get recovery threshold: No active configuration found");
592 return current_config->recovery_threshold;
Definition internal_tables_access.h:31
static bool is_service_created(ccf::kv::ReadOnlyTx &tx, const ccf::crypto::Pem &expected_service_cert)
Definition internal_tables_access.h:347
static bool set_recovery_threshold(ccf::kv::Tx &tx, size_t threshold)
Definition internal_tables_access.h:530
static void trust_node_host_data(ccf::kv::Tx &tx, const HostData &host_data, const std::optional< HostDataMetadata > &security_policy=std::nullopt)
Definition internal_tables_access.h:480
static std::optional< ServiceStatus > get_service_status(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:401
static bool open_service(ccf::kv::Tx &tx)
Definition internal_tables_access.h:354
static void init_configuration(ccf::kv::Tx &tx, const ServiceConfiguration &configuration)
Definition internal_tables_access.h:516
static std::map< NodeId, NodeInfo > get_trusted_nodes(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:285
static UserId add_user(ccf::kv::Tx &tx, const NewUser &new_user)
Definition internal_tables_access.h:235
static bool is_recovery_member(ccf::kv::ReadOnlyTx &tx, const MemberId &member_id)
Definition internal_tables_access.h:56
static bool remove_member(ccf::kv::Tx &tx, const MemberId &member_id)
Definition internal_tables_access.h:181
static MemberId add_member(ccf::kv::Tx &tx, const NewMember &member_pub_info)
Definition internal_tables_access.h:108
static void set_constitution(ccf::kv::Tx &tx, const std::string &constitution)
Definition internal_tables_access.h:440
static void create_service(ccf::kv::Tx &tx, const ccf::crypto::Pem &service_cert, ccf::TxID create_txid, nlohmann::json service_data=nullptr, bool recovering=false)
Definition internal_tables_access.h:314
static std::map< MemberId, ccf::crypto::Pem > get_active_recovery_members(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:79
static bool is_active_member(ccf::kv::ReadOnlyTx &tx, const MemberId &member_id)
Definition internal_tables_access.h:66
static void trust_node_uvm_endorsements(ccf::kv::Tx &tx, const std::optional< UVMEndorsements > &uvm_endorsements)
Definition internal_tables_access.h:500
static void trust_node_measurement(ccf::kv::Tx &tx, const pal::PlatformAttestationMeasurement &node_measurement, const QuoteFormat &platform)
Definition internal_tables_access.h:446
static void retire_active_nodes(ccf::kv::Tx &tx)
Definition internal_tables_access.h:37
static void add_node(ccf::kv::Tx &tx, const NodeId &id, const NodeInfo &node_info)
Definition internal_tables_access.h:278
static bool activate_member(ccf::kv::Tx &tx, const MemberId &member_id)
Definition internal_tables_access.h:152
static void trust_node(ccf::kv::Tx &tx, const NodeId &node_id, ccf::kv::Version latest_ledger_secret_seqno)
Definition internal_tables_access.h:415
InternalTablesAccess()=delete
static size_t get_recovery_threshold(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:583
static void remove_user(ccf::kv::Tx &tx, const UserId &user_id)
Definition internal_tables_access.h:268
Definition sha256_hash.h:16
std::string hex_str() const
Definition sha256_hash.cpp:61
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:170
M::Handle * rw(M &m)
Definition tx.h:213
M::WriteOnlyHandle * wo(M &m)
Definition tx.h:234
#define LOG_INFO_FMT
Definition logger.h:395
#define LOG_TRACE_FMT
Definition logger.h:378
#define LOG_FAIL_FMT
Definition logger.h:396
std::vector< uint8_t > raw_from_b64(const std::string_view &b64_string)
Definition base64.cpp:12
VerifierPtr make_verifier(const std::vector< uint8_t > &cert)
Definition verifier.cpp:18
uint64_t Version
Definition version.h:8
AttestationMeasurement< snp_attestation_measurement_size > SnpAttestationMeasurement
Definition measurement.h:107
AttestationMeasurement< sgx_attestation_measurement_size > SgxAttestationMeasurement
Definition measurement.h:97
Definition app_interface.h:15
ServiceMap< NodeId, NodeInfo > Nodes
Definition nodes.h:19
@ WAITING_FOR_RECOVERY_SHARES
ServiceMap< UserId, UserDetails > UserInfo
Definition users.h:32
ccf::kv::RawCopySerialisedMap< MemberId, ccf::crypto::Pem > MemberCerts
Definition members.h:79
ServiceMap< MemberId, MemberDetails > MemberInfo
Definition members.h:77
ccf::kv::RawCopySerialisedMap< UserId, ccf::crypto::Pem > UserCerts
Definition users.h:31
ServiceValue< std::string > Constitution
Definition constitution.h:9
ServiceMap< DID, FeedToEndorsementsDataMap > SNPUVMEndorsements
Definition uvm_endorsements.h:24
ServiceValue< ServiceInfo > Service
Definition service.h:55
ServiceValue< PrimarySignature > Signatures
Definition signatures.h:58
ServiceMap< MemberId, SignedReq > GovernanceHistory
Definition governance_history.h:12
ServiceMap< MemberId, MemberAck > MemberAcks
Definition members.h:140
ServiceMap< pal::SgxAttestationMeasurement, CodeStatus > CodeIDs
Definition code_id.h:11
ServiceMap< pal::SnpAttestationMeasurement, CodeStatus > SnpMeasurements
Definition snp_measurements.h:12
ServiceMap< HostData, HostDataMetadata > SnpHostDataMap
Definition host_data.h:14
ccf::kv::RawCopySerialisedMap< MemberId, ccf::crypto::Pem > MemberPublicEncryptionKeys
Definition members.h:81
QuoteFormat
Definition quote_info.h:12
ServiceValue< ccf::crypto::Pem > PreviousServiceIdentity
Definition previous_service_identity.h:13
Value & value()
Definition entity_id.h:60
std::optional< ccf::crypto::Pem > encryption_pub_key
Definition members.h:36
ccf::crypto::Pem cert
Definition members.h:33
nlohmann::json member_data
Definition members.h:37
nlohmann::json user_data
Definition users.h:16
ccf::crypto::Pem cert
Definition users.h:15
Definition node_info.h:30
NodeStatus status
Node status.
Definition node_info.h:36
Definition service_config.h:14