aboutsummaryrefslogtreecommitdiffstats
path: root/brillo/streams/tls_stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'brillo/streams/tls_stream.h')
-rw-r--r--brillo/streams/tls_stream.h84
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_