Use std::array<char, 16> instead of uint128 for StatelessResetToken.

Using absl::uint128 does not make much sense since this is an opaque piece of
data with a fixed size of 16 octets (that happen to be the same as the size of
uint128), no numerical operations are performed on it.  Keep absl::uint128
within QuicUtils::GenerateStatelessResetToken(), necessary for the hash
computations, but use the new alias StatelessResetToken elsewhere.

This is a follow-up to a drive-by comment at cl/366984087.

PiperOrigin-RevId: 367245431
Change-Id: Ie79796e22ed4b7c6862a55e0280e7943378d559a
diff --git a/quic/core/chlo_extractor.cc b/quic/core/chlo_extractor.cc
index 0cce9f9..48fe9a8 100644
--- a/quic/core/chlo_extractor.cc
+++ b/quic/core/chlo_extractor.cc
@@ -4,7 +4,6 @@
 
 #include "quic/core/chlo_extractor.h"
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/crypto/crypto_framer.h"
@@ -16,6 +15,7 @@
 #include "quic/core/crypto/quic_encrypter.h"
 #include "quic/core/frames/quic_ack_frequency_frame.h"
 #include "quic/core/quic_framer.h"
+#include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
 #include "common/platform/api/quiche_text_utils.h"
 
@@ -82,7 +82,8 @@
   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override;
   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& farme) override;
   void OnPacketComplete() override {}
-  bool IsValidStatelessResetToken(absl::uint128 token) const override;
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const override;
   void OnAuthenticatedIetfStatelessResetPacket(
       const QuicIetfStatelessResetPacket& /*packet*/) override {}
   void OnKeyUpdate(KeyUpdateReason /*reason*/) override;
@@ -304,7 +305,7 @@
 }
 
 bool ChloFramerVisitor::IsValidStatelessResetToken(
-    absl::uint128 /*token*/) const {
+    const StatelessResetToken& /*token*/) const {
   return false;
 }
 
diff --git a/quic/core/crypto/crypto_handshake_message.cc b/quic/core/crypto/crypto_handshake_message.cc
index ec07791..6dcb989 100644
--- a/quic/core/crypto/crypto_handshake_message.cc
+++ b/quic/core/crypto/crypto_handshake_message.cc
@@ -221,9 +221,10 @@
   return GetPOD(tag, out, sizeof(uint64_t));
 }
 
-QuicErrorCode CryptoHandshakeMessage::GetUint128(QuicTag tag,
-                                                 absl::uint128* out) const {
-  return GetPOD(tag, out, sizeof(absl::uint128));
+QuicErrorCode CryptoHandshakeMessage::GetStatelessResetToken(
+    QuicTag tag,
+    StatelessResetToken* out) const {
+  return GetPOD(tag, out, kStatelessResetTokenLength);
 }
 
 size_t CryptoHandshakeMessage::size() const {
diff --git a/quic/core/crypto/crypto_handshake_message.h b/quic/core/crypto/crypto_handshake_message.h
index de02d6c..9550c15 100644
--- a/quic/core/crypto/crypto_handshake_message.h
+++ b/quic/core/crypto/crypto_handshake_message.h
@@ -11,9 +11,9 @@
 #include <string>
 #include <vector>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/quic_packets.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -110,7 +110,9 @@
                               absl::string_view* out) const;
   QuicErrorCode GetUint32(QuicTag tag, uint32_t* out) const;
   QuicErrorCode GetUint64(QuicTag tag, uint64_t* out) const;
-  QuicErrorCode GetUint128(QuicTag tag, absl::uint128* out) const;
+
+  QuicErrorCode GetStatelessResetToken(QuicTag tag,
+                                       StatelessResetToken* out) const;
 
   // size returns 4 (message tag) + 2 (uint16_t, number of entries) +
   // (4 (tag) + 4 (end offset))*tag_value_map_.size() + ∑ value sizes.
diff --git a/quic/core/crypto/transport_parameters.cc b/quic/core/crypto/transport_parameters.cc
index 759f6f1..14df9c3 100644
--- a/quic/core/crypto/transport_parameters.cc
+++ b/quic/core/crypto/transport_parameters.cc
@@ -74,7 +74,6 @@
 constexpr uint64_t kDefaultAckDelayExponentTransportParam = 3;
 constexpr uint64_t kMaxMaxAckDelayTransportParam = 16383;
 constexpr uint64_t kDefaultMaxAckDelayTransportParam = 25;
-constexpr size_t kStatelessResetTokenLength = 16;
 constexpr uint64_t kMinActiveConnectionIdLimitTransportParam = 2;
 constexpr uint64_t kDefaultActiveConnectionIdLimitTransportParam = 2;
 
diff --git a/quic/core/frames/quic_frames_test.cc b/quic/core/frames/quic_frames_test.cc
index 82070f0..c11be9e 100644
--- a/quic/core/frames/quic_frames_test.cc
+++ b/quic/core/frames/quic_frames_test.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "absl/numeric/int128.h"
 #include "quic/core/frames/quic_ack_frame.h"
 #include "quic/core/frames/quic_blocked_frame.h"
 #include "quic/core/frames/quic_connection_close_frame.h"
@@ -117,7 +116,8 @@
   new_connection_id_frame.connection_id = TestConnectionId(2);
   new_connection_id_frame.sequence_number = 2u;
   new_connection_id_frame.retire_prior_to = 1u;
-  new_connection_id_frame.stateless_reset_token = absl::MakeUint128(0, 1);
+  new_connection_id_frame.stateless_reset_token =
+      StatelessResetToken{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
   std::ostringstream stream;
   stream << new_connection_id_frame;
   EXPECT_EQ(
diff --git a/quic/core/frames/quic_new_connection_id_frame.cc b/quic/core/frames/quic_new_connection_id_frame.cc
index 3d8787e..b4c68ff 100644
--- a/quic/core/frames/quic_new_connection_id_frame.cc
+++ b/quic/core/frames/quic_new_connection_id_frame.cc
@@ -10,7 +10,7 @@
     QuicControlFrameId control_frame_id,
     QuicConnectionId connection_id,
     QuicConnectionIdSequenceNumber sequence_number,
-    const absl::uint128 stateless_reset_token,
+    StatelessResetToken stateless_reset_token,
     uint64_t retire_prior_to)
     : control_frame_id(control_frame_id),
       connection_id(connection_id),
diff --git a/quic/core/frames/quic_new_connection_id_frame.h b/quic/core/frames/quic_new_connection_id_frame.h
index 9cad262..9c3d205 100644
--- a/quic/core/frames/quic_new_connection_id_frame.h
+++ b/quic/core/frames/quic_new_connection_id_frame.h
@@ -7,7 +7,6 @@
 
 #include <ostream>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_constants.h"
 #include "quic/core/quic_error_codes.h"
@@ -20,7 +19,7 @@
   QuicNewConnectionIdFrame(QuicControlFrameId control_frame_id,
                            QuicConnectionId connection_id,
                            QuicConnectionIdSequenceNumber sequence_number,
-                           const absl::uint128 stateless_reset_token,
+                           StatelessResetToken stateless_reset_token,
                            uint64_t retire_prior_to);
 
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
@@ -32,7 +31,7 @@
   QuicControlFrameId control_frame_id = kInvalidControlFrameId;
   QuicConnectionId connection_id = EmptyQuicConnectionId();
   QuicConnectionIdSequenceNumber sequence_number = 0;
-  absl::uint128 stateless_reset_token;
+  StatelessResetToken stateless_reset_token;
   uint64_t retire_prior_to;
 };
 
diff --git a/quic/core/frames/quic_retire_connection_id_frame.h b/quic/core/frames/quic_retire_connection_id_frame.h
index cbfc7af..3a8a4da 100644
--- a/quic/core/frames/quic_retire_connection_id_frame.h
+++ b/quic/core/frames/quic_retire_connection_id_frame.h
@@ -7,7 +7,6 @@
 
 #include <ostream>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/quic_constants.h"
 #include "quic/core/quic_error_codes.h"
 #include "quic/core/quic_types.h"
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 5e070dc..aceebe1 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -11,7 +11,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/crypto/null_encrypter.h"
@@ -3339,7 +3338,8 @@
   QuicConfig* config = client_session->config();
   ASSERT_TRUE(config);
   EXPECT_TRUE(config->HasReceivedStatelessResetToken());
-  absl::uint128 stateless_reset_token = config->ReceivedStatelessResetToken();
+  StatelessResetToken stateless_reset_token =
+      config->ReceivedStatelessResetToken();
 
   // Send the public reset.
   QuicConnection* client_connection = GetClientConnection();
@@ -3381,7 +3381,8 @@
   QuicConfig* config = client_session->config();
   ASSERT_TRUE(config);
   EXPECT_TRUE(config->HasReceivedStatelessResetToken());
-  absl::uint128 stateless_reset_token = config->ReceivedStatelessResetToken();
+  StatelessResetToken stateless_reset_token =
+      config->ReceivedStatelessResetToken();
   // Send the public reset.
   QuicConnection* client_connection = GetClientConnection();
   ASSERT_TRUE(client_connection);
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index 1f81daa..796c641 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -11,7 +11,6 @@
 #include <utility>
 
 #include "absl/base/attributes.h"
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/crypto/crypto_handshake_message.h"
 #include "quic/core/crypto/crypto_protocol.h"
@@ -225,54 +224,61 @@
   return error;
 }
 
