// Copyright 2015 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_ #define LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_ #include <memory> #include <string> #include <base/macros.h> #include <brillo/brillo_export.h> #include <brillo/errors/error.h> #include <brillo/streams/stream.h> namespace brillo { // This class provides client-side TLS stream that performs handshake with the // server and established a secure communication channel which can be used // by performing read/write operations on this stream. Both synchronous and // asynchronous I/O is supported. // The underlying socket stream must already be created and connected to the // destination server and passed in TlsStream::Connect() method as |socket|. class BRILLO_EXPORT TlsStream : public Stream { public: ~TlsStream() override; // Perform a TLS handshake and establish secure connection over |socket|. // Calls |callback| when successful and passes the instance of TlsStream // as an argument. In case of an error, |error_callback| is called. // |host| must specify the expected remote host (server) name. static void Connect( StreamPtr socket, const std::string& host, const base::Callback<void(StreamPtr)>& success_callback, const Stream::ErrorCallback& error_callback); // Overrides from Stream: bool IsOpen() const override; bool CanRead() const override { return true; } bool CanWrite() const override { return true; } bool CanSeek() const override { return false; } bool CanGetSize() const override { return false; } uint64_t GetSize() const override { return 0; } bool SetSizeBlocking(uint64_t size, ErrorPtr* error) override; uint64_t GetRemainingSize() const override { return 0; } uint64_t GetPosition() const override { return 0; } bool Seek(int64_t offset, Whence whence, uint64_t* new_position, ErrorPtr* error) override; bool ReadNonBlocking(void* buffer, size_t size_to_read, size_t* size_read, bool* end_of_stream, ErrorPtr* error) override; bool WriteNonBlocking(const void* buffer, size_t size_to_write, size_t* size_written, ErrorPtr* error) override; bool FlushBlocking(ErrorPtr* error) override; bool CloseBlocking(ErrorPtr* error) override; bool WaitForData(AccessMode mode, const base::Callback<void(AccessMode)>& callback, ErrorPtr* error) override; bool WaitForDataBlocking(AccessMode in_mode, base::TimeDelta timeout, AccessMode* out_mode, ErrorPtr* error) override; void CancelPendingAsyncOperations() override; private: class TlsStreamImpl; // Private constructor called from TlsStream::Connect() factory method. explicit TlsStream(std::unique_ptr<TlsStreamImpl> impl); std::unique_ptr<TlsStreamImpl> impl_; DISALLOW_COPY_AND_ASSIGN(TlsStream); }; } // namespace brillo #endif // LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_