CCF
Loading...
Searching...
No Matches
node_to_node.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/ds/logger.h"
6#include "ds/serialized.h"
8#include "node_types.h"
9
10#include <algorithm>
11#define FMT_HEADER_ONLY
12#include <fmt/format.h>
13
14namespace ccf
15{
17 {
18 public:
19 virtual ~NodeToNode() = default;
20
21 class DroppedMessageException : public std::exception
22 {
23 public:
26 };
27
29 const NodeId& peer_id,
30 const std::string& peer_hostname,
31 const std::string& peer_service) = 0;
32
33 virtual void close_channel(const NodeId& peer_id) = 0;
34
35 virtual bool have_channel(const NodeId& nid) = 0;
36
37 template <class T>
38 bool send_authenticated(const NodeId& to, NodeMsgType type, const T& data)
39 {
40 return send_authenticated(
41 to, type, reinterpret_cast<const uint8_t*>(&data), sizeof(T));
42 }
43
44 template <>
46 const NodeId& to, NodeMsgType type, const std::vector<uint8_t>& data)
47 {
48 return send_authenticated(to, type, data.data(), data.size());
49 }
50
51 virtual bool send_authenticated(
52 const NodeId& to, NodeMsgType type, const uint8_t* data, size_t size) = 0;
53
54 template <class T>
56 const NodeId& from, const uint8_t*& data, size_t& size)
57 {
58 std::span<const uint8_t> ts(data, sizeof(T));
59 auto& t = serialized::overlay<T>(data, size);
60
61 if (!recv_authenticated(from, ts, data, size))
62 {
63 throw DroppedMessageException(from);
64 }
65
66 return t;
67 }
68
69 template <class T>
71 const NodeId& from, const uint8_t*& data, size_t& size)
72 {
73 const auto* data_ = data;
74 auto size_ = size;
75
76 const auto& t = serialized::overlay<T>(data_, size_);
77
78 if (!recv_authenticated_with_load(from, data, size))
79 {
80 throw DroppedMessageException(from);
81 }
82 serialized::skip(data, size, sizeof(T));
83
84 return t;
85 }
86
88 const NodeId& from, const uint8_t*& data, size_t& size) = 0;
89
90 virtual bool recv_authenticated(
91 const NodeId& from,
92 std::span<const uint8_t> header,
93 const uint8_t*& data,
94 size_t& size) = 0;
95
97 const NodeId& from, const uint8_t* data, size_t size) = 0;
98
99 virtual void initialize(
100 const NodeId& self_id,
101 const ccf::crypto::Pem& service_cert,
103 const std::optional<ccf::crypto::Pem>& node_cert = std::nullopt) = 0;
104
106 const ccf::crypto::Pem& endorsed_node_cert) = 0;
107
108 virtual bool send_encrypted(
109 const NodeId& to,
110 NodeMsgType type,
111 std::span<const uint8_t> header,
112 const std::vector<uint8_t>& data) = 0;
113
114 template <class T>
116 const NodeId& to,
117 NodeMsgType type,
118 const std::vector<uint8_t>& data,
119 const T& msg_hdr)
120 {
121 std::span<const uint8_t> hdr_s{
122 reinterpret_cast<const uint8_t*>(&msg_hdr), sizeof(T)};
123 return send_encrypted(to, type, hdr_s, data);
124 }
125
126 template <class T>
127 std::pair<T, std::vector<uint8_t>> recv_encrypted(
128 const NodeId& from, const uint8_t*& data, size_t& size)
129 {
130 std::span<const uint8_t> ts(data, sizeof(T));
131 auto t = serialized::read<T>(data, size);
132
133 std::vector<uint8_t> plain = recv_encrypted(from, ts, data, size);
134 return std::make_pair(t, plain);
135 }
136
137 virtual std::vector<uint8_t> recv_encrypted(
138 const NodeId& from,
139 std::span<const uint8_t> header,
140 const uint8_t* data,
141 size_t size) = 0;
142
143 virtual void set_message_limit(size_t message_limit) = 0;
144 virtual void set_idle_timeout(std::chrono::milliseconds idle_timeout) = 0;
145
146 virtual void tick(std::chrono::milliseconds elapsed) = 0;
147 };
148}
Definition node_to_node.h:22
DroppedMessageException(const NodeId &from)
Definition node_to_node.h:25
NodeId from
Definition node_to_node.h:24
Definition node_to_node.h:17
virtual bool recv_authenticated(const NodeId &from, std::span< const uint8_t > header, const uint8_t *&data, size_t &size)=0
bool send_encrypted(const NodeId &to, NodeMsgType type, const std::vector< uint8_t > &data, const T &msg_hdr)
Definition node_to_node.h:115
virtual void set_idle_timeout(std::chrono::milliseconds idle_timeout)=0
bool send_authenticated(const NodeId &to, NodeMsgType type, const T &data)
Definition node_to_node.h:38
virtual void initialize(const NodeId &self_id, const ccf::crypto::Pem &service_cert, ccf::crypto::KeyPairPtr node_kp, const std::optional< ccf::crypto::Pem > &node_cert=std::nullopt)=0
virtual void tick(std::chrono::milliseconds elapsed)=0
const T & recv_authenticated_with_load(const NodeId &from, const uint8_t *&data, size_t &size)
Definition node_to_node.h:70
virtual bool have_channel(const NodeId &nid)=0
virtual bool recv_channel_message(const NodeId &from, const uint8_t *data, size_t size)=0
std::pair< T, std::vector< uint8_t > > recv_encrypted(const NodeId &from, const uint8_t *&data, size_t &size)
Definition node_to_node.h:127
virtual void close_channel(const NodeId &peer_id)=0
virtual std::vector< uint8_t > recv_encrypted(const NodeId &from, std::span< const uint8_t > header, const uint8_t *data, size_t size)=0
virtual void set_message_limit(size_t message_limit)=0
const T & recv_authenticated(const NodeId &from, const uint8_t *&data, size_t &size)
Definition node_to_node.h:55
bool send_authenticated(const NodeId &to, NodeMsgType type, const std::vector< uint8_t > &data)
Definition node_to_node.h:45
virtual bool recv_authenticated_with_load(const NodeId &from, const uint8_t *&data, size_t &size)=0
virtual ~NodeToNode()=default
virtual void set_endorsed_node_cert(const ccf::crypto::Pem &endorsed_node_cert)=0
virtual void associate_node_address(const NodeId &peer_id, const std::string &peer_hostname, const std::string &peer_service)=0
virtual bool send_encrypted(const NodeId &to, NodeMsgType type, std::span< const uint8_t > header, const std::vector< uint8_t > &data)=0
virtual bool send_authenticated(const NodeId &to, NodeMsgType type, const uint8_t *data, size_t size)=0
Definition pem.h:18
std::shared_ptr< KeyPair > KeyPairPtr
Definition key_pair.h:145
Definition app_interface.h:14
NodeMsgType
Definition node_types.h:19
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:166
char const * data() const
Definition entity_id.h:70