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