Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
control_identity.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <chrono>
8#include <cstdint>
9#include <functional>
10#include <memory>
11#include <optional>
12#include <span>
13#include <string>
14#include <string_view>
15#include <utility>
16#include <vector>
17
18namespace pulp::inspect {
19
21 std::string value;
22 explicit operator bool() const {
23 return !value.empty();
24 }
25 friend bool operator==(const ControlBrokerId&, const ControlBrokerId&) = default;
26};
27
29 std::string value;
30 explicit operator bool() const {
31 return !value.empty();
32 }
33 friend bool operator==(const ControlClientId&, const ControlClientId&) = default;
34};
35
37 std::string value;
38 explicit operator bool() const {
39 return !value.empty();
40 }
41 friend bool operator==(const ControlRegistrationId&, const ControlRegistrationId&) = default;
42};
43
50
61
63class VerifiedControlPeerIdentity {
64 public:
66 return evidence_;
67 }
68 std::string_view fingerprint() const {
69 return fingerprint_;
70 }
71
72 friend bool operator==(const VerifiedControlPeerIdentity& left,
73 const VerifiedControlPeerIdentity& right) {
74 return left.fingerprint_ == right.fingerprint_;
75 }
76
77 private:
78 friend class ControlPeerVerifier;
79 VerifiedControlPeerIdentity(ControlPeerEvidence evidence, std::string fingerprint)
80 : evidence_(std::move(evidence)), fingerprint_(std::move(fingerprint)) {}
81
82 ControlPeerEvidence evidence_;
83 std::string fingerprint_;
84};
85
90 public:
91 using Authority = std::function<bool(const ControlPeerEvidence&)>;
92
93 explicit ControlPeerVerifier(Authority authority);
94 std::optional<VerifiedControlPeerIdentity> verify(ControlPeerEvidence evidence) const;
95
96 private:
97 Authority authority_;
98};
99
105
107
121
123
126 public:
127 explicit ControlBootstrapSecret(std::span<const std::uint8_t> bytes);
133
134 std::span<const std::uint8_t> bytes() const {
135 return bytes_;
136 }
137
138 private:
139 void clear() noexcept;
140 std::vector<std::uint8_t> bytes_;
141};
142
144 std::string ticket_id;
147 std::chrono::steady_clock::time_point expires_at;
148};
149
154
164
169
170enum class ControlDurableClientLifetime : std::uint8_t {
173};
174
175enum class ControlProcessLiveness : std::uint8_t {
179};
180
189
211
216
218 std::size_t max_registrations = 64;
219 std::size_t max_bootstrap_tickets = 64;
220 std::size_t max_clients = 16;
221 std::chrono::milliseconds registration_ttl = std::chrono::seconds(30);
222 std::chrono::milliseconds bootstrap_ttl = std::chrono::seconds(5);
223 std::chrono::milliseconds client_ttl = std::chrono::minutes(5);
224};
225
229 public:
230 using Clock = std::function<std::chrono::steady_clock::time_point()>;
231
234 std::shared_ptr<ControlSecurityAuditLog> audit_log = {},
235 Clock clock = [] { return std::chrono::steady_clock::now(); });
239
241
243 const VerifiedControlPeerIdentity& expected_peer);
245 std::string_view ticket_id,
246 std::span<const std::uint8_t> secret,
247 const VerifiedControlPeerIdentity& observed_peer,
248 std::string_view durable_principal = {},
249 ControlDurableClientLifetime durable_lifetime =
254 std::vector<ControlClientId> reclaim_process_clients(
255 const std::function<ControlProcessLiveness(const ControlPeerEvidence&)>&
256 process_liveness);
257 bool refresh_client(const ControlClientId& client_id,
258 const VerifiedControlPeerIdentity& peer);
259 bool disconnect_client(const ControlClientId& client_id);
260 std::optional<ControlClientIdentity> client(const ControlClientId& client_id) const;
261
264 bool publish = true);
265 bool publish_instance(const ControlRegistrationId& registration_id,
266 const VerifiedControlPeerIdentity& peer);
267 bool heartbeat(const ControlRegistrationId& registration_id,
268 const VerifiedControlPeerIdentity& peer);
269 bool unregister_instance(const ControlRegistrationId& registration_id,
270 const VerifiedControlPeerIdentity& peer);
271 std::optional<ControlRegistration> registration(
272 std::string_view session_id,
273 std::string_view instance_id,
274 std::string_view publication_id) const;
275 std::optional<ControlRegistration> registration(
276 const ControlRegistrationId& registration_id) const;
279 std::vector<ControlRegistration> registrations() const;
280
282
283 private:
284 class Impl;
285 std::unique_ptr<Impl> impl_;
286};
287
288} // namespace pulp::inspect
Move-only bootstrap material. Destruction wipes the secret bytes.
Definition control_identity.hpp:125
ControlBootstrapSecret & operator=(const ControlBootstrapSecret &)=delete
ControlBootstrapSecret(ControlBootstrapSecret &&other) noexcept
ControlBootstrapSecret(const ControlBootstrapSecret &)=delete
std::span< const std::uint8_t > bytes() const
Definition control_identity.hpp:134
ControlBootstrapSecret(std::span< const std::uint8_t > bytes)
ControlBootstrapSecret & operator=(ControlBootstrapSecret &&other) noexcept
ControlRegistrationResult register_instance(const VerifiedControlPeerIdentity &peer, ControlRegistrationRequest request, bool publish=true)
std::optional< ControlRegistration > registration(std::string_view session_id, std::string_view instance_id, std::string_view publication_id) const
std::vector< ControlClientId > reclaim_process_clients(const std::function< ControlProcessLiveness(const ControlPeerEvidence &)> &process_liveness)
Removes process-scoped clients whose kernel process is gone or whose reconnect lease expired.
bool heartbeat(const ControlRegistrationId &registration_id, const VerifiedControlPeerIdentity &peer)
ControlClientResult redeem_bootstrap(std::string_view ticket_id, std::span< const std::uint8_t > secret, const VerifiedControlPeerIdentity &observed_peer, std::string_view durable_principal={}, ControlDurableClientLifetime durable_lifetime=ControlDurableClientLifetime::Broker)
bool disconnect_client(const ControlClientId &client_id)
bool publish_instance(const ControlRegistrationId &registration_id, const VerifiedControlPeerIdentity &peer)
ControlBootstrapResult issue_bootstrap(const VerifiedControlPeerIdentity &expected_peer)
std::optional< ControlClientIdentity > client(const ControlClientId &client_id) const
ControlIdentityRegistry(const ControlIdentityRegistry &)=delete
ControlIdentityRegistry(ControlIdentityRegistryConfig config={}, std::shared_ptr< ControlSecurityAuditLog > audit_log={}, Clock clock=[] { return std::chrono::steady_clock::now();})
ControlIdentityRegistry & operator=(const ControlIdentityRegistry &)=delete
bool unregister_instance(const ControlRegistrationId &registration_id, const VerifiedControlPeerIdentity &peer)
std::optional< ControlRegistration > registration(const ControlRegistrationId &registration_id) const
std::function< std::chrono::steady_clock::time_point()> Clock
Definition control_identity.hpp:230
std::vector< ControlRegistration > registrations() const
Snapshot of every currently-live exact registration.
bool refresh_client(const ControlClientId &client_id, const VerifiedControlPeerIdentity &peer)
const ControlBrokerId & broker_id() const
std::optional< VerifiedControlPeerIdentity > verify(ControlPeerEvidence evidence) const
std::function< bool(const ControlPeerEvidence &)> Authority
Definition control_identity.hpp:91
ControlPeerVerifier(Authority authority)
Copyable proof minted only by the broker's trusted OS peer verifier.
Definition control_identity.hpp:63
const ControlPeerEvidence & evidence() const
Definition control_identity.hpp:65
std::string_view fingerprint() const
Definition control_identity.hpp:68
friend bool operator==(const VerifiedControlPeerIdentity &left, const VerifiedControlPeerIdentity &right)
Definition control_identity.hpp:72
friend class ControlPeerVerifier
Definition control_identity.hpp:78
@ right
Definition canvas.hpp:221
@ left
Definition canvas.hpp:221
@ NotFound
Nothing matched and synthesis was disabled.
Definition font_resolver.hpp:174
Definition agent_context.hpp:7
ControlHostTier
Definition control_identity.hpp:100
@ Standalone
Definition control_identity.hpp:102
@ SharedPluginHost
Definition control_identity.hpp:103
ControlBuildProfile
Definition control_manifest.hpp:22
@ ProductionStripped
Definition control_manifest.hpp:23
std::string_view control_identity_status_id(ControlIdentityStatus status)
@ Expired
Definition audit.hpp:68
@ Accepted
Definition audit.hpp:65
ControlIdentityStatus
Definition control_identity.hpp:108
@ PeerRoleMismatch
Definition control_identity.hpp:111
@ Replay
Definition control_identity.hpp:117
@ InvalidRequest
Definition control_identity.hpp:110
@ AttestationUnavailable
Definition control_identity.hpp:113
@ HostUnavailable
Definition control_identity.hpp:112
@ EntropyUnavailable
Definition control_connection_admission.hpp:46
ControlDurableClientLifetime
Definition control_identity.hpp:170
@ Broker
Definition control_identity.hpp:171
@ Process
Definition control_identity.hpp:172
@ OfflineJob
Definition capabilities.hpp:62
ControlProcessLiveness
Definition control_identity.hpp:175
@ Dead
Definition control_identity.hpp:178
@ Unknown
Definition control_identity.hpp:176
@ Alive
Definition control_identity.hpp:177
ControlPeerRole
Definition control_identity.hpp:44
@ StandaloneHost
Definition control_identity.hpp:47
@ OfflineHost
Definition control_identity.hpp:46
@ Client
Definition control_identity.hpp:45
@ TrustedHostBridge
Definition control_identity.hpp:48
@ ResourceExhausted
Definition control_admission.hpp:26
@ InvalidRequest
Definition control_admission.hpp:17
@ IdentityMismatch
Definition control_admission.hpp:19
std::string_view control_host_tier_id(ControlHostTier tier)
STL namespace.
Definition control_identity.hpp:150
std::optional< ControlBootstrapTicket > ticket
Definition control_identity.hpp:152
ControlIdentityStatus status
Definition control_identity.hpp:151
Definition control_identity.hpp:143
std::string ticket_id
Definition control_identity.hpp:144
ControlBrokerId broker_id
Definition control_identity.hpp:145
ControlBootstrapSecret secret
Definition control_identity.hpp:146
std::chrono::steady_clock::time_point expires_at
Definition control_identity.hpp:147
Definition control_identity.hpp:20
std::string value
Definition control_identity.hpp:21
friend bool operator==(const ControlBrokerId &, const ControlBrokerId &)=default
Definition control_identity.hpp:28
friend bool operator==(const ControlClientId &, const ControlClientId &)=default
std::string value
Definition control_identity.hpp:29
Definition control_identity.hpp:155
std::string peer_fingerprint
Definition control_identity.hpp:158
ControlBrokerId broker_id
Definition control_identity.hpp:157
ControlClientId client_id
Definition control_identity.hpp:156
std::chrono::steady_clock::time_point expires_at
Definition control_identity.hpp:159
std::string durable_principal
Broker-owned stable principal for a re-authenticating installed client.
Definition control_identity.hpp:162
Definition control_identity.hpp:165
ControlIdentityStatus status
Definition control_identity.hpp:166
std::optional< ControlClientIdentity > client
Definition control_identity.hpp:167
Definition control_identity.hpp:217
std::chrono::milliseconds client_ttl
Definition control_identity.hpp:223
std::chrono::milliseconds registration_ttl
Definition control_identity.hpp:221
std::chrono::milliseconds bootstrap_ttl
Definition control_identity.hpp:222
std::size_t max_registrations
Definition control_identity.hpp:218
std::size_t max_bootstrap_tickets
Definition control_identity.hpp:219
std::size_t max_clients
Definition control_identity.hpp:220
Definition control_manifest.hpp:67
Evidence observed by the local IPC carrier.
Definition control_identity.hpp:53
std::int64_t process_id
Definition control_identity.hpp:56
std::string publisher_id
Definition control_identity.hpp:59
std::string process_start_id
Definition control_identity.hpp:57
std::string executable_identity
Definition control_identity.hpp:58
ControlPeerRole role
Definition control_identity.hpp:54
std::string user_id
Definition control_identity.hpp:55
Definition control_identity.hpp:36
friend bool operator==(const ControlRegistrationId &, const ControlRegistrationId &)=default
std::string value
Definition control_identity.hpp:37
Definition control_identity.hpp:181
std::string artifact_digest
Definition control_identity.hpp:187
ControlManifest manifest
Definition control_identity.hpp:186
std::string instance_id
Definition control_identity.hpp:184
ControlHostTier host_tier
Definition control_identity.hpp:182
std::string session_id
Definition control_identity.hpp:183
std::string publication_id
Definition control_identity.hpp:185
Definition control_identity.hpp:212
std::optional< ControlRegistration > registration
Definition control_identity.hpp:214
ControlIdentityStatus status
Definition control_identity.hpp:213
Definition control_identity.hpp:190
ControlBrokerId broker_id
Definition control_identity.hpp:192
std::uint64_t liveness_generation
Starts at one and advances only after an authenticated heartbeat.
Definition control_identity.hpp:209
std::string session_id
Definition control_identity.hpp:194
std::chrono::steady_clock::time_point expires_at
Definition control_identity.hpp:205
std::string build_id
Manifest build identity retained for exact instance/status reads.
Definition control_identity.hpp:207
std::string consent_identity
Definition control_identity.hpp:201
std::string manifest_digest
Definition control_identity.hpp:199
ControlBuildProfile profile
Definition control_identity.hpp:202
std::vector< InspectorCapability > capabilities
Definition control_identity.hpp:203
std::string publisher_id
Definition control_identity.hpp:198
std::string instance_id
Definition control_identity.hpp:195
std::string artifact_digest
Definition control_identity.hpp:200
ControlRegistrationId registration_id
Definition control_identity.hpp:191
std::string peer_fingerprint
Definition control_identity.hpp:204
std::string plugin_id
Definition control_identity.hpp:197
std::string publication_id
Definition control_identity.hpp:196
ControlHostTier host_tier
Definition control_identity.hpp:193