diff options
Diffstat (limited to 'brillo/streams/tls_stream.h')
-rw-r--r-- | brillo/streams/tls_stream.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/brillo/streams/tls_stream.h b/brillo/streams/tls_stream.h new file mode 100644 index 0000000..5513eb5 --- /dev/null +++ b/brillo/streams/tls_stream.h @@ -0,0 +1,84 @@ +// 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 LIBCHROMEOS_BRILLO_STREAMS_TLS_STREAM_H_ +#define LIBCHROMEOS_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 // LIBCHROMEOS_BRILLO_STREAMS_TLS_STREAM_H_ |