proxygen
fizz::server::AeadCookieCipher< AeadType, HkdfType > Class Template Reference

#include <AeadCookieCipher.h>

Inheritance diagram for fizz::server::AeadCookieCipher< AeadType, HkdfType >:
fizz::server::CookieCipher

Public Member Functions

 AeadCookieCipher ()
 
bool setCookieSecrets (const std::vector< folly::ByteRange > &cookieSecrets)
 
void setContext (const FizzServerContext *context)
 
boost::variant< AppToken, StatelessHelloRetryRequestgetTokenOrRetry (Buf clientHello, Buf appToken) const
 
folly::Optional< CookieStatedecrypt (Buf cookie) const override
 
- Public Member Functions inherited from fizz::server::CookieCipher
virtual ~CookieCipher ()=default
 

Private Member Functions

Buf getStatelessResponse (const ClientHello &chlo, Buf appToken) const
 

Private Attributes

AeadTokenCipher< AeadType, HkdfType > tokenCipher_
 
const FizzServerContextcontext_ = nullptr
 

Detailed Description

template<typename AeadType, typename HkdfType>
class fizz::server::AeadCookieCipher< AeadType, HkdfType >

Definition at line 25 of file AeadCookieCipher.h.

Constructor & Destructor Documentation

template<typename AeadType, typename HkdfType>
fizz::server::AeadCookieCipher< AeadType, HkdfType >::AeadCookieCipher ( )
inline

Definition at line 27 of file AeadCookieCipher.h.

28  : tokenCipher_(std::vector<std::string>({"Fizz Cookie Cipher v1"})) {}
AeadTokenCipher< AeadType, HkdfType > tokenCipher_

Member Function Documentation

template<typename AeadType , typename HkdfType >
folly::Optional< CookieState > fizz::server::AeadCookieCipher< AeadType, HkdfType >::decrypt ( Buf  cookie) const
overridevirtual

Implements fizz::server::CookieCipher.

Definition at line 93 of file AeadCookieCipher-inl.h.

References fizz::server::detail::decodeCookie(), folly::gen::move, and folly::none.

94  {
95  auto plaintext = tokenCipher_.decrypt(std::move(cookie));
96  if (plaintext) {
97  return detail::decodeCookie(std::move(*plaintext));
98  } else {
99  return folly::none;
100  }
101 }
CookieState decodeCookie(Buf cookie)
StringPiece cookie
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
AeadTokenCipher< AeadType, HkdfType > tokenCipher_
constexpr None none
Definition: Optional.h:87
template<typename AeadType , typename HkdfType >
Buf fizz::server::AeadCookieCipher< AeadType, HkdfType >::getStatelessResponse ( const ClientHello chlo,
Buf  appToken 
) const
private

Definition at line 104 of file AeadCookieCipher-inl.h.

References chlo, cookie, fizz::TLSContent::data, fizz::server::detail::encodeCookie(), fizz::server::getCookieState(), fizz::server::getStatelessHelloRetryRequest(), folly::gen::move, and fizz::WriteRecordLayer::writeHandshake().

