161 static std::chrono::system_clock::duration&
164 static std::chrono::system_clock::duration value =
165 std::chrono::seconds(2);
173 std::vector<uint8_t> raw_aad;
174 std::vector<uint8_t> raw_plain;
178 std::span<const uint8_t> raw_aad_,
179 std::span<const uint8_t> raw_plain_) :
181 raw_aad(raw_aad_.begin(), raw_aad_.end()),
182 raw_plain(raw_plain_.begin(), raw_plain_.end())
201 std::chrono::system_clock::time_point last_initiation_time;
202 static constexpr size_t salt_len = 32;
203 static constexpr size_t shared_key_size = 32;
204 std::vector<uint8_t> hkdf_salt;
205 size_t message_limit;
208 std::unique_ptr<ccf::crypto::KeyAesGcm> recv_key =
nullptr;
209 std::unique_ptr<ccf::crypto::KeyAesGcm> send_key =
nullptr;
212 std::atomic<MsgNonce> send_nonce{1};
216 std::optional<OutgoingMsg> outgoing_consensus_msg;
222 static constexpr size_t outgoing_forwarding_queue_size = 10;
223 std::vector<OutgoingMsg> outgoing_forwarding_msgs;
229 void check_message_limit()
234 const auto lower_limit = message_limit / 2;
235 size_t num_messages = send_nonce + local_recv_nonce;
239 "Reached message limit ({}+{} >= {}), triggering new key exchange",
243 reset_key_exchange();
246 else if (num_messages >= message_limit)
249 "Reached hard message limit ({}+{} >= {}), dropping previous keys",
257 local_recv_nonce = 0;
258 reset_key_exchange();
265 std::span<const uint8_t> aad,
266 std::span<const uint8_t> cipher,
267 std::vector<uint8_t>& plain)
269 if (recv_key ==
nullptr)
271 throw std::logic_error(
"Tried to decrypt, but have no receive key");
274 auto wire_nonce = get_wire_nonce(header);
275 auto recv_nonce = wire_nonce.nonce;
278 "decrypt({} bytes, {} bytes) (nonce={})",
286 if (recv_nonce <= local_recv_nonce)
292 "Received past nonce, received:{}, "
300 recv_key->decrypt(header.get_iv(), header.tag, cipher, aad, plain);
305 local_recv_nonce = recv_nonce;
308 check_message_limit();
313 bool verify(
const GcmHdr& header, std::span<const uint8_t> aad)
315 std::vector<uint8_t> empty_plaintext;
316 return decrypt(header, aad, {}, empty_plaintext);
319 void send_key_exchange_init()
321 std::vector<uint8_t> payload;
327 append_buffer(payload, signature);
330 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
331 append_buffer(payload, hkdf_salt);
335 "send_key_exchange_init: node serial: {}",
347 void send_key_exchange_response()
349 std::vector<uint8_t> signature;
353 to_sign.insert(to_sign.end(), peer_ks.begin(), peer_ks.end());
354 signature = node_kp->sign(to_sign);
357 std::vector<uint8_t> payload;
362 append_buffer(payload, signature);
365 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
369 "send_key_exchange_response: oks={}, serialised_signed_share={}",
371 ds::to_hex(payload));
382 void send_key_exchange_final()
384 std::vector<uint8_t> payload;
390 append_buffer(payload, signature);
394 "key_exchange_final: ks={}, serialised_signed_key_share={}",
396 ds::to_hex(payload));
407 void advance_connection_attempt()
417 const auto time_since_initiated =
418 decltype(last_initiation_time)::clock::now() - last_initiation_time;
442 bool recv_key_exchange_init(
443 const uint8_t* data,
size_t size,
bool they_have_priority =
false)
446 "recv_key_exchange_init({} bytes, {})", size, they_have_priority);
449 size_t peer_version = serialized::read<size_t>(data, size);
453 "Protocol version mismatch (node={}, peer={})",
459 auto ks = extract_span(data, size);
466 auto sig = extract_span(data, size);
473 auto pc = extract_span(data, size);
480 auto salt = extract_span(data, size);
496 if (!verify_peer_certificate(pc, cert, verifier))
499 "Peer certificate verification failed - recv_key_exchange_init "
500 "failed to verify peer cert:\n{}\nUsing trusted service "
507 if (!verify_peer_signature(ks, sig, verifier))
532 "recv_key_exchange_init: version={} ks={} sig={} pc={} salt={}",
539 hkdf_salt = {salt.data(), salt.data() + salt.size()};
549 send_key_exchange_response();
551 flush_pending_outgoing();
556 bool recv_key_exchange_response(
const uint8_t* data,
size_t size)
567 size_t peer_version = serialized::read<size_t>(data, size);
571 "Protocol version mismatch (node={}, peer={})",
577 auto ks = extract_span(data, size);
584 auto sig = extract_span(data, size);
591 auto pc = extract_span(data, size);
607 if (!verify_peer_certificate(pc, cert, verifier))
610 "Peer certificate verification failed - recv_key_exchange_response "
611 "failed to verify peer cert:\n{}\nUsing trusted service "
620 std::vector<uint8_t> signed_msg(ks.begin(), ks.end());
622 signed_msg.insert(signed_msg.end(), oks.begin(), oks.end());
624 if (!verify_peer_signature(signed_msg, sig, verifier))
628 "Peer certificate verification failed - recv_key_exchange_response "
629 "failed to verify signature from cert:\n{}",
642 send_key_exchange_final();
644 flush_pending_outgoing();
653 bool recv_key_exchange_final(
const uint8_t* data,
size_t size)
674 auto sig = extract_span(data, size);
684 "Peer certificate verification failed - recv_key_exchange_final "
685 "failed to verify signature from peer with serial number {}",
686 peer_cv->serial_number());
697 std::span<const uint8_t> extract_span(
698 const uint8_t*& data,
size_t& size)
const
705 auto sz = serialized::read<size_t>(data, size);
706 const uint8_t* data_start = data;
711 "Buffer header wants {} bytes, but only {} remain", sz, size);
720 return std::span<const uint8_t>(data_start, sz);
723 bool verify_peer_certificate(
724 std::span<const uint8_t> pc,
736 if (!verifier->verify_certificate(
737 {&service_cert}, {},
true ))
743 "New peer certificate: {}\n{}",
744 verifier->serial_number(),
755 bool verify_peer_signature(
756 std::span<const uint8_t> msg,
757 std::span<const uint8_t> sig,
761 "Verifying peer signature with peer certificate serial {}",
762 verifier ? verifier->serial_number() :
"no peer_cv!");
764 if (!verifier || !verifier->verify(msg, sig))
772 void update_send_key()
774 const std::string label_to = self.value() + peer_id.value();
775 const std::span<const uint8_t> label(
776 reinterpret_cast<const uint8_t*
>(label_to.c_str()), label_to.size());
788 void update_recv_key()
790 const std::string label_from = peer_id.value() + self.value();
791 const std::span<const uint8_t> label(
792 reinterpret_cast<const uint8_t*
>(label_from.c_str()),
802 local_recv_nonce = 0;
808 LOG_INFO_FMT(
"Node channel with {} is now established.", peer_id);
814 "Node certificate serial numbers: node={} peer={}",
815 node_cv->serial_number(),
816 peer_cv->serial_number());
819 void flush_pending_outgoing()
821 if (outgoing_consensus_msg.has_value())
824 outgoing_consensus_msg->type,
825 outgoing_consensus_msg->raw_aad,
826 outgoing_consensus_msg->raw_plain);
827 outgoing_consensus_msg.reset();
830 for (
auto& outgoing_msg : outgoing_forwarding_msgs)
833 outgoing_msg.type, outgoing_msg.raw_aad, outgoing_msg.raw_plain);
836 outgoing_forwarding_msgs.clear();
841 LOG_INFO_FMT(
"Initiating node channel with {}.", peer_id);
849 hkdf_salt = e->random(salt_len);
857 last_initiation_time =
decltype(last_initiation_time)::clock::now();
859 send_key_exchange_init();
862 void reset_key_exchange()
872 hkdf_salt = e->random(salt_len);
877 std::span<const uint8_t> aad,
878 std::span<const uint8_t> plain)
880 if (send_key ==
nullptr)
882 advance_connection_attempt();
887 if (outgoing_consensus_msg.has_value())
890 "Dropping outgoing consensus message - replaced by new "
891 "consensus message");
893 outgoing_consensus_msg = OutgoingMsg(type, aad, plain);
900 outgoing_forwarding_msgs.size() < outgoing_forwarding_queue_size)
902 outgoing_forwarding_msgs.emplace_back(type, aad, plain);
904 "Queueing outgoing forwarding message - the is the {}/{} "
906 outgoing_forwarding_msgs.size(),
907 outgoing_forwarding_queue_size);
913 "Unable to queue outgoing forwarding message - already queued "
914 "maximum {} messages",
915 outgoing_forwarding_queue_size);
923 "Unhandled message type {} on unestablished channel - ignoring",
930 auto nonce = send_nonce.fetch_add(1);
931 WireNonce wire_nonce(nonce);
934 "send({}, {} bytes, {} bytes) (nonce={})",
941 gcm_hdr.set_iv((
const uint8_t*)&wire_nonce,
sizeof(wire_nonce));
943 std::vector<uint8_t> cipher;
945 send_key->encrypt(gcm_hdr.get_iv(), plain, aad, cipher, gcm_hdr.tag);
947 const auto gcm_hdr_serialised = gcm_hdr.serialise();
956 {aad.
data(),
static_cast<size_t>(aad.size())},
957 {gcm_hdr_serialised.data(),
958 static_cast<size_t>(gcm_hdr_serialised.size())},
959 {cipher.data(),
static_cast<size_t>(cipher.size())}};
962 node_outbound, to_host, peer_id.value(), type, self.value(), payload);
964 check_message_limit();
979 size_t message_limit_) :
981 service_cert(service_cert_),
983 node_cert(node_cert_),
984 to_host(writer_factory.create_writer_to_outside()),
986 status(fmt::format(
"Channel to {}", peer_id_),
INACTIVE),
987 message_limit(message_limit_)
990 hkdf_salt = e->random(salt_len);
995 std::lock_guard<ccf::pal::Mutex> guard(lock);
996 return recv_key !=
nullptr && send_key !=
nullptr;
1012 std::span<const uint8_t> aad,
1013 std::span<const uint8_t> plain = {})
1015 std::lock_guard<ccf::pal::Mutex> guard(lock);
1017 return send_unsafe(type, aad, plain);
1021 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1023 std::lock_guard<ccf::pal::Mutex> guard(lock);
1027 if (recv_key ==
nullptr)
1030 "Node channel with {} cannot receive authenticated message: not "
1031 "established a receive key, status={}",
1034 advance_connection_attempt();
1041 if (!verify(hdr, aad))
1052 std::lock_guard<ccf::pal::Mutex> guard(lock);
1058 if (recv_key ==
nullptr)
1061 "Node channel with {} cannot receive authenticated message with "
1062 "payload: not established a receive key, status={}",
1065 advance_connection_attempt();
1069 const uint8_t* data_ = data;
1070 size_t size_ = size;
1077 if (!verify(hdr, std::span<const uint8_t>(data, size)))
1087 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1089 std::lock_guard<ccf::pal::Mutex> guard(lock);
1092 if (recv_key ==
nullptr)
1095 "Node channel with {} cannot receive encrypted message: not "
1096 "established a receive key, status={}",
1099 advance_connection_attempt();
1100 return std::nullopt;
1106 std::vector<uint8_t> plain;
1107 if (!decrypt(hdr, aad, std::span<const uint8_t>(data, size), plain))
1110 return std::nullopt;
1118 std::lock_guard<ccf::pal::Mutex> guard(lock);
1121 reset_key_exchange();
1122 outgoing_consensus_msg.reset();
1130 std::lock_guard<ccf::pal::Mutex> guard(lock);
1134 auto chmsg = serialized::read<ChannelMsg>(data, size);
1141 return recv_key_exchange_init(data, size, self < peer_id);
1146 return recv_key_exchange_response(data, size);
1151 return recv_key_exchange_final(data, size);
1156 throw std::runtime_error(fmt::format(
1157 "Received message with initial bytes {} from {} - not recognised "
1158 "as a key exchange message",
1164 catch (
const std::exception& e)