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