Skip to content

Commit 7ad0ebc

Browse files
authored
Simplify NetworkIdentity type (#6666)
1 parent 6bfcc62 commit 7ad0ebc

19 files changed

+121
-123
lines changed

include/ccf/node/cose_signatures_config.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66

77
#include <string>
88

9-
struct COSESignaturesConfig
9+
namespace ccf
1010
{
11-
std::string issuer = "";
12-
std::string subject = "";
11+
struct COSESignaturesConfig
12+
{
13+
std::string issuer = "";
14+
std::string subject = "";
1315

14-
bool operator==(const COSESignaturesConfig& other) const = default;
15-
};
16+
bool operator==(const COSESignaturesConfig& other) const = default;
17+
};
1618

17-
DECLARE_JSON_TYPE(COSESignaturesConfig);
18-
DECLARE_JSON_REQUIRED_FIELDS(COSESignaturesConfig, issuer, subject);
19+
DECLARE_JSON_TYPE(COSESignaturesConfig);
20+
DECLARE_JSON_REQUIRED_FIELDS(COSESignaturesConfig, issuer, subject);
21+
}

include/ccf/node/startup_config.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ struct StartupConfig : CCFConfig
8787
// Only if starting or recovering
8888
size_t initial_service_certificate_validity_days = 1;
8989
std::string service_subject_name = "CN=CCF Service";
90-
COSESignaturesConfig cose_signatures;
90+
ccf::COSESignaturesConfig cose_signatures;
9191

9292
nlohmann::json service_data = nullptr;
9393

src/host/configuration.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ namespace host
144144
ccf::ServiceConfiguration service_configuration;
145145
size_t initial_service_certificate_validity_days = 1;
146146
std::string service_subject_name = "CN=CCF Service";
147-
COSESignaturesConfig cose_signatures;
147+
ccf::COSESignaturesConfig cose_signatures;
148148

149149
bool operator==(const Start&) const = default;
150150
};

src/js/extensions/ccf/network.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ namespace ccf::js::extensions
163163

164164
try
165165
{
166-
auto renewed_cert = network->identity->issue_certificate(
166+
auto renewed_cert = network->identity->renew_certificate(
167167
valid_from, validity_period_days);
168168

169169
return JS_NewString(ctx, renewed_cert.str().c_str());

src/kv/kv_types.h

+1
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ namespace ccf::kv
428428
virtual void set_service_signing_identity(
429429
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> keypair,
430430
const COSESignaturesConfig& cose_signatures) = 0;
431+
virtual const ccf::COSESignaturesConfig& get_cose_signatures_config() = 0;
431432
};
432433

433434
class Consensus : public ConfigurableConsensus

src/node/history.h

+43-13
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,16 @@ namespace ccf
198198

199199
void set_service_signing_identity(
200200
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> service_kp_,
201-
const COSESignaturesConfig& cose_signatures) override
201+
const ccf::COSESignaturesConfig& cose_signatures) override
202202
{
203203
std::ignore = std::move(service_kp_);
204204
}
205205

206+
const ccf::COSESignaturesConfig& get_cose_signatures_config() override
207+
{
208+
throw std::logic_error("Unimplemented");
209+
}
210+
206211
ccf::crypto::Sha256Hash get_replicated_state_root() override
207212
{
208213
return ccf::crypto::Sha256Hash(std::to_string(version));
@@ -323,7 +328,7 @@ namespace ccf
323328
ccf::crypto::KeyPair& node_kp;
324329
ccf::crypto::KeyPair_OpenSSL& service_kp;
325330
ccf::crypto::Pem& endorsed_cert;
326-
const COSESignaturesConfig& cose_signatures_config;
331+
const ccf::COSESignaturesConfig& cose_signatures_config;
327332

328333
public:
329334
MerkleTreeHistoryPendingTx(
@@ -334,7 +339,7 @@ namespace ccf
334339
ccf::crypto::KeyPair& node_kp_,
335340
ccf::crypto::KeyPair_OpenSSL& service_kp_,
336341
ccf::crypto::Pem& endorsed_cert_,
337-
const COSESignaturesConfig& cose_signatures_config_) :
342+
const ccf::COSESignaturesConfig& cose_signatures_config_) :
338343
txid(txid_),
339344
store(store_),
340345
history(history_),
@@ -566,7 +571,6 @@ namespace ccf
566571
T replicated_state_tree;
567572

568573
ccf::crypto::KeyPair& node_kp;
569-
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> service_kp{};
570574
ccf::crypto::COSEVerifierUniquePtr cose_verifier{};
571575
std::vector<uint8_t> cose_cert_cached{};
572576

@@ -580,7 +584,14 @@ namespace ccf
580584
ccf::kv::Term term_of_next_version;
581585

582586
std::optional<ccf::crypto::Pem> endorsed_cert = std::nullopt;
583-
COSESignaturesConfig cose_signatures_config;
587+
588+
struct ServiceSigningIdentity
589+
{
590+
const std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> service_kp;
591+
const ccf::COSESignaturesConfig cose_signatures_config;
592+
};
593+
594+
std::optional<ServiceSigningIdentity> signing_identity = std::nullopt;
584595

