// ********************************************************************** // // Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICE_SSL_SCHANNELTRANSCEIVER_I_H #define ICE_SSL_SCHANNELTRANSCEIVER_I_H #include #include #include #include #include #include #include #include #include #ifdef ICE_USE_SCHANNEL #ifdef SECURITY_WIN32 # undef SECURITY_WIN32 #endif #ifdef SECURITY_KERNEL # undef SECURITY_KERNEL #endif #define SECURITY_WIN32 1 #include #include #include #undef SECURITY_WIN32 namespace IceSSL { class ConnectorI; class AcceptorI; class TransceiverI : public IceInternal::Transceiver { public: virtual IceInternal::NativeInfoPtr getNativeInfo(); virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&); virtual IceInternal::SocketOperation closing(bool, const Ice::LocalException&); virtual void close(); virtual IceInternal::SocketOperation write(IceInternal::Buffer&); virtual IceInternal::SocketOperation read(IceInternal::Buffer&); #ifdef ICE_USE_IOCP virtual bool startWrite(IceInternal::Buffer&); virtual void finishWrite(IceInternal::Buffer&); virtual void startRead(IceInternal::Buffer&); virtual void finishRead(IceInternal::Buffer&); #endif virtual std::string protocol() const; virtual std::string toString() const; virtual std::string toDetailedString() const; virtual Ice::ConnectionInfoPtr getInfo() const; virtual void checkSendSize(const IceInternal::Buffer&); virtual void setBufferSize(int rcvSize, int sndSize); private: TransceiverI(const InstancePtr&, const IceInternal::TransceiverPtr&, const std::string&, bool); virtual ~TransceiverI(); IceInternal::SocketOperation sslHandshake(); size_t decryptMessage(IceInternal::Buffer&); size_t encryptMessage(IceInternal::Buffer&); bool writeRaw(IceInternal::Buffer&); bool readRaw(IceInternal::Buffer&); friend class ConnectorI; friend class AcceptorI; enum State { StateNotInitialized, StateHandshakeNotStarted, StateHandshakeReadContinue, StateHandshakeWriteContinue, StateHandshakeComplete }; const InstancePtr _instance; const SChannelEnginePtr _engine; const std::string _host; const std::string _adapterName; const bool _incoming; const IceInternal::TransceiverPtr _delegate; State _state; // // Buffered encrypted data that has not been written. // IceInternal::Buffer _writeBuffer; size_t _bufferedW; // // Buffered data that has not been decrypted. // IceInternal::Buffer _readBuffer; // // Buffered data that was decrypted but not yet processed. // IceInternal::Buffer _readUnprocessed; CtxtHandle _ssl; bool _sslInitialized; CredHandle _credentials; bool _credentialsInitialized; SecPkgContext_StreamSizes _sizes; bool _verified; }; typedef IceUtil::Handle TransceiverIPtr; } #endif #endif