1 // Copyright 2015 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
6 #define LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
7 
8 #include <memory>
9 #include <string>
10 
11 #include <base/macros.h>
12 #include <brillo/brillo_export.h>
13 #include <brillo/errors/error.h>
14 #include <brillo/streams/stream.h>
15 
16 namespace brillo {
17 
18 // This class provides client-side TLS stream that performs handshake with the
19 // server and established a secure communication channel which can be used
20 // by performing read/write operations on this stream. Both synchronous and
21 // asynchronous I/O is supported.
22 // The underlying socket stream must already be created and connected to the
23 // destination server and passed in TlsStream::Connect() method as |socket|.
24 class BRILLO_EXPORT TlsStream : public Stream {
25  public:
26   ~TlsStream() override;
27 
28   // Perform a TLS handshake and establish secure connection over |socket|.
29   // Calls |callback| when successful and passes the instance of TlsStream
30   // as an argument. In case of an error, |error_callback| is called.
31   // |host| must specify the expected remote host (server) name.
32   static void Connect(
33       StreamPtr socket,
34       const std::string& host,
35       const base::Callback<void(StreamPtr)>& success_callback,
36       const Stream::ErrorCallback& error_callback);
37 
38   // Overrides from Stream:
39   bool IsOpen() const override;
CanRead()40   bool CanRead() const override { return true; }
CanWrite()41   bool CanWrite() const override { return true; }
CanSeek()42   bool CanSeek() const override { return false; }
CanGetSize()43   bool CanGetSize() const override { return false; }
GetSize()44   uint64_t GetSize() const override { return 0; }
45   bool SetSizeBlocking(uint64_t size, ErrorPtr* error) override;
GetRemainingSize()46   uint64_t GetRemainingSize() const override { return 0; }
GetPosition()47   uint64_t GetPosition() const override { return 0; }
48   bool Seek(int64_t offset,
49             Whence whence,
50             uint64_t* new_position,
51             ErrorPtr* error) override;
52   bool ReadNonBlocking(void* buffer,
53                        size_t size_to_read,
54                        size_t* size_read,
55                        bool* end_of_stream,
56                        ErrorPtr* error) override;
57   bool WriteNonBlocking(const void* buffer,
58                         size_t size_to_write,
59                         size_t* size_written,
60                         ErrorPtr* error) override;
61   bool FlushBlocking(ErrorPtr* error) override;
62   bool CloseBlocking(ErrorPtr* error) override;
63   bool WaitForData(AccessMode mode,
64                    const base::Callback<void(AccessMode)>& callback,
65                    ErrorPtr* error) override;
66   bool WaitForDataBlocking(AccessMode in_mode,
67                            base::TimeDelta timeout,
68                            AccessMode* out_mode,
69                            ErrorPtr* error) override;
70   void CancelPendingAsyncOperations() override;
71 
72  private:
73   class TlsStreamImpl;
74 
75   // Private constructor called from TlsStream::Connect() factory method.
76   explicit TlsStream(std::unique_ptr<TlsStreamImpl> impl);
77 
78   std::unique_ptr<TlsStreamImpl> impl_;
79   DISALLOW_COPY_AND_ASSIGN(TlsStream);
80 };
81 
82 }  // namespace brillo
83 
84 #endif  // LIBBRILLO_BRILLO_STREAMS_TLS_STREAM_H_
85