585596
public:
586597
HashedTxHistory(
@@ -604,14 +615,33 @@ namespace ccf
604615

605616
void set_service_signing_identity(
606617
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> service_kp_,
607-
const COSESignaturesConfig& cose_signatures_config_) override
618+
const ccf::COSESignaturesConfig& cose_signatures_config_) override
608619
{
609-
service_kp = std::move(service_kp_);
610-
cose_signatures_config = cose_signatures_config_;
620+
if (signing_identity.has_value())
621+
{
622+
throw std::logic_error(
623+
"Called set_service_signing_identity() multiple times");
624+
}
625+
626+
signing_identity.emplace(
627+
ServiceSigningIdentity{service_kp_, cose_signatures_config_});
628+
611629
LOG_INFO_FMT(
612630
"Setting service signing identity to iss: {} sub: {}",
613-
cose_signatures_config.issuer,
614-
cose_signatures_config.subject);
631+
cose_signatures_config_.issuer,
632+
cose_signatures_config_.subject);
633+
}
634+
635+
const ccf::COSESignaturesConfig& get_cose_signatures_config() override
636+
{
637+
if (!signing_identity.has_value())
638+
{
639+
throw std::logic_error(
640+
"Called get_cose_signatures_config() before "
641+
"set_service_signing_identity()");
642+
}
643+
644+
return signing_identity->cose_signatures_config;
615645
}
616646

617647
void start_signature_emit_timer() override
@@ -870,7 +900,7 @@ namespace ccf
870900

871901
LOG_DEBUG_FMT("Signed at {} in view: {}", txid.version, txid.term);
872902

873-
if (!service_kp)
903+
if (!signing_identity.has_value())
874904
{
875905
throw std::logic_error(
876906
fmt::format("No service key has been set yet to sign"));
@@ -884,9 +914,9 @@ namespace ccf
884914
*this,
885915
id,
886916
node_kp,
887-
*service_kp,
917+
*signing_identity->service_kp,
888918
endorsed_cert.value(),
889-
cose_signatures_config),
919+
signing_identity->cose_signatures_config),
890920
true);
891921
}
892922

src/node/identity.h

+16-71
Original file line numberDiff line numberDiff line change
@@ -14,70 +14,18 @@
1414

1515
namespace ccf
1616
{
17-
enum class IdentityType
18-
{
19-
REPLICATED,
20-
SPLIT
21-
};
22-
2317
struct NetworkIdentity
2418
{
2519
ccf::crypto::Pem priv_key;
2620
ccf::crypto::Pem cert;
27-
std::optional<IdentityType> type = IdentityType::REPLICATED;
28-
std::string subject_name = "CN=CCF Service";
29-
COSESignaturesConfig cose_signatures_config;
30-
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> kp{};
31-
32-
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> get_key_pair()
33-
{
34-
if (!kp)
35-
{
36-
kp = std::make_shared<ccf::crypto::KeyPair_OpenSSL>(priv_key);
37-
}
3821

39-
return kp;
40-
}
41-
42-
bool operator==(const NetworkIdentity& other) const
43-
{
44-
return cert == other.cert && priv_key == other.priv_key &&
45-
type == other.type && subject_name == other.subject_name &&
46-
cose_signatures_config == other.cose_signatures_config;
47-
}
22+
bool operator==(const NetworkIdentity& other) const = default;
4823

4924
NetworkIdentity(
50-
const std::string& subject_name_,
51-
const COSESignaturesConfig& cose_signatures_config_) :
52-
type(IdentityType::REPLICATED),
53-
subject_name(subject_name_),
54-
cose_signatures_config(cose_signatures_config_)
55-
{}
56-
NetworkIdentity() = default;
57-
58-
virtual ccf::crypto::Pem issue_certificate(
59-
const std::string& valid_from, size_t validity_period_days)
60-
{
61-
return {};
62-
}
63-
64-
virtual void set_certificate(const ccf::crypto::Pem& certificate) {}
65-
66-
virtual ~NetworkIdentity() {}
67-
};
68-
69-
class ReplicatedNetworkIdentity : public NetworkIdentity
70-
{
71-
public:
72-
ReplicatedNetworkIdentity() = default;
73-
74-
ReplicatedNetworkIdentity(
75-
const std::string& subject_name_,
25+
const std::string& subject_name,
7626
ccf::crypto::CurveID curve_id,
7727
const std::string& valid_from,
78-
size_t validity_period_days,
79-
const COSESignaturesConfig& cose_signatures_config_) :
80-
NetworkIdentity(subject_name_, cose_signatures_config_)
28+
size_t validity_period_days)
8129
{
8230
auto identity_key_pair =
8331
std::make_shared<ccf::crypto::KeyPair_OpenSSL>(curve_id);
@@ -91,37 +39,34 @@ namespace ccf
9139
validity_period_days);
9240
}
9341

