// 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_