-QuicFixedUint128::QuicFixedUint128(QuicTag tag, QuicConfigPresence presence)
+QuicFixedStatelessResetToken::QuicFixedStatelessResetToken(
+    QuicTag tag,
+    QuicConfigPresence presence)
     : QuicConfigValue(tag, presence),
       has_send_value_(false),
       has_receive_value_(false) {}
-QuicFixedUint128::~QuicFixedUint128() {}
+QuicFixedStatelessResetToken::~QuicFixedStatelessResetToken() {}
 
-bool QuicFixedUint128::HasSendValue() const {
+bool QuicFixedStatelessResetToken::HasSendValue() const {
   return has_send_value_;
 }
 
-absl::uint128 QuicFixedUint128::GetSendValue() const {
+const StatelessResetToken& QuicFixedStatelessResetToken::GetSendValue() const {
   QUIC_BUG_IF(quic_bug_12743_4, !has_send_value_)
       << "No send value to get for tag:" << QuicTagToString(tag_);
   return send_value_;
 }
 
-void QuicFixedUint128::SetSendValue(absl::uint128 value) {
+void QuicFixedStatelessResetToken::SetSendValue(
+    const StatelessResetToken& value) {
   has_send_value_ = true;
   send_value_ = value;
 }
 
-bool QuicFixedUint128::HasReceivedValue() const {
+bool QuicFixedStatelessResetToken::HasReceivedValue() const {
   return has_receive_value_;
 }
 
-absl::uint128 QuicFixedUint128::GetReceivedValue() const {
+const StatelessResetToken& QuicFixedStatelessResetToken::GetReceivedValue()
+    const {
   QUIC_BUG_IF(quic_bug_12743_5, !has_receive_value_)
       << "No receive value to get for tag:" << QuicTagToString(tag_);
   return receive_value_;
 }
 
-void QuicFixedUint128::SetReceivedValue(absl::uint128 value) {
+void QuicFixedStatelessResetToken::SetReceivedValue(
+    const StatelessResetToken& value) {
   has_receive_value_ = true;
   receive_value_ = value;
 }
 
-void QuicFixedUint128::ToHandshakeMessage(CryptoHandshakeMessage* out) const {
+void QuicFixedStatelessResetToken::ToHandshakeMessage(
+    CryptoHandshakeMessage* out) const {
   if (has_send_value_) {
     out->SetValue(tag_, send_value_);
   }
 }
 
-QuicErrorCode QuicFixedUint128::ProcessPeerHello(
+QuicErrorCode QuicFixedStatelessResetToken::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType /*hello_type*/,
     std::string* error_details) {
   QUICHE_DCHECK(error_details != nullptr);
-  QuicErrorCode error = peer_hello.GetUint128(tag_, &receive_value_);
+  QuicErrorCode error =
+      peer_hello.GetStatelessResetToken(tag_, &receive_value_);
   switch (error) {
     case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
       if (presence_ == PRESENCE_OPTIONAL) {
@@ -887,7 +893,7 @@
 void QuicConfig::SetIPv6AlternateServerAddressToSend(
     const QuicSocketAddress& alternate_server_address_ipv6,
     const QuicConnectionId& connection_id,
-    absl::uint128 stateless_reset_token) {
+    const StatelessResetToken& stateless_reset_token) {
   if (!alternate_server_address_ipv6.host().IsIPv6()) {
     QUIC_BUG(quic_bug_10575_10)
         << "Cannot use SetIPv6AlternateServerAddressToSend with "
@@ -922,7 +928,7 @@
 void QuicConfig::SetIPv4AlternateServerAddressToSend(
     const QuicSocketAddress& alternate_server_address_ipv4,
     const QuicConnectionId& connection_id,
-    absl::uint128 stateless_reset_token) {
+    const StatelessResetToken& stateless_reset_token) {
   if (!alternate_server_address_ipv4.host().IsIPv4()) {
     QUIC_BUG(quic_bug_10575_12)
         << "Cannot use SetIPv4AlternateServerAddressToSend with "
@@ -949,7 +955,7 @@
          preferred_address_connection_id_and_token_.has_value();
 }
 
-const std::pair<QuicConnectionId, absl::uint128>&
+const std::pair<QuicConnectionId, StatelessResetToken>&
 QuicConfig::ReceivedPreferredAddressConnectionIdAndToken() const {
   QUICHE_DCHECK(HasReceivedPreferredAddressConnectionIdAndToken());
   return *preferred_address_connection_id_and_token_;
@@ -1008,7 +1014,7 @@
 }
 
 void QuicConfig::SetStatelessResetTokenToSend(
-    absl::uint128 stateless_reset_token) {
+    const StatelessResetToken& stateless_reset_token) {
   stateless_reset_token_.SetSendValue(stateless_reset_token);
 }
 
@@ -1016,7 +1022,7 @@
   return stateless_reset_token_.HasReceivedValue();
 }
 
-absl::uint128 QuicConfig::ReceivedStatelessResetToken() const {
+const StatelessResetToken& QuicConfig::ReceivedStatelessResetToken() const {
   return stateless_reset_token_.GetReceivedValue();
 }
 
@@ -1204,7 +1210,8 @@
       max_idle_timeout_to_send_.ToMilliseconds());
 
   if (stateless_reset_token_.HasSendValue()) {
-    absl::uint128 stateless_reset_token = stateless_reset_token_.GetSendValue();
+    StatelessResetToken stateless_reset_token =
+        stateless_reset_token_.GetSendValue();
     params->stateless_reset_token.assign(
         reinterpret_cast<const char*>(&stateless_reset_token),
         reinterpret_cast<const char*>(&stateless_reset_token) +
@@ -1319,7 +1326,7 @@
   }
 
   if (!is_resumption && !params.stateless_reset_token.empty()) {
-    absl::uint128 stateless_reset_token;
+    StatelessResetToken stateless_reset_token;
     if (params.stateless_reset_token.size() != sizeof(stateless_reset_token)) {
       QUIC_BUG(quic_bug_10575_16) << "Bad stateless reset token length "
                                   << params.stateless_reset_token.size();
@@ -1385,7 +1392,7 @@
       if (!params.preferred_address->connection_id.IsEmpty()) {
         preferred_address_connection_id_and_token_ = std::make_pair(
             params.preferred_address->connection_id,
-            *reinterpret_cast<const absl::uint128*>(
+            *reinterpret_cast<const StatelessResetToken*>(
                 &params.preferred_address->stateless_reset_token.front()));
       }
     }
diff --git a/quic/core/quic_config.h b/quic/core/quic_config.h
index e196fc5..d122be7 100644
--- a/quic/core/quic_config.h
+++ b/quic/core/quic_config.h
@@ -9,12 +9,12 @@
 #include <cstdint>
 #include <string>
 
-#include "absl/numeric/int128.h"
 #include "absl/types/optional.h"
 #include "quic/core/crypto/transport_parameters.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_time.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -134,23 +134,25 @@
   uint64_t receive_value_;
 };
 
-// Stores uint128 from CHLO or SHLO messages that are not negotiated.
-class QUIC_EXPORT_PRIVATE QuicFixedUint128 : public QuicConfigValue {
+// Stores StatelessResetToken from CHLO or SHLO messages that are not
+// negotiated.
+class QUIC_EXPORT_PRIVATE QuicFixedStatelessResetToken
+    : public QuicConfigValue {
  public:
-  QuicFixedUint128(QuicTag tag, QuicConfigPresence presence);
-  ~QuicFixedUint128() override;
+  QuicFixedStatelessResetToken(QuicTag tag, QuicConfigPresence presence);
+  ~QuicFixedStatelessResetToken() override;
 
   bool HasSendValue() const;
 
-  absl::uint128 GetSendValue() const;
+  const StatelessResetToken& GetSendValue() const;
 
-  void SetSendValue(absl::uint128 value);
+  void SetSendValue(const StatelessResetToken& value);
 
   bool HasReceivedValue() const;
 
-  absl::uint128 GetReceivedValue() const;
+  const StatelessResetToken& GetReceivedValue() const;
 
-  void SetReceivedValue(absl::uint128 value);
+  void SetReceivedValue(const StatelessResetToken& value);
 
   // If has_send_value is true, serialises |tag_| and |send_value_| to |out|.
   void ToHandshakeMessage(CryptoHandshakeMessage* out) const override;
@@ -163,8 +165,8 @@
  private:
   bool has_send_value_;
   bool has_receive_value_;
-  absl::uint128 send_value_;
-  absl::uint128 receive_value_;
+  StatelessResetToken send_value_;
+  StatelessResetToken receive_value_;
 };
 
 // Stores tag from CHLO or SHLO messages that are not negotiated.
@@ -394,7 +396,7 @@
   void SetIPv6AlternateServerAddressToSend(
       const QuicSocketAddress& alternate_server_address_ipv6,
       const QuicConnectionId& connection_id,
-      absl::uint128 stateless_reset_token);
+      const StatelessResetToken& stateless_reset_token);
   bool HasReceivedIPv6AlternateServerAddress() const;
   const QuicSocketAddress& ReceivedIPv6AlternateServerAddress() const;
 
@@ -404,13 +406,13 @@
   void SetIPv4AlternateServerAddressToSend(
       const QuicSocketAddress& alternate_server_address_ipv4,
       const QuicConnectionId& connection_id,
-      absl::uint128 stateless_reset_token);
+      const StatelessResetToken& stateless_reset_token);
   bool HasReceivedIPv4AlternateServerAddress() const;
   const QuicSocketAddress& ReceivedIPv4AlternateServerAddress() const;
 
   // Preferred Address Connection ID and Token.
   bool HasReceivedPreferredAddressConnectionIdAndToken() const;
-  const std::pair<QuicConnectionId, absl::uint128>&
+  const std::pair<QuicConnectionId, StatelessResetToken>&
   ReceivedPreferredAddressConnectionIdAndToken() const;
 
   // Original destination connection ID.
@@ -420,9 +422,10 @@
   QuicConnectionId ReceivedOriginalConnectionId() const;
 
   // Stateless reset token.
-  void SetStatelessResetTokenToSend(absl::uint128 stateless_reset_token);
+  void SetStatelessResetTokenToSend(
+      const StatelessResetToken& stateless_reset_token);
   bool HasReceivedStatelessResetToken() const;
-  absl::uint128 ReceivedStatelessResetToken() const;
+  const StatelessResetToken& ReceivedStatelessResetToken() const;
 
   // Manage the IETF QUIC Max ACK Delay transport parameter.
   // The sent value is the delay that this node uses
@@ -604,12 +607,12 @@
   QuicFixedSocketAddress alternate_server_address_ipv4_;
   // Connection Id data to send from the server or receive at the client as part
   // of the preferred address transport parameter.
-  absl::optional<std::pair<QuicConnectionId, absl::uint128>>
+  absl::optional<std::pair<QuicConnectionId, StatelessResetToken>>
       preferred_address_connection_id_and_token_;
 
   // Stateless reset token used in IETF public reset packet.
   // Uses the stateless_reset_token transport parameter in IETF QUIC.
-  QuicFixedUint128 stateless_reset_token_;
+  QuicFixedStatelessResetToken stateless_reset_token_;
 
   // List of QuicTags whose presence immediately causes the session to
   // be created. This allows for CHLOs that are larger than a single
diff --git a/quic/core/quic_config_test.cc b/quic/core/quic_config_test.cc
index 1253740..5124a97 100644
--- a/quic/core/quic_config_test.cc
+++ b/quic/core/quic_config_test.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <string>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/crypto/crypto_handshake_message.h"
 #include "quic/core/crypto/crypto_protocol.h"
 #include "quic/core/crypto/transport_parameters.h"
@@ -188,7 +187,9 @@
   QuicIpAddress host;
   host.FromString("127.0.3.1");
   const QuicSocketAddress kTestServerAddress = QuicSocketAddress(host, 1234);
-  const absl::uint128 kTestResetToken = absl::MakeUint128(0, 10111100001);
+  const StatelessResetToken kTestStatelessResetToken{
+      0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+      0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
   const uint32_t kTestMaxAckDelayMs =
       static_cast<uint32_t>(kDefaultDelayedAckTimeMs + 1);
   QuicConfig server_config;
@@ -202,7 +203,7 @@
   server_config.SetInitialSessionFlowControlWindowToSend(
       2 * kInitialSessionFlowControlWindowForTest);
   server_config.SetIPv4AlternateServerAddressToSend(kTestServerAddress);
-  server_config.SetStatelessResetTokenToSend(kTestResetToken);
+  server_config.SetStatelessResetTokenToSend(kTestStatelessResetToken);
   server_config.SetMaxAckDelayToSendMs(kTestMaxAckDelayMs);
   CryptoHandshakeMessage msg;
   server_config.ToHandshakeMessage(&msg, version_.transport_version);
@@ -222,7 +223,7 @@
   EXPECT_EQ(kTestServerAddress, config_.ReceivedIPv4AlternateServerAddress());
   EXPECT_FALSE(config_.HasReceivedIPv6AlternateServerAddress());
   EXPECT_TRUE(config_.HasReceivedStatelessResetToken());
-  EXPECT_EQ(kTestResetToken, config_.ReceivedStatelessResetToken());
+  EXPECT_EQ(kTestStatelessResetToken, config_.ReceivedStatelessResetToken());
   EXPECT_TRUE(config_.HasReceivedMaxAckDelayMs());
   EXPECT_EQ(kTestMaxAckDelayMs, config_.ReceivedMaxAckDelayMs());
 
@@ -481,7 +482,7 @@
   host.FromString("127.0.3.1");
   QuicSocketAddress kTestServerAddress = QuicSocketAddress(host, 1234);
   QuicConnectionId new_connection_id = TestConnectionId(5);
-  absl::uint128 new_stateless_reset_token =
+  StatelessResetToken new_stateless_reset_token =
       QuicUtils::GenerateStatelessResetToken(new_connection_id);
   config_.SetIPv4AlternateServerAddressToSend(
       kTestServerAddress, new_connection_id, new_stateless_reset_token);
@@ -521,8 +522,7 @@
   EXPECT_TRUE(params.key_update_not_yet_supported);
 
   EXPECT_EQ(params.preferred_address->ipv4_socket_address, kTestServerAddress);
-  EXPECT_EQ(params.preferred_address->connection_id, new_connection_id);
-  EXPECT_EQ(*reinterpret_cast<absl::uint128*>(
+  EXPECT_EQ(*reinterpret_cast<StatelessResetToken*>(
                 &params.preferred_address->stateless_reset_token.front()),
             new_stateless_reset_token);
 }
@@ -775,7 +775,7 @@
   host.FromString("::ffff:192.0.2.128");
   QuicSocketAddress kTestServerAddress = QuicSocketAddress(host, 1234);
   QuicConnectionId new_connection_id = TestConnectionId(5);
-  absl::uint128 new_stateless_reset_token =
+  StatelessResetToken new_stateless_reset_token =
       QuicUtils::GenerateStatelessResetToken(new_connection_id);
   auto preferred_address =
       std::make_unique<TransportParameters::PreferredAddress>();
@@ -795,7 +795,7 @@
   EXPECT_TRUE(config_.HasReceivedIPv6AlternateServerAddress());
   EXPECT_EQ(config_.ReceivedIPv6AlternateServerAddress(), kTestServerAddress);
   EXPECT_TRUE(config_.HasReceivedPreferredAddressConnectionIdAndToken());
-  const std::pair<QuicConnectionId, absl::uint128>&
+  const std::pair<QuicConnectionId, StatelessResetToken>&
       preferred_address_connection_id_and_token =
           config_.ReceivedPreferredAddressConnectionIdAndToken();
   EXPECT_EQ(preferred_address_connection_id_and_token.first, new_connection_id);
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 7f10238..9bd2140 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -353,7 +353,7 @@
       fill_up_link_during_probing_(false),
       probing_retransmission_pending_(false),
       stateless_reset_token_received_(false),
-      received_stateless_reset_token_(0),
+      received_stateless_reset_token_({}),
       last_control_frame_id_(kInvalidControlFrameId),
       is_path_degrading_(false),
       processing_ack_frame_(false),
@@ -2194,7 +2194,8 @@
   }
 }
 
-bool QuicConnection::IsValidStatelessResetToken(absl::uint128 token) const {
+bool QuicConnection::IsValidStatelessResetToken(
+    const StatelessResetToken& token) const {
   return stateless_reset_token_received_ &&
          token == received_stateless_reset_token_;
 }
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 31ba053..e2ba17b 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -24,7 +24,6 @@
 #include <string>
 #include <vector>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "quic/core/crypto/quic_decrypter.h"
@@ -686,7 +685,8 @@
   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override;
   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override;
   void OnPacketComplete() override;
-  bool IsValidStatelessResetToken(absl::uint128 token) const override;
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const override;
   void OnAuthenticatedIetfStatelessResetPacket(
       const QuicIetfStatelessResetPacket& packet) override;
   void OnKeyUpdate(KeyUpdateReason reason) override;
@@ -2004,7 +2004,7 @@
   bool stateless_reset_token_received_;
   // Stores received stateless reset token from peer. Used to verify whether a
   // packet is a stateless reset packet.
-  absl::uint128 received_stateless_reset_token_;
+  StatelessResetToken received_stateless_reset_token_;
 
   // Id of latest sent control frame. 0 if no control frame has been sent.
   QuicControlFrameId last_control_frame_id_;
diff --git a/quic/core/quic_connection_id.h b/quic/core/quic_connection_id.h
index 909d916..a0669d7 100644
--- a/quic/core/quic_connection_id.h
+++ b/quic/core/quic_connection_id.h
@@ -8,7 +8,6 @@
 #include <string>
 #include <vector>
 
-#include "absl/numeric/int128.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
diff --git a/quic/core/quic_connection_id_manager.cc b/quic/core/quic_connection_id_manager.cc
index 5bf647a..a8e8c54 100644
--- a/quic/core/quic_connection_id_manager.cc
+++ b/quic/core/quic_connection_id_manager.cc
@@ -5,7 +5,6 @@
 #include "quic/core/quic_connection_id_manager.h"
 #include <cstdio>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/quic_clock.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_error_codes.h"
@@ -16,7 +15,7 @@
 QuicConnectionIdData::QuicConnectionIdData(
     const QuicConnectionId& connection_id,
     uint64_t sequence_number,
-    absl::uint128 stateless_reset_token)
+    const StatelessResetToken& stateless_reset_token)
     : connection_id(connection_id),
       sequence_number(sequence_number),
       stateless_reset_token(stateless_reset_token) {}
@@ -71,9 +70,10 @@
           new RetirePeerIssuedConnectionIdAlarm(visitor))) {
   QUICHE_DCHECK_GE(active_connection_id_limit_, 2u);
   QUICHE_DCHECK(!initial_peer_issued_connection_id.IsEmpty());
-  active_connection_id_data_.emplace_back(initial_peer_issued_connection_id,
-                                          /*sequence_number=*/0u,
-                                          absl::uint128());
+  active_connection_id_data_.emplace_back<const QuicConnectionId&, uint64_t,
+                                          const StatelessResetToken&>(
+      initial_peer_issued_connection_id,
+      /*sequence_number=*/0u, {});
   recent_new_connection_id_sequence_numbers_.Add(0u, 1u);
 }
 
diff --git a/quic/core/quic_connection_id_manager.h b/quic/core/quic_connection_id_manager.h
index 91ff934..b933a69 100644
--- a/quic/core/quic_connection_id_manager.h
+++ b/quic/core/quic_connection_id_manager.h
@@ -13,7 +13,6 @@
 #include <cstddef>
 #include <memory>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/frames/quic_new_connection_id_frame.h"
 #include "quic/core/frames/quic_retire_connection_id_frame.h"
 #include "quic/core/quic_alarm.h"
@@ -21,6 +20,7 @@
 #include "quic/core/quic_clock.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_interval_set.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -32,11 +32,11 @@
 struct QUIC_EXPORT_PRIVATE QuicConnectionIdData {
   QuicConnectionIdData(const QuicConnectionId& connection_id,
                        uint64_t sequence_number,
-                       absl::uint128 stateless_reset_token);
+                       const StatelessResetToken& stateless_reset_token);
 
   QuicConnectionId connection_id;
   uint64_t sequence_number;
-  absl::uint128 stateless_reset_token;
+  StatelessResetToken stateless_reset_token;
 };
 
 // Used by QuicSelfIssuedConnectionIdManager
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 187ef66..c27f96c 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -12,7 +12,6 @@
 #include <utility>
 
 #include "absl/base/macros.h"
-#include "absl/numeric/int128.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/congestion_control/loss_detection_interface.h"
@@ -84,6 +83,10 @@
     'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b',
 };
 
+const StatelessResetToken kTestStatelessResetToken{
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
+
 const QuicSocketAddress kPeerAddress =
     QuicSocketAddress(QuicIpAddress::Loopback6(),
                       /*port=*/12345);
@@ -6900,7 +6903,6 @@
   if (!GetParam().version.HasIetfInvariantHeader()) {
     return;
   }
-  const absl::uint128 kTestStatelessResetToken = 1010101;
   QuicConfig config;
   QuicConfigPeer::SetReceivedStatelessResetToken(&config,
                                                  kTestStatelessResetToken);
@@ -8612,8 +8614,10 @@
 }
 
 TEST_P(QuicConnectionTest, ValidStatelessResetToken) {
-  const absl::uint128 kTestToken = 1010101;
-  const absl::uint128 kWrongTestToken = 1010100;
+  const StatelessResetToken kTestToken{0, 1, 0, 1, 0, 1, 0, 1,
+                                       0, 1, 0, 1, 0, 1, 0, 1};
+  const StatelessResetToken kWrongTestToken{0, 1, 0, 1, 0, 1, 0, 1,
+                                            0, 1, 0, 1, 0, 1, 0, 2};
   QuicConfig config;
   // No token has been received.
   EXPECT_FALSE(connection_.IsValidStatelessResetToken(kTestToken));
@@ -11846,7 +11850,6 @@
     return;
   }
   PathProbeTestInit(Perspective::IS_CLIENT);
-  const absl::uint128 kTestStatelessResetToken = 1010101;
   QuicConfig config;
   QuicConfigPeer::SetReceivedStatelessResetToken(&config,
                                                  kTestStatelessResetToken);
diff --git a/quic/core/quic_control_frame_manager.cc b/quic/core/quic_control_frame_manager.cc
index 1a6d2aa..f41a356 100644
--- a/quic/core/quic_control_frame_manager.cc
+++ b/quic/core/quic_control_frame_manager.cc
@@ -138,7 +138,7 @@
     const QuicConnectionId& connection_id,
     uint64_t sequence_number,
     uint64_t retire_prior_to,
-    absl::uint128 stateless_reset_token) {
+    const StatelessResetToken& stateless_reset_token) {
   QUIC_DVLOG(1) << "Writing NEW_CONNECTION_ID frame";
   WriteOrBufferQuicFrame(QuicFrame(new QuicNewConnectionIdFrame(
       ++last_control_frame_id_, connection_id, sequence_number,
diff --git a/quic/core/quic_control_frame_manager.h b/quic/core/quic_control_frame_manager.h
index 1406872..1bb3703 100644
--- a/quic/core/quic_control_frame_manager.h
+++ b/quic/core/quic_control_frame_manager.h
@@ -8,10 +8,10 @@
 #include <cstdint>
 #include <string>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/frames/quic_frame.h"
 #include "quic/core/quic_circular_deque.h"
 #include "quic/core/quic_connection_id.h"
+#include "quic/core/quic_types.h"
 
 namespace quic {
 
@@ -93,10 +93,11 @@
 
   // Tries to send a NEW_CONNECTION_ID frame. The frame is buffered if it cannot
   // be sent immediately.
-  void WriteOrBufferNewConnectionId(const QuicConnectionId& connection_id,
-                                    uint64_t sequence_number,
-                                    uint64_t retire_prior_to,
-                                    absl::uint128 stateless_reset_token);
+  void WriteOrBufferNewConnectionId(
+      const QuicConnectionId& connection_id,
+      uint64_t sequence_number,
+      uint64_t retire_prior_to,
+      const StatelessResetToken& stateless_reset_token);
 
   // Tries to send a RETIRE_CONNNECTION_ID frame. The frame is buffered if it
   // cannot be sent immediately.
diff --git a/quic/core/quic_control_frame_manager_test.cc b/quic/core/quic_control_frame_manager_test.cc
index d077410..9d6b434 100644
--- a/quic/core/quic_control_frame_manager_test.cc
+++ b/quic/core/quic_control_frame_manager_test.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/crypto/null_encrypter.h"
 #include "quic/core/frames/quic_ack_frequency_frame.h"
 #include "quic/core/frames/quic_retire_connection_id_frame.h"
@@ -251,7 +250,8 @@
   // Send NewConnectionIdFrame as frame 6.
   manager_->WriteOrBufferNewConnectionId(
       TestConnectionId(3), /*sequence_number=*/2, /*retire_prior_to=*/1,
-      /*stateless_reset_token=*/absl::MakeUint128(1, 1));
+      /*stateless_reset_token=*/
+      {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1});
   // Send RetireConnectionIdFrame as frame 7.
   manager_->WriteOrBufferRetireConnectionId(/*sequence_number=*/0);
   manager_->OnCanWrite();
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index ebaa091..c5de97b 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -1300,14 +1300,14 @@
 // static
 size_t QuicFramer::GetMinStatelessResetPacketLength() {
   // 5 bytes (40 bits) = 2 Fixed Bits (01) + 38 Unpredictable bits
-  return 5 + sizeof(absl::uint128);
+  return 5 + kStatelessResetTokenLength;
 }
 
 // static
 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
     QuicConnectionId /*connection_id*/,
     size_t received_packet_length,
-    absl::uint128 stateless_reset_token) {
+    StatelessResetToken stateless_reset_token) {
   QUIC_DVLOG(1) << "Building IETF stateless reset packet.";
   if (GetQuicReloadableFlag(quic_fix_stateless_reset)) {
     if (received_packet_length <= GetMinStatelessResetPacketLength()) {
@@ -1329,9 +1329,9 @@
     // cryptographic use, and does not need a secure cryptographic pseudo-random
     // number generator. It's therefore safe to use WriteInsecureRandomBytes.
     if (!writer.WriteInsecureRandomBytes(QuicRandom::GetInstance(),
-                                         len - sizeof(absl::uint128))) {
+                                         len - kStatelessResetTokenLength)) {
       QUIC_BUG(362045737_2) << "Failed to append random bytes of length: "
-                            << len - sizeof(absl::uint128);
+                            << len - kStatelessResetTokenLength;
       return nullptr;
     }
     // Change first 2 fixed bits to 01.
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h
index 5704cb5..e27c7f0 100644
--- a/quic/core/quic_framer.h
+++ b/quic/core/quic_framer.h
@@ -10,7 +10,6 @@
 #include <memory>
 #include <string>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/crypto/quic_decrypter.h"
 #include "quic/core/crypto/quic_encrypter.h"
@@ -226,7 +225,8 @@
   virtual void OnPacketComplete() = 0;
 
   // Called to check whether |token| is a valid stateless reset token.
-  virtual bool IsValidStatelessResetToken(absl::uint128 token) const = 0;
+  virtual bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const = 0;
 
   // Called when an IETF stateless reset packet has been parsed and validated
   // with the stateless reset token.
@@ -478,7 +478,7 @@
   static std::unique_ptr<QuicEncryptedPacket> BuildIetfStatelessResetPacket(
       QuicConnectionId connection_id,
       size_t received_packet_length,
-      absl::uint128 stateless_reset_token);
+      StatelessResetToken stateless_reset_token);
 
   // Returns a new version negotiation packet.
   static std::unique_ptr<QuicEncryptedPacket> BuildVersionNegotiationPacket(
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index f64e7a5..048a4b7 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -47,7 +47,9 @@
 const uint64_t kEpoch = UINT64_C(1) << 32;
 const uint64_t kMask = kEpoch - 1;
 
-const absl::uint128 kTestStatelessResetToken = 1010101;  // 0x0F69B5
+const StatelessResetToken kTestStatelessResetToken{
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
 
 // Use fields in which each byte is distinct to ensure that every byte is
 // framed correctly. The values are otherwise arbitrary.
@@ -571,7 +573,8 @@
     return true;
   }
 
-  bool IsValidStatelessResetToken(absl::uint128 token) const override {
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const override {
     EXPECT_EQ(0u, framer_->current_received_frame_type());
     return token == kTestStatelessResetToken;
   }
@@ -5752,8 +5755,8 @@
       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
       0x01, 0x11, 0x02, 0x22, 0x03, 0x33, 0x04, 0x44,
       // stateless reset token
-      0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+      0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   };
   // clang-format on
   if (!framer_.version().HasIetfInvariantHeader()) {
@@ -9253,8 +9256,8 @@
       // At least 4 bytes of random bytes.
       0x00, 0x00, 0x00, 0x00,
       // stateless reset token
-      0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+      0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
     };
     // clang-format on
 
@@ -9272,11 +9275,10 @@
     // Verify stateless reset token.
     quiche::test::CompareCharArraysWithHexError(
         "constructed packet",
-        data->data() + data->length() - sizeof(kTestStatelessResetToken),
-        sizeof(kTestStatelessResetToken),
-        AsChars(packet) + ABSL_ARRAYSIZE(packet) -
-            sizeof(kTestStatelessResetToken),
-        sizeof(kTestStatelessResetToken));
+        data->data() + data->length() - kStatelessResetTokenLength,
+        kStatelessResetTokenLength,
+        AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
+        kStatelessResetTokenLength);
 
     // Packets with length <= minimal stateless reset does not trigger stateless
     // reset.
@@ -9306,8 +9308,8 @@
     // random packet number
     0xFE,
     // stateless reset token
-    0xB5, 0x69, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   };
   // clang-format on
 
@@ -9319,16 +9321,15 @@
   quiche::test::CompareCharArraysWithHexError(
       "constructed packet", data->data(), 1, AsChars(packet), 1);
   const size_t random_bytes_length =
-      data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken);
+      data->length() - kPacketHeaderTypeSize - kStatelessResetTokenLength;
   EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length);
   // Verify stateless reset token is correct.
   quiche::test::CompareCharArraysWithHexError(
       "constructed packet",
-      data->data() + data->length() - sizeof(kTestStatelessResetToken),
-      sizeof(kTestStatelessResetToken),
-      AsChars(packet) + ABSL_ARRAYSIZE(packet) -
-          sizeof(kTestStatelessResetToken),
-      sizeof(kTestStatelessResetToken));
+      data->data() + data->length() - kStatelessResetTokenLength,
+      kStatelessResetTokenLength,
+      AsChars(packet) + ABSL_ARRAYSIZE(packet) - kStatelessResetTokenLength,
+      kStatelessResetTokenLength);
 }
 
 TEST_P(QuicFramerTest, EncryptPacket) {
@@ -10912,8 +10913,8 @@
       {"Unable to read new connection ID frame connection id.",
        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11}},
       {"Can not read new connection ID frame reset token.",
-       {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
+       {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+        0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
   };
   // clang-format on
 
@@ -10971,8 +10972,8 @@
       {"Unable to read new connection ID frame connection id.",
        {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0x42}},
       {"Can not read new connection ID frame reset token.",
-       {0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
+       {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+        0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}}
   };
   // clang-format on
 
@@ -11138,8 +11139,8 @@
     // new connection id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
     // stateless reset token
-    0xb5, 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   };
   // clang-format on
 
@@ -11545,8 +11546,8 @@
     return;
   }
 
-  QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111,
-                                             1);
+  QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1,
+                                             kTestStatelessResetToken, 1);
   EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
             QuicFramer::GetRetransmittableControlFrameSize(
                 framer_.transport_version(), QuicFrame(&new_connection_id)));
diff --git a/quic/core/quic_packets.cc b/quic/core/quic_packets.cc
index a7599cf..5cc593f 100644
--- a/quic/core/quic_packets.cc
+++ b/quic/core/quic_packets.cc
@@ -183,7 +183,7 @@
       nonce(nullptr),
       form(GOOGLE_QUIC_PACKET),
       long_packet_type(INITIAL),
-      possible_stateless_reset_token(0),
+      possible_stateless_reset_token({}),
       retry_token_length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
       retry_token(absl::string_view()),
       length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
@@ -215,11 +215,11 @@
 QuicVersionNegotiationPacket::~QuicVersionNegotiationPacket() {}
 
 QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket()
-    : stateless_reset_token(0) {}
+    : stateless_reset_token({}) {}
 
 QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket(
     const QuicPacketHeader& header,
-    absl::uint128 token)
+    StatelessResetToken token)
     : header(header), stateless_reset_token(token) {}
 
 QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket(
diff --git a/quic/core/quic_packets.h b/quic/core/quic_packets.h
index 338adae..a3fc59d 100644
--- a/quic/core/quic_packets.h
+++ b/quic/core/quic_packets.h
@@ -7,14 +7,11 @@
 
 #include <cstddef>
 #include <cstdint>
-#include <limits>
-#include <list>
 #include <memory>
 #include <ostream>
+#include <string>
 #include <utility>
-#include <vector>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/frames/quic_frame.h"
 #include "quic/core/quic_ack_listener_interface.h"
@@ -155,7 +152,7 @@
   // Only valid if |has_possible_stateless_reset_token| is true.
   // Stores last 16 bytes of a this packet, used to check whether this packet is
   // a stateless reset packet on decryption failure.
-  absl::uint128 possible_stateless_reset_token;
+  StatelessResetToken possible_stateless_reset_token;
   // Length of the retry token length variable length integer field,
   // carried only by v99 IETF Initial packets.
   QuicVariableLengthIntegerLength retry_token_length_length;
@@ -196,12 +193,12 @@
 struct QUIC_EXPORT_PRIVATE QuicIetfStatelessResetPacket {
   QuicIetfStatelessResetPacket();
   QuicIetfStatelessResetPacket(const QuicPacketHeader& header,
-                               absl::uint128 token);
+                               StatelessResetToken token);
   QuicIetfStatelessResetPacket(const QuicIetfStatelessResetPacket& other);
   ~QuicIetfStatelessResetPacket();
 
   QuicPacketHeader header;
-  absl::uint128 stateless_reset_token;
+  StatelessResetToken stateless_reset_token;
 };
 
 class QUIC_EXPORT_PRIVATE QuicData {
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 55a9c19..7c7aa4d 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -2359,7 +2359,7 @@
                                                     writer);
 }
 
-absl::uint128 QuicSession::GetStatelessResetToken() const {
+StatelessResetToken QuicSession::GetStatelessResetToken() const {
   return QuicUtils::GenerateStatelessResetToken(connection_->connection_id());
 }
 
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index bd65bf3..cf366cf 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -15,7 +15,6 @@
 #include <vector>
 
 #include "absl/container/flat_hash_map.h"
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "quic/core/frames/quic_ack_frequency_frame.h"
@@ -721,7 +720,7 @@
 
   // Returns a stateless reset token which will be included in the public reset
   // packet.
-  virtual absl::uint128 GetStatelessResetToken() const;
+  virtual StatelessResetToken GetStatelessResetToken() const;
 
   QuicControlFrameManager& control_frame_manager() {
     return control_frame_manager_;
diff --git a/quic/core/quic_time_wait_list_manager.cc b/quic/core/quic_time_wait_list_manager.cc
index 857b6c7..d6fa2da 100644
--- a/quic/core/quic_time_wait_list_manager.cc
+++ b/quic/core/quic_time_wait_list_manager.cc
@@ -500,7 +500,7 @@
 
 QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() = default;
 
-absl::uint128 QuicTimeWaitListManager::GetStatelessResetToken(
+StatelessResetToken QuicTimeWaitListManager::GetStatelessResetToken(
     QuicConnectionId connection_id) const {
   return QuicUtils::GenerateStatelessResetToken(connection_id);
 }
diff --git a/quic/core/quic_time_wait_list_manager.h b/quic/core/quic_time_wait_list_manager.h
index 5e097b5..2018f72 100644
--- a/quic/core/quic_time_wait_list_manager.h
+++ b/quic/core/quic_time_wait_list_manager.h
@@ -12,13 +12,13 @@
 #include <memory>
 
 #include "absl/container/flat_hash_map.h"
-#include "absl/numeric/int128.h"
 #include "quic/core/quic_blocked_writer_interface.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_framer.h"
 #include "quic/core/quic_packet_writer.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_session.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_containers.h"
 #include "quic/platform/api/quic_flags.h"
 
@@ -187,7 +187,7 @@
 
   // Returns a stateless reset token which will be included in the public reset
   // packet.
-  virtual absl::uint128 GetStatelessResetToken(
+  virtual StatelessResetToken GetStatelessResetToken(
       QuicConnectionId connection_id) const;
 
   // Internal structure to store pending termination packets.
diff --git a/quic/core/quic_time_wait_list_manager_test.cc b/quic/core/quic_time_wait_list_manager_test.cc
index b423713..d33e992 100644
--- a/quic/core/quic_time_wait_list_manager_test.cc
+++ b/quic/core/quic_time_wait_list_manager_test.cc
@@ -9,7 +9,6 @@
 #include <ostream>
 #include <utility>
 
-#include "absl/numeric/int128.h"
 #include "quic/core/crypto/crypto_protocol.h"
 #include "quic/core/crypto/null_encrypter.h"
 #include "quic/core/crypto/quic_decrypter.h"
@@ -57,7 +56,8 @@
     return public_reset_packet_;
   }
 
-  bool IsValidStatelessResetToken(absl::uint128 token) const override {
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const override {
     return token == QuicUtils::GenerateStatelessResetToken(connection_id_);
   }
 
@@ -220,7 +220,7 @@
   QuicIetfStatelessResetPacket stateless_reset =
       visitor.stateless_reset_packet();
 
-  absl::uint128 expected_stateless_reset_token =
+  StatelessResetToken expected_stateless_reset_token =
       QuicUtils::GenerateStatelessResetToken(expected_connection_id);
 
   bool stateless_reset_is_valid =
diff --git a/quic/core/quic_types.cc b/quic/core/quic_types.cc
index f818268..57163ab 100644
--- a/quic/core/quic_types.cc
+++ b/quic/core/quic_types.cc
@@ -11,6 +11,9 @@
 
 namespace quic {
 
+static_assert(sizeof(StatelessResetToken) == kStatelessResetTokenLength,
+              "bad size");
+
 std::ostream& operator<<(std::ostream& os, const QuicConsumedData& s) {
   os << "bytes_consumed: " << s.bytes_consumed
      << " fin_consumed: " << s.fin_consumed;
diff --git a/quic/core/quic_types.h b/quic/core/quic_types.h
index 83404c5..2e65e5f 100644
--- a/quic/core/quic_types.h
+++ b/quic/core/quic_types.h
@@ -44,6 +44,9 @@
 using DiversificationNonce = std::array<char, 32>;
 using PacketTimeVector = std::vector<std::pair<QuicPacketNumber, QuicTime>>;
 
+enum : size_t { kStatelessResetTokenLength = 16 };
+using StatelessResetToken = std::array<char, kStatelessResetTokenLength>;
+
 // WebTransport session IDs are stream IDs.
 using WebTransportSessionId = uint64_t;
 
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index 7e3652e..27b74bb 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -630,10 +630,15 @@
                                              transport_version);
 }
 
-absl::uint128 QuicUtils::GenerateStatelessResetToken(
+StatelessResetToken QuicUtils::GenerateStatelessResetToken(
     QuicConnectionId connection_id) {
-  return FNV1a_128_Hash(
+  static_assert(sizeof(absl::uint128) == sizeof(StatelessResetToken),
+                "bad size");
+  static_assert(alignof(absl::uint128) >= alignof(StatelessResetToken),
+                "bad alignment");
+  absl::uint128 hash = FNV1a_128_Hash(
       absl::string_view(connection_id.data(), connection_id.length()));
+  return *reinterpret_cast<StatelessResetToken*>(&hash);
 }
 
 // static
diff --git a/quic/core/quic_utils.h b/quic/core/quic_utils.h
index abef12b..0b089b4 100644
--- a/quic/core/quic_utils.h
+++ b/quic/core/quic_utils.h
@@ -219,7 +219,7 @@
   static QuicConnectionId CreateZeroConnectionId(QuicTransportVersion version);
 
   // Generates a 128bit stateless reset token based on a connection ID.
-  static absl::uint128 GenerateStatelessResetToken(
+  static StatelessResetToken GenerateStatelessResetToken(
       QuicConnectionId connection_id);
 
   // Determines packet number space from |encryption_level|.
diff --git a/quic/core/quic_utils_test.cc b/quic/core/quic_utils_test.cc
index a178725..dc11652 100644
--- a/quic/core/quic_utils_test.cc
+++ b/quic/core/quic_utils_test.cc
@@ -312,11 +312,12 @@
   QuicConnectionId connection_id1a = test::TestConnectionId(1);
   QuicConnectionId connection_id1b = test::TestConnectionId(1);
   QuicConnectionId connection_id2 = test::TestConnectionId(2);
-  absl::uint128 token1a =
+  StatelessResetToken token1a =
       QuicUtils::GenerateStatelessResetToken(connection_id1a);
-  absl::uint128 token1b =
+  StatelessResetToken token1b =
       QuicUtils::GenerateStatelessResetToken(connection_id1b);
-  absl::uint128 token2 = QuicUtils::GenerateStatelessResetToken(connection_id2);
+  StatelessResetToken token2 =
+      QuicUtils::GenerateStatelessResetToken(connection_id2);
   EXPECT_EQ(token1a, token1b);
   EXPECT_NE(token1a, token2);
 }
diff --git a/quic/core/tls_chlo_extractor.h b/quic/core/tls_chlo_extractor.h
index 8383af1..c6d0455 100644
--- a/quic/core/tls_chlo_extractor.h
+++ b/quic/core/tls_chlo_extractor.h
@@ -8,12 +8,12 @@
 #include <memory>
 #include <string>
 #include <vector>
-#include "absl/numeric/int128.h"
 #include "third_party/boringssl/src/include/openssl/ssl.h"
 #include "quic/core/frames/quic_ack_frequency_frame.h"
 #include "quic/core/quic_framer.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_stream_sequencer.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -157,7 +157,8 @@
     return true;
   }
   void OnPacketComplete() override {}
-  bool IsValidStatelessResetToken(absl::uint128 /*token*/) const override {
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& /*token*/) const override {
     return true;
   }
   void OnAuthenticatedIetfStatelessResetPacket(
diff --git a/quic/test_tools/quic_config_peer.cc b/quic/test_tools/quic_config_peer.cc
index 03a477e..243216b 100644
--- a/quic/test_tools/quic_config_peer.cc
+++ b/quic/test_tools/quic_config_peer.cc
@@ -87,8 +87,9 @@
 }
 
 // static
-void QuicConfigPeer::SetReceivedStatelessResetToken(QuicConfig* config,
-                                                    absl::uint128 token) {
+void QuicConfigPeer::SetReceivedStatelessResetToken(
+    QuicConfig* config,
+    const StatelessResetToken& token) {
   config->stateless_reset_token_.SetReceivedValue(token);
 }
 
diff --git a/quic/test_tools/quic_config_peer.h b/quic/test_tools/quic_config_peer.h
index 9f48a79..6ffc5ae 100644
--- a/quic/test_tools/quic_config_peer.h
+++ b/quic/test_tools/quic_config_peer.h
@@ -5,10 +5,10 @@
 #ifndef QUICHE_QUIC_TEST_TOOLS_QUIC_CONFIG_PEER_H_
 #define QUICHE_QUIC_TEST_TOOLS_QUIC_CONFIG_PEER_H_
 
-#include "absl/numeric/int128.h"
 #include "quic/core/quic_config.h"
 #include "quic/core/quic_connection_id.h"
 #include "quic/core/quic_packets.h"
+#include "quic/core/quic_types.h"
 
 namespace quic {
 
@@ -55,7 +55,7 @@
                                          const QuicTagVector& options);
 
   static void SetReceivedStatelessResetToken(QuicConfig* config,
-                                             absl::uint128 token);
+                                             const StatelessResetToken& token);
 
   static void SetReceivedMaxPacketSize(QuicConfig* config,
                                        uint32_t max_udp_payload_size);
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index c247526..5feb646 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -449,7 +449,7 @@
 }
 
 bool NoOpFramerVisitor::IsValidStatelessResetToken(
-    absl::uint128 /*token*/) const {
+    const StatelessResetToken& /*token*/) const {
   return false;
 }
 
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 763638f..2f16b1e 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -14,7 +14,6 @@
 #include <vector>
 
 #include "absl/container/flat_hash_map.h"
-#include "absl/numeric/int128.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/congestion_control/loss_detection_interface.h"
@@ -432,7 +431,7 @@
   MOCK_METHOD(void, OnPacketComplete, (), (override));
   MOCK_METHOD(bool,
               IsValidStatelessResetToken,
-              (absl::uint128),
+              (const StatelessResetToken&),
               (const, override));
   MOCK_METHOD(void,
               OnAuthenticatedIetfStatelessResetPacket,
@@ -505,7 +504,8 @@
   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override;
   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override;
   void OnPacketComplete() override {}
-  bool IsValidStatelessResetToken(absl::uint128 token) const override;
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& token) const override;
   void OnAuthenticatedIetfStatelessResetPacket(
       const QuicIetfStatelessResetPacket& /*packet*/) override {}
   void OnKeyUpdate(KeyUpdateReason /*reason*/) override {}
diff --git a/quic/test_tools/simple_quic_framer.cc b/quic/test_tools/simple_quic_framer.cc
index 14d5b33..92363ec 100644
--- a/quic/test_tools/simple_quic_framer.cc
+++ b/quic/test_tools/simple_quic_framer.cc
@@ -8,10 +8,10 @@
 #include <utility>
 
 #include "absl/memory/memory.h"
-#include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/crypto/quic_decrypter.h"
 #include "quic/core/crypto/quic_encrypter.h"
+#include "quic/core/quic_types.h"
 
 namespace quic {
 namespace test {
@@ -211,7 +211,8 @@
 
   void OnPacketComplete() override {}
 
-  bool IsValidStatelessResetToken(absl::uint128 /*token*/) const override {
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& /*token*/) const override {
     return false;
   }
 
diff --git a/quic/tools/quic_packet_printer_bin.cc b/quic/tools/quic_packet_printer_bin.cc
index 4fc82e4..97ca71e 100644
--- a/quic/tools/quic_packet_printer_bin.cc
+++ b/quic/tools/quic_packet_printer_bin.cc
@@ -28,10 +28,10 @@
 
 #include <iostream>
 
-#include "absl/numeric/int128.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/quic_framer.h"
+#include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
 #include "quic/platform/api/quic_flags.h"
 #include "common/platform/api/quiche_text_utils.h"
@@ -214,7 +214,8 @@
     return true;
   }
   void OnPacketComplete() override { std::cerr << "OnPacketComplete\n"; }
-  bool IsValidStatelessResetToken(absl::uint128 /*token*/) const override {
+  bool IsValidStatelessResetToken(
+      const StatelessResetToken& /*token*/) const override {
     std::cerr << "IsValidStatelessResetToken\n";
     return false;
   }