171 std::vector<uint8_t> raw_aad;
172 std::vector<uint8_t> raw_plain;
176 std::span<const uint8_t> raw_aad_,
177 std::span<const uint8_t> raw_plain_) :
179 raw_aad(raw_aad_.begin(), raw_aad_.end()),
180 raw_plain(raw_plain_.begin(), raw_plain_.end())
199 std::chrono::microseconds last_initiation_time;
200 static constexpr size_t salt_len = 32;
201 static constexpr size_t shared_key_size = 32;
202 std::vector<uint8_t> hkdf_salt;
203 size_t message_limit;
206 std::unique_ptr<ccf::crypto::KeyAesGcm> recv_key =
nullptr;
207 std::unique_ptr<ccf::crypto::KeyAesGcm> send_key =
nullptr;
210 std::atomic<MsgNonce> send_nonce{1};
214 std::optional<OutgoingMsg> outgoing_consensus_msg;
220 static constexpr size_t outgoing_forwarding_queue_size = 10;
221 std::vector<OutgoingMsg> outgoing_forwarding_msgs;
227 void check_message_limit()
232 const auto lower_limit = message_limit / 2;
233 size_t num_messages = send_nonce + local_recv_nonce;
237 "Reached message limit ({}+{} >= {}), triggering new key exchange",
241 reset_key_exchange();
244 else if (num_messages >= message_limit)
247 "Reached hard message limit ({}+{} >= {}), dropping previous keys",
259 std::span<const uint8_t> aad,
260 std::span<const uint8_t> cipher,
261 std::vector<uint8_t>& plain)
263 if (recv_key ==
nullptr)
265 throw std::logic_error(
"Tried to decrypt, but have no receive key");
268 auto wire_nonce = get_wire_nonce(header);
269 auto recv_nonce = wire_nonce.nonce;
272 "decrypt({} bytes, {} bytes) (nonce={})",
280 if (recv_nonce <= local_recv_nonce)
286 "Received past nonce, received:{}, "
294 recv_key->decrypt(header.get_iv(), header.tag, cipher, aad, plain);
299 local_recv_nonce = recv_nonce;
302 check_message_limit();
307 bool verify(
const GcmHdr& header, std::span<const uint8_t> aad)
309 std::vector<uint8_t> empty_plaintext;
310 return decrypt(header, aad, {}, empty_plaintext);
313 void send_key_exchange_init()
315 std::vector<uint8_t> payload;
321 append_buffer(payload, signature);
324 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
325 append_buffer(payload, hkdf_salt);
329 "send_key_exchange_init: node serial: {}",
341 void send_key_exchange_response()
343 std::vector<uint8_t> signature;
347 to_sign.insert(to_sign.end(), peer_ks.begin(), peer_ks.end());
348 signature = node_kp->sign(to_sign);
351 std::vector<uint8_t> payload;
356 append_buffer(payload, signature);
359 std::span<const uint8_t>(node_cert.
data(), node_cert.
size()));
363 "send_key_exchange_response: oks={}, serialised_signed_share={}",
365 ds::to_hex(payload));
376 void send_key_exchange_final()
378 std::vector<uint8_t> payload;
384 append_buffer(payload, signature);
388 "key_exchange_final: ks={}, serialised_signed_key_share={}",
390 ds::to_hex(payload));
401 void advance_connection_attempt()
411 const auto time_since_initiated =
412 ccf::get_enclave_time() - last_initiation_time;
436 bool recv_key_exchange_init(
437 const uint8_t* data,
size_t size,
bool they_have_priority =
false)
440 "recv_key_exchange_init({} bytes, {})", size, they_have_priority);
443 size_t peer_version = serialized::read<size_t>(data, size);
447 "Protocol version mismatch (node={}, peer={})",
453 auto ks = extract_span(data, size);
460 auto sig = extract_span(data, size);
467 auto pc = extract_span(data, size);
474 auto salt = extract_span(data, size);
490 if (!verify_peer_certificate(pc, cert, verifier))
493 "Peer certificate verification failed - recv_key_exchange_init "
494 "failed to verify peer cert:\n{}\nUsing trusted service "
501 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();
548 bool recv_key_exchange_response(
const uint8_t* data,
size_t size)
559 size_t peer_version = serialized::read<size_t>(data, size);
563 "Protocol version mismatch (node={}, peer={})",
569 auto ks = extract_span(data, size);
576 auto sig = extract_span(data, size);
583 auto pc = extract_span(data, size);
599 if (!verify_peer_certificate(pc, cert, verifier))
602 "Peer certificate verification failed - recv_key_exchange_response "
603 "failed to verify peer cert:\n{}\nUsing trusted service "
612 std::vector<uint8_t> signed_msg(ks.begin(), ks.end());
614 signed_msg.insert(signed_msg.end(), oks.begin(), oks.end());
616 if (!verify_peer_signature(signed_msg, sig, verifier))
620 "Peer certificate verification failed - recv_key_exchange_response "
621 "failed to verify signature from cert:\n{}",
634 send_key_exchange_final();
643 bool recv_key_exchange_final(
const uint8_t* data,
size_t size)
664 auto sig = extract_span(data, size);
674 "Peer certificate verification failed - recv_key_exchange_final "
675 "failed to verify signature from peer with serial number {}",
676 peer_cv->serial_number());
687 std::span<const uint8_t> extract_span(
688 const uint8_t*& data,
size_t& size)
const
695 auto sz = serialized::read<size_t>(data, size);
696 const uint8_t* data_start = data;
701 "Buffer header wants {} bytes, but only {} remain", sz, size);
710 return std::span<const uint8_t>(data_start, sz);
713 bool verify_peer_certificate(
714 std::span<const uint8_t> pc,
726 if (!verifier->verify_certificate(
727 {&service_cert}, {},
true ))
733 "New peer certificate: {}\n{}",
734 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 if (!verifier || !verifier->verify(msg, sig))
762 void update_send_key()
764 const std::string label_to = self.
value() + peer_id.
value();
765 const std::span<const uint8_t> label(
766 reinterpret_cast<const uint8_t*
>(label_to.c_str()), label_to.size());
778 void update_recv_key()
780 const std::string label_from = peer_id.
value() + self.
value();
781 const std::span<const uint8_t> label(
782 reinterpret_cast<const uint8_t*
>(label_from.c_str()),
792 local_recv_nonce = 0;
798 LOG_INFO_FMT(
"Node channel with {} is now established.", peer_id);
804 "Node certificate serial numbers: node={} peer={}",
805 node_cv->serial_number(),
806 peer_cv->serial_number());
808 if (outgoing_consensus_msg.has_value())
811 outgoing_consensus_msg->type,
812 outgoing_consensus_msg->raw_aad,
813 outgoing_consensus_msg->raw_plain);
814 outgoing_consensus_msg.reset();
817 for (
auto& outgoing_msg : outgoing_forwarding_msgs)
820 outgoing_msg.type, outgoing_msg.raw_aad, outgoing_msg.raw_plain);
823 outgoing_forwarding_msgs.clear();
828 LOG_INFO_FMT(
"Initiating node channel with {}.", peer_id);
836 hkdf_salt = e->random(salt_len);
844 last_initiation_time = ccf::get_enclave_time();
846 send_key_exchange_init();
849 void reset_key_exchange()
859 hkdf_salt = e->random(salt_len);
864 std::span<const uint8_t> aad,
865 std::span<const uint8_t> plain)
867 if (send_key ==
nullptr)
869 advance_connection_attempt();
874 if (outgoing_consensus_msg.has_value())
877 "Dropping outgoing consensus message - replaced by new "
878 "consensus message");
880 outgoing_consensus_msg = OutgoingMsg(type, aad, plain);
887 outgoing_forwarding_msgs.size() < outgoing_forwarding_queue_size)
889 outgoing_forwarding_msgs.emplace_back(type, aad, plain);
891 "Queueing outgoing forwarding message - the is the {}/{} "
893 outgoing_forwarding_msgs.size(),
894 outgoing_forwarding_queue_size);
900 "Unable to queue outgoing forwarding message - already queued "
901 "maximum {} messages",
902 outgoing_forwarding_queue_size);
910 "Unhandled message type {} on unestablished channel - ignoring",
917 auto nonce = send_nonce.fetch_add(1);
918 WireNonce wire_nonce(nonce);
921 "send({}, {} bytes, {} bytes) (nonce={})",
928 gcm_hdr.set_iv((
const uint8_t*)&wire_nonce,
sizeof(wire_nonce));
930 std::vector<uint8_t> cipher;
932 send_key->encrypt(gcm_hdr.get_iv(), plain, aad, cipher, gcm_hdr.tag);
934 const auto gcm_hdr_serialised = gcm_hdr.serialise();
943 {aad.
data(),
static_cast<size_t>(aad.size())},
944 {gcm_hdr_serialised.data(),
945 static_cast<size_t>(gcm_hdr_serialised.size())},
946 {cipher.data(),
static_cast<size_t>(cipher.size())}};
949 node_outbound, to_host, peer_id.
value(), type, self.
value(), payload);
951 check_message_limit();
966 size_t message_limit_) :
968 service_cert(service_cert_),
970 node_cert(node_cert_),
971 to_host(writer_factory.create_writer_to_outside()),
973 status(fmt::format(
"Channel to {}", peer_id_),
INACTIVE),
974 message_limit(message_limit_)
977 hkdf_salt = e->random(salt_len);
982 std::lock_guard<ccf::pal::Mutex> guard(lock);
983 return recv_key !=
nullptr && send_key !=
nullptr;
999 std::span<const uint8_t> aad,
1000 std::span<const uint8_t> plain = {})
1002 std::lock_guard<ccf::pal::Mutex> guard(lock);
1004 return send_unsafe(type, aad, plain);
1008 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1010 std::lock_guard<ccf::pal::Mutex> guard(lock);
1014 if (recv_key ==
nullptr)
1017 "Node channel with {} cannot receive authenticated message: not "
1018 "established a receive key, status={}",
1021 advance_connection_attempt();
1028 if (!verify(hdr, aad))
1039 std::lock_guard<ccf::pal::Mutex> guard(lock);
1045 if (recv_key ==
nullptr)
1048 "Node channel with {} cannot receive authenticated message with "
1049 "payload: not established a receive key, status={}",
1052 advance_connection_attempt();
1056 const uint8_t* data_ = data;
1057 size_t size_ = size;
1064 if (!verify(hdr, std::span<const uint8_t>(data, size)))
1074 std::span<const uint8_t> aad,
const uint8_t*& data,
size_t& size)
1076 std::lock_guard<ccf::pal::Mutex> guard(lock);
1079 if (recv_key ==
nullptr)
1082 "Node channel with {} cannot receive encrypted message: not "
1083 "established a receive key, status={}",
1086 advance_connection_attempt();
1087 return std::nullopt;
1093 std::vector<uint8_t> plain;
1094 if (!decrypt(hdr, aad, std::span<const uint8_t>(data, size), plain))
1097 return std::nullopt;
1105 std::lock_guard<ccf::pal::Mutex> guard(lock);
1108 reset_key_exchange();
1109 outgoing_consensus_msg.reset();
1117 std::lock_guard<ccf::pal::Mutex> guard(lock);
1121 auto chmsg = serialized::read<ChannelMsg>(data, size);
1128 return recv_key_exchange_init(data, size, self < peer_id);
1133 return recv_key_exchange_response(data, size);
1138 return recv_key_exchange_final(data, size);
1143 throw std::runtime_error(fmt::format(
1144 "Received message with initial bytes {} from {} - not recognised "
1145 "as a key exchange message",
1151 catch (
const std::exception& e)