94-
ReplicatedNetworkIdentity(const NetworkIdentity& other) :
95-
NetworkIdentity(
96-
ccf::crypto::get_subject_name(other.cert), other.cose_signatures_config)
42+
NetworkIdentity(const NetworkIdentity& other) = default;
43+
44+
NetworkIdentity() = default;
45+
46+
virtual ~NetworkIdentity()
9747
{
98-
if (type != other.type)
99-
{
100-
throw std::runtime_error("invalid identity type conversion");
101-
}
102-
priv_key = other.priv_key;
103-
cert = other.cert;
48+
OPENSSL_cleanse(priv_key.data(), priv_key.size());
10449
}
10550

106-
virtual ccf::crypto::Pem issue_certificate(
107-
const std::string& valid_from, size_t validity_period_days) override
51+
ccf::crypto::Pem renew_certificate(
52+
const std::string& valid_from, size_t validity_period_days)
10853
{
10954
return ccf::crypto::create_self_signed_cert(
11055
get_key_pair(),
111-
subject_name,
56+
ccf::crypto::get_subject_name(cert),
11257
{} /* SAN */,
11358
valid_from,
11459
validity_period_days);
11560
}
11661

117-
virtual void set_certificate(const ccf::crypto::Pem& new_cert) override
62+
void set_certificate(const ccf::crypto::Pem& new_cert)
11863
{
11964
cert = new_cert;
12065
}
12166

122-
~ReplicatedNetworkIdentity() override
67+
std::shared_ptr<ccf::crypto::KeyPair_OpenSSL> get_key_pair()
12368
{
124-
OPENSSL_cleanse(priv_key.data(), priv_key.size());
69+
return std::make_shared<ccf::crypto::KeyPair_OpenSSL>(priv_key);
12570
}
12671
};
127-
}
72+
}

src/node/node_state.h

+17-7
Original file line numberDiff line numberDiff line change
@@ -498,12 +498,11 @@ namespace ccf
498498
{
499499
case StartType::Start:
500500
{
501-
network.identity = std::make_unique<ReplicatedNetworkIdentity>(
501+
network.identity = std::make_unique<ccf::NetworkIdentity>(
502502
config.service_subject_name,
503503
curve_id,
504504
config.startup_host_time,
505-
config.initial_service_certificate_validity_days,
506-
config.cose_signatures);
505+
config.initial_service_certificate_validity_days);
507506

508507
network.ledger_secrets->init();
509508

@@ -539,12 +538,11 @@ namespace ccf
539538
ccf::crypto::Pem previous_service_identity_cert(
540539
config.recover.previous_service_identity.value());
541540

542-
network.identity = std::make_unique<ReplicatedNetworkIdentity>(
541+
network.identity = std::make_unique<ccf::NetworkIdentity>(
543542
ccf::crypto::get_subject_name(previous_service_identity_cert),
544543
curve_id,
545544
config.startup_host_time,
546-
config.initial_service_certificate_validity_days,
547-
config.cose_signatures);
545+
config.initial_service_certificate_validity_days);
548546

549547
history->set_service_signing_identity(
550548
network.identity->get_key_pair(), config.cose_signatures);
@@ -664,7 +662,7 @@ namespace ccf
664662
throw std::logic_error("Expected network info in join response");
665663
}
666664

667-
network.identity = std::make_unique<ReplicatedNetworkIdentity>(
665+
network.identity = std::make_unique<ccf::NetworkIdentity>(
668666
resp.network_info->identity);
669667
network.ledger_secrets->init_from_map(
670668
std::move(resp.network_info->ledger_secrets));
@@ -1764,6 +1762,18 @@ namespace ccf
17641762
return self_signed_node_cert;
17651763
}
17661764

1765+
const ccf::COSESignaturesConfig& get_cose_signatures_config() override
1766+
{
1767+
if (history == nullptr)
1768+
{
1769+
throw std::logic_error(
1770+
"Attempting to access COSE signatures config before history has been "
1771+
"constructed");
1772+
}
1773+
1774+
return history->get_cose_signatures_config();
1775+
}
1776+
17671777
private:
17681778
bool is_ip(const std::string_view& hostname)
17691779
{

src/node/rpc/node_call_types.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ namespace ccf
106106
std::optional<ServiceStatus> service_status = std::nullopt;
107107

108108
std::optional<ccf::crypto::Pem> endorsed_certificate = std::nullopt;
109-
std::optional<COSESignaturesConfig> cose_signatures_config =
109+
std::optional<ccf::COSESignaturesConfig> cose_signatures_config =
110110
std::nullopt;
111111

112112
NetworkInfo() {}
@@ -118,7 +118,8 @@ namespace ccf
118118
const NetworkIdentity& identity,
119119
ServiceStatus service_status,
120120
const std::optional<ccf::crypto::Pem>& endorsed_certificate,
121-
const std::optional<COSESignaturesConfig>& cose_signatures_config_) :
121+
const std::optional<ccf::COSESignaturesConfig>&
122+
cose_signatures_config_) :
122123
public_only(public_only),
123124
last_recovered_signed_idx(last_recovered_signed_idx),
124125
ledger_secrets(ledger_secrets),

0 commit comments

Comments
 (0)