proxygen
wangle::FizzAcceptorHandshakeHelper Class Reference

#include <FizzAcceptorHandshakeHelper.h>

Inheritance diagram for wangle::FizzAcceptorHandshakeHelper:
wangle::AcceptorHandshakeHelper fizz::server::AsyncFizzServerT< SM >::HandshakeCallback folly::AsyncSSLSocket::HandshakeCB folly::DelayedDestruction folly::DelayedDestructionBase

Classes

class  LoggingCallback
 

Public Member Functions

 FizzAcceptorHandshakeHelper (std::shared_ptr< fizz::server::FizzServerContext > context, const folly::SocketAddress &clientAddr, std::chrono::steady_clock::time_point acceptTime, wangle::TransportInfo &tinfo, LoggingCallback *loggingCallback, const std::shared_ptr< fizz::extensions::TokenBindingContext > &tokenBindingContext)
 
void start (folly::AsyncSSLSocket::UniquePtr sock, wangle::AcceptorHandshakeHelper::Callback *callback) noexceptoverride
 
void dropConnection (wangle::SSLErrorEnum reason=wangle::SSLErrorEnum::NO_ERROR) override
 
- Public Member Functions inherited from folly::DelayedDestruction
virtual void destroy ()
 
bool getDestroyPending () const
 
- Public Member Functions inherited from folly::DelayedDestructionBase
virtual ~DelayedDestructionBase ()=default
 
- Public Member Functions inherited from fizz::server::AsyncFizzServerT< SM >::HandshakeCallback
virtual ~HandshakeCallback ()=default
 
virtual void fizzHandshakeSuccess (AsyncFizzServerT *transport) noexcept=0
 
virtual void fizzHandshakeError (AsyncFizzServerT *transport, folly::exception_wrapper ex) noexcept=0
 
- Public Member Functions inherited from folly::AsyncSSLSocket::HandshakeCB
virtual ~HandshakeCB ()=default
 
virtual bool handshakeVer (AsyncSSLSocket *, bool preverifyOk, X509_STORE_CTX *) noexcept
 

Protected Member Functions

virtual fizz::server::AsyncFizzServer::UniquePtr createFizzServer (folly::AsyncSSLSocket::UniquePtr sslSock, const std::shared_ptr< fizz::server::FizzServerContext > &fizzContext, const std::shared_ptr< fizz::ServerExtensions > &extensions)
 
virtual folly::AsyncSSLSocket::UniquePtr createSSLSocket (const std::shared_ptr< folly::SSLContext > &sslContext, folly::EventBase *evb, int fd)
 
void fizzHandshakeSuccess (fizz::server::AsyncFizzServer *transport) noexceptoverride
 
void fizzHandshakeError (fizz::server::AsyncFizzServer *transport, folly::exception_wrapper ex) noexceptoverride
 
void fizzHandshakeAttemptFallback (std::unique_ptr< folly::IOBuf > clientHello) override
 
void handshakeSuc (folly::AsyncSSLSocket *sock) noexceptoverride
 
void handshakeErr (folly::AsyncSSLSocket *sock, const folly::AsyncSocketException &ex) noexceptoverride
 
- Protected Member Functions inherited from folly::DelayedDestruction
 ~DelayedDestruction () override=default
 
 DelayedDestruction ()
 
- Protected Member Functions inherited from folly::DelayedDestructionBase
 DelayedDestructionBase ()
 
uint32_t getDestructorGuardCount () const
 

Protected Attributes

std::shared_ptr< fizz::server::FizzServerContextcontext_
 
std::shared_ptr< folly::SSLContextsslContext_
 
std::shared_ptr< fizz::extensions::TokenBindingContexttokenBindingContext_
 
std::shared_ptr< fizz::extensions::TokenBindingServerExtensionextension_
 
fizz::server::AsyncFizzServer::UniquePtr transport_
 
folly::AsyncSSLSocket::UniquePtr sslSocket_
 
wangle::AcceptorHandshakeHelper::Callbackcallback_
 
const folly::SocketAddressclientAddr_
 
std::chrono::steady_clock::time_point acceptTime_
 
wangle::TransportInfotinfo_
 
wangle::SSLErrorEnum sslError_ {wangle::SSLErrorEnum::NO_ERROR}
 
LoggingCallbackloggingCallback_
 

Additional Inherited Members

- Public Types inherited from wangle::AcceptorHandshakeHelper
using UniquePtr = std::unique_ptr< AcceptorHandshakeHelper, folly::DelayedDestruction::Destructor >
 

Detailed Description

Definition at line 31 of file FizzAcceptorHandshakeHelper.h.

Constructor & Destructor Documentation

wangle::FizzAcceptorHandshakeHelper::FizzAcceptorHandshakeHelper ( std::shared_ptr< fizz::server::FizzServerContext context,
const folly::SocketAddress clientAddr,
std::chrono::steady_clock::time_point  acceptTime,
wangle::TransportInfo tinfo,
LoggingCallback loggingCallback,
const std::shared_ptr< fizz::extensions::TokenBindingContext > &  tokenBindingContext 
)
inline

Definition at line 45 of file FizzAcceptorHandshakeHelper.h.

References folly::pushmi::__adl::noexcept(), and start.

53  : context_(context),
54  tokenBindingContext_(tokenBindingContext),
55  clientAddr_(clientAddr),
56  acceptTime_(acceptTime),
57  tinfo_(tinfo),
58  loggingCallback_(loggingCallback) {}
context
Definition: CMakeCache.txt:563
std::shared_ptr< fizz::extensions::TokenBindingContext > tokenBindingContext_
std::shared_ptr< fizz::server::FizzServerContext > context_
std::chrono::steady_clock::time_point acceptTime_

Member Function Documentation

AsyncFizzServer::UniquePtr wangle::FizzAcceptorHandshakeHelper::createFizzServer ( folly::AsyncSSLSocket::UniquePtr  sslSock,
const std::shared_ptr< fizz::server::FizzServerContext > &  fizzContext,
const std::shared_ptr< fizz::ServerExtensions > &  extensions 
)
protectedvirtual

Definition at line 40 of file FizzAcceptorHandshakeHelper.cpp.

References folly::gen::move.

43  {
45  new folly::AsyncSocket(std::move(sslSock)));
46  asyncSock->cacheAddresses();
48  new AsyncFizzServer(std::move(asyncSock), fizzContext, extensions));
49 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::unique_ptr< AsyncFizzServerT, folly::DelayedDestruction::Destructor > UniquePtr
AsyncFizzServerT< ServerStateMachine > AsyncFizzServer
std::unique_ptr< AsyncSocket, Destructor > UniquePtr
Definition: AsyncSocket.h:83
folly::AsyncSSLSocket::UniquePtr wangle::FizzAcceptorHandshakeHelper::createSSLSocket ( const std::shared_ptr< folly::SSLContext > &  sslContext,
folly::EventBase evb,
int  fd 
)
protectedvirtual

Definition at line 102 of file FizzAcceptorHandshakeHelper.cpp.

105  {
107  context, evb, fd));
108 }
context
Definition: CMakeCache.txt:563
std::unique_ptr< AsyncSSLSocket, Destructor > UniquePtr
void wangle::FizzAcceptorHandshakeHelper::dropConnection ( wangle::SSLErrorEnum  reason = wangle::SSLErrorEnum::NO_ERROR)
inlineoverridevirtual

Implements wangle::AcceptorHandshakeHelper.

Definition at line 64 of file FizzAcceptorHandshakeHelper.h.

References sslSocket_, and transport_.

65  {
66  sslError_ = reason;
67  if (transport_) {
68  transport_->closeNow();
69  return;
70  }
71  if (sslSocket_) {
72  sslSocket_->closeNow();
73  return;
74  }
75  }
fizz::server::AsyncFizzServer::UniquePtr transport_
folly::AsyncSSLSocket::UniquePtr sslSocket_
void wangle::FizzAcceptorHandshakeHelper::fizzHandshakeAttemptFallback ( std::unique_ptr< folly::IOBuf clientHello)
overrideprotectedvirtual

Implements fizz::server::AsyncFizzServerT< SM >::HandshakeCallback.

Definition at line 110 of file FizzAcceptorHandshakeHelper.cpp.

References folly::gen::move, sslSocket_, and transport_.

111  {
112  VLOG(3) << "Fallback to OpenSSL";
113 
114  auto evb = transport_->getEventBase();
115  auto fd =
116  transport_->getUnderlyingTransport<folly::AsyncSocket>()->detachFd();
117  transport_.reset();
118 
120  sslSocket_->setPreReceivedData(std::move(clientHello));
121  sslSocket_->enableClientHelloParsing();
122  sslSocket_->forceCacheAddrOnFailure(true);
123  sslSocket_->sslAccept(this);
124 }
std::shared_ptr< folly::SSLContext > sslContext_
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
fizz::server::AsyncFizzServer::UniquePtr transport_
folly::AsyncSSLSocket::UniquePtr sslSocket_
virtual folly::AsyncSSLSocket::UniquePtr createSSLSocket(const std::shared_ptr< folly::SSLContext > &sslContext, folly::EventBase *evb, int fd)
void wangle::FizzAcceptorHandshakeHelper::fizzHandshakeError ( fizz::server::AsyncFizzServer transport,
folly::exception_wrapper  ex 
)
overrideprotectednoexcept

Definition at line 82 of file FizzAcceptorHandshakeHelper.cpp.

References callback_, folly::gen::move, now(), and transport_.

83  {
84  if (loggingCallback_) {
85  loggingCallback_->logFizzHandshakeError(*transport, ex);
86  }
87 
88  auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
90  VLOG(3) << "Fizz handshake error after " << elapsedTime.count() << " ms; "
91  << transport->getRawBytesReceived() << " bytes received & "
92  << transport->getRawBytesWritten() << " bytes sent: " << ex.what();
93 
94  auto handshakeException =
95  folly::make_exception_wrapper<FizzHandshakeException>(
96  sslError_, elapsedTime, transport->getRawBytesReceived());
97 
99  transport_.get(), std::move(handshakeException), sslError_);
100 }
folly::fbstring what() const
virtual void logFizzHandshakeError(const fizz::server::AsyncFizzServer &, const folly::exception_wrapper &)=0
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::steady_clock::time_point now()
wangle::AcceptorHandshakeHelper::Callback * callback_
fizz::server::AsyncFizzServer::UniquePtr transport_
virtual void connectionError(folly::AsyncTransportWrapper *transport, folly::exception_wrapper ex, folly::Optional< SSLErrorEnum > sslErr) noexcept=0
std::chrono::steady_clock::time_point acceptTime_
void wangle::FizzAcceptorHandshakeHelper::fizzHandshakeSuccess ( fizz::server::AsyncFizzServer transport)
overrideprotectednoexcept

Definition at line 51 of file FizzAcceptorHandshakeHelper.cpp.

References callback_, folly::gen::move, now(), transport_, and uint8_t.

52  {
53  if (loggingCallback_) {
55  }
56 
57  VLOG(3) << "Fizz handshake success";
58 
60  tinfo_.secure = true;
62  tinfo_.sslSetupTime = std::chrono::duration_cast<std::chrono::milliseconds>(
64  if (extension_ && extension_->getNegotiatedKeyParam().hasValue()) {
66  static_cast<uint8_t>(*extension_->getNegotiatedKeyParam());
67  }
68 
69  auto* handshakeLogging = transport->getState().handshakeLogging();
70  if (handshakeLogging && handshakeLogging->clientSni) {
72  std::make_shared<std::string>(*handshakeLogging->clientSni);
73  }
74 
75  auto appProto = transport->getApplicationProtocol();
77  std::move(appProto),
80 }
std::chrono::steady_clock::time_point acceptTime
Definition: TransportInfo.h:65
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::steady_clock::time_point now()
std::string securityType
wangle::AcceptorHandshakeHelper::Callback * callback_
const State & getState() const
virtual void logFizzHandshakeSuccess(const fizz::server::AsyncFizzServer &)=0
std::shared_ptr< std::string > sslServerName
virtual void connectionReady(folly::AsyncTransportWrapper::UniquePtr transport, std::string nextProtocol, SecureTransportType secureTransportType, folly::Optional< SSLErrorEnum > sslErr) noexcept=0
fizz::server::AsyncFizzServer::UniquePtr transport_
std::shared_ptr< fizz::extensions::TokenBindingServerExtension > extension_
std::string getApplicationProtocol() const noexceptoverride
HandshakeLogging * handshakeLogging() const
Definition: State.h:193
std::string getSecurityProtocol() const override
std::chrono::steady_clock::time_point acceptTime_
std::chrono::milliseconds sslSetupTime
folly::Optional< uint8_t > negotiatedTokenBindingKeyParameters
void wangle::FizzAcceptorHandshakeHelper::handshakeErr ( folly::AsyncSSLSocket sock,
const folly::AsyncSocketException ex 
)
overrideprotectedvirtualnoexcept

handshakeErr() is called if an error occurs while establishing the SSL connection.

The HandshakeCB will be uninstalled before handshakeErr() is called.

Parameters
sockSSL socket on which the handshake was initiated
exAn exception representing the error.

Implements folly::AsyncSSLSocket::HandshakeCB.

Definition at line 149 of file FizzAcceptorHandshakeHelper.cpp.

References callback_, now(), and sslSocket_.

151  {
152  auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
154  VLOG(3) << "SSL handshake error after " << elapsedTime.count() << " ms; "
155  << sock->getRawBytesReceived() << " bytes received & "
156  << sock->getRawBytesWritten() << " bytes sent: " << ex.what();
157 
158  auto sslEx = folly::make_exception_wrapper<SSLException>(
159  sslError_, elapsedTime, sock->getRawBytesReceived());
160 
161  // The callback will delete this.
163 }
size_t getRawBytesReceived() const override
size_t getRawBytesWritten() const override
std::chrono::steady_clock::time_point now()
wangle::AcceptorHandshakeHelper::Callback * callback_
folly::AsyncSSLSocket::UniquePtr sslSocket_
virtual void connectionError(folly::AsyncTransportWrapper *transport, folly::exception_wrapper ex, folly::Optional< SSLErrorEnum > sslErr) noexcept=0
std::chrono::steady_clock::time_point acceptTime_
void wangle::FizzAcceptorHandshakeHelper::handshakeSuc ( folly::AsyncSSLSocket sock)
overrideprotectedvirtualnoexcept

handshakeSuc() is called when a new SSL connection is established, i.e., after SSL_accept/connect() returns successfully.

The HandshakeCB will be uninstalled before handshakeSuc() is called.

Parameters
sockSSL socket on which the handshake was initiated

Implements folly::AsyncSSLSocket::HandshakeCB.

Definition at line 126 of file FizzAcceptorHandshakeHelper.cpp.

References callback_, wangle::SSLAcceptorHandshakeHelper::fillSSLTransportInfoFields(), folly::gen::move, now(), and sslSocket_.

127  {
128  auto appProto = sock->getApplicationProtocol();
129  if (!appProto.empty()) {
130  VLOG(3) << "Client selected next protocol " << appProto;
131  } else {
132  VLOG(3) << "Client did not select a next protocol";
133  }
134 
135  // fill in SSL-related fields from TransportInfo
136  // the other fields like RTT are filled in the Acceptor
138  tinfo_.sslSetupTime = std::chrono::duration_cast<std::chrono::milliseconds>(
141 
142  // The callback will delete this.
144  std::move(appProto),
147 }
std::chrono::steady_clock::time_point acceptTime
Definition: TransportInfo.h:65
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::steady_clock::time_point now()
wangle::AcceptorHandshakeHelper::Callback * callback_
virtual void connectionReady(folly::AsyncTransportWrapper::UniquePtr transport, std::string nextProtocol, SecureTransportType secureTransportType, folly::Optional< SSLErrorEnum > sslErr) noexcept=0
folly::AsyncSSLSocket::UniquePtr sslSocket_
static void fillSSLTransportInfoFields(folly::AsyncSSLSocket *sock, TransportInfo &tinfo)
std::chrono::steady_clock::time_point acceptTime_
std::string getApplicationProtocol() const noexceptoverride
std::chrono::milliseconds sslSetupTime
void wangle::FizzAcceptorHandshakeHelper::start ( folly::AsyncSSLSocket::UniquePtr  sock,
wangle::AcceptorHandshakeHelper::Callback callback 
)
overridevirtualnoexcept

Implements wangle::AcceptorHandshakeHelper.

Definition at line 25 of file FizzAcceptorHandshakeHelper.cpp.

References callback_, folly::gen::move, and transport_.

27  {
28  callback_ = callback;
29  sslContext_ = sock->getSSLContext();
30 
32  extension_ =
33  std::make_shared<TokenBindingServerExtension>(tokenBindingContext_);
34  }
35 
37  transport_->accept(this);
38 }
std::shared_ptr< folly::SSLContext > sslContext_
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
wangle::AcceptorHandshakeHelper::Callback * callback_
std::shared_ptr< fizz::extensions::TokenBindingContext > tokenBindingContext_
fizz::server::AsyncFizzServer::UniquePtr transport_
std::shared_ptr< fizz::extensions::TokenBindingServerExtension > extension_
std::shared_ptr< fizz::server::FizzServerContext > context_
virtual fizz::server::AsyncFizzServer::UniquePtr createFizzServer(folly::AsyncSSLSocket::UniquePtr sslSock, const std::shared_ptr< fizz::server::FizzServerContext > &fizzContext, const std::shared_ptr< fizz::ServerExtensions > &extensions)

Member Data Documentation

std::chrono::steady_clock::time_point wangle::FizzAcceptorHandshakeHelper::acceptTime_
protected

Definition at line 109 of file FizzAcceptorHandshakeHelper.h.

wangle::AcceptorHandshakeHelper::Callback* wangle::FizzAcceptorHandshakeHelper::callback_
protected

Definition at line 107 of file FizzAcceptorHandshakeHelper.h.

const folly::SocketAddress& wangle::FizzAcceptorHandshakeHelper::clientAddr_
protected

Definition at line 108 of file FizzAcceptorHandshakeHelper.h.

std::shared_ptr<fizz::server::FizzServerContext> wangle::FizzAcceptorHandshakeHelper::context_
protected

Definition at line 101 of file FizzAcceptorHandshakeHelper.h.

std::shared_ptr<fizz::extensions::TokenBindingServerExtension> wangle::FizzAcceptorHandshakeHelper::extension_
protected

Definition at line 104 of file FizzAcceptorHandshakeHelper.h.

LoggingCallback* wangle::FizzAcceptorHandshakeHelper::loggingCallback_
protected

Definition at line 112 of file FizzAcceptorHandshakeHelper.h.

std::shared_ptr<folly::SSLContext> wangle::FizzAcceptorHandshakeHelper::sslContext_
protected

Definition at line 102 of file FizzAcceptorHandshakeHelper.h.

wangle::SSLErrorEnum wangle::FizzAcceptorHandshakeHelper::sslError_ {wangle::SSLErrorEnum::NO_ERROR}
protected

Definition at line 111 of file FizzAcceptorHandshakeHelper.h.

folly::AsyncSSLSocket::UniquePtr wangle::FizzAcceptorHandshakeHelper::sslSocket_
protected

Definition at line 106 of file FizzAcceptorHandshakeHelper.h.

wangle::TransportInfo& wangle::FizzAcceptorHandshakeHelper::tinfo_
protected

Definition at line 110 of file FizzAcceptorHandshakeHelper.h.

std::shared_ptr<fizz::extensions::TokenBindingContext> wangle::FizzAcceptorHandshakeHelper::tokenBindingContext_
protected

Definition at line 103 of file FizzAcceptorHandshakeHelper.h.

fizz::server::AsyncFizzServer::UniquePtr wangle::FizzAcceptorHandshakeHelper::transport_
protected

Definition at line 105 of file FizzAcceptorHandshakeHelper.h.


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