1 /*
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 */
8
9 #include <quic/fizz/server/handshake/AppToken.h>
10
11 #include <quic/fizz/handshake/FizzTransportParameters.h>
12
13 #include <fizz/server/State.h>
14
15 #include <vector>
16
17 namespace quic {
18
encodeAppToken(const AppToken & appToken)19 std::unique_ptr<folly::IOBuf> encodeAppToken(const AppToken& appToken) {
20 auto buf = folly::IOBuf::create(20);
21 folly::io::Appender appender(buf.get(), 20);
22 auto ext = encodeExtension(appToken.transportParams, QuicVersion::MVFST);
23 fizz::detail::write(ext, appender);
24 fizz::detail::writeVector<uint8_t>(appToken.sourceAddresses, appender);
25 fizz::detail::write(appToken.version, appender);
26 fizz::detail::writeBuf<uint16_t>(appToken.appParams, appender);
27 return buf;
28 }
29
decodeAppToken(const folly::IOBuf & buf)30 folly::Optional<AppToken> decodeAppToken(const folly::IOBuf& buf) {
31 AppToken appToken;
32 folly::io::Cursor cursor(&buf);
33 std::vector<fizz::Extension> extensions;
34 fizz::Extension ext;
35 try {
36 fizz::detail::read(ext, cursor);
37 extensions.push_back(std::move(ext));
38 // TODO plumb version
39 appToken.transportParams =
40 *fizz::getTicketExtension(extensions, QuicVersion::MVFST);
41 fizz::detail::readVector<uint8_t>(appToken.sourceAddresses, cursor);
42 if (cursor.isAtEnd()) {
43 return appToken;
44 }
45 fizz::detail::read(appToken.version, cursor);
46 fizz::detail::readBuf<uint16_t>(appToken.appParams, cursor);
47 } catch (const std::exception&) {
48 return folly::none;
49 }
50 return appToken;
51 }
52
53 } // namespace quic
54