aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/NetSSL_OpenSSL/include/Poco
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/NetSSL_OpenSSL/include/Poco
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/NetSSL_OpenSSL/include/Poco')
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h52
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h93
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h64
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h50
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h405
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h165
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h65
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h83
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h80
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h47
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h51
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h94
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h95
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h64
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h84
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h48
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h39
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h390
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h96
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h136
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h146
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h265
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h272
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h303
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h79
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h52
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h108
-rw-r--r--contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h102
28 files changed, 3528 insertions, 0 deletions
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h
new file mode 100644
index 0000000000..2d92c629aa
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h
@@ -0,0 +1,52 @@
+//
+// AcceptCertificateHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: AcceptCertificateHandler
+//
+// Definition of the AcceptCertificateHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_AcceptCertificateHandler_INCLUDED
+#define NetSSL_AcceptCertificateHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/InvalidCertificateHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API AcceptCertificateHandler: public InvalidCertificateHandler
+ /// A AcceptCertificateHandler is invoked whenever an error
+ /// occurs verifying the certificate. It always accepts
+ /// the certificate.
+ ///
+ /// Should be using for testing purposes only.
+{
+public:
+ AcceptCertificateHandler(bool handleErrorsOnServerSide);
+ /// Creates the AcceptCertificateHandler
+
+ virtual ~AcceptCertificateHandler();
+ /// Destroys the AcceptCertificateHandler.
+
+ void onInvalidCertificate(const void* pSender, VerificationErrorArgs& errorCert);
+ /// Receives the questionable certificate in parameter errorCert. If one wants to accept the
+ /// certificate, call errorCert.setIgnoreError(true).
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_AcceptCertificateHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h
new file mode 100644
index 0000000000..5e3699c3ca
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h
@@ -0,0 +1,93 @@
+//
+// CertificateHandlerFactory.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: CertificateHandlerFactory
+//
+// Definition of the CertificateHandlerFactory class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_CertificateHandlerFactory_INCLUDED
+#define NetSSL_CertificateHandlerFactory_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class InvalidCertificateHandler;
+
+
+class NetSSL_API CertificateHandlerFactory
+ /// A CertificateHandlerFactory is responsible for creating InvalidCertificateHandlers.
+ ///
+ /// You don't need to access this class directly. Use the macro
+ /// POCO_REGISTER_CHFACTORY(namespace, InvalidCertificateHandlerName)
+ /// instead (see the documentation of InvalidCertificateHandler for an example).
+{
+public:
+ CertificateHandlerFactory();
+ /// Creates the CertificateHandlerFactory.
+
+ virtual ~CertificateHandlerFactory();
+ /// Destroys the CertificateHandlerFactory.
+
+ virtual InvalidCertificateHandler* create(bool server) const = 0;
+ /// Creates a new InvalidCertificateHandler. Set server to true if the certificate handler is used on the server side.
+};
+
+
+class NetSSL_API CertificateHandlerFactoryRegistrar
+ /// Registrar class which automatically registers CertificateHandlerFactory at the CertificateHandlerFactoryMgr.
+ /// You don't need to access this class directly. Use the macro
+ /// POCO_REGISTER_CHFACTORY(namespace, InvalidCertificateHandlerName)
+ /// instead (see the documentation of InvalidCertificateHandler for an example).
+{
+public:
+ CertificateHandlerFactoryRegistrar(const std::string& name, CertificateHandlerFactory* pFactory);
+ /// Registers the CertificateHandlerFactory with the given name at the factory manager.
+
+ virtual ~CertificateHandlerFactoryRegistrar();
+ /// Destroys the CertificateHandlerFactoryRegistrar.
+};
+
+
+template <typename T>
+class CertificateHandlerFactoryImpl: public Poco::Net::CertificateHandlerFactory
+{
+public:
+ CertificateHandlerFactoryImpl()
+ {
+ }
+
+ ~CertificateHandlerFactoryImpl()
+ {
+ }
+
+ InvalidCertificateHandler* create(bool server) const
+ {
+ return new T(server);
+ }
+};
+
+
+} } // namespace Poco::Net
+
+
+// DEPRECATED: register the factory directly at the FactoryMgr:
+// Poco::Net::SSLManager::instance().certificateHandlerFactoryMgr().setFactory(name, new Poco::Net::CertificateHandlerFactoryImpl<MyConsoleHandler>());
+#define POCO_REGISTER_CHFACTORY(API, PKCLS) \
+ static Poco::Net::CertificateHandlerFactoryRegistrar aRegistrar(std::string(#PKCLS), new Poco::Net::CertificateHandlerFactoryImpl<PKCLS>());
+
+
+#endif // NetSSL_CertificateHandlerFactory_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h
new file mode 100644
index 0000000000..e70c9060b6
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h
@@ -0,0 +1,64 @@
+//
+// CertificateHandlerFactoryMgr.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: CertificateHandlerFactoryMgr
+//
+// Definition of the CertificateHandlerFactoryMgr class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_CertificateHandlerFactoryMgr_INCLUDED
+#define NetSSL_CertificateHandlerFactoryMgr_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/CertificateHandlerFactory.h"
+#include "Poco/SharedPtr.h"
+#include <map>
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API CertificateHandlerFactoryMgr
+ /// A CertificateHandlerFactoryMgr manages all existing CertificateHandlerFactories.
+{
+public:
+ typedef std::map<std::string, Poco::SharedPtr<CertificateHandlerFactory> > FactoriesMap;
+
+ CertificateHandlerFactoryMgr();
+ /// Creates the CertificateHandlerFactoryMgr.
+
+ ~CertificateHandlerFactoryMgr();
+ /// Destroys the CertificateHandlerFactoryMgr.
+
+ void setFactory(const std::string& name, CertificateHandlerFactory* pFactory);
+ /// Registers the factory. Class takes ownership of the pointer.
+ /// If a factory with the same name already exists, an exception is thrown.
+
+ bool hasFactory(const std::string& name) const;
+ /// Returns true if for the given name a factory is already registered
+
+ const CertificateHandlerFactory* getFactory(const std::string& name) const;
+ /// Returns NULL if for the given name a factory does not exist, otherwise the factory is returned
+
+ void removeFactory(const std::string& name);
+ /// Removes the factory from the manager.
+
+private:
+ FactoriesMap _factories;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_CertificateHandlerFactoryMgr_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h
new file mode 100644
index 0000000000..c58962c476
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h
@@ -0,0 +1,50 @@
+//
+// ConsoleCertificateHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: ConsoleCertificateHandler
+//
+// Definition of the ConsoleCertificateHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_ConsoleCertificateHandler_INCLUDED
+#define NetSSL_ConsoleCertificateHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/InvalidCertificateHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API ConsoleCertificateHandler: public InvalidCertificateHandler
+ /// A ConsoleCertificateHandler is invoked whenever an error occurs verifying the certificate.
+ ///
+ /// The certificate is printed to stdout and the user is asked via console if he wants to accept it.
+{
+public:
+ ConsoleCertificateHandler(bool handleErrorsOnServerSide);
+ /// Creates the ConsoleCertificateHandler.
+
+ virtual ~ConsoleCertificateHandler();
+ /// Destroys the ConsoleCertificateHandler.
+
+ void onInvalidCertificate(const void* pSender, VerificationErrorArgs& errorCert);
+ /// Prints the certificate to stdout and waits for user input on the console
+ /// to decide if a certificate should be accepted/rejected.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_ConsoleCertificateHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h
new file mode 100644
index 0000000000..d66328380d
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h
@@ -0,0 +1,405 @@
+//
+// Context.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: Context
+//
+// Definition of the Context class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_Context_INCLUDED
+#define NetSSL_Context_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Crypto/X509Certificate.h"
+#include "Poco/Crypto/RSAKey.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/AutoPtr.h"
+#include <openssl/ssl.h>
+#include <cstdlib>
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API Context: public Poco::RefCountedObject
+ /// This class encapsulates context information for
+ /// an SSL server or client, such as the certificate
+ /// verification mode and the location of certificates
+ /// and private key files, as well as the list of
+ /// supported ciphers.
+ ///
+ /// The Context class is also used to control
+ /// SSL session caching on the server and client side.
+{
+public:
+ typedef Poco::AutoPtr<Context> Ptr;
+
+ enum Usage
+ {
+ CLIENT_USE, /// Context is used by a client.
+ SERVER_USE, /// Context is used by a server.
+ TLSV1_CLIENT_USE, /// Context is used by a client requiring TLSv1.
+ TLSV1_SERVER_USE, /// Context is used by a server requiring TLSv1.
+ TLSV1_1_CLIENT_USE, /// Context is used by a client requiring TLSv1.1 (OpenSSL 1.0.0 or newer).
+ TLSV1_1_SERVER_USE, /// Context is used by a server requiring TLSv1.1 (OpenSSL 1.0.0 or newer).
+ TLSV1_2_CLIENT_USE, /// Context is used by a client requiring TLSv1.2 (OpenSSL 1.0.1 or newer).
+ TLSV1_2_SERVER_USE /// Context is used by a server requiring TLSv1.2 (OpenSSL 1.0.1 or newer).
+ };
+
+ enum VerificationMode
+ {
+ VERIFY_NONE = SSL_VERIFY_NONE,
+ /// Server: The server will not send a client certificate
+ /// request to the client, so the client will not send a certificate.
+ ///
+ /// Client: If not using an anonymous cipher (by default disabled),
+ /// the server will send a certificate which will be checked, but
+ /// the result of the check will be ignored.
+
+ VERIFY_RELAXED = SSL_VERIFY_PEER,
+ /// Server: The server sends a client certificate request to the
+ /// client. The certificate returned (if any) is checked.
+ /// If the verification process fails, the TLS/SSL handshake is
+ /// immediately terminated with an alert message containing the
+ /// reason for the verification failure.
+ ///
+ /// Client: The server certificate is verified, if one is provided.
+ /// If the verification process fails, the TLS/SSL handshake is
+ /// immediately terminated with an alert message containing the
+ /// reason for the verification failure.
+
+ VERIFY_STRICT = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
+ /// Server: If the client did not return a certificate, the TLS/SSL
+ /// handshake is immediately terminated with a handshake failure
+ /// alert.
+ ///
+ /// Client: Same as VERIFY_RELAXED.
+
+ VERIFY_ONCE = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE
+ /// Server: Only request a client certificate on the initial
+ /// TLS/SSL handshake. Do not ask for a client certificate
+ /// again in case of a renegotiation.
+ ///
+ /// Client: Same as VERIFY_RELAXED.
+ };
+
+ enum Protocols
+ {
+ PROTO_SSLV2 = 0x01,
+ PROTO_SSLV3 = 0x02,
+ PROTO_TLSV1 = 0x04,
+ PROTO_TLSV1_1 = 0x08,
+ PROTO_TLSV1_2 = 0x10
+ };
+
+ struct NetSSL_API Params
+ {
+ Params();
+ /// Initializes the struct with default values.
+
+ std::string privateKeyFile;
+ /// Path to the private key file used for encryption.
+ /// Can be empty if no private key file is used.
+
+ std::string certificateFile;
+ /// Path to the certificate file (in PEM format).
+ /// If the private key and the certificate are stored in the same file, this
+ /// can be empty if privateKeyFile is given.
+
+ std::string caLocation;
+ /// Path to the file or directory containing the CA/root certificates.
+ /// Can be empty if the OpenSSL builtin CA certificates
+ /// are used (see loadDefaultCAs).
+
+ VerificationMode verificationMode;
+ /// Specifies whether and how peer certificates are validated.
+ /// Defaults to VERIFY_RELAXED.
+
+ int verificationDepth;
+ /// Sets the upper limit for verification chain sizes. Verification
+ /// will fail if a certificate chain larger than this is encountered.
+ /// Defaults to 9.
+
+ bool loadDefaultCAs;
+ /// Specifies whether the builtin CA certificates from OpenSSL are used.
+ /// Defaults to false.
+
+ std::string cipherList;
+ /// Specifies the supported ciphers in OpenSSL notation.
+ /// Defaults to "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH".
+
+ std::string dhParamsFile;
+ /// Specifies a file containing Diffie-Hellman parameters.
+ /// If empty, the default parameters are used.
+
+ std::string ecdhCurve;
+ /// Specifies the name of the curve to use for ECDH, based
+ /// on the curve names specified in RFC 4492.
+ /// Defaults to "prime256v1".
+ };
+
+ Context(Usage usage, const Params& params);
+ /// Creates a Context using the given parameters.
+ ///
+ /// * usage specifies whether the context is used by a client or server.
+ /// * params specifies the context parameters.
+
+ Context(
+ Usage usage,
+ const std::string& privateKeyFile,
+ const std::string& certificateFile,
+ const std::string& caLocation,
+ VerificationMode verificationMode = VERIFY_RELAXED,
+ int verificationDepth = 9,
+ bool loadDefaultCAs = false,
+ const std::string& cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ /// Creates a Context.
+ ///
+ /// * usage specifies whether the context is used by a client or server.
+ /// * privateKeyFile contains the path to the private key file used for encryption.
+ /// Can be empty if no private key file is used.
+ /// * certificateFile contains the path to the certificate file (in PEM format).
+ /// If the private key and the certificate are stored in the same file, this
+ /// can be empty if privateKeyFile is given.
+ /// * caLocation contains the path to the file or directory containing the
+ /// CA/root certificates. Can be empty if the OpenSSL builtin CA certificates
+ /// are used (see loadDefaultCAs).
+ /// * verificationMode specifies whether and how peer certificates are validated.
+ /// * verificationDepth sets the upper limit for verification chain sizes. Verification
+ /// will fail if a certificate chain larger than this is encountered.
+ /// * loadDefaultCAs specifies whether the builtin CA certificates from OpenSSL are used.
+ /// * cipherList specifies the supported ciphers in OpenSSL notation.
+ ///
+ /// Note: If the private key is protected by a passphrase, a PrivateKeyPassphraseHandler
+ /// must have been setup with the SSLManager, or the SSLManager's PrivateKeyPassphraseRequired
+ /// event must be handled.
+
+ Context(
+ Usage usage,
+ const std::string& caLocation,
+ VerificationMode verificationMode = VERIFY_RELAXED,
+ int verificationDepth = 9,
+ bool loadDefaultCAs = false,
+ const std::string& cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ /// Creates a Context.
+ ///
+ /// * usage specifies whether the context is used by a client or server.
+ /// * caLocation contains the path to the file or directory containing the
+ /// CA/root certificates. Can be empty if the OpenSSL builtin CA certificates
+ /// are used (see loadDefaultCAs).
+ /// * verificationMode specifies whether and how peer certificates are validated.
+ /// * verificationDepth sets the upper limit for verification chain sizes. Verification
+ /// will fail if a certificate chain larger than this is encountered.
+ /// * loadDefaultCAs specifies whether the builtin CA certificates from OpenSSL are used.
+ /// * cipherList specifies the supported ciphers in OpenSSL notation.
+ ///
+ /// Note that a private key and/or certificate must be specified with
+ /// usePrivateKey()/useCertificate() before the Context can be used.
+
+ ~Context();
+ /// Destroys the Context.
+
+ void useCertificate(const Poco::Crypto::X509Certificate& certificate);
+ /// Sets the certificate to be used by the Context.
+ ///
+ /// To set-up a complete certificate chain, it might be
+ /// necessary to call addChainCertificate() to specify
+ /// additional certificates.
+ ///
+ /// Note that useCertificate() must always be called before
+ /// usePrivateKey().
+
+ void addChainCertificate(const Poco::Crypto::X509Certificate& certificate);
+ /// Adds a certificate for certificate chain validation.
+
+ void addCertificateAuthority(const Poco::Crypto::X509Certificate& certificate);
+ /// Add one trusted certification authority to be used by the Context.
+
+ void usePrivateKey(const Poco::Crypto::RSAKey& key);
+ /// Sets the private key to be used by the Context.
+ ///
+ /// Note that useCertificate() must always be called before
+ /// usePrivateKey().
+ ///
+ /// Note: If the private key is protected by a passphrase, a PrivateKeyPassphraseHandler
+ /// must have been setup with the SSLManager, or the SSLManager's PrivateKeyPassphraseRequired
+ /// event must be handled.
+
+ SSL_CTX* sslContext() const;
+ /// Returns the underlying OpenSSL SSL Context object.
+
+ Usage usage() const;
+ /// Returns whether the context is for use by a client or by a server
+ /// and whether TLSv1 is required.
+
+ bool isForServerUse() const;
+ /// Returns true iff the context is for use by a server.
+
+ Context::VerificationMode verificationMode() const;
+ /// Returns the verification mode.
+
+ void enableSessionCache(bool flag = true);
+ /// Enable or disable SSL/TLS session caching.
+ /// For session caching to work, it must be enabled
+ /// on the server, as well as on the client side.
+ ///
+ /// The default is disabled session caching.
+ ///
+ /// To enable session caching on the server side, use the
+ /// two-argument version of this method to specify
+ /// a session ID context.
+
+ void enableSessionCache(bool flag, const std::string& sessionIdContext);
+ /// Enables or disables SSL/TLS session caching on the server.
+ /// For session caching to work, it must be enabled
+ /// on the server, as well as on the client side.
+ ///
+ /// SessionIdContext contains the application's unique
+ /// session ID context, which becomes part of each
+ /// session identifier generated by the server within this
+ /// context. SessionIdContext can be an arbitrary sequence
+ /// of bytes with a maximum length of SSL_MAX_SSL_SESSION_ID_LENGTH.
+ ///
+ /// A non-empty sessionIdContext should be specified even if
+ /// session caching is disabled to avoid problems with clients
+ /// requesting to reuse a session (e.g. Firefox 3.6).
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ bool sessionCacheEnabled() const;
+ /// Returns true iff the session cache is enabled.
+
+ void setSessionCacheSize(std::size_t size);
+ /// Sets the maximum size of the server session cache, in number of
+ /// sessions. The default size (according to OpenSSL documentation)
+ /// is 1024*20, which may be too large for many applications,
+ /// especially on embedded platforms with limited memory.
+ ///
+ /// Specifying a size of 0 will set an unlimited cache size.
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ std::size_t getSessionCacheSize() const;
+ /// Returns the current maximum size of the server session cache.
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ void setSessionTimeout(long seconds);
+ /// Sets the timeout (in seconds) of cached sessions on the server.
+ /// A cached session will be removed from the cache if it has
+ /// not been used for the given number of seconds.
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ long getSessionTimeout() const;
+ /// Returns the timeout (in seconds) of cached sessions on the server.
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ void flushSessionCache();
+ /// Flushes the SSL session cache on the server.
+ ///
+ /// This method may only be called on SERVER_USE Context objects.
+
+ void enableExtendedCertificateVerification(bool flag = true);
+ /// Enable or disable the automatic post-connection
+ /// extended certificate verification.
+ ///
+ /// See X509Certificate::verify() for more information.
+
+ bool extendedCertificateVerificationEnabled() const;
+ /// Returns true iff automatic extended certificate
+ /// verification is enabled.
+
+ void disableStatelessSessionResumption();
+ /// Newer versions of OpenSSL support RFC 4507 tickets for stateless
+ /// session resumption.
+ ///
+ /// The feature can be disabled by calling this method.
+
+ void disableProtocols(int protocols);
+ /// Disables the given protocols.
+ ///
+ /// The protocols to be disabled are specified by OR-ing
+ /// values from the Protocols enumeration, e.g.:
+ ///
+ /// context.disableProtocols(PROTO_SSLV2 | PROTO_SSLV3);
+
+ void preferServerCiphers();
+ /// When choosing a cipher, use the server's preferences instead of the client
+ /// preferences. When not called, the SSL server will always follow the clients
+ /// preferences. When called, the SSL/TLS server will choose following its own
+ /// preferences.
+
+private:
+ void init(const Params& params);
+ /// Initializes the Context with the given parameters.
+
+ void initDH(const std::string& dhFile);
+ /// Initializes the Context with Diffie-Hellman parameters.
+
+ void initECDH(const std::string& curve);
+ /// Initializes the Context with Elliptic-Curve Diffie-Hellman key
+ /// exchange curve parameters.
+
+ void createSSLContext();
+ /// Create a SSL_CTX object according to Context configuration.
+
+ Usage _usage;
+ VerificationMode _mode;
+ SSL_CTX* _pSSLContext;
+ bool _extendedCertificateVerification;
+};
+
+
+//
+// inlines
+//
+inline Context::Usage Context::usage() const
+{
+ return _usage;
+}
+
+
+inline bool Context::isForServerUse() const
+{
+ return _usage == SERVER_USE
+ || _usage == TLSV1_SERVER_USE
+ || _usage == TLSV1_1_SERVER_USE
+ || _usage == TLSV1_2_SERVER_USE;
+}
+
+
+inline Context::VerificationMode Context::verificationMode() const
+{
+ return _mode;
+}
+
+
+inline SSL_CTX* Context::sslContext() const
+{
+ return _pSSLContext;
+}
+
+
+inline bool Context::extendedCertificateVerificationEnabled() const
+{
+ return _extendedCertificateVerification;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_Context_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h
new file mode 100644
index 0000000000..ff0d89994c
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h
@@ -0,0 +1,165 @@
+//
+// HTTPSClientSession.h
+//
+// Library: NetSSL_OpenSSL
+// Package: HTTPSClient
+// Module: HTTPSClientSession
+//
+// Definition of the HTTPSClientSession class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_HTTPSClientSession_INCLUDED
+#define NetSSL_HTTPSClientSession_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/Utility.h"
+#include "Poco/Net/HTTPClientSession.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/Session.h"
+#include "Poco/Net/X509Certificate.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class SecureStreamSocket;
+class HTTPRequest;
+class HTTPResponse;
+
+
+class NetSSL_API HTTPSClientSession: public HTTPClientSession
+ /// This class implements the client-side of
+ /// a HTTPS session.
+ ///
+ /// To send a HTTPS request to a HTTPS server, first
+ /// instantiate a HTTPSClientSession object and
+ /// specify the server's host name and port number.
+ ///
+ /// Then create a HTTPRequest object, fill it accordingly,
+ /// and pass it as argument to the sendRequest() method.
+ ///
+ /// sendRequest() will return an output stream that can
+ /// be used to send the request body, if there is any.
+ ///
+ /// After you are done sending the request body, create
+ /// a HTTPResponse object and pass it to receiveResponse().
+ ///
+ /// This will return an input stream that can be used to
+ /// read the response body.
+ ///
+ /// See RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html> for more
+ /// information about the HTTP protocol.
+ ///
+ /// Note that sending requests that neither contain a content length
+ /// field in the header nor are using chunked transfer encoding will
+ /// result in a SSL protocol violation, as the framework shuts down
+ /// the socket after sending the message body. No orderly SSL shutdown
+ /// will be performed in this case.
+ ///
+ /// If session caching has been enabled for the Context object passed
+ /// to the HTTPSClientSession, the HTTPSClientSession class will
+ /// attempt to reuse a previously obtained Session object in
+ /// case of a reconnect.
+{
+public:
+ enum
+ {
+ HTTPS_PORT = 443
+ };
+
+ HTTPSClientSession();
+ /// Creates an unconnected HTTPSClientSession.
+
+ explicit HTTPSClientSession(const SecureStreamSocket& socket);
+ /// Creates a HTTPSClientSession using the given socket.
+ /// The socket must not be connected. The session
+ /// takes ownership of the socket.
+
+ HTTPSClientSession(const SecureStreamSocket& socket, Session::Ptr pSession);
+ /// Creates a HTTPSClientSession using the given socket.
+ /// The socket must not be connected. The session
+ /// takes ownership of the socket.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ HTTPSClientSession(const std::string& host, Poco::UInt16 port = HTTPS_PORT);
+ /// Creates a HTTPSClientSession using the given host and port.
+
+ explicit HTTPSClientSession(Context::Ptr pContext);
+ /// Creates an unconnected HTTPSClientSession, using the
+ /// give SSL context.
+
+ HTTPSClientSession(Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates an unconnected HTTPSClientSession, using the
+ /// give SSL context.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext);
+ /// Creates a HTTPSClientSession using the given host and port,
+ /// using the given SSL context.
+
+ HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates a HTTPSClientSession using the given host and port,
+ /// using the given SSL context.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ ~HTTPSClientSession();
+ /// Destroys the HTTPSClientSession and closes
+ /// the underlying socket.
+
+ bool secure() const;
+ /// Return true iff the session uses SSL or TLS,
+ /// or false otherwise.
+
+ X509Certificate serverCertificate();
+ /// Returns the server's certificate.
+ ///
+ /// The certificate is available after the first request has been sent.
+
+ Session::Ptr sslSession();
+ /// Returns the SSL Session object for the current
+ /// connection, if session caching has been enabled for
+ /// the HTTPSClientSession's Context. A null pointer is
+ /// returned otherwise.
+ ///
+ /// The Session object can be obtained after the first request has
+ /// been sent.
+
+ // HTTPSession
+ void abort();
+
+protected:
+ void connect(const SocketAddress& address);
+ std::string proxyRequestPrefix() const;
+ void proxyAuthenticate(HTTPRequest& request);
+ int read(char* buffer, std::streamsize length);
+
+private:
+ HTTPSClientSession(const HTTPSClientSession&);
+ HTTPSClientSession& operator = (const HTTPSClientSession&);
+
+ Context::Ptr _pContext;
+ Session::Ptr _pSession;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSClientSession_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h
new file mode 100644
index 0000000000..214e2819b6
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h
@@ -0,0 +1,65 @@
+//
+// HTTPSSessionInstantiator.h
+//
+// Library: NetSSL_OpenSSL
+// Package: HTTPSClient
+// Module: HTTPSSessionInstantiator
+//
+// Definition of the HTTPSSessionInstantiator class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_HTTPSSessionInstantiator_INCLUDED
+#define Net_HTTPSSessionInstantiator_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/Utility.h"
+#include "Poco/Net/HTTPSessionInstantiator.h"
+#include "Poco/URI.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API HTTPSSessionInstantiator: public HTTPSessionInstantiator
+ /// The HTTPSessionInstantiator for HTTPSClientSession.
+{
+public:
+ HTTPSSessionInstantiator();
+ /// Creates the HTTPSSessionInstantiator.
+
+ HTTPSSessionInstantiator(Context::Ptr pContext);
+ /// Creates the HTTPSSessionInstantiator using the given SSL context.
+
+ ~HTTPSSessionInstantiator();
+ /// Destroys the HTTPSSessionInstantiator.
+
+ HTTPClientSession* createClientSession(const Poco::URI& uri);
+ /// Creates a HTTPSClientSession for the given URI.
+
+ static void registerInstantiator();
+ /// Registers the instantiator with the global HTTPSessionFactory.
+
+ static void registerInstantiator(Context::Ptr pContext);
+ /// Registers the instantiator with the global HTTPSessionFactory using the given SSL context.
+
+ static void unregisterInstantiator();
+ /// Unregisters the factory with the global HTTPSessionFactory.
+
+private:
+ Context::Ptr _pContext;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSSessionInstantiator_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h
new file mode 100644
index 0000000000..2fd3515c88
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h
@@ -0,0 +1,83 @@
+//
+// HTTPSStreamFactory.h
+//
+// Library: NetSSL_OpenSSL
+// Package: HTTPSClient
+// Module: HTTPSStreamFactory
+//
+// Definition of the HTTPSStreamFactory class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_HTTPSStreamFactory_INCLUDED
+#define NetSSL_HTTPSStreamFactory_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/HTTPSession.h"
+#include "Poco/URIStreamFactory.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API HTTPSStreamFactory: public Poco::URIStreamFactory
+ /// An implementation of the URIStreamFactory interface
+ /// that handles secure Hyper-Text Transfer Protocol (https) URIs.
+{
+public:
+ HTTPSStreamFactory();
+ /// Creates the HTTPSStreamFactory.
+
+ HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort = HTTPSession::HTTP_PORT);
+ /// Creates the HTTPSStreamFactory.
+ ///
+ /// HTTPS connections will use the given proxy.
+
+ HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword);
+ /// Creates the HTTPSStreamFactory.
+ ///
+ /// HTTPS connections will use the given proxy and
+ /// will be authorized against the proxy using Basic authentication
+ /// with the given proxyUsername and proxyPassword.
+
+ ~HTTPSStreamFactory();
+ /// Destroys the HTTPSStreamFactory.
+
+ std::istream* open(const Poco::URI& uri);
+ /// Creates and opens a HTTPS stream for the given URI.
+ /// The URI must be a https://... URI.
+ ///
+ /// Throws a NetException if anything goes wrong.
+
+ static void registerFactory();
+ /// Registers the HTTPSStreamFactory with the
+ /// default URIStreamOpener instance.
+
+ static void unregisterFactory();
+ /// Unregisters the HTTPSStreamFactory with the
+ /// default URIStreamOpener instance.
+
+private:
+ enum
+ {
+ MAX_REDIRECTS = 10
+ };
+
+ std::string _proxyHost;
+ Poco::UInt16 _proxyPort;
+ std::string _proxyUsername;
+ std::string _proxyPassword;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_HTTPSStreamFactory_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h
new file mode 100644
index 0000000000..e10faf3cdb
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h
@@ -0,0 +1,80 @@
+//
+// InvalidCertificateHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: InvalidCertificateHandler
+//
+// Definition of the InvalidCertificateHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_InvalidCertificateHandler_INCLUDED
+#define NetSSL_InvalidCertificateHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/VerificationErrorArgs.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API InvalidCertificateHandler
+ /// A InvalidCertificateHandler is invoked whenever an error occurs verifying the certificate. It allows the user
+ /// to inspect and accept/reject the certificate.
+ /// One can install one's own InvalidCertificateHandler by implementing this interface. Note that
+ /// in the implementation file of the subclass the following code must be present (assuming you use the namespace My_API
+ /// and the name of your handler class is MyGuiHandler):
+ ///
+ /// #include "Poco/Net/CertificateHandlerFactory.h"
+ /// ...
+ /// POCO_REGISTER_CHFACTORY(My_API, MyGuiHandler)
+ ///
+ /// One can either set the handler directly in the startup code of the main method of ones application by calling
+ ///
+ /// SSLManager::instance().initialize(mypassphraseHandler, myguiHandler, mySSLContext)
+ ///
+ /// or in case one uses Poco::Util::Application one can rely on an XML configuration and put the following entry
+ /// under the path openSSL.invalidCertificateHandler:
+ ///
+ /// <invalidCertificateHandler>
+ /// <name>MyGuiHandler<name>
+ /// <options>
+ /// [...] // Put optional config params for the handler here
+ /// </options>
+ /// </invalidCertificateHandler>
+ ///
+ /// Note that the name of the InvalidCertificateHandler must be same as the one provided to the POCO_REGISTER_CHFACTORY macro.
+{
+public:
+ InvalidCertificateHandler(bool handleErrorsOnServerSide);
+ /// Creates the InvalidCertificateHandler.
+ ///
+ /// Set handleErrorsOnServerSide to true if the certificate handler is used on the server side.
+ /// Automatically registers at one of the SSLManager::VerificationError events.
+
+ virtual ~InvalidCertificateHandler();
+ /// Destroys the InvalidCertificateHandler.
+
+ virtual void onInvalidCertificate(const void* pSender, VerificationErrorArgs& errorCert) = 0;
+ /// Receives the questionable certificate in parameter errorCert. If one wants to accept the
+ /// certificate, call errorCert.setIgnoreError(true).
+
+protected:
+ bool _handleErrorsOnServerSide;
+ /// Stores if the certificate handler gets invoked by the server (i.e. a client certificate is wrong)
+ /// or the client (a server certificate is wrong)
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_InvalidCertificateHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h
new file mode 100644
index 0000000000..d9483d78e0
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h
@@ -0,0 +1,47 @@
+//
+// KeyConsoleHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: KeyConsoleHandler
+//
+// Definition of the KeyConsoleHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_KeyConsoleHandler_INCLUDED
+#define NetSSL_KeyConsoleHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/PrivateKeyPassphraseHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API KeyConsoleHandler: public PrivateKeyPassphraseHandler
+ /// An implementation of PrivateKeyPassphraseHandler that
+ /// reads the key for a certificate from the console.
+{
+public:
+ KeyConsoleHandler(bool server);
+ /// Creates the KeyConsoleHandler.
+
+ ~KeyConsoleHandler();
+ /// Destroys the KeyConsoleHandler.
+
+ void onPrivateKeyRequested(const void* pSender, std::string& privateKey);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_KeyConsoleHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h
new file mode 100644
index 0000000000..274cdbff59
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h
@@ -0,0 +1,51 @@
+//
+// KeyFileHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: KeyFileHandler
+//
+// Definition of the KeyFileHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_KeyFileHandler_INCLUDED
+#define NetSSL_KeyFileHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/PrivateKeyPassphraseHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API KeyFileHandler: public PrivateKeyPassphraseHandler
+ /// An implementation of PrivateKeyPassphraseHandler that
+ /// reads the key for a certificate from a configuration file
+ /// under the path "openSSL.privateKeyPassphraseHandler.options.password".
+{
+public:
+ KeyFileHandler(bool server);
+ /// Creates the KeyFileHandler.
+
+ virtual ~KeyFileHandler();
+ /// Destroys the KeyFileHandler.
+
+ void onPrivateKeyRequested(const void* pSender, std::string& privateKey);
+
+private:
+ static const std::string CFG_PRIV_KEY_FILE;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_KeyFileHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h
new file mode 100644
index 0000000000..ae793fde93
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h
@@ -0,0 +1,94 @@
+//
+// NetSSL.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: OpenSSL
+//
+// Basic definitions for the Poco OpenSSL library.
+// This file must be the first file included by every other OpenSSL
+// header file.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_NetSSL_INCLUDED
+#define NetSSL_NetSSL_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Crypto/Crypto.h"
+
+
+//
+// The following block is the standard way of creating macros which make exporting
+// from a DLL simpler. All files within this DLL are compiled with the NetSSL_EXPORTS
+// symbol defined on the command line. this symbol should not be defined on any project
+// that uses this DLL. This way any other project whose source files include this file see
+// NetSSL_API functions as being imported from a DLL, wheras this DLL sees symbols
+// defined with this macro as being exported.
+//
+#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(POCO_DLL)
+ #if defined(NetSSL_EXPORTS)
+ #define NetSSL_API __declspec(dllexport)
+ #else
+ #define NetSSL_API __declspec(dllimport)
+ #endif
+#endif
+
+
+#if !defined(NetSSL_API)
+ #if !defined(POCO_NO_GCC_API_ATTRIBUTE) && defined (__GNUC__) && (__GNUC__ >= 4)
+ #define NetSSL_API __attribute__ ((visibility ("default")))
+ #else
+ #define NetSSL_API
+ #endif
+#endif
+
+
+//
+// Automatically link NetSSL and OpenSSL libraries.
+//
+#if defined(_MSC_VER)
+ #if !defined(POCO_NO_AUTOMATIC_LIBS)
+ #if !defined(NetSSL_EXPORTS)
+ #pragma comment(lib, "PocoNetSSL" POCO_LIB_SUFFIX)
+ #endif
+ #endif // POCO_NO_AUTOMATIC_LIBS
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+void NetSSL_API initializeSSL();
+ /// Initialize the NetSSL library, as well as the underlying OpenSSL
+ /// libraries, by calling Poco::Crypto::OpenSSLInitializer::initialize().
+ ///
+ /// Should be called before using any class from the NetSSL library.
+ /// The NetSSL will be initialized automatically, through
+ /// Poco::Crypto::OpenSSLInitializer instances or similar mechanisms
+ /// when creating Context or SSLManager instances.
+ /// However, it is recommended to call initializeSSL()
+ /// in any case at application startup.
+ ///
+ /// Can be called multiple times; however, for every call to
+ /// initializeSSL(), a matching call to uninitializeSSL()
+ /// must be performed.
+
+
+void NetSSL_API uninitializeSSL();
+ /// Uninitializes the NetSSL library by calling
+ /// Poco::Crypto::OpenSSLInitializer::uninitialize() and
+ /// shutting down the SSLManager.
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_NetSSL_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h
new file mode 100644
index 0000000000..9c0fa37faa
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h
@@ -0,0 +1,95 @@
+//
+// PrivateKeyFactory.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: PrivateKeyFactory
+//
+// Definition of the PrivateKeyFactory class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_PrivateKeyFactory_INCLUDED
+#define NetSSL_PrivateKeyFactory_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class PrivateKeyPassphraseHandler;
+
+
+class NetSSL_API PrivateKeyFactory
+ /// A PrivateKeyFactory is responsible for creating PrivateKeyPassphraseHandlers.
+ ///
+ /// You don't need to access this class directly. Use the macro
+ /// POCO_REGISTER_KEYFACTORY(namespace, PrivateKeyPassphraseHandlerName)
+ /// instead (see the documentation of PrivateKeyPassphraseHandler for an example).
+{
+public:
+ PrivateKeyFactory();
+ /// Creates the PrivateKeyFactory.
+
+ virtual ~PrivateKeyFactory();
+ /// Destroys the PrivateKeyFactory.
+
+ virtual PrivateKeyPassphraseHandler* create(bool onServer) const = 0;
+ /// Creates a new PrivateKeyPassphraseHandler
+};
+
+
+class NetSSL_API PrivateKeyFactoryRegistrar
+ /// Registrar class which automatically registers PrivateKeyFactories at the PrivateKeyFactoryMgr.
+ ///
+ /// You don't need to access this class directly. Use the macro
+ /// POCO_REGISTER_KEYFACTORY(namespace, PrivateKeyPassphraseHandlerName)
+ /// instead (see the documentation of PrivateKeyPassphraseHandler for an example).
+
+{
+public:
+ PrivateKeyFactoryRegistrar(const std::string& name, PrivateKeyFactory* pFactory);
+ /// Registers the PrivateKeyFactory with the given name at the factory manager.
+
+ virtual ~PrivateKeyFactoryRegistrar();
+ /// Destroys the PrivateKeyFactoryRegistrar.
+};
+
+
+template<typename T>
+class PrivateKeyFactoryImpl: public Poco::Net::PrivateKeyFactory
+{
+public:
+ PrivateKeyFactoryImpl()
+ {
+ }
+
+ ~PrivateKeyFactoryImpl()
+ {
+ }
+
+ PrivateKeyPassphraseHandler* create(bool server) const
+ {
+ return new T(server);
+ }
+};
+
+
+} } // namespace Poco::Net
+
+
+// DEPRECATED: register the factory directly at the FactoryMgr:
+// Poco::Net::SSLManager::instance().privateKeyFactoryMgr().setFactory(name, new Poco::Net::PrivateKeyFactoryImpl<MyKeyHandler>());
+#define POCO_REGISTER_KEYFACTORY(API, PKCLS) \
+ static Poco::Net::PrivateKeyFactoryRegistrar aRegistrar(std::string(#PKCLS), new Poco::Net::PrivateKeyFactoryImpl<PKCLS>());
+
+
+#endif // NetSSL_PrivateKeyFactory_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h
new file mode 100644
index 0000000000..b29b37f46a
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h
@@ -0,0 +1,64 @@
+//
+// PrivateKeyFactoryMgr.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: PrivateKeyFactoryMgr
+//
+// Definition of the PrivateKeyFactoryMgr class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_PrivateKeyFactoryMgr_INCLUDED
+#define NetSSL_PrivateKeyFactoryMgr_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/PrivateKeyFactory.h"
+#include "Poco/SharedPtr.h"
+#include <map>
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API PrivateKeyFactoryMgr
+ /// A PrivateKeyFactoryMgr manages all existing PrivateKeyFactories.
+{
+public:
+ typedef std::map<std::string, Poco::SharedPtr<PrivateKeyFactory> > FactoriesMap;
+
+ PrivateKeyFactoryMgr();
+ /// Creates the PrivateKeyFactoryMgr.
+
+ ~PrivateKeyFactoryMgr();
+ /// Destroys the PrivateKeyFactoryMgr.
+
+ void setFactory(const std::string& name, PrivateKeyFactory* pFactory);
+ /// Registers the factory. Class takes ownership of the pointer.
+ /// If a factory with the same name already exists, an exception is thrown.
+
+ bool hasFactory(const std::string& name) const;
+ /// Returns true if for the given name a factory is already registered
+
+ const PrivateKeyFactory* getFactory(const std::string& name) const;
+ /// Returns NULL if for the given name a factory does not exist, otherwise the factory is returned
+
+ void removeFactory(const std::string& name);
+ /// Removes the factory from the manager.
+
+private:
+ FactoriesMap _factories;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_PrivateKeyFactoryMgr_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h
new file mode 100644
index 0000000000..726703f78f
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h
@@ -0,0 +1,84 @@
+//
+// PrivateKeyPassphraseHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: PrivateKeyPassphraseHandler
+//
+// Definition of the PrivateKeyPassphraseHandler class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_PrivateKeyPassphraseHandler_INCLUDED
+#define NetSSL_PrivateKeyPassphraseHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API PrivateKeyPassphraseHandler
+ /// A passphrase handler is needed whenever the private key of a certificate is loaded and the certificate is protected
+ /// by a passphrase. The PrivateKeyPassphraseHandler's task is to provide that passphrase.
+ /// One can install one's own PrivateKeyPassphraseHandler by implementing this interface. Note that
+ /// in the implementation file of the subclass the following code must be present (assuming you use the namespace My_API
+ /// and the name of your handler class is MyGuiHandler):
+ ///
+ /// #include "Poco/Net/PrivateKeyFactory.h"
+ /// ...
+ /// POCO_REGISTER_KEYFACTORY(My_API, MyGuiHandler)
+ ///
+ /// One can either set the handler directly in the startup code of the main method of ones application by calling
+ ///
+ /// SSLManager::instance().initialize(myguiHandler, myInvalidCertificateHandler, mySSLContext)
+ ///
+ /// or in case one's application extends Poco::Util::Application one can use an XML configuration and put the following entry
+ /// under the path openSSL.privateKeyPassphraseHandler:
+ ///
+ /// <privateKeyPassphraseHandler>
+ /// <name>MyGuiHandler</name>
+ /// <options>
+ /// [...] // Put optional config params for the handler here
+ /// </options>
+ /// </privateKeyPassphraseHandler>
+ ///
+ /// Note that the name of the passphrase handler must be same as the one provided to the POCO_REGISTER_KEYFACTORY macro.
+{
+public:
+ PrivateKeyPassphraseHandler(bool onServerSide);
+ /// Creates the PrivateKeyPassphraseHandler. Automatically registers at the SSLManager::PrivateKeyPassword event.
+
+ virtual ~PrivateKeyPassphraseHandler();
+ /// Destroys the PrivateKeyPassphraseHandler.
+
+ virtual void onPrivateKeyRequested(const void* pSender, std::string& privateKey) = 0;
+ /// Returns the requested private key in the parameter privateKey.
+
+ bool serverSide() const;
+
+private:
+ bool _serverSide;
+};
+
+
+//
+// inlines
+//
+inline bool PrivateKeyPassphraseHandler::serverSide() const
+{
+ return _serverSide;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_PrivateKeyPassphraseHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h
new file mode 100644
index 0000000000..b170ad50b5
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h
@@ -0,0 +1,48 @@
+//
+// RejectCertificateHandler.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: RejectCertificateHandler
+//
+// Definition of the RejectCertificateHandler class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_RejectCertificateHandler_INCLUDED
+#define NetSSL_RejectCertificateHandler_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/InvalidCertificateHandler.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API RejectCertificateHandler: public InvalidCertificateHandler
+ /// A RejectCertificateHandler is invoked whenever an error
+ /// occurs verifying the certificate. It always rejects
+ /// the certificate.
+{
+public:
+ RejectCertificateHandler(bool handleErrorsOnServerSide);
+ /// Creates the RejectCertificateHandler
+
+ virtual ~RejectCertificateHandler();
+ /// Destroys the RejectCertificateHandler.
+
+ void onInvalidCertificate(const void* pSender, VerificationErrorArgs& errorCert);
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_RejectCertificateHandler_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h
new file mode 100644
index 0000000000..7b8dfe79d3
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h
@@ -0,0 +1,39 @@
+//
+// SSLException.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: SSLException
+//
+// Definition of the SSLException class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SSLException_INCLUDED
+#define NetSSL_SSLException_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/NetException.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+POCO_DECLARE_EXCEPTION(NetSSL_API, SSLException, NetException)
+POCO_DECLARE_EXCEPTION(NetSSL_API, SSLContextException, SSLException)
+POCO_DECLARE_EXCEPTION(NetSSL_API, InvalidCertificateException, SSLException)
+POCO_DECLARE_EXCEPTION(NetSSL_API, CertificateValidationException, SSLException)
+POCO_DECLARE_EXCEPTION(NetSSL_API, SSLConnectionUnexpectedlyClosedException, SSLException)
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SSLException_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h
new file mode 100644
index 0000000000..6d0f469295
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h
@@ -0,0 +1,390 @@
+//
+// SSLManager.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: SSLManager
+//
+// Definition of the SSLManager class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SSLManager_INCLUDED
+#define NetSSL_SSLManager_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/VerificationErrorArgs.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/PrivateKeyFactoryMgr.h"
+#include "Poco/Net/CertificateHandlerFactoryMgr.h"
+#include "Poco/Net/InvalidCertificateHandler.h"
+#include "Poco/Util/AbstractConfiguration.h"
+#include "Poco/BasicEvent.h"
+#include "Poco/SharedPtr.h"
+#include "Poco/Mutex.h"
+#include <openssl/ssl.h>
+#if defined(OPENSSL_FIPS) && OPENSSL_VERSION_NUMBER < 0x010001000L
+#include <openssl/fips.h>
+#endif
+
+
+namespace Poco {
+namespace Net {
+
+
+class Context;
+
+
+class NetSSL_API SSLManager
+ /// SSLManager is a singleton for holding the default server/client
+ /// Context and handling callbacks for certificate verification errors
+ /// and private key passphrases.
+ ///
+ /// Proper initialization of SSLManager is critical.
+ ///
+ /// SSLManager can be initialized manually, by calling initializeServer()
+ /// and/or initializeClient(), or initialization can be automatic. In the latter
+ /// case, a Poco::Util::Application instance must be available and the required
+ /// configuration properties must be set (see below).
+ ///
+ /// Note that manual initialization must happen very early in the application,
+ /// before defaultClientContext() or defaultServerContext() are called.
+ ///
+ /// If defaultClientContext() and defaultServerContext() are never called
+ /// in an application, initialization of SSLManager can be omitted.
+ /// However, in this case, delegates for the ServerVerificationError,
+ /// ClientVerificationError and PrivateKeyPassphraseRequired events
+ /// must be registered.
+ ///
+ /// An exemplary documentation which sets either the server or client default context and creates
+ /// a PrivateKeyPassphraseHandler that reads the password from the XML file looks like this:
+ ///
+ /// <AppConfig>
+ /// <openSSL>
+ /// <server|client>
+ /// <privateKeyFile>mycert.key</privateKeyFile>
+ /// <certificateFile>mycert.crt</certificateFile>
+ /// <caConfig>rootcert.pem</caConfig>
+ /// <verificationMode>none|relaxed|strict|once</verificationMode>
+ /// <verificationDepth>1..9</verificationDepth>
+ /// <loadDefaultCAFile>true|false</loadDefaultCAFile>
+ /// <cipherList>ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH</cipherList>
+ /// <preferServerCiphers>true|false</preferServerCiphers>
+ /// <privateKeyPassphraseHandler>
+ /// <name>KeyFileHandler</name>
+ /// <options>
+ /// <password>test</password>
+ /// </options>
+ /// </privateKeyPassphraseHandler>
+ /// <invalidCertificateHandler>
+ /// <name>ConsoleCertificateHandler</name>
+ /// </invalidCertificateHandler>
+ /// <cacheSessions>true|false</cacheSessions>
+ /// <sessionIdContext>someString</sessionIdContext> <!-- server only -->
+ /// <sessionCacheSize>0..n</sessionCacheSize> <!-- server only -->
+ /// <sessionTimeout>0..n</sessionTimeout> <!-- server only -->
+ /// <extendedVerification>true|false</extendedVerification>
+ /// <requireTLSv1>true|false</requireTLSv1>
+ /// <requireTLSv1_1>true|false</requireTLSv1_1>
+ /// <requireTLSv1_2>true|false</requireTLSv1_2>
+ /// <disableProtocols>sslv2,sslv3,tlsv1,tlsv1_1,tlsv1_2</disableProtocols>
+ /// <dhParamsFile>dh.pem</dhParamsFile>
+ /// <ecdhCurve>prime256v1</ecdhCurve>
+ /// </server|client>
+ /// <fips>false</fips>
+ /// </openSSL>
+ /// </AppConfig>
+ ///
+ /// Following is a list of supported configuration properties. Property names must always
+ /// be prefixed with openSSL.server or openSSL.client. Some properties are only supported
+ /// for servers.
+ ///
+ /// - privateKeyFile (string): The path to the file containing the private key for the certificate
+ /// in PEM format (or containing both the private key and the certificate).
+ /// - certificateFile (string): The Path to the file containing the server's or client's certificate
+ /// in PEM format. Can be omitted if the the file given in privateKeyFile contains the certificate as well.
+ /// - caConfig (string): The path to the file or directory containing the trusted root certificates.
+ /// - verificationMode (string): Specifies whether and how peer certificates are validated (see
+ /// the Context class for details). Valid values are none, relaxed, strict, once.
+ /// - verificationDepth (integer, 1-9): Sets the upper limit for verification chain sizes. Verification
+ /// will fail if a certificate chain larger than this is encountered.
+ /// - loadDefaultCAFile (boolean): Specifies whether the builtin CA certificates from OpenSSL are used.
+ /// - cipherList (string): Specifies the supported ciphers in OpenSSL notation
+ /// (e.g. "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH").
+ /// - preferServerCiphers (bool): When choosing a cipher, use the server's preferences instead of the
+ /// client preferences. When not called, the SSL server will always follow the clients
+ /// preferences. When called, the SSL/TLS server will choose following its own
+ /// preferences.
+ /// - privateKeyPassphraseHandler.name (string): The name of the class (subclass of PrivateKeyPassphraseHandler)
+ /// used for obtaining the passphrase for accessing the private key.
+ /// - privateKeyPassphraseHandler.options.password (string): The password to be used by KeyFileHandler.
+ /// - invalidCertificateHandler.name: The name of the class (subclass of CertificateHandler)
+ /// used for confirming invalid certificates.
+ /// - cacheSessions (boolean): Enables or disables session caching.
+ /// - sessionIdContext (string): contains the application's unique session ID context, which becomes
+ /// part of each session identifier generated by the server. Can be an arbitrary sequence
+ /// of bytes with a maximum length of SSL_MAX_SSL_SESSION_ID_LENGTH. Should be specified
+ /// for a server to enable session caching. Should be specified even if session caching
+ /// is disabled to avoid problems with clients that request session caching (e.g. Firefox 3.6).
+ /// If not specified, defaults to ${application.name}.
+ /// - sessionCacheSize (integer): Sets the maximum size of the server session cache, in number of
+ /// sessions. The default size (according to OpenSSL documentation) is 1024*20, which may be too
+ /// large for many applications, especially on embedded platforms with limited memory.
+ /// Specifying a size of 0 will set an unlimited cache size.
+ /// - sessionTimeout (integer): Sets the timeout (in seconds) of cached sessions on the server.
+ /// - extendedVerification (boolean): Enable or disable the automatic post-connection
+ /// extended certificate verification.
+ /// - requireTLSv1 (boolean): Require a TLSv1 connection.
+ /// - requireTLSv1_1 (boolean): Require a TLSv1.1 connection.
+ /// - requireTLSv1_2 (boolean): Require a TLSv1.2 connection.
+ /// - disableProtocols (string): A comma-separated list of protocols that should be
+ /// disabled. Valid protocol names are sslv2, sslv3, tlsv1, tlsv1_1, tlsv1_2.
+ /// - dhParamsFile (string): Specifies a file containing Diffie-Hellman parameters.
+ /// If not specified or empty, the default parameters are used.
+ /// - ecdhCurve (string): Specifies the name of the curve to use for ECDH, based
+ /// on the curve names specified in RFC 4492. Defaults to "prime256v1".
+ /// - fips: Enable or disable OpenSSL FIPS mode. Only supported if the OpenSSL version
+ /// that this library is built against supports FIPS mode.
+{
+public:
+ typedef Poco::SharedPtr<PrivateKeyPassphraseHandler> PrivateKeyPassphraseHandlerPtr;
+ typedef Poco::SharedPtr<InvalidCertificateHandler> InvalidCertificateHandlerPtr;
+
+ Poco::BasicEvent<VerificationErrorArgs> ServerVerificationError;
+ /// Fired whenever a certificate verification error is detected by the server during a handshake.
+
+ Poco::BasicEvent<VerificationErrorArgs> ClientVerificationError;
+ /// Fired whenever a certificate verification error is detected by the client during a handshake.
+
+ Poco::BasicEvent<std::string> PrivateKeyPassphraseRequired;
+ /// Fired when a encrypted certificate is loaded. Not setting the password
+ /// in the event parameter will result in a failure to load the certificate.
+
+ static SSLManager& instance();
+ /// Returns the instance of the SSLManager singleton.
+
+ void initializeServer(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrCertificateHandler, Context::Ptr ptrContext);
+ /// Initializes the server side of the SSLManager with a default passphrase handler, a default invalid certificate handler and a default context. If this method
+ /// is never called the SSLmanager will try to initialize its members from an application configuration.
+ ///
+ /// PtrPassphraseHandler and ptrCertificateHandler can be 0. However, in this case, event delegates
+ /// must be registered with the ServerVerificationError and PrivateKeyPassphraseRequired events.
+ ///
+ /// Note: Always create the handlers (or register the corresponding event delegates) before creating
+ /// the Context, as during creation of the Context the passphrase for the private key might be needed.
+ ///
+ /// Valid initialization code would be:
+ /// SharedPtr<PrivateKeyPassphraseHandler> pConsoleHandler = new KeyConsoleHandler;
+ /// SharedPtr<InvalidCertificateHandler> pInvalidCertHandler = new ConsoleCertificateHandler;
+ /// Context::Ptr pContext = new Context(Context::SERVER_USE, "any.pem", "any.pem", "rootcert.pem", Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ /// SSLManager::instance().initializeServer(pConsoleHandler, pInvalidCertHandler, pContext);
+
+ void initializeClient(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrHandler, Context::Ptr ptrContext);
+ /// Initializes the client side of the SSLManager with a default passphrase handler, a default invalid certificate handler and a default context. If this method
+ /// is never called the SSLmanager will try to initialize its members from an application configuration.
+ ///
+ /// PtrPassphraseHandler and ptrCertificateHandler can be 0. However, in this case, event delegates
+ /// must be registered with the ClientVerificationError and PrivateKeyPassphraseRequired events.
+ ///
+ /// Note: Always create the handlers (or register the corresponding event delegates) before creating
+ /// the Context, as during creation of the Context the passphrase for the private key might be needed.
+ ///
+ /// Valid initialization code would be:
+ /// SharedPtr<PrivateKeyPassphraseHandler> pConsoleHandler = new KeyConsoleHandler;
+ /// SharedPtr<InvalidCertificateHandler> pInvalidCertHandler = new ConsoleCertificateHandler;
+ /// Context::Ptr pContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ /// SSLManager::instance().initializeClient(pConsoleHandler, pInvalidCertHandler, pContext);
+
+ Context::Ptr defaultServerContext();
+ /// Returns the default Context used by the server.
+ ///
+ /// Unless initializeServer() has been called, the first call to this method initializes the default Context
+ /// from the application configuration.
+
+ Context::Ptr defaultClientContext();
+ /// Returns the default Context used by the client.
+ ///
+ /// Unless initializeClient() has been called, the first call to this method initializes the default Context
+ /// from the application configuration.
+
+ PrivateKeyPassphraseHandlerPtr serverPassphraseHandler();
+ /// Returns the configured passphrase handler of the server. If none is set, the method will create a default one
+ /// from an application configuration.
+
+ InvalidCertificateHandlerPtr serverCertificateHandler();
+ /// Returns an initialized certificate handler (used by the server to verify client cert) which determines how invalid certificates are treated.
+ /// If none is set, it will try to auto-initialize one from an application configuration.
+
+ PrivateKeyPassphraseHandlerPtr clientPassphraseHandler();
+ /// Returns the configured passphrase handler of the client. If none is set, the method will create a default one
+ /// from an application configuration.
+
+ InvalidCertificateHandlerPtr clientCertificateHandler();
+ /// Returns an initialized certificate handler (used by the client to verify server cert) which determines how invalid certificates are treated.
+ /// If none is set, it will try to auto-initialize one from an application configuration.
+
+ PrivateKeyFactoryMgr& privateKeyFactoryMgr();
+ /// Returns the private key factory manager which stores the
+ /// factories for the different registered passphrase handlers for private keys.
+
+ CertificateHandlerFactoryMgr& certificateHandlerFactoryMgr();
+ /// Returns the CertificateHandlerFactoryMgr which stores the
+ /// factories for the different registered certificate handlers.
+
+ static bool isFIPSEnabled();
+ // Returns true if FIPS mode is enabled, false otherwise.
+
+ void shutdown();
+ /// Shuts down the SSLManager and releases the default Context
+ /// objects. After a call to shutdown(), the SSLManager can no
+ /// longer be used.
+ ///
+ /// Normally, it's not necessary to call this method directly, as this
+ /// will be called either by uninitializeSSL(), or when
+ /// the SSLManager instance is destroyed.
+
+ static const std::string CFG_SERVER_PREFIX;
+ static const std::string CFG_CLIENT_PREFIX;
+
+protected:
+ static int verifyClientCallback(int ok, X509_STORE_CTX* pStore);
+ /// The return value of this method defines how errors in
+ /// verification are handled. Return 0 to terminate the handshake,
+ /// or 1 to continue despite the error.
+
+ static int verifyServerCallback(int ok, X509_STORE_CTX* pStore);
+ /// The return value of this method defines how errors in
+ /// verification are handled. Return 0 to terminate the handshake,
+ /// or 1 to continue despite the error.
+
+ static int privateKeyPassphraseCallback(char* pBuf, int size, int flag, void* userData);
+ /// Method is invoked by OpenSSL to retrieve a passwd for an encrypted certificate.
+ /// The request is delegated to the PrivatekeyPassword event. This method returns the
+ /// length of the password.
+
+ static Poco::Util::AbstractConfiguration& appConfig();
+ /// Returns the application configuration.
+ ///
+ /// Throws a InvalidStateException if not application instance
+ /// is available.
+
+private:
+ SSLManager();
+ /// Creates the SSLManager.
+
+ ~SSLManager();
+ /// Destroys the SSLManager.
+
+ void initDefaultContext(bool server);
+ /// Inits the default context, the first time it is accessed.
+
+ void initEvents(bool server);
+ /// Registers delegates at the events according to the configuration.
+
+ void initPassphraseHandler(bool server);
+ /// Inits the passphrase handler.
+
+ void initCertificateHandler(bool server);
+ /// Inits the certificate handler.
+
+ static int verifyCallback(bool server, int ok, X509_STORE_CTX* pStore);
+ /// The return value of this method defines how errors in
+ /// verification are handled. Return 0 to terminate the handshake,
+ /// or 1 to continue despite the error.
+
+ PrivateKeyFactoryMgr _factoryMgr;
+ CertificateHandlerFactoryMgr _certHandlerFactoryMgr;
+ Context::Ptr _ptrDefaultServerContext;
+ PrivateKeyPassphraseHandlerPtr _ptrServerPassphraseHandler;
+ InvalidCertificateHandlerPtr _ptrServerCertificateHandler;
+ Context::Ptr _ptrDefaultClientContext;
+ PrivateKeyPassphraseHandlerPtr _ptrClientPassphraseHandler;
+ InvalidCertificateHandlerPtr _ptrClientCertificateHandler;
+ Poco::FastMutex _mutex;
+
+ static const std::string CFG_PRIV_KEY_FILE;
+ static const std::string CFG_CERTIFICATE_FILE;
+ static const std::string CFG_CA_LOCATION;
+ static const std::string CFG_VER_MODE;
+ static const Context::VerificationMode VAL_VER_MODE;
+ static const std::string CFG_VER_DEPTH;
+ static const int VAL_VER_DEPTH;
+ static const std::string CFG_ENABLE_DEFAULT_CA;
+ static const bool VAL_ENABLE_DEFAULT_CA;
+ static const std::string CFG_CIPHER_LIST;
+ static const std::string CFG_CYPHER_LIST; // for backwards compatibility
+ static const std::string VAL_CIPHER_LIST;
+ static const std::string CFG_PREFER_SERVER_CIPHERS;
+ static const std::string CFG_DELEGATE_HANDLER;
+ static const std::string VAL_DELEGATE_HANDLER;
+ static const std::string CFG_CERTIFICATE_HANDLER;
+ static const std::string VAL_CERTIFICATE_HANDLER;
+ static const std::string CFG_CACHE_SESSIONS;
+ static const std::string CFG_SESSION_ID_CONTEXT;
+ static const std::string CFG_SESSION_CACHE_SIZE;
+ static const std::string CFG_SESSION_TIMEOUT;
+ static const std::string CFG_EXTENDED_VERIFICATION;
+ static const std::string CFG_REQUIRE_TLSV1;
+ static const std::string CFG_REQUIRE_TLSV1_1;
+ static const std::string CFG_REQUIRE_TLSV1_2;
+ static const std::string CFG_DISABLE_PROTOCOLS;
+ static const std::string CFG_DH_PARAMS_FILE;
+ static const std::string CFG_ECDH_CURVE;
+
+#ifdef OPENSSL_FIPS
+ static const std::string CFG_FIPS_MODE;
+ static const bool VAL_FIPS_MODE;
+#endif
+
+ friend class Poco::SingletonHolder<SSLManager>;
+ friend class Context;
+};
+
+
+//
+// inlines
+//
+inline PrivateKeyFactoryMgr& SSLManager::privateKeyFactoryMgr()
+{
+ return _factoryMgr;
+}
+
+
+inline CertificateHandlerFactoryMgr& SSLManager::certificateHandlerFactoryMgr()
+{
+ return _certHandlerFactoryMgr;
+}
+
+
+inline bool SSLManager::isFIPSEnabled()
+{
+#ifdef OPENSSL_FIPS
+ return FIPS_mode() ? true : false;
+#else
+ return false;
+#endif
+}
+
+
+inline int SSLManager::verifyServerCallback(int ok, X509_STORE_CTX* pStore)
+{
+ return SSLManager::verifyCallback(true, ok, pStore);
+}
+
+
+inline int SSLManager::verifyClientCallback(int ok, X509_STORE_CTX* pStore)
+{
+ return SSLManager::verifyCallback(false, ok, pStore);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SSLManager_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h
new file mode 100644
index 0000000000..146be2aeb5
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h
@@ -0,0 +1,96 @@
+//
+// SecureSMTPClientSession.h
+//
+// Library: NetSSL_OpenSSL
+// Package: Mail
+// Module: SecureSMTPClientSession
+//
+// Definition of the SecureSMTPClientSession class.
+//
+// Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Net_SecureSMTPClientSession_INCLUDED
+#define Net_SecureSMTPClientSession_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SMTPClientSession.h"
+#include "Poco/Net/Context.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API SecureSMTPClientSession: public SMTPClientSession
+ /// This class implements an Simple Mail
+ /// Transfer Protocol (SMTP, RFC 2821)
+ /// client for sending e-mail messages that
+ /// supports the STARTTLS command for secure
+ /// connections.
+ ///
+ /// Usage is as follows:
+ /// 1. Create a SecureSMTPClientSession object.
+ /// 2. Call login() or login(hostname).
+ /// 3. Call startTLS() to switch to a secure connection.
+ /// Check the return value to see if a secure connection
+ /// has actually been established (not all servers may
+ /// support STARTTLS).
+ /// 4. Call any of the login() methods to securely authenticate
+ /// with a username and password.
+ /// 5. Send the message(s).
+{
+public:
+ explicit SecureSMTPClientSession(const StreamSocket& socket);
+ /// Creates the SecureSMTPClientSession using
+ /// the given socket, which must be connected
+ /// to a SMTP server.
+
+ SecureSMTPClientSession(const std::string& host, Poco::UInt16 port = SMTP_PORT);
+ /// Creates the SecureSMTPClientSession using a socket connected
+ /// to the given host and port.
+
+ virtual ~SecureSMTPClientSession();
+ /// Destroys the SMTPClientSession.
+
+ bool startTLS();
+ /// Sends a STARTTLS command and, if successful,
+ /// creates a secure SSL/TLS connection over the
+ /// existing socket connection.
+ ///
+ /// Must be called after login() or login(hostname).
+ /// If successful, login() can be called again
+ /// to authenticate the user.
+ ///
+ /// Returns true if the STARTTLS command was successful,
+ /// false otherwise.
+
+ bool startTLS(Context::Ptr pContext);
+ /// Sends a STARTTLS command and, if successful,
+ /// creates a secure SSL/TLS connection over the
+ /// existing socket connection.
+ ///
+ /// Uses the given Context object for creating
+ /// the SSL/TLS connection.
+ ///
+ /// Must be called after login() or login(hostname).
+ /// If successful, login() can be called again
+ /// to authenticate the user.
+ ///
+ /// Returns true if the STARTTLS command was successful,
+ /// false otherwise.
+
+private:
+ std::string _host;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // Net_SecureSMTPClientSession_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h
new file mode 100644
index 0000000000..2b89c45cb9
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h
@@ -0,0 +1,136 @@
+//
+// SecureServerSocket.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLSockets
+// Module: SecureServerSocket
+//
+// Definition of the SecureServerSocket class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SecureServerSocket_INCLUDED
+#define NetSSL_SecureServerSocket_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/ServerSocket.h"
+#include "Poco/Net/Context.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API SecureServerSocket: public ServerSocket
+ /// A server socket for secure SSL connections.
+{
+public:
+ SecureServerSocket();
+ /// Creates a SSL server socket using the
+ /// default SSL server context.
+ ///
+ /// The server socket must be bound to
+ /// an address and put into listening state.
+
+ explicit SecureServerSocket(Context::Ptr pContext);
+ /// Creates a SSL server socket, using the
+ /// given SSL context object.
+ ///
+ /// The server socket must be bound to
+ /// an address and put into listening state.
+
+ SecureServerSocket(const Socket& socket);
+ /// Creates the SecureServerSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a SecureServerSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ SecureServerSocket(const SocketAddress& address, int backlog = 64);
+ /// Creates a server socket using the default server SSL context,
+ /// binds it to the given address and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ SecureServerSocket(const SocketAddress& address, int backlog, Context::Ptr pContext);
+ /// Creates a server socket using the given SSL context, binds it
+ /// to the given address and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ SecureServerSocket(Poco::UInt16 port, int backlog = 64);
+ /// Creates a server socket using the default server SSL context,
+ /// binds it to the given port and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ SecureServerSocket(Poco::UInt16 port, int backlog, Context::Ptr pContext);
+ /// Creates a server socket using the given SSL context, binds it
+ /// to the given port and puts it in listening
+ /// state.
+ ///
+ /// After successful construction, the server socket
+ /// is ready to accept connections.
+
+ virtual ~SecureServerSocket();
+ /// Destroys the StreamSocket.
+
+ SecureServerSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ StreamSocket acceptConnection(SocketAddress& clientAddr);
+ /// Get the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new SSL socket for the connection
+ /// with the client.
+ ///
+ /// The client socket's address is returned in clientAddr.
+ ///
+ /// No SSL handshake is performed on the new connection.
+ /// The SSL handshake will be performed the first time
+ /// sendBytes(), receiveBytes() or completeHandshake()
+ /// is called on the returned SecureStreamSocket.
+
+ StreamSocket acceptConnection();
+ /// Get the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new SSL socket for the connection
+ /// with the client.
+ ///
+ /// No SSL handshake is performed on the new connection.
+ /// The SSL handshake will be performed the first time
+ /// sendBytes(), receiveBytes() or completeHandshake()
+ /// is called on the returned SecureStreamSocket.
+
+ Context::Ptr context() const;
+ /// Returns the SSL context used by this socket.
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SecureServerSocket_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h
new file mode 100644
index 0000000000..2cf969d099
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h
@@ -0,0 +1,146 @@
+//
+// SecureServerSocketImpl.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLSockets
+// Module: SecureServerSocketImpl
+//
+// Definition of the SecureServerSocketImpl class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SecureServerSocketImpl_INCLUDED
+#define NetSSL_SecureServerSocketImpl_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SecureSocketImpl.h"
+#include "Poco/Net/ServerSocketImpl.h"
+#include "Poco/Net/Context.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API SecureServerSocketImpl: public ServerSocketImpl
+ /// The SocketImpl class for SecureServerSocket.
+{
+public:
+ SecureServerSocketImpl(Context::Ptr pContext);
+ /// Creates the SecureServerSocketImpl using the
+ /// given SSL context object.
+
+ SocketImpl* acceptConnection(SocketAddress& clientAddr);
+ /// Get the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new TCP socket for the connection
+ /// with the client.
+ ///
+ /// The client socket's address is returned in clientAddr.
+
+ void connect(const SocketAddress& address);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void connect(const SocketAddress& address, const Poco::Timespan& timeout);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void connectNB(const SocketAddress& address);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void bind(const SocketAddress& address, bool reuseAddress = false, bool reusePort = false);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. TCP clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+
+ void listen(int backlog = 64);
+ /// Puts the socket into listening state.
+ ///
+ /// The socket becomes a passive socket that
+ /// can accept incoming connection requests.
+ ///
+ /// The backlog argument specifies the maximum
+ /// number of connections that can be queued
+ /// for this socket.
+
+ void close();
+ /// Close the socket.
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void sendUrgent(unsigned char data);
+ /// Not supported by this kind of socket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ bool secure() const;
+ /// Returns true iff the socket's connection is secure
+ /// (using SSL or TLS).
+
+ Context::Ptr context() const;
+ /// Returns the SSL context used by this socket.
+
+protected:
+ ~SecureServerSocketImpl();
+ /// Destroys the SecureServerSocketImpl.
+
+private:
+ SecureServerSocketImpl(const SecureServerSocketImpl&);
+ SecureServerSocketImpl& operator = (const SecureServerSocketImpl&);
+
+private:
+ SecureSocketImpl _impl;
+};
+
+
+//
+// inlines
+//
+inline Context::Ptr SecureServerSocketImpl::context() const
+{
+ return _impl.context();
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SecureServerSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h
new file mode 100644
index 0000000000..8d331a3a6d
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h
@@ -0,0 +1,265 @@
+//
+// SecureSocketImpl.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLSockets
+// Module: SecureSocketImpl
+//
+// Definition of the SecureSocketImpl class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SecureSocketImpl_INCLUDED
+#define NetSSL_SecureSocketImpl_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SocketImpl.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/X509Certificate.h"
+#include "Poco/Net/Session.h"
+#include <openssl/bio.h>
+#include <openssl/ssl.h>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HostEntry;
+
+
+class NetSSL_API SecureSocketImpl
+ /// The SocketImpl for SecureStreamSocket.
+{
+public:
+ SecureSocketImpl(Poco::AutoPtr<SocketImpl> pSocketImpl, Context::Ptr pContext);
+ /// Creates the SecureSocketImpl using an already
+ /// connected stream socket.
+
+ virtual ~SecureSocketImpl();
+ /// Destroys the SecureSocketImpl.
+
+ SocketImpl* acceptConnection(SocketAddress& clientAddr);
+ /// Get the next completed connection from the
+ /// socket's completed connection queue.
+ ///
+ /// If the queue is empty, waits until a connection
+ /// request completes.
+ ///
+ /// Returns a new SSL socket for the connection
+ /// with the client.
+ ///
+ /// The client socket's address is returned in clientAddr.
+
+ void connect(const SocketAddress& address, bool performHandshake);
+ /// Initializes the socket and establishes a secure connection to
+ /// the TCP server at the given address.
+ ///
+ /// If performHandshake is true, the SSL handshake is performed immediately
+ /// after establishing the connection. Otherwise, the handshake is performed
+ /// the first time sendBytes(), receiveBytes() or completeHandshake() is called.
+
+ void connect(const SocketAddress& address, const Poco::Timespan& timeout, bool performHandshake);
+ /// Initializes the socket, sets the socket timeout and
+ /// establishes a secure connection to the TCP server at the given address.
+ ///
+ /// If performHandshake is true, the SSL handshake is performed immediately
+ /// after establishing the connection. Otherwise, the handshake is performed
+ /// the first time sendBytes(), receiveBytes() or completeHandshake() is called.
+
+ void connectNB(const SocketAddress& address);
+ /// Initializes the socket and establishes a secure connection to
+ /// the TCP server at the given address. Prior to opening the
+ /// connection the socket is set to nonblocking mode.
+
+ void bind(const SocketAddress& address, bool reuseAddress = false, bool reusePort = false);
+ /// Bind a local address to the socket.
+ ///
+ /// This is usually only done when establishing a server
+ /// socket. SSL clients should not bind a socket to a
+ /// specific address.
+ ///
+ /// If reuseAddress is true, sets the SO_REUSEADDR
+ /// socket option.
+
+ void listen(int backlog = 64);
+ /// Puts the socket into listening state.
+ ///
+ /// The socket becomes a passive socket that
+ /// can accept incoming connection requests.
+ ///
+ /// The backlog argument specifies the maximum
+ /// number of connections that can be queued
+ /// for this socket.
+
+ void shutdown();
+ /// Shuts down the connection by attempting
+ /// an orderly SSL shutdown, then actually
+ /// shutting down the TCP connection.
+
+ void close();
+ /// Close the socket.
+
+ void abort();
+ /// Aborts the connection by closing the
+ /// underlying TCP connection. No orderly SSL shutdown
+ /// is performed.
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket. Any specified flags are ignored.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+
+ int available() const;
+ /// Returns the number of bytes available from the
+ /// SSL buffer for immediate reading.
+
+ int completeHandshake();
+ /// Completes the SSL handshake.
+ ///
+ /// If the SSL connection was the result of an accept(),
+ /// the server-side handshake is completed, otherwise
+ /// a client-side handshake is performed.
+
+ poco_socket_t sockfd();
+ /// Returns the underlying socket descriptor.
+
+ X509* peerCertificate() const;
+ /// Returns the peer's certificate.
+
+ Context::Ptr context() const;
+ /// Returns the SSL context used for this socket.
+
+ void verifyPeerCertificate();
+ /// Performs post-connect (or post-accept) peer certificate validation,
+ /// using the peer host name set with setPeerHostName(), or the peer's
+ /// IP address string if no peer host name has been set.
+
+ void verifyPeerCertificate(const std::string& hostName);
+ /// Performs post-connect (or post-accept) peer certificate validation
+ /// using the given peer host name.
+
+ void setPeerHostName(const std::string& hostName);
+ /// Sets the peer host name for certificate validation purposes.
+
+ const std::string& getPeerHostName() const;
+ /// Returns the peer host name.
+
+ Session::Ptr currentSession();
+ /// Returns the SSL session of the current connection,
+ /// for reuse in a future connection (if session caching
+ /// is enabled).
+ ///
+ /// If no connection is established, returns null.
+
+ void useSession(Session::Ptr pSession);
+ /// Sets the SSL session to use for the next
+ /// connection. Setting a previously saved Session
+ /// object is necessary to enable session caching.
+ ///
+ /// To remove the currently set session, a null pointer
+ /// can be given.
+ ///
+ /// Must be called before connect() to be effective.
+
+ bool sessionWasReused();
+ /// Returns true iff a reused session was negotiated during
+ /// the handshake.
+
+protected:
+ void acceptSSL();
+ /// Performs a server-side SSL handshake and certificate verification.
+
+ void connectSSL(bool performHandshake);
+ /// Performs a client-side SSL handshake and establishes a secure
+ /// connection over an already existing TCP connection.
+
+ long verifyPeerCertificateImpl(const std::string& hostName);
+ /// Performs post-connect (or post-accept) peer certificate validation.
+
+ static bool isLocalHost(const std::string& hostName);
+ /// Returns true iff the given host name is the local host
+ /// (either "localhost" or "127.0.0.1").
+
+ bool mustRetry(int rc, Poco::Timespan& remaining_time);
+ /// Returns true if the last operation should be retried,
+ /// otherwise false.
+ ///
+ /// In case of an SSL_ERROR_WANT_READ error, and if the socket is
+ /// blocking, waits for the underlying socket to become readable.
+ ///
+ /// In case of an SSL_ERROR_WANT_WRITE error, and if the socket is
+ /// blocking, waits for the underlying socket to become writable.
+ ///
+ /// Can also throw a Poco::TimeoutException if the socket does
+ /// not become readable or writable within the sockets
+ /// receive or send timeout.
+
+ int handleError(int rc);
+ /// Handles an SSL error by throwing an appropriate exception.
+
+ void reset();
+ /// Prepares the socket for re-use.
+ ///
+ /// After closing and resetting a socket, the socket can
+ /// be used for a new connection.
+ ///
+ /// Note that simply closing a socket is not sufficient
+ /// to be able to re-use it again.
+
+ Poco::Timespan getMaxTimeout();
+
+private:
+ SecureSocketImpl(const SecureSocketImpl&);
+ SecureSocketImpl& operator = (const SecureSocketImpl&);
+
+ SSL* _pSSL;
+ Poco::AutoPtr<SocketImpl> _pSocket;
+ Context::Ptr _pContext;
+ bool _needHandshake;
+ std::string _peerHostName;
+ Session::Ptr _pSession;
+
+ friend class SecureStreamSocketImpl;
+};
+
+
+//
+// inlines
+//
+inline poco_socket_t SecureSocketImpl::sockfd()
+{
+ return _pSocket->sockfd();
+}
+
+
+inline Context::Ptr SecureSocketImpl::context() const
+{
+ return _pContext;
+}
+
+
+inline const std::string& SecureSocketImpl::getPeerHostName() const
+{
+ return _peerHostName;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SecureSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h
new file mode 100644
index 0000000000..059be1bbee
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h
@@ -0,0 +1,272 @@
+//
+// SecureStreamSocket.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLSockets
+// Module: SecureStreamSocket
+//
+// Definition of the SecureStreamSocket class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SecureStreamSocket_INCLUDED
+#define NetSSL_SecureStreamSocket_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/StreamSocket.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/Session.h"
+#include "Poco/Net/X509Certificate.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API SecureStreamSocket: public StreamSocket
+ /// A subclass of StreamSocket for secure SSL sockets.
+ ///
+ /// A few notes about nonblocking IO:
+ /// sendBytes() and receiveBytes() can return a
+ /// negative value when using a nonblocking socket, which means
+ /// a SSL handshake is currently in progress and more data
+ /// needs to be read or written for the handshake to continue.
+ /// If sendBytes() or receiveBytes() return ERR_SSL_WANT_WRITE,
+ /// sendBytes() must be called as soon as possible (usually, after
+ /// select() indicates that data can be written). Likewise, if
+ /// ERR_SSL_WANT_READ is returned, receiveBytes() must be called
+ /// as soon as data is available for reading (indicated by select()).
+ ///
+ /// The SSL handshake is delayed until the first sendBytes() or
+ /// receiveBytes() operation is performed on the socket. No automatic
+ /// post connection check (checking the peer certificate for a valid
+ /// hostname) is performed when using nonblocking I/O. To manually
+ /// perform peer certificate validation, call verifyPeerCertificate()
+ /// after the SSL handshake has been completed.
+{
+public:
+ enum
+ {
+ ERR_SSL_WANT_READ = -1,
+ ERR_SSL_WANT_WRITE = -2
+ };
+
+ SecureStreamSocket();
+ /// Creates an unconnected secure stream socket
+ /// using the default client SSL context.
+ ///
+ /// Before sending or receiving data, the socket
+ /// must be connected with a call to connect().
+
+ explicit SecureStreamSocket(Context::Ptr pContext);
+ /// Creates an unconnected secure stream socket
+ /// using the given SSL context.
+ ///
+ /// Before sending or receiving data, the socket
+ /// must be connected with a call to connect().
+
+ SecureStreamSocket(Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates an unconnected secure stream socket
+ /// using the given SSL context.
+ ///
+ /// Before sending or receiving data, the socket
+ /// must be connected with a call to connect().
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ explicit SecureStreamSocket(const SocketAddress& address);
+ /// Creates a secure stream socket using the default
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+
+ SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext);
+ /// Creates a secure stream socket using the given
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+
+ SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates a secure stream socket using the given
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ SecureStreamSocket(const SocketAddress& address, const std::string& hostName);
+ /// Creates a secure stream socket using the default
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+ ///
+ /// The given host name is used for certificate verification.
+
+ SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext);
+ /// Creates a secure stream socket using the given
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+ ///
+ /// The given host name is used for certificate verification.
+
+ SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates a secure stream socket using the given
+ /// client SSL context and connects it to
+ /// the socket specified by address.
+ ///
+ /// The given host name is used for certificate verification.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ SecureStreamSocket(const Socket& socket);
+ /// Creates the SecureStreamSocket with the SocketImpl
+ /// from another socket. The SocketImpl must be
+ /// a SecureStreamSocketImpl, otherwise an InvalidArgumentException
+ /// will be thrown.
+
+ virtual ~SecureStreamSocket();
+ /// Destroys the StreamSocket.
+
+ SecureStreamSocket& operator = (const Socket& socket);
+ /// Assignment operator.
+ ///
+ /// Releases the socket's SocketImpl and
+ /// attaches the SocketImpl from the other socket and
+ /// increments the reference count of the SocketImpl.
+
+ bool havePeerCertificate() const;
+ /// Returns true iff the peer has presented a
+ /// certificate.
+
+ X509Certificate peerCertificate() const;
+ /// Returns the peer's X509 certificate.
+ ///
+ /// Throws a SSLException if the peer did not
+ /// present a certificate.
+
+ void setPeerHostName(const std::string& hostName);
+ /// Sets the peer's host name used for certificate validation.
+
+ const std::string& getPeerHostName() const;
+ /// Returns the peer's host name used for certificate validation.
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket, Context::Ptr pContext);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket, Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket, const std::string& peerHostName);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+
+ static SecureStreamSocket attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext, Session::Ptr pSession);
+ /// Creates a SecureStreamSocket over an existing socket
+ /// connection. The given StreamSocket must be connected.
+ /// A SSL handshake will be performed.
+ ///
+ /// The given Session is reused, if possible (client session
+ /// caching is enabled for the given Context, and the server
+ /// agrees to reuse the session).
+
+ Context::Ptr context() const;
+ /// Returns the SSL context used by this socket.
+
+ void setLazyHandshake(bool flag = true);
+ /// Enable lazy SSL handshake. If enabled, the SSL handshake
+ /// will be performed the first time date is sent or
+ /// received over the connection.
+
+ bool getLazyHandshake() const;
+ /// Returns true if setLazyHandshake(true) has been called.
+
+ void verifyPeerCertificate();
+ /// Performs post-connect (or post-accept) peer certificate validation,
+ /// using the peer host name set with setPeerHostName(), or the peer's
+ /// IP address string if no peer host name has been set.
+ ///
+ /// Should only be used for non-blocking connections, after the
+ /// initial SSL handshake has been performed (see completeHandshake()).
+
+ void verifyPeerCertificate(const std::string& hostName);
+ /// Performs post-connect (or post-accept) peer certificate validation
+ /// using the given host name.
+ ///
+ /// Should only be used for non-blocking connections, after the
+ /// initial SSL handshake has been performed (see completeHandshake()).
+
+ int completeHandshake();
+ /// Completes the SSL handshake.
+ ///
+ /// If the SSL connection was the result of an accept(),
+ /// the server-side handshake is completed, otherwise
+ /// a client-side handshake is performed.
+ ///
+ /// Returns 1 if the handshake was successful, ERR_SSL_WANT_READ or
+ /// ERR_SSL_WANT_WRITE if more data is required to complete the
+ /// handshake. In this case, completeHandshake() should be called
+ /// again, after the necessary condition has been met.
+
+ Session::Ptr currentSession();
+ /// Returns the SSL session of the current connection,
+ /// for reuse in a future connection (if session caching
+ /// is enabled).
+ ///
+ /// If no connection is established, returns null.
+
+ void useSession(Session::Ptr pSession);
+ /// Sets the SSL session to use for the next
+ /// connection. Setting a previously saved Session
+ /// object is necessary to enable session caching.
+ ///
+ /// To remove the currently set session, a null pointer
+ /// can be given.
+ ///
+ /// Must be called before connect() to be effective.
+
+ bool sessionWasReused();
+ /// Returns true iff a reused session was negotiated during
+ /// the handshake.
+
+ void abort();
+ /// Aborts the SSL connection by closing the underlying
+ /// TCP connection. No orderly SSL shutdown is performed.
+
+protected:
+ SecureStreamSocket(SocketImpl* pImpl);
+
+ friend class SecureServerSocket;
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SecureStreamSocket_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h
new file mode 100644
index 0000000000..3b000b4758
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h
@@ -0,0 +1,303 @@
+//
+// SecureStreamSocketImpl.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLSockets
+// Module: SecureStreamSocketImpl
+//
+// Definition of the SecureStreamSocketImpl class.
+//
+// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_SecureStreamSocketImpl_INCLUDED
+#define NetSSL_SecureStreamSocketImpl_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SecureSocketImpl.h"
+#include "Poco/Net/StreamSocketImpl.h"
+#include "Poco/Net/Context.h"
+#include "Poco/Net/X509Certificate.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API SecureStreamSocketImpl: public StreamSocketImpl
+ /// This class implements a SSL stream socket.
+{
+public:
+ SecureStreamSocketImpl(Context::Ptr pContext);
+ /// Creates the SecureStreamSocketImpl.
+
+ SecureStreamSocketImpl(StreamSocketImpl* pStreamSocket, Context::Ptr pContext);
+ /// Creates the SecureStreamSocketImpl.
+
+ void setSendTimeout(const Poco::Timespan& timeout);
+ void setReceiveTimeout(const Poco::Timespan& timeout);
+
+ SocketImpl* acceptConnection(SocketAddress& clientAddr);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void connect(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address.
+ ///
+ /// Can also be used for UDP sockets. In this case, no
+ /// connection is established. Instead, incoming and outgoing
+ /// packets are restricted to the specified address.
+
+ void connect(const SocketAddress& address, const Poco::Timespan& timeout);
+ /// Initializes the socket, sets the socket timeout and
+ /// establishes a connection to the TCP server at the given address.
+
+ void connectNB(const SocketAddress& address);
+ /// Initializes the socket and establishes a connection to
+ /// the TCP server at the given address. Prior to opening the
+ /// connection the socket is set to nonblocking mode.
+
+ void bind(const SocketAddress& address, bool reuseAddress = false, bool reusePort = false);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void listen(int backlog = 64);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void close();
+ /// Close the socket.
+
+ int sendBytes(const void* buffer, int length, int flags = 0);
+ /// Sends the contents of the given buffer through
+ /// the socket. Any specified flags are ignored.
+ ///
+ /// Returns the number of bytes sent, which may be
+ /// less than the number of bytes specified.
+
+ int receiveBytes(void* buffer, int length, int flags = 0);
+ /// Receives data from the socket and stores it
+ /// in buffer. Up to length bytes are received.
+ ///
+ /// Returns the number of bytes received.
+
+ int sendTo(const void* buffer, int length, const SocketAddress& address, int flags = 0);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ int receiveFrom(void* buffer, int length, SocketAddress& address, int flags = 0);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ void sendUrgent(unsigned char data);
+ /// Not supported by a SecureStreamSocket.
+ ///
+ /// Throws a Poco::InvalidAccessException.
+
+ int available();
+ /// Returns the number of bytes available that can be read
+ /// without causing the socket to block.
+ ///
+ /// For an SSL connection, returns the number of bytes that
+ /// can be read from the currently buffered SSL record,
+ /// before a new record is read from the underlying socket.
+
+ void shutdownReceive();
+ /// Shuts down the receiving part of the socket connection.
+ ///
+ /// Since SSL does not support a half shutdown, this does
+ /// nothing.
+
+ void shutdownSend();
+ /// Shuts down the receiving part of the socket connection.
+ ///
+ /// Since SSL does not support a half shutdown, this does
+ /// nothing.
+
+ void shutdown();
+ /// Shuts down the SSL connection.
+
+ void abort();
+ /// Aborts the connection by closing the underlying
+ /// TCP connection. No orderly SSL shutdown is performed.
+
+ bool secure() const;
+ /// Returns true iff the socket's connection is secure
+ /// (using SSL or TLS).
+
+ void setPeerHostName(const std::string& hostName);
+ /// Sets the peer host name for certificate validation purposes.
+
+ const std::string& getPeerHostName() const;
+ /// Returns the peer host name.
+
+ bool havePeerCertificate() const;
+ /// Returns true iff the peer has presented a
+ /// certificate.
+
+ X509Certificate peerCertificate() const;
+ /// Returns the peer's X509 certificate.
+ ///
+ /// Throws a SSLException if the peer did not
+ /// present a certificate.
+
+ Context::Ptr context() const;
+ /// Returns the SSL context used by this socket.
+
+ void setLazyHandshake(bool flag = true);
+ /// Enable lazy SSL handshake. If enabled, the SSL handshake
+ /// will be performed the first time date is sent or
+ /// received over the connection.
+
+ bool getLazyHandshake() const;
+ /// Returns true if setLazyHandshake(true) has been called.
+
+ void verifyPeerCertificate();
+ /// Performs post-connect (or post-accept) peer certificate validation,
+ /// using the peer's IP address as host name.
+
+ void verifyPeerCertificate(const std::string& hostName);
+ /// Performs post-connect (or post-accept) peer certificate validation
+ /// using the given host name.
+
+ int completeHandshake();
+ /// Completes the SSL handshake.
+ ///
+ /// If the SSL connection was the result of an accept(),
+ /// the server-side handshake is completed, otherwise
+ /// a client-side handshake is performed.
+
+ Session::Ptr currentSession();
+ /// Returns the SSL session of the current connection,
+ /// for reuse in a future connection (if session caching
+ /// is enabled).
+ ///
+ /// If no connection is established, returns null.
+
+ void useSession(Session::Ptr pSession);
+ /// Sets the SSL session to use for the next
+ /// connection. Setting a previously saved Session
+ /// object is necessary to enable session caching.
+ ///
+ /// To remove the currently set session, a null pointer
+ /// can be given.
+ ///
+ /// Must be called before connect() to be effective.
+
+ bool sessionWasReused();
+ /// Returns true iff a reused session was negotiated during
+ /// the handshake.
+
+protected:
+ void acceptSSL();
+ /// Performs a SSL server-side handshake.
+
+ void connectSSL();
+ /// Performs a SSL client-side handshake on an already connected TCP socket.
+
+ ~SecureStreamSocketImpl();
+ /// Destroys the SecureStreamSocketImpl.
+
+ static int lastError();
+ static void error();
+ static void error(const std::string& arg);
+ static void error(int code);
+ static void error(int code, const std::string& arg);
+
+private:
+ SecureStreamSocketImpl(const SecureStreamSocketImpl&);
+ SecureStreamSocketImpl& operator = (const SecureStreamSocketImpl&);
+
+ StreamSocketImpl * underlying_socket;
+ SecureSocketImpl _impl;
+ bool _lazyHandshake;
+
+ friend class SecureSocketImpl;
+ friend class SecureStreamSocket;
+};
+
+
+//
+// inlines
+//
+inline const std::string& SecureStreamSocketImpl::getPeerHostName() const
+{
+ return _impl.getPeerHostName();
+}
+
+
+inline void SecureStreamSocketImpl::setPeerHostName(const std::string& peerHostName)
+{
+ _impl.setPeerHostName(peerHostName);
+}
+
+
+inline Context::Ptr SecureStreamSocketImpl::context() const
+{
+ return _impl.context();
+}
+
+
+inline Session::Ptr SecureStreamSocketImpl::currentSession()
+{
+ return _impl.currentSession();
+}
+
+
+inline void SecureStreamSocketImpl::useSession(Session::Ptr pSession)
+{
+ _impl.useSession(pSession);
+}
+
+
+inline bool SecureStreamSocketImpl::sessionWasReused()
+{
+ return _impl.sessionWasReused();
+}
+
+
+inline int SecureStreamSocketImpl::lastError()
+{
+ return SocketImpl::lastError();
+}
+
+
+inline void SecureStreamSocketImpl::error()
+{
+ return SocketImpl::error();
+}
+
+
+inline void SecureStreamSocketImpl::error(const std::string& arg)
+{
+ return SocketImpl::error(arg);
+}
+
+
+inline void SecureStreamSocketImpl::error(int code)
+{
+ return SocketImpl::error(code);
+}
+
+
+inline void SecureStreamSocketImpl::error(int code, const std::string& arg)
+{
+ return SocketImpl::error(code, arg);
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_SecureStreamSocketImpl_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h
new file mode 100644
index 0000000000..cc9b2db746
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h
@@ -0,0 +1,79 @@
+//
+// Session.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: Session
+//
+// Definition of the Session class.
+//
+// Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_Session_INCLUDED
+#define NetSSL_Session_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/AutoPtr.h"
+#include <openssl/ssl.h>
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API Session: public Poco::RefCountedObject
+ /// This class encapsulates a SSL session object
+ /// used with session caching on the client side.
+ ///
+ /// For session caching to work, a client must
+ /// save the session object from an existing connection,
+ /// if it wants to reuse it with a future connection.
+{
+public:
+ typedef Poco::AutoPtr<Session> Ptr;
+
+ SSL_SESSION* sslSession() const;
+ /// Returns the stored OpenSSL SSL_SESSION object.
+
+protected:
+ Session(SSL_SESSION* pSession);
+ /// Creates a new Session object, using the given
+ /// SSL_SESSION object.
+ ///
+ /// The SSL_SESSION's reference count is not changed.
+
+ ~Session();
+ /// Destroys the Session.
+ ///
+ /// Calls SSL_SESSION_free() on the stored
+ /// SSL_SESSION object.
+
+private:
+ Session();
+
+ SSL_SESSION* _pSession;
+
+ friend class SecureSocketImpl;
+};
+
+
+//
+// inlines
+//
+inline SSL_SESSION* Session::sslSession() const
+{
+ return _pSession;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_Session_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h
new file mode 100644
index 0000000000..b1d0073cfa
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h
@@ -0,0 +1,52 @@
+//
+// Utility.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: Utility
+//
+// Definition of the Utility class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_Utility_INCLUDED
+#define NetSSL_Utility_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/Context.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API Utility
+ /// This class provides various helper functions for working
+ /// with the OpenSSL library.
+{
+public:
+ static Context::VerificationMode convertVerificationMode(const std::string& verMode);
+ /// Non-case sensitive conversion of a string to a VerificationMode enum.
+ /// If verMode is illegal an InvalidArgumentException is thrown.
+
+ static std::string convertCertificateError(long errCode);
+ /// Converts an SSL certificate handling error code into an error message.
+
+ static std::string getLastError();
+ /// Returns the last error from the error stack
+
+ static void clearErrorStack();
+ /// Clears the error stack
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_Utility_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h
new file mode 100644
index 0000000000..55ef897bb7
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h
@@ -0,0 +1,108 @@
+//
+// VerificationErrorArgs.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: VerificationErrorArgs
+//
+// Definition of the VerificationErrorArgs class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_VerificationErrorArgs_INCLUDED
+#define NetSSL_VerificationErrorArgs_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/X509Certificate.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+class NetSSL_API VerificationErrorArgs
+ /// A utility class for certificate error handling.
+{
+public:
+ VerificationErrorArgs(const X509Certificate& cert, int errDepth, int errNum, const std::string& errMsg);
+ /// Creates the VerificationErrorArgs. _ignoreError is per default set to false.
+
+ ~VerificationErrorArgs();
+ /// Destroys the VerificationErrorArgs.
+
+ const X509Certificate& certificate() const;
+ /// Returns the certificate that caused the error.
+
+ int errorDepth() const;
+ /// Returns the position of the certificate in the certificate chain.
+
+ int errorNumber() const;
+ /// Returns the id of the error
+
+ const std::string& errorMessage() const;
+ /// Returns the textual presentation of the errorNumber.
+
+ void setIgnoreError(bool ignoreError);
+ /// setIgnoreError to true, if a verification error is judged non-fatal by the user.
+
+ bool getIgnoreError() const;
+ /// returns the value of _ignoreError
+
+private:
+ X509Certificate _cert;
+ int _errorDepth;
+ int _errorNumber;
+ std::string _errorMessage; /// Textual representation of the _errorNumber
+ bool _ignoreError;
+};
+
+
+//
+// inlines
+//
+inline const X509Certificate& VerificationErrorArgs::certificate() const
+{
+ return _cert;
+}
+
+
+inline int VerificationErrorArgs::errorDepth() const
+{
+ return _errorDepth;
+}
+
+
+inline int VerificationErrorArgs::errorNumber() const
+{
+ return _errorNumber;
+}
+
+
+inline const std::string& VerificationErrorArgs::errorMessage() const
+{
+ return _errorMessage;
+}
+
+
+inline void VerificationErrorArgs::setIgnoreError(bool ignoreError)
+{
+ _ignoreError = ignoreError;
+}
+
+
+inline bool VerificationErrorArgs::getIgnoreError() const
+{
+ return _ignoreError;
+}
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_VerificationErrorArgs_INCLUDED
diff --git a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h
new file mode 100644
index 0000000000..a810b29457
--- /dev/null
+++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h
@@ -0,0 +1,102 @@
+//
+// X509Certificate.h
+//
+// Library: NetSSL_OpenSSL
+// Package: SSLCore
+// Module: X509Certificate
+//
+// Definition of the X509Certificate class.
+//
+// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef NetSSL_X509Certificate_INCLUDED
+#define NetSSL_X509Certificate_INCLUDED
+
+
+#include "Poco/Net/NetSSL.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Crypto/X509Certificate.h"
+#include "Poco/DateTime.h"
+#include "Poco/SharedPtr.h"
+#include <set>
+
+
+namespace Poco {
+namespace Net {
+
+
+class HostEntry;
+
+
+class NetSSL_API X509Certificate: public Poco::Crypto::X509Certificate
+ /// This class extends Poco::Crypto::X509Certificate with the
+ /// feature to validate a certificate.
+{
+public:
+ explicit X509Certificate(std::istream& istr);
+ /// Creates the X509Certificate object by reading
+ /// a certificate in PEM format from a stream.
+
+ explicit X509Certificate(const std::string& path);
+ /// Creates the X509Certificate object by reading
+ /// a certificate in PEM format from a file.
+
+ explicit X509Certificate(X509* pCert);
+ /// Creates the X509Certificate from an existing
+ /// OpenSSL certificate. Ownership is taken of
+ /// the certificate.
+
+ X509Certificate(X509* pCert, bool shared);
+ /// Creates the X509Certificate from an existing
+ /// OpenSSL certificate. Ownership is taken of
+ /// the certificate. If shared is true, the
+ /// certificate's reference count is incremented.
+
+ X509Certificate(const Poco::Crypto::X509Certificate& cert);
+ /// Creates the certificate by copying another one.
+
+ X509Certificate& operator = (const Poco::Crypto::X509Certificate& cert);
+ /// Assigns a certificate.
+
+ ~X509Certificate();
+ /// Destroys the X509Certificate.
+
+ bool verify(const std::string& hostName) const;
+ /// Verifies the validity of the certificate against the host name.
+ ///
+ /// For this check to be successful, the certificate must contain
+ /// a domain name that matches the domain name
+ /// of the host.
+ ///
+ /// Returns true if verification succeeded, or false otherwise.
+
+ static bool verify(const Poco::Crypto::X509Certificate& cert, const std::string& hostName);
+ /// Verifies the validity of the certificate against the host name.
+ ///
+ /// For this check to be successful, the certificate must contain
+ /// a domain name that matches the domain name
+ /// of the host.
+ ///
+ /// Returns true if verification succeeded, or false otherwise.
+
+protected:
+ static bool containsWildcards(const std::string& commonName);
+ static bool matchWildcard(const std::string& alias, const std::string& hostName);
+
+private:
+ enum
+ {
+ NAME_BUFFER_SIZE = 256
+ };
+};
+
+
+} } // namespace Poco::Net
+
+
+#endif // NetSSL_X509Certificate_INCLUDED