diff --git a/examples/client.cc b/examples/client.cc
index bb912393c2a76d93c11efee5230f37a066dab365..b674180d59cb82caa6cde58531f45694f92062ae 100644
--- a/examples/client.cc
+++ b/examples/client.cc
@@ -621,8 +621,7 @@ int extend_max_streams_bidi(ngtcp2_conn *conn, uint64_t max_streams,
 } // namespace
 
 namespace {
-int rand(ngtcp2_conn *conn, uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx,
-         void *user_data) {
+int rand(uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx) {
   auto dis = std::uniform_int_distribution<uint8_t>(0, 255);
   std::generate(dest, dest + destlen, [&dis]() { return dis(randgen); });
   return 0;
diff --git a/examples/server.cc b/examples/server.cc
index ecc110237fea0f9c68464e25cdc91de98554bad5..550590798bf62a944b757351e91ed1b84892b78d 100644
--- a/examples/server.cc
+++ b/examples/server.cc
@@ -1057,8 +1057,7 @@ int Handler::on_stream_reset(int64_t stream_id) {
 }
 
 namespace {
-int rand(ngtcp2_conn *conn, uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx,
-         void *user_data) {
+int rand(uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx) {
   auto dis = std::uniform_int_distribution<uint8_t>(0, 255);
   std::generate(dest, dest + destlen, [&dis]() { return dis(randgen); });
   return 0;
diff --git a/lib/includes/ngtcp2/ngtcp2.h b/lib/includes/ngtcp2/ngtcp2.h
index d5e3fde7a375c642de66691b69544dfc89e28631..abef3855bebd6a1f473f717612a06c2675b3fbde 100644
--- a/lib/includes/ngtcp2/ngtcp2.h
+++ b/lib/includes/ngtcp2/ngtcp2.h
@@ -1525,8 +1525,7 @@ typedef int (*ngtcp2_extend_max_stream_data)(ngtcp2_conn *conn,
  * :enum:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library call return
  * immediately.
  */
-typedef int (*ngtcp2_rand)(ngtcp2_conn *conn, uint8_t *dest, size_t destlen,
-                           ngtcp2_rand_ctx ctx, void *user_data);
+typedef int (*ngtcp2_rand)(uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx);
 
 /**
  * @functypedef
diff --git a/lib/ngtcp2_conn.c b/lib/ngtcp2_conn.c
index 2e5321503bbf0a5578f2eae2351eeb8f17373f9a..12c0b9db5e87e5018943020e5c8dd9ded0855be4 100644
--- a/lib/ngtcp2_conn.c
+++ b/lib/ngtcp2_conn.c
@@ -3609,9 +3609,9 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn,
   }
 
   assert(conn->callbacks.rand);
-  rv = conn->callbacks.rand(conn, lfr.path_challenge.data,
+  rv = conn->callbacks.rand(lfr.path_challenge.data,
                             sizeof(lfr.path_challenge.data),
-                            NGTCP2_RAND_CTX_PATH_CHALLENGE, conn->user_data);
+                            NGTCP2_RAND_CTX_PATH_CHALLENGE);
   if (rv != 0) {
     return NGTCP2_ERR_CALLBACK_FAILURE;
   }
diff --git a/tests/ngtcp2_conn_test.c b/tests/ngtcp2_conn_test.c
index 2239cfe361fcacb1d6c5d9e179f4796be1886413..d1b313d1ec9f067a78d361327192e36a5548ecfb 100644
--- a/tests/ngtcp2_conn_test.c
+++ b/tests/ngtcp2_conn_test.c
@@ -341,11 +341,8 @@ static int recv_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd,
   return 0;
 }
 
-static int genrand(ngtcp2_conn *conn, uint8_t *dest, size_t destlen,
-                   ngtcp2_rand_ctx ctx, void *user_data) {
-  (void)conn;
+static int genrand(uint8_t *dest, size_t destlen, ngtcp2_rand_ctx ctx) {
   (void)ctx;
-  (void)user_data;
 
   memset(dest, 0, destlen);