10155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko// Copyright 2015 The Chromium OS Authors. All rights reserved.
20155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
30155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko// found in the LICENSE file.
40155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
5fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#ifndef LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
6fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#define LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
70155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
80155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko#include <memory>
9f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko#include <string>
100155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
110155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko#include <base/macros.h>
129ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/brillo_export.h>
139ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/errors/error.h>
149ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/streams/stream.h>
150155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
169ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
170155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
18f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// This class provides client-side TLS stream that performs handshake with the
19f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// server and established a secure communication channel which can be used
20f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// by performing read/write operations on this stream. Both synchronous and
21f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// asynchronous I/O is supported.
22f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// The underlying socket stream must already be created and connected to the
23f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko// destination server and passed in TlsStream::Connect() method as |socket|.
249ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoclass BRILLO_EXPORT TlsStream : public Stream {
250155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko public:
260155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  ~TlsStream() override;
270155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
280155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  // Perform a TLS handshake and establish secure connection over |socket|.
290155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  // Calls |callback| when successful and passes the instance of TlsStream
300155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  // as an argument. In case of an error, |error_callback| is called.
31f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko  // |host| must specify the expected remote host (server) name.
320155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  static void Connect(
330155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko      StreamPtr socket,
34f76c68298c31a148c7c4bb353f87152f5ca529bcAlex Vakulenko      const std::string& host,
350155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko      const base::Callback<void(StreamPtr)>& success_callback,
360155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko      const Stream::ErrorCallback& error_callback);
370155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
380155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  // Overrides from Stream:
390155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool IsOpen() const override;
400155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool CanRead() const override { return true; }
410155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool CanWrite() const override { return true; }
429ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko  bool CanSeek() const override { return false; }
430155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool CanGetSize() const override { return false; }
440155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  uint64_t GetSize() const override { return 0; }
450155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool SetSizeBlocking(uint64_t size, ErrorPtr* error) override;
460155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  uint64_t GetRemainingSize() const override { return 0; }
470155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  uint64_t GetPosition() const override { return 0; }
480155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool Seek(int64_t offset,
490155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko            Whence whence,
500155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko            uint64_t* new_position,
510155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko            ErrorPtr* error) override;
520155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool ReadNonBlocking(void* buffer,
530155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                       size_t size_to_read,
540155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                       size_t* size_read,
550155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                       bool* end_of_stream,
560155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                       ErrorPtr* error) override;
570155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool WriteNonBlocking(const void* buffer,
580155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                        size_t size_to_write,
590155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                        size_t* size_written,
600155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                        ErrorPtr* error) override;
610155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool FlushBlocking(ErrorPtr* error) override;
620155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool CloseBlocking(ErrorPtr* error) override;
630155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool WaitForData(AccessMode mode,
640155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                   const base::Callback<void(AccessMode)>& callback,
650155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                   ErrorPtr* error) override;
660155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  bool WaitForDataBlocking(AccessMode in_mode,
671b79239785bf964fd5f1a607a6ed9c9bbb57a4b1Alex Vakulenko                           base::TimeDelta timeout,
680155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                           AccessMode* out_mode,
690155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko                           ErrorPtr* error) override;
708cb41343cddbab496e7ca90bca4dc95f07af64bdAlex Vakulenko  void CancelPendingAsyncOperations() override;
710155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
720155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko private:
730155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  class TlsStreamImpl;
740155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
750155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  // Private constructor called from TlsStream::Connect() factory method.
760155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  explicit TlsStream(std::unique_ptr<TlsStreamImpl> impl);
770155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
780155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  std::unique_ptr<TlsStreamImpl> impl_;
790155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko  DISALLOW_COPY_AND_ASSIGN(TlsStream);
800155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko};
810155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
829ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
830155b392067cba98fc6a60fe64fb38b23b01e4c4Alex Vakulenko
84fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#endif  // LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
85