1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #ifndef NET_DCSCTP_SOCKET_STATE_COOKIE_H_ 11*d9f75844SAndroid Build Coastguard Worker #define NET_DCSCTP_SOCKET_STATE_COOKIE_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <cstdint> 14*d9f75844SAndroid Build Coastguard Worker #include <vector> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 17*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h" 18*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/common/internal_types.h" 19*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/socket/capabilities.h" 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker namespace dcsctp { 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker // This is serialized as a state cookie and put in INIT_ACK. The client then 24*d9f75844SAndroid Build Coastguard Worker // responds with this in COOKIE_ECHO. 25*d9f75844SAndroid Build Coastguard Worker // 26*d9f75844SAndroid Build Coastguard Worker // NOTE: Expect that the client will modify it to try to exploit the library. 27*d9f75844SAndroid Build Coastguard Worker // Do not trust anything in it; no pointers or anything like that. 28*d9f75844SAndroid Build Coastguard Worker class StateCookie { 29*d9f75844SAndroid Build Coastguard Worker public: 30*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kCookieSize = 36; 31*d9f75844SAndroid Build Coastguard Worker StateCookie(VerificationTag initiate_tag,TSN initial_tsn,uint32_t a_rwnd,TieTag tie_tag,Capabilities capabilities)32*d9f75844SAndroid Build Coastguard Worker StateCookie(VerificationTag initiate_tag, 33*d9f75844SAndroid Build Coastguard Worker TSN initial_tsn, 34*d9f75844SAndroid Build Coastguard Worker uint32_t a_rwnd, 35*d9f75844SAndroid Build Coastguard Worker TieTag tie_tag, 36*d9f75844SAndroid Build Coastguard Worker Capabilities capabilities) 37*d9f75844SAndroid Build Coastguard Worker : initiate_tag_(initiate_tag), 38*d9f75844SAndroid Build Coastguard Worker initial_tsn_(initial_tsn), 39*d9f75844SAndroid Build Coastguard Worker a_rwnd_(a_rwnd), 40*d9f75844SAndroid Build Coastguard Worker tie_tag_(tie_tag), 41*d9f75844SAndroid Build Coastguard Worker capabilities_(capabilities) {} 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Worker // Returns a serialized version of this cookie. 44*d9f75844SAndroid Build Coastguard Worker std::vector<uint8_t> Serialize(); 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker // Deserializes the cookie, and returns absl::nullopt if that failed. 47*d9f75844SAndroid Build Coastguard Worker static absl::optional<StateCookie> Deserialize( 48*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<const uint8_t> cookie); 49*d9f75844SAndroid Build Coastguard Worker initiate_tag()50*d9f75844SAndroid Build Coastguard Worker VerificationTag initiate_tag() const { return initiate_tag_; } initial_tsn()51*d9f75844SAndroid Build Coastguard Worker TSN initial_tsn() const { return initial_tsn_; } a_rwnd()52*d9f75844SAndroid Build Coastguard Worker uint32_t a_rwnd() const { return a_rwnd_; } tie_tag()53*d9f75844SAndroid Build Coastguard Worker TieTag tie_tag() const { return tie_tag_; } capabilities()54*d9f75844SAndroid Build Coastguard Worker const Capabilities& capabilities() const { return capabilities_; } 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker private: 57*d9f75844SAndroid Build Coastguard Worker const VerificationTag initiate_tag_; 58*d9f75844SAndroid Build Coastguard Worker const TSN initial_tsn_; 59*d9f75844SAndroid Build Coastguard Worker const uint32_t a_rwnd_; 60*d9f75844SAndroid Build Coastguard Worker const TieTag tie_tag_; 61*d9f75844SAndroid Build Coastguard Worker const Capabilities capabilities_; 62*d9f75844SAndroid Build Coastguard Worker }; 63*d9f75844SAndroid Build Coastguard Worker } // namespace dcsctp 64*d9f75844SAndroid Build Coastguard Worker 65*d9f75844SAndroid Build Coastguard Worker #endif // NET_DCSCTP_SOCKET_STATE_COOKIE_H_ 66