106  {
107  auto state = getCookieState(
108  *context_->getFactory(),
112  chlo,
113  std::move(appToken));
114 
115  auto encoded = detail::encodeCookie(state);
116  auto cookie = tokenCipher_.encrypt(std::move(encoded));
117  if (!cookie) {
118  throw std::runtime_error("could not encrypt cookie");
119  }
120 
121  auto statelessMessage = getStatelessHelloRetryRequest(
122  state.version, state.cipher, state.group, std::move(*cookie));
123 
124  return PlaintextWriteRecordLayer()
125  .writeHandshake(std::move(statelessMessage))
126  .data;
127 }
Buf getStatelessHelloRetryRequest(ProtocolVersion version, CipherSuite cipher, folly::Optional< NamedGroup > group, Buf cookie)
static const std::string chlo
StringPiece cookie
CookieState getCookieState(const Factory &factory, const std::vector< ProtocolVersion > &supportedVersions, const std::vector< std::vector< CipherSuite >> &supportedCiphers, const std::vector< NamedGroup > &supportedGroups, const ClientHello &chlo, Buf appToken)
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
const FizzServerContext * context_
const auto & getSupportedVersions() const
AeadTokenCipher< AeadType, HkdfType > tokenCipher_
const Factory * getFactory() const
const auto & getSupportedCiphers() const
Buf encodeCookie(const CookieState &state)
const auto & getSupportedGroups() const
state
Definition: http_parser.c:272
template<typename AeadType , typename HkdfType >
boost::variant< AppToken, StatelessHelloRetryRequest > fizz::server::AeadCookieCipher< AeadType, HkdfType >::getTokenOrRetry ( Buf  clientHello,
Buf  appToken 
) const

Returns either a stateless hello retry request, or a verified token contained in the client hello.

Definition at line 64 of file AeadCookieCipher-inl.h.

References folly::IOBufQueue::cacheChainLength(), chlo, cookie, fizz::server::StatelessHelloRetryRequest::data, folly::gen::move, fizz::ReadRecordLayer::readEvent(), and fizz::server::AppToken::token.

66  {
68  queue.append(std::move(clientHello));
69  auto msg = PlaintextReadRecordLayer().readEvent(queue);
70  if (!msg) {
71  throw std::runtime_error("no TLS message in initial");
72  }
73 
74  auto chlo = std::move(boost::get<ClientHello>(*msg));
75 
76  auto cookie = getExtension<Cookie>(chlo.extensions);
77  if (cookie) {
78  auto state = decrypt(std::move(cookie->cookie));
79  if (!state) {
80  throw std::runtime_error("cookie could not be decrypted");
81  }
82  AppToken token;
83  token.token = std::move(state->appToken);
84  return std::move(token);
85  } else {
86  StatelessHelloRetryRequest hrr;
87  hrr.data = getStatelessResponse(chlo, std::move(appToken));
88  return std::move(hrr);
89  }
90 }
static const std::string chlo
StringPiece cookie
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
static Options cacheChainLength()
Definition: IOBufQueue.h:83
folly::Optional< CookieState > decrypt(Buf cookie) const override
Buf getStatelessResponse(const ClientHello &chlo, Buf appToken) const
state
Definition: http_parser.c:272
template<typename AeadType, typename HkdfType>
void fizz::server::AeadCookieCipher< AeadType, HkdfType >::setContext ( const FizzServerContext context)
inline

Set the Fizz context to use when negotiating the parameters for a stateless hello retry request.

Definition at line 41 of file AeadCookieCipher.h.

References chlo, context, and cookie.

41  {
42  context_ = context;
43  }
context
Definition: CMakeCache.txt:563
const FizzServerContext * context_
template<typename AeadType, typename HkdfType>
bool fizz::server::AeadCookieCipher< AeadType, HkdfType >::setCookieSecrets ( const std::vector< folly::ByteRange > &  cookieSecrets)
inline

Set cookie secrets to use for cookie encryption/decryption.

Definition at line 33 of file AeadCookieCipher.h.

33  {
34  return tokenCipher_.setSecrets(cookieSecrets);
35  }
AeadTokenCipher< AeadType, HkdfType > tokenCipher_

Member Data Documentation

template<typename AeadType, typename HkdfType>
const FizzServerContext* fizz::server::AeadCookieCipher< AeadType, HkdfType >::context_ = nullptr
private

Definition at line 60 of file AeadCookieCipher.h.

template<typename AeadType, typename HkdfType>
AeadTokenCipher<AeadType, HkdfType> fizz::server::AeadCookieCipher< AeadType, HkdfType >::tokenCipher_
private

Definition at line 58 of file AeadCookieCipher.h.


The documentation for this class was generated from the following files: