Skip to content

Commit 0042c47

Browse files
authored
Merge pull request #34 from orbisai0security/fix-tcp-auth-token-v003
2 parents 3e40ed4 + 732d43c commit 0042c47

3 files changed

Lines changed: 21 additions & 0 deletions

File tree

include/tcp_communication.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,24 @@ struct TCPRequest {
1818
uint64_t size;
1919
uint64_t timestamp;
2020
uint8_t host_id;
21+
uint64_t auth_token;
2122
uint64_t virtual_addr;
2223
uint8_t data[TCP_CACHELINE_SIZE];
2324
} __attribute__((packed));
2425

26+
// Returns a FNV-1a hash of CXL_CLUSTER_SECRET env var, or 0 if unset.
27+
static inline uint64_t tcp_get_auth_token() {
28+
const char *secret = std::getenv("CXL_CLUSTER_SECRET");
29+
if (!secret || secret[0] == '\0')
30+
return 0;
31+
uint64_t hash = 14695981039346656037ULL;
32+
for (const char *p = secret; *p; ++p) {
33+
hash ^= static_cast<uint8_t>(*p);
34+
hash *= 1099511628211ULL;
35+
}
36+
return hash;
37+
}
38+
2539
struct TCPResponse {
2640
uint8_t status;
2741
uint64_t latency_ns;

src/distributed_server.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,6 +1616,7 @@ bool DistributedTCPTransport::send_message(uint32_t dst_node, const dist_message
16161616
tcp_msg.request.size = sizeof(dist_message_t);
16171617
tcp_msg.request.timestamp = msg.header.timestamp;
16181618
tcp_msg.request.host_id = static_cast<uint8_t>(local_node_id_);
1619+
tcp_msg.request.auth_token = tcp_get_auth_token();
16191620

16201621
// Serialize the dist_message into the data field (truncated to fit)
16211622
size_t copy_size = std::min(sizeof(tcp_msg.request.data), sizeof(dist_message_t));

src/tcp_communication.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,19 @@ int TCPServer::accept_connection() {
167167
}
168168

169169
void TCPServer::handle_client() {
170+
const uint64_t expected_token = tcp_get_auth_token();
170171
while (running_ && connected_) {
171172
TCPMessage recv_msg, send_msg;
172173

173174
if (receive_message(recv_msg) < 0) {
174175
break;
175176
}
176177

178+
if (expected_token != 0 && recv_msg.request.auth_token != expected_token) {
179+
std::cerr << "TCP auth failed: invalid token, closing connection" << std::endl;
180+
break;
181+
}
182+
177183
if (message_handler_) {
178184
message_handler_(recv_msg, send_msg);
179185
} else {

0 commit comments

Comments
 (0)