quic/fizz/handshake/QuicFizzFactory.cpp (90 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include <quic/fizz/handshake/QuicFizzFactory.h> namespace { class QuicPlaintextReadRecordLayer : public fizz::PlaintextReadRecordLayer { public: ~QuicPlaintextReadRecordLayer() override = default; ReadResult<fizz::TLSMessage> read( folly::IOBufQueue& buf, fizz::Aead::AeadOptions) override { if (buf.empty()) { return folly::none; } fizz::TLSMessage msg; msg.type = fizz::ContentType::handshake; msg.fragment = buf.move(); return ReadResult<fizz::TLSMessage>::from(std::move(msg)); } }; class QuicEncryptedReadRecordLayer : public fizz::EncryptedReadRecordLayer { public: ~QuicEncryptedReadRecordLayer() override = default; explicit QuicEncryptedReadRecordLayer(fizz::EncryptionLevel encryptionLevel) : fizz::EncryptedReadRecordLayer(encryptionLevel) {} ReadResult<fizz::TLSMessage> read( folly::IOBufQueue& buf, fizz::Aead::AeadOptions) override { if (buf.empty()) { return folly::none; } fizz::TLSMessage msg; msg.type = fizz::ContentType::handshake; msg.fragment = buf.move(); return ReadResult<fizz::TLSMessage>::from(std::move(msg)); } }; class QuicPlaintextWriteRecordLayer : public fizz::PlaintextWriteRecordLayer { public: ~QuicPlaintextWriteRecordLayer() override = default; fizz::TLSContent write( fizz::TLSMessage&& msg, fizz::Aead::AeadOptions /*options*/) const override { fizz::TLSContent content; content.data = std::move(msg.fragment); content.contentType = msg.type; content.encryptionLevel = getEncryptionLevel(); return content; } fizz::TLSContent writeInitialClientHello( std::unique_ptr<folly::IOBuf> encodedClientHello) const override { return write( fizz::TLSMessage{ fizz::ContentType::handshake, std::move(encodedClientHello)}, fizz::Aead::AeadOptions()); } }; class QuicEncryptedWriteRecordLayer : public fizz::EncryptedWriteRecordLayer { public: ~QuicEncryptedWriteRecordLayer() override = default; explicit QuicEncryptedWriteRecordLayer(fizz::EncryptionLevel encryptionLevel) : EncryptedWriteRecordLayer(encryptionLevel) {} fizz::TLSContent write( fizz::TLSMessage&& msg, fizz::Aead::AeadOptions /*options*/) const override { fizz::TLSContent content; content.data = std::move(msg.fragment); content.contentType = msg.type; content.encryptionLevel = getEncryptionLevel(); return content; } }; } // namespace namespace quic { std::unique_ptr<fizz::PlaintextReadRecordLayer> QuicFizzFactory::makePlaintextReadRecordLayer() const { return std::make_unique<QuicPlaintextReadRecordLayer>(); } std::unique_ptr<fizz::PlaintextWriteRecordLayer> QuicFizzFactory::makePlaintextWriteRecordLayer() const { return std::make_unique<QuicPlaintextWriteRecordLayer>(); } std::unique_ptr<fizz::EncryptedReadRecordLayer> QuicFizzFactory::makeEncryptedReadRecordLayer( fizz::EncryptionLevel encryptionLevel) const { return std::make_unique<QuicEncryptedReadRecordLayer>(encryptionLevel); } std::unique_ptr<fizz::EncryptedWriteRecordLayer> QuicFizzFactory::makeEncryptedWriteRecordLayer( fizz::EncryptionLevel encryptionLevel) const { return std::make_unique<QuicEncryptedWriteRecordLayer>(encryptionLevel); } } // namespace quic