157 static std::chrono::system_clock::duration&
160 static std::chrono::system_clock::duration value =
161 std::chrono::seconds(2);
169 std::vector<uint8_t> raw_aad;
170 std::vector<uint8_t> raw_plain;
174 std::span<const uint8_t> raw_aad_,
175 std::span<const uint8_t> raw_plain_) :
177 raw_aad(raw_aad_.begin(), raw_aad_.end()),
178 raw_plain(raw_plain_.begin(), raw_plain_.end())
197 std::chrono::system_clock::time_point last_initiation_time;
198 static constexpr size_t salt_len = 32;
199 static constexpr size_t shared_key_size = 32;
200 std::vector<uint8_t> hkdf_salt;
201 size_t message_limit;
204 std::unique_ptr<ccf::crypto::KeyAesGcm> recv_key =
nullptr;
205 std::unique_ptr<ccf::crypto::KeyAesGcm> send_key =
nullptr;
208 std::atomic<MsgNonce> send_nonce{1};
212 std::optional<OutgoingMsg> outgoing_consensus_msg;
218 static constexpr size_t outgoing_forwarding_queue_size = 10;
219 std::vector<OutgoingMsg> outgoing_forwarding_msgs;
225 void check_message_limit()
230 const auto lower_limit = message_limit / 2;
231 size_t num_messages = send_nonce + local_recv_nonce;
235 "Reached message limit ({}+{} >= {}), triggering new key exchange",
239 reset_key_exchange();
242 else if (num_messages >= message_limit)
245 "Reached hard message limit ({}+{} >= {}), dropping previous keys",
253 local_recv_nonce = 0;
254 reset_key_exchange();
261 std::span<const uint8_t> aad,
262 std::span<const uint8_t> cipher,
263 std::vector<uint8_t>& plain)
265 if (recv_key ==
nullptr)
267 throw std::logic_error(
"Tried to decrypt, but have no receive key");
271 auto recv_nonce = wire_nonce.nonce;
274 "decrypt({} bytes, {} bytes) (nonce={})",
282 if (recv_nonce <= local_recv_nonce)
288 "Received past nonce, received:{}, "
296 recv_key->decrypt(header.get_iv(), header.tag, cipher, aad, plain);
301 local_recv_nonce = recv_nonce;
304 check_message_limit();
309 bool verify(
const GcmHdr& header, std::span<const uint8_t> aad)
311 std::vector<uint8_t> empty_plaintext;
312 return decrypt(header, aad, {}, empty_plaintext);
315 void send_key_exchange_init()
317 std::vector<uint8_t> payload;
326 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
331 "send_key_exchange_init: node serial: {}",
343 void send_key_exchange_response()
345 std::vector<uint8_t> signature;
349 to_sign.insert(to_sign.end(), peer_ks.begin(), peer_ks.end());
350 signature = node_kp->sign(to_sign);
353 std::vector<uint8_t> payload;
361 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
365 "send_key_exchange_response: oks={}, serialised_signed_share={}",
367 ds::to_hex(payload));
378 void send_key_exchange_final()
380 std::vector<uint8_t> payload;
390 "key_exchange_final: ks={}, serialised_signed_key_share={}",
392 ds::to_hex(payload));
403 void advance_connection_attempt()
413 const auto time_since_initiated =
414 decltype(last_initiation_time)::clock::now() - last_initiation_time;
438 bool recv_key_exchange_init(
439 const uint8_t* data,
size_t size,
bool they_have_priority =
false)
442 "recv_key_exchange_init({} bytes, {})", size, they_have_priority);
445 auto peer_version = serialized::read<size_t>(data, size);
449 "Protocol version mismatch (node={}, peer={})",
455 auto ks = extract_span(data, size);
462 auto sig = extract_span(data, size);
469 auto pc = extract_span(data, size);
476 auto salt = extract_span(data, size);
492 if (!verify_peer_certificate(pc, cert, verifier))
495 "Peer certificate verification failed - recv_key_exchange_init "
496 "failed to verify peer cert:\n{}\nUsing trusted service "
503 if (!verify_peer_signature(ks, sig, verifier))
526 "recv_key_exchange_init: version={} ks={} sig={} pc={} salt={}",
533 hkdf_salt = {salt.data(), salt.data() + salt.size()};
543 send_key_exchange_response();
545 flush_pending_outgoing();
550 bool recv_key_exchange_response(
const uint8_t* data,
size_t size)
561 auto peer_version = serialized::read<size_t>(data, size);
565 "Protocol version mismatch (node={}, peer={})",
571 auto ks = extract_span(data, size);
578 auto sig = extract_span(data, size);
585 auto pc = extract_span(data, size);
601 if (!verify_peer_certificate(pc, cert, verifier))
604 "Peer certificate verification failed - recv_key_exchange_response "
605 "failed to verify peer cert:\n{}\nUsing trusted service "
614 std::vector<uint8_t> signed_msg(ks.begin(), ks.end());
616 signed_msg.insert(signed_msg.end(), oks.begin(), oks.end());
618 if (!verify_peer_signature(signed_msg, sig, verifier))
622 "Peer certificate verification failed - recv_key_exchange_response "
623 "failed to verify signature from cert:\n{}",
636 send_key_exchange_final();
638 flush_pending_outgoing();
647 bool recv_key_exchange_final(
const uint8_t* data,
size_t size)
668 auto sig = extract_span(data, size);
678 "Peer certificate verification failed - recv_key_exchange_final "
679 "failed to verify signature from peer with serial number {}",
680 peer_cv->serial_number());
691 std::span<const uint8_t> extract_span(
692 const uint8_t*& data,
size_t& size)
const
699 auto sz = serialized::read<size_t>(data, size);
700 const uint8_t* data_start = data;
705 "Buffer header wants {} bytes, but only {} remain", sz, size);
712 return {data_start, sz};
715 bool verify_peer_certificate(
716 std::span<const uint8_t> pc,
728 if (!verifier->verify_certificate(
729 {&service_cert}, {},
true ))
735 "New peer certificate: {}\n{}",
736 verifier->serial_number(),
745 bool verify_peer_signature(
746 std::span<const uint8_t> msg,
747 std::span<const uint8_t> sig,
751 "Verifying peer signature with peer certificate serial {}",
752 verifier ? verifier->serial_number() :
"no peer_cv!");
754 return verifier && verifier->verify(msg, sig);
757 void update_send_key()
759 const std::string label_to = self.value() + peer_id.value();
760 const std::span<const uint8_t> label(
761 reinterpret_cast<const uint8_t*
>(label_to.c_str()), label_to.size());
773 void update_recv_key()
775 const std::string label_from = peer_id.value() + self.value();
776 const std::span<const uint8_t> label(
777 reinterpret_cast<const uint8_t*
>(label_from.c_str()),
787 local_recv_nonce = 0;
793 LOG_INFO_FMT(
"Node channel with {} is now established.", peer_id);
799 "Node certificate serial numbers: node={} peer={}",
800 node_cv->serial_number(),
801 peer_cv->serial_number());
804 void flush_pending_outgoing()
806 if (outgoing_consensus_msg.has_value())
809 outgoing_consensus_msg->type,
810 outgoing_consensus_msg->raw_aad,
811 outgoing_consensus_msg->raw_plain);
812 outgoing_consensus_msg.reset();
815 for (
auto& outgoing_msg : outgoing_forwarding_msgs)
818 outgoing_msg.type, outgoing_msg.raw_aad, outgoing_msg.raw_plain);
821 outgoing_forwarding_msgs.clear();
826 LOG_INFO_FMT(
"Initiating node channel with {}.", peer_id);
834 hkdf_salt = e->random(salt_len);
842 last_initiation_time =
decltype(last_initiation_time)::clock::now();
844 send_key_exchange_init();
847 void reset_key_exchange()
857 hkdf_salt = e->random(salt_len);
862 std::span<const uint8_t> aad,
863 std::span<const uint8_t> plain)
865 if (send_key ==
nullptr)
867 advance_connection_attempt();
872 if (outgoing_consensus_msg.has_value())
875 "Dropping outgoing consensus message - replaced by new "
876 "consensus message");
878 outgoing_consensus_msg = OutgoingMsg(type, aad, plain);
885 outgoing_forwarding_msgs.size() < outgoing_forwarding_queue_size)
887 outgoing_forwarding_msgs.emplace_back(type, aad, plain);
889 "Queueing outgoing forwarding message - the is the {}/{} "
891 outgoing_forwarding_msgs.size(),
892 outgoing_forwarding_queue_size);
897 "Unable to queue outgoing forwarding message - already queued "
898 "maximum {} messages",
899 outgoing_forwarding_queue_size);
906 "Unhandled message type {} on unestablished channel - ignoring",
913 auto nonce = send_nonce.fetch_add(1);
914 WireNonce wire_nonce(nonce);
917 "send({}, {} bytes, {} bytes) (nonce={})",
925 reinterpret_cast<const uint8_t*
>(&wire_nonce),
sizeof(wire_nonce));
927 std::vector<uint8_t> cipher;
929 send_key->encrypt(gcm_hdr.get_iv(), plain, aad, cipher, gcm_hdr.tag);
931 const auto gcm_hdr_serialised = gcm_hdr.serialise();
940 {aad.
data(),
static_cast<size_t>(aad.size())},
941 {gcm_hdr_serialised.data(),
942 static_cast<size_t>(gcm_hdr_serialised.size())},
943 {cipher.data(),
static_cast<size_t>(cipher.size())}};
946 node_outbound, to_host, peer_id.value(), type, self.value(), payload);
948 check_message_limit();
963 size_t message_limit_) :
964 self(
std::move(self_)),
965 service_cert(service_cert_),
966 node_kp(
std::move(node_kp_)),
967 node_cert(node_cert_),
968 to_host(writer_factory.create_writer_to_outside()),
969 peer_id(
std::move(peer_id_)),
970 status(fmt::format(
"Channel to {}", peer_id),
INACTIVE),
971 message_limit(message_limit_)
974 hkdf_salt = e->random(salt_len);
979 std::lock_guard<ccf::pal::Mutex> guard(lock);
980 return recv_key !=
nullptr && send_key !=
nullptr;
996 std::span<const uint8_t> aad,
997 std::span<const uint8_t> plain = {})
999 std::lock_guard<ccf::pal::Mutex> guard(lock);
1001 return send_unsafe(type, aad, plain);
1005 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1007 std::lock_guard<ccf::pal::Mutex> guard(lock);
1011 if (recv_key ==
nullptr)
1014 "Node channel with {} cannot receive authenticated message: not "
1015 "established a receive key, status={}",
1018 advance_connection_attempt();
1025 if (!verify(hdr, aad))
1036 std::lock_guard<ccf::pal::Mutex> guard(lock);
1042 if (recv_key ==
nullptr)
1045 "Node channel with {} cannot receive authenticated message with "
1046 "payload: not established a receive key, status={}",
1049 advance_connection_attempt();
1053 const uint8_t* data_ = data;
1054 size_t size_ = size;
1061 if (!verify(hdr, std::span<const uint8_t>(data, size)))
1071 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1073 std::lock_guard<ccf::pal::Mutex> guard(lock);
1076 if (recv_key ==
nullptr)
1079 "Node channel with {} cannot receive encrypted message: not "
1080 "established a receive key, status={}",
1083 advance_connection_attempt();
1084 return std::nullopt;
1090 std::vector<uint8_t> plain;
1091 if (!decrypt(hdr, aad, std::span<const uint8_t>(data, size), plain))
1094 return std::nullopt;
1102 std::lock_guard<ccf::pal::Mutex> guard(lock);
1105 reset_key_exchange();
1106 outgoing_consensus_msg.reset();
1114 std::lock_guard<ccf::pal::Mutex> guard(lock);
1118 auto chmsg = serialized::read<ChannelMsg>(data, size);
1125 return recv_key_exchange_init(data, size, self < peer_id);
1130 return recv_key_exchange_response(data, size);
1135 return recv_key_exchange_final(data, size);
1140 throw std::runtime_error(fmt::format(
1141 "Received message with initial bytes {} from {} - not recognised "
1142 "as a key exchange message",
1148 catch (
const std::exception& e)