diff --git a/include/Swiften/TLS/Schannel/SchannelServerContext.h b/include/Swiften/TLS/Schannel/SchannelServerContext.h new file mode 100644 index 0000000000000000000000000000000000000000..d9e91df040a5f45ac191d6bec24edc40da8d863e --- /dev/null +++ b/include/Swiften/TLS/Schannel/SchannelServerContext.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2011 Soren Dreijer + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include "Swiften/Base/boost_bsignals.h" + +#include "Swiften/TLS/TLSServerContext.h" +#include "Swiften/TLS/Schannel/SchannelUtil.h" +#include +#include "Swiften/Base/ByteArray.h" + +#define SECURITY_WIN32 +#include +#include +#include +#include + +#include + +namespace Swift +{ + class SchannelServerContext : public TLSServerContext, boost::noncopyable + { + public: + typedef boost::shared_ptr sp_t; + + public: + SchannelServerContext(); + + ~SchannelServerContext(); + + // + // TLSContext + // + virtual void connect(); + virtual bool setServerCertificate(CertificateWithKey::ref cert); + + virtual void handleDataFromNetwork(const SafeByteArray& data); + virtual void handleDataFromApplication(const SafeByteArray& data); + + virtual Certificate::ref getPeerCertificate() const; + virtual CertificateVerificationError::ref getPeerCertificateVerificationError() const; + + virtual ByteArray getFinishMessage() const; + + private: + void determineStreamSizes(); + void continueHandshake(const SafeByteArray& data); + void indicateError(); + + void sendDataOnNetwork(const void* pData, size_t dataSize); + void forwardDataToApplication(const void* pData, size_t dataSize); + + void decryptAndProcessData(const SafeByteArray& data); + void encryptAndSendData(const SafeByteArray& data); + + void appendNewData(const SafeByteArray& data); + + private: + enum SchannelState + { + Start, + Connecting, + Connected, + Error + + }; + + SchannelState m_state; + CertificateVerificationError m_verificationError; + + ULONG m_secContext; + ScopedCredHandle m_credHandle; + ScopedCtxtHandle m_ctxtHandle; + DWORD m_ctxtFlags; + SecPkgContext_StreamSizes m_streamSizes; + + std::vector m_receivedData; + + HCERTSTORE m_my_cert_store; + std::string m_cert_store_name; + std::string m_cert_name; + }; +}