test_bind_curve_fuzzer.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #ifdef ZMQ_USE_FUZZING_ENGINE
4 #include <fuzzer/FuzzedDataProvider.h>
5 #endif
6 
7 #include <string.h>
8 
9 #include "testutil.hpp"
10 #include "testutil_security.hpp"
11 
12 // Test that the ZMTP engine handles invalid handshake when binding
13 // https://rfc.zeromq.org/spec/37/
14 extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
15 {
16  const char *fixed_client_public =
17  "{{k*81)yMWEF{/BxdMd[5RL^qRFxBgoL<8m.D^KD";
18  const char *fixed_client_secret =
19  "N?Gmik8R[2ACw{b7*[-$S6[4}aO#?DB?#=<OQPc7";
20  const char *fixed_server_public =
21  "3.9-xXwy{g*w72TP*3iB9IJJRxlBH<ufTAvPd2>C";
22  const char *fixed_server_secret =
23  "T}t5GLq%&Qm1)y3ywu-}pY3KEA//{^Ut!M1ut+B4";
24  void *handler;
25  void *zap_thread;
26  void *server;
27  void *server_mon;
29 
31  memcpy (valid_client_public, fixed_client_public, 41);
34  &socket_config_curve_server, (void *) fixed_server_secret);
36 
37  // If there is not enough data for a full greeting, just send what we can
38  // Otherwise send greeting first, as expected by the protocol
39  uint8_t buf[512];
40  if (size >= 64) {
41  send (client, (void *) data, 64, MSG_NOSIGNAL);
42  data += 64;
43  size -= 64;
44  }
45  recv (client, buf, 64, 0);
46  // Then send HELLO and expect WELCOME if there's enough data
47  if (size >= 202) {
48  send (client, (void *) data, 202, MSG_NOSIGNAL);
49  data += 202;
50  size -= 202;
51  recv (client, buf, 170, MSG_DONTWAIT);
52  }
53  // Then send READY and expect INITIATE if there's enough data
54  if (size >= 301) {
55  send (client, (void *) data, 301, MSG_NOSIGNAL);
56  data += 301;
57  size -= 301;
58  recv (client, buf, 512, MSG_DONTWAIT);
59  }
60  msleep (250);
61  for (ssize_t sent = 0; size > 0 && (sent != -1 || errno == EINTR);
62  size -= sent > 0 ? sent : 0, data += sent > 0 ? sent : 0)
63  sent = send (client, (const char *) data, size, MSG_NOSIGNAL);
64  msleep (250);
65 
66  // Drain the queue, if any
67  zmq_msg_t msg;
68  zmq_msg_init (&msg);
69  while (-1 != zmq_msg_recv (&msg, server, ZMQ_DONTWAIT)) {
70  zmq_msg_close (&msg);
71  zmq_msg_init (&msg);
72  }
73 
74  // A well-behaved client should work while the malformed data from the other
75  // is being received
77  fixed_server_public, fixed_client_public, fixed_client_secret};
78  void *client_mon;
79  void *client_good = create_and_connect_client (
81 
82  bounce (server, client_good);
83 
84  close (client);
89 
90  return 0;
91 }
92 
93 #ifndef ZMQ_USE_FUZZING_ENGINE
95 {
96  uint8_t **data;
97  size_t *len, num_cases = 0;
99  "tests/libzmq-fuzz-corpora/test_bind_curve_fuzzer_seed_corpus", &data,
100  &len, &num_cases)
101  != 0)
102  exit (77);
103 
104  while (num_cases-- > 0) {
106  LLVMFuzzerTestOneInput (data[num_cases], len[num_cases]));
107  free (data[num_cases]);
108  }
109 
110  free (data);
111  free (len);
112 }
113 
114 int main (int argc, char **argv)
115 {
117 
118  UNITY_BEGIN ();
120 
121  return UNITY_END ();
122 }
123 #endif
bounce
static void bounce(void *socket_)
Definition: test_req_relaxed.cpp:50
curve_client_data_t
Definition: testutil_security.hpp:35
UNITY_END
return UNITY_END()
EINTR
#define EINTR
Definition: errno.hpp:7
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
setup_context_and_server_side
void setup_context_and_server_side(void **zap_control_, void **zap_thread_, void **server_, void **server_mon_, char *my_endpoint_, zmq_thread_fn zap_handler_, socket_config_fn socket_config_, void *socket_config_data_, const char *routing_id_)
Definition: testutil_security.cpp:264
LLVMFuzzerTestOneInput
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition: test_bind_curve_fuzzer.cpp:14
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
testutil_security.hpp
setup_test_context
void setup_test_context()
Definition: testutil_unity.cpp:179
errno
int errno
teardown_test_context
void teardown_test_context()
Definition: testutil_unity.cpp:189
client
void client(int num)
Definition: test_multithread.cpp:134
send
void send(fd_t fd_, const char(&data_)[N])
Definition: test_security_curve.cpp:209
curve_client_data
static NULL curve_client_data_t curve_client_data
Definition: test_security_zap.cpp:407
test_context_socket_close_zero_linger
void * test_context_socket_close_zero_linger(void *socket_)
Definition: testutil_unity.cpp:215
fuzzer_corpus_encode
int fuzzer_corpus_encode(const char *dirname, uint8_t ***data, size_t **len, size_t *num_cases)
Definition: testutil.cpp:534
socket_config_curve_server
void socket_config_curve_server(void *server_, void *server_secret_)
Definition: testutil_security.cpp:66
testutil.hpp
zmq_msg_t
Definition: zmq.h:218
test_bind_curve_fuzzer
void test_bind_curve_fuzzer()
Definition: test_bind_curve_fuzzer.cpp:94
valid_client_public
char valid_client_public[41]
Definition: testutil_security.cpp:52
connect_socket
fd_t connect_socket(const char *endpoint_, const int af_, const int protocol_)
Definition: testutil.cpp:353
shutdown_context_and_server_side
void shutdown_context_and_server_side(void *zap_thread_, void *server_, void *server_mon_, void *zap_control_, bool zap_handler_stopped_)
Definition: testutil_security.cpp:314
my_endpoint
char my_endpoint[MAX_SOCKET_STRING]
Definition: test_security_curve.cpp:31
MAX_SOCKET_STRING
#define MAX_SOCKET_STRING
Definition: libzmq/tests/testutil.hpp:35
size
#define size
Definition: glcorearb.h:2944
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
ZMQ_DONTWAIT
#define ZMQ_DONTWAIT
Definition: zmq.h:358
server
void * server
Definition: test_security_curve.cpp:29
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:4175
zmq_msg_init
ZMQ_EXPORT int zmq_msg_init(zmq_msg_t *msg_)
Definition: zmq.cpp:587
len
int len
Definition: php/ext/google/protobuf/map.c:206
server_mon
void * server_mon
Definition: test_security_curve.cpp:30
create_and_connect_client
void * create_and_connect_client(char *my_endpoint_, socket_config_fn socket_config_, void *socket_config_data_, void **client_mon_)
Definition: testutil_security.cpp:338
size
GLsizeiptr size
Definition: glcorearb.h:2943
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
zap_handler
static void zap_handler(void *handler_)
Definition: test_metadata.cpp:17
fd_t
zmq_fd_t fd_t
Definition: libzmq/tests/testutil.hpp:98
socket_config_curve_client
void socket_config_curve_client(void *client_, void *data_)
Definition: testutil_security.cpp:83
handler
void * handler
Definition: test_security_curve.cpp:27
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
zap_thread
void * zap_thread
Definition: test_security_curve.cpp:28
main
int main(int argc, char **argv)
Definition: test_bind_curve_fuzzer.cpp:114
zmq_msg_close
ZMQ_EXPORT int zmq_msg_close(zmq_msg_t *msg_)
Definition: zmq.cpp:625
TEST_ASSERT_SUCCESS_ERRNO
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
Definition: proxy_thr.cpp:47
MSG_NOSIGNAL
#define MSG_NOSIGNAL
Definition: libzmq/tests/testutil.hpp:71


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:59