diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/libs/poco/NetSSL_OpenSSL | |
parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
download | ydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/poco/NetSSL_OpenSSL')
56 files changed, 7340 insertions, 7340 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 index 2d92c629aa..dc1f9d7b78 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/AcceptCertificateHandler.h @@ -1,52 +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 +// +// 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 index 5e3699c3ca..c5e52dec16 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactory.h @@ -1,93 +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 +// +// 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 index e70c9060b6..213d480f2f 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/CertificateHandlerFactoryMgr.h @@ -1,64 +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 +// +// 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 index c58962c476..958906aede 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/ConsoleCertificateHandler.h @@ -1,50 +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 +// +// 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 index d66328380d..a6fff8c9e3 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Context.h @@ -1,405 +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 +// +// 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 index ff0d89994c..ef77d8a922 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSClientSession.h @@ -1,165 +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 +// +// 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 index 214e2819b6..6fd4a3179b 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSSessionInstantiator.h @@ -1,65 +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 +// +// 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 index 2fd3515c88..fe8983d03d 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/HTTPSStreamFactory.h @@ -1,83 +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 +// +// 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 index e10faf3cdb..58194d9bec 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/InvalidCertificateHandler.h @@ -1,80 +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 +// +// 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 index d9483d78e0..dc14502a87 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyConsoleHandler.h @@ -1,47 +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 +// +// 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 index 274cdbff59..452205ac59 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/KeyFileHandler.h @@ -1,51 +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 +// +// 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 index ae793fde93..3c2afd745a 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/NetSSL.h @@ -1,94 +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 +// +// 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 index 9c0fa37faa..e2a5f0b54c 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactory.h @@ -1,95 +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 +// +// 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 index b29b37f46a..b4e8305e45 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyFactoryMgr.h @@ -1,64 +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 +// +// 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 index 726703f78f..1e1cf411f0 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/PrivateKeyPassphraseHandler.h @@ -1,84 +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 +// +// 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 index b170ad50b5..9b18ab4f8f 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/RejectCertificateHandler.h @@ -1,48 +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 +// +// 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 index 7b8dfe79d3..aa9bd9dd0c 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLException.h @@ -1,39 +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 +// +// 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 index 6d0f469295..cf5a61b321 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h @@ -1,390 +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 +// +// 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 index 146be2aeb5..71518046f2 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSMTPClientSession.h @@ -1,96 +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 +// +// 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 index 2b89c45cb9..d6bc23e496 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocket.h @@ -1,136 +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 +// +// 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 index 2cf969d099..8889ed5028 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureServerSocketImpl.h @@ -1,146 +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 +// +// 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 index 8d331a3a6d..5ff589d336 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureSocketImpl.h @@ -1,265 +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"). - +// +// 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. - + /// 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 +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 index 059be1bbee..e33a59391d 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocket.h @@ -1,272 +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 +// +// 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 index 3b000b4758..64d63bc018 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/SecureStreamSocketImpl.h @@ -1,303 +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. - +// +// 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&); - + 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 + 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 index cc9b2db746..a3dcf1c1bb 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Session.h @@ -1,79 +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. +// +// 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. /// - /// 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 + /// 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 index b1d0073cfa..bd58735572 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/Utility.h @@ -1,52 +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 +// +// 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 index 55ef897bb7..5606fc4f4b 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/VerificationErrorArgs.h @@ -1,108 +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 +// +// 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 index a810b29457..7c7eedaff6 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h +++ b/contrib/libs/poco/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h @@ -1,102 +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. +// +// 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. /// - /// 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 + /// 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 diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/AcceptCertificateHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/AcceptCertificateHandler.cpp index 84017f7c34..10d2c3e49f 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/AcceptCertificateHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/AcceptCertificateHandler.cpp @@ -1,38 +1,38 @@ -// -// AcceptCertificateHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: AcceptCertificateHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/AcceptCertificateHandler.h" - - -namespace Poco { -namespace Net { - - -AcceptCertificateHandler::AcceptCertificateHandler(bool server): InvalidCertificateHandler(server) -{ -} - - -AcceptCertificateHandler::~AcceptCertificateHandler() -{ -} - - -void AcceptCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) -{ - errorCert.setIgnoreError(true); -} - - -} } // namespace Poco::Net +// +// AcceptCertificateHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: AcceptCertificateHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/AcceptCertificateHandler.h" + + +namespace Poco { +namespace Net { + + +AcceptCertificateHandler::AcceptCertificateHandler(bool server): InvalidCertificateHandler(server) +{ +} + + +AcceptCertificateHandler::~AcceptCertificateHandler() +{ +} + + +void AcceptCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) +{ + errorCert.setIgnoreError(true); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactory.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactory.cpp index 8c517748be..320fe431e6 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactory.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactory.cpp @@ -1,44 +1,44 @@ -// -// CertificateHandlerFactory.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: CertificateHandlerFactory -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/CertificateHandlerFactory.h" -#include "Poco/Net/SSLManager.h" - - -namespace Poco { -namespace Net { - - -CertificateHandlerFactory::CertificateHandlerFactory() -{ -} - - -CertificateHandlerFactory::~CertificateHandlerFactory() -{ -} - - -CertificateHandlerFactoryRegistrar::CertificateHandlerFactoryRegistrar(const std::string& name, CertificateHandlerFactory* pFactory) -{ - SSLManager::instance().certificateHandlerFactoryMgr().setFactory(name, pFactory); -} - - -CertificateHandlerFactoryRegistrar::~CertificateHandlerFactoryRegistrar() -{ -} - - -} } // namespace Poco::Net +// +// CertificateHandlerFactory.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: CertificateHandlerFactory +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/CertificateHandlerFactory.h" +#include "Poco/Net/SSLManager.h" + + +namespace Poco { +namespace Net { + + +CertificateHandlerFactory::CertificateHandlerFactory() +{ +} + + +CertificateHandlerFactory::~CertificateHandlerFactory() +{ +} + + +CertificateHandlerFactoryRegistrar::CertificateHandlerFactoryRegistrar(const std::string& name, CertificateHandlerFactory* pFactory) +{ + SSLManager::instance().certificateHandlerFactoryMgr().setFactory(name, pFactory); +} + + +CertificateHandlerFactoryRegistrar::~CertificateHandlerFactoryRegistrar() +{ +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactoryMgr.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactoryMgr.cpp index a89bbea11f..5de448a076 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactoryMgr.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/CertificateHandlerFactoryMgr.cpp @@ -1,69 +1,69 @@ -// -// CertificateHandlerFactoryMgr.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: CertificateHandlerFactoryMgr -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/CertificateHandlerFactoryMgr.h" -#include "Poco/Net/ConsoleCertificateHandler.h" -#include "Poco/Net/AcceptCertificateHandler.h" -#include "Poco/Net/RejectCertificateHandler.h" - - -namespace Poco { -namespace Net { - - -CertificateHandlerFactoryMgr::CertificateHandlerFactoryMgr() -{ - setFactory("ConsoleCertificateHandler", new CertificateHandlerFactoryImpl<ConsoleCertificateHandler>()); - setFactory("AcceptCertificateHandler", new CertificateHandlerFactoryImpl<AcceptCertificateHandler>()); - setFactory("RejectCertificateHandler", new CertificateHandlerFactoryImpl<RejectCertificateHandler>()); -} - - -CertificateHandlerFactoryMgr::~CertificateHandlerFactoryMgr() -{ -} - - -void CertificateHandlerFactoryMgr::setFactory(const std::string& name, CertificateHandlerFactory* pFactory) -{ - bool success = _factories.insert(make_pair(name, Poco::SharedPtr<CertificateHandlerFactory>(pFactory))).second; - if (!success) - delete pFactory; - poco_assert(success); -} - - -bool CertificateHandlerFactoryMgr::hasFactory(const std::string& name) const -{ - return _factories.find(name) != _factories.end(); -} - - -const CertificateHandlerFactory* CertificateHandlerFactoryMgr::getFactory(const std::string& name) const -{ - FactoriesMap::const_iterator it = _factories.find(name); - if (it != _factories.end()) - return it->second; - else - return 0; -} - - -void CertificateHandlerFactoryMgr::removeFactory(const std::string& name) -{ - _factories.erase(name); -} - - -} } // namespace Poco::Net +// +// CertificateHandlerFactoryMgr.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: CertificateHandlerFactoryMgr +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/CertificateHandlerFactoryMgr.h" +#include "Poco/Net/ConsoleCertificateHandler.h" +#include "Poco/Net/AcceptCertificateHandler.h" +#include "Poco/Net/RejectCertificateHandler.h" + + +namespace Poco { +namespace Net { + + +CertificateHandlerFactoryMgr::CertificateHandlerFactoryMgr() +{ + setFactory("ConsoleCertificateHandler", new CertificateHandlerFactoryImpl<ConsoleCertificateHandler>()); + setFactory("AcceptCertificateHandler", new CertificateHandlerFactoryImpl<AcceptCertificateHandler>()); + setFactory("RejectCertificateHandler", new CertificateHandlerFactoryImpl<RejectCertificateHandler>()); +} + + +CertificateHandlerFactoryMgr::~CertificateHandlerFactoryMgr() +{ +} + + +void CertificateHandlerFactoryMgr::setFactory(const std::string& name, CertificateHandlerFactory* pFactory) +{ + bool success = _factories.insert(make_pair(name, Poco::SharedPtr<CertificateHandlerFactory>(pFactory))).second; + if (!success) + delete pFactory; + poco_assert(success); +} + + +bool CertificateHandlerFactoryMgr::hasFactory(const std::string& name) const +{ + return _factories.find(name) != _factories.end(); +} + + +const CertificateHandlerFactory* CertificateHandlerFactoryMgr::getFactory(const std::string& name) const +{ + FactoriesMap::const_iterator it = _factories.find(name); + if (it != _factories.end()) + return it->second; + else + return 0; +} + + +void CertificateHandlerFactoryMgr::removeFactory(const std::string& name) +{ + _factories.erase(name); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/ConsoleCertificateHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/ConsoleCertificateHandler.cpp index db64752e70..126d0772fc 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/ConsoleCertificateHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/ConsoleCertificateHandler.cpp @@ -1,53 +1,53 @@ -// -// ConsoleCertificateHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: ConsoleCertificateHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/ConsoleCertificateHandler.h" -#include <iostream> - - -namespace Poco { -namespace Net { - - -ConsoleCertificateHandler::ConsoleCertificateHandler(bool server): InvalidCertificateHandler(server) -{ -} - - -ConsoleCertificateHandler::~ConsoleCertificateHandler() -{ -} - - -void ConsoleCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) -{ - const X509Certificate& aCert = errorCert.certificate(); - std::cout << "\n"; - std::cout << "WARNING: Certificate verification failed\n"; - std::cout << "----------------------------------------\n"; - std::cout << "Issuer Name: " << aCert.issuerName() << "\n"; - std::cout << "Subject Name: " << aCert.subjectName() << "\n\n"; - std::cout << "The certificate yielded the error: " << errorCert.errorMessage() << "\n\n"; - std::cout << "The error occurred in the certificate chain at position " << errorCert.errorDepth() << "\n"; - std::cout << "Accept the certificate (y,n)? "; - char c = 0; - std::cin >> c; - if (c == 'y' || c == 'Y') - errorCert.setIgnoreError(true); - else - errorCert.setIgnoreError(false); -} - - -} } // namespace Poco::Net +// +// ConsoleCertificateHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: ConsoleCertificateHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/ConsoleCertificateHandler.h" +#include <iostream> + + +namespace Poco { +namespace Net { + + +ConsoleCertificateHandler::ConsoleCertificateHandler(bool server): InvalidCertificateHandler(server) +{ +} + + +ConsoleCertificateHandler::~ConsoleCertificateHandler() +{ +} + + +void ConsoleCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) +{ + const X509Certificate& aCert = errorCert.certificate(); + std::cout << "\n"; + std::cout << "WARNING: Certificate verification failed\n"; + std::cout << "----------------------------------------\n"; + std::cout << "Issuer Name: " << aCert.issuerName() << "\n"; + std::cout << "Subject Name: " << aCert.subjectName() << "\n\n"; + std::cout << "The certificate yielded the error: " << errorCert.errorMessage() << "\n\n"; + std::cout << "The error occurred in the certificate chain at position " << errorCert.errorDepth() << "\n"; + std::cout << "Accept the certificate (y,n)? "; + char c = 0; + std::cin >> c; + if (c == 'y' || c == 'Y') + errorCert.setIgnoreError(true); + else + errorCert.setIgnoreError(false); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/Context.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/Context.cpp index 2b16790ca4..80417c1006 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/Context.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/Context.cpp @@ -1,578 +1,578 @@ -// -// Context.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: Context -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/Context.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Net/SSLException.h" -#include "Poco/Net/Utility.h" -#include "Poco/Crypto/OpenSSLInitializer.h" -#include "Poco/File.h" -#include "Poco/Path.h" -#include "Poco/Timestamp.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/ssl.h> -#include <openssl/x509v3.h> - - -namespace Poco { -namespace Net { - - -Context::Params::Params(): - verificationMode(VERIFY_RELAXED), - verificationDepth(9), - loadDefaultCAs(false), - cipherList("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH") -{ -} - - -Context::Context(Usage usage, const Params& params): - _usage(usage), - _mode(params.verificationMode), - _pSSLContext(0), - _extendedCertificateVerification(true) -{ - init(params); -} - - -Context::Context( - Usage usage, - const std::string& privateKeyFile, - const std::string& certificateFile, - const std::string& caLocation, - VerificationMode verificationMode, - int verificationDepth, - bool loadDefaultCAs, - const std::string& cipherList): - _usage(usage), - _mode(verificationMode), - _pSSLContext(0), - _extendedCertificateVerification(true) -{ - Params params; - params.privateKeyFile = privateKeyFile; - params.certificateFile = certificateFile; - params.caLocation = caLocation; - params.verificationMode = verificationMode; - params.verificationDepth = verificationDepth; - params.loadDefaultCAs = loadDefaultCAs; - params.cipherList = cipherList; - init(params); -} - - -Context::Context( - Usage usage, - const std::string& caLocation, - VerificationMode verificationMode, - int verificationDepth, - bool loadDefaultCAs, - const std::string& cipherList): - _usage(usage), - _mode(verificationMode), - _pSSLContext(0), - _extendedCertificateVerification(true) -{ - Params params; - params.caLocation = caLocation; - params.verificationMode = verificationMode; - params.verificationDepth = verificationDepth; - params.loadDefaultCAs = loadDefaultCAs; - params.cipherList = cipherList; - init(params); -} - - -Context::~Context() -{ - try - { - SSL_CTX_free(_pSSLContext); - Poco::Crypto::OpenSSLInitializer::uninitialize(); - } - catch (...) - { - poco_unexpected(); - } -} - - -void Context::init(const Params& params) -{ - Poco::Crypto::OpenSSLInitializer::initialize(); - - createSSLContext(); - - try - { - int errCode = 0; - if (!params.caLocation.empty()) - { - Poco::File aFile(params.caLocation); - if (aFile.isDirectory()) - errCode = SSL_CTX_load_verify_locations(_pSSLContext, 0, Poco::Path::transcode(params.caLocation).c_str()); - else - errCode = SSL_CTX_load_verify_locations(_pSSLContext, Poco::Path::transcode(params.caLocation).c_str(), 0); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException(std::string("Cannot load CA file/directory at ") + params.caLocation, msg); - } - } - - if (params.loadDefaultCAs) - { - errCode = SSL_CTX_set_default_verify_paths(_pSSLContext); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot load default CA certificates", msg); - } - } - - if (!params.privateKeyFile.empty()) - { - errCode = SSL_CTX_use_PrivateKey_file(_pSSLContext, Poco::Path::transcode(params.privateKeyFile).c_str(), SSL_FILETYPE_PEM); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException(std::string("Error loading private key from file ") + params.privateKeyFile, msg); - } - } - - if (!params.certificateFile.empty()) - { - errCode = SSL_CTX_use_certificate_chain_file(_pSSLContext, Poco::Path::transcode(params.certificateFile).c_str()); - if (errCode != 1) - { - std::string errMsg = Utility::getLastError(); - throw SSLContextException(std::string("Error loading certificate from file ") + params.certificateFile, errMsg); - } - } - - if (isForServerUse()) - SSL_CTX_set_verify(_pSSLContext, params.verificationMode, &SSLManager::verifyServerCallback); - else - SSL_CTX_set_verify(_pSSLContext, params.verificationMode, &SSLManager::verifyClientCallback); - - SSL_CTX_set_cipher_list(_pSSLContext, params.cipherList.c_str()); - SSL_CTX_set_verify_depth(_pSSLContext, params.verificationDepth); - SSL_CTX_set_mode(_pSSLContext, SSL_MODE_AUTO_RETRY); - SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); - - initDH(params.dhParamsFile); - initECDH(params.ecdhCurve); - } - catch (...) - { - SSL_CTX_free(_pSSLContext); - throw; - } -} - - -void Context::useCertificate(const Poco::Crypto::X509Certificate& certificate) -{ - int errCode = SSL_CTX_use_certificate(_pSSLContext, const_cast<X509*>(certificate.certificate())); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot set certificate for Context", msg); - } -} - - -void Context::addChainCertificate(const Poco::Crypto::X509Certificate& certificate) -{ - X509* pCert = certificate.dup(); - int errCode = SSL_CTX_add_extra_chain_cert(_pSSLContext, pCert); - if (errCode != 1) - { - X509_free(pCert); - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot add chain certificate to Context", msg); - } -} - - -void Context::addCertificateAuthority(const Crypto::X509Certificate &certificate) -{ - if (X509_STORE* store = SSL_CTX_get_cert_store(_pSSLContext)) - { - int errCode = X509_STORE_add_cert(store, const_cast<X509*>(certificate.certificate())); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot add certificate authority to Context", msg); - } - } - else - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot add certificate authority to Context", msg); - } -} - - -void Context::usePrivateKey(const Poco::Crypto::RSAKey& key) -{ - int errCode = SSL_CTX_use_RSAPrivateKey(_pSSLContext, key.impl()->getRSA()); - if (errCode != 1) - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Cannot set private key for Context", msg); - } -} - - -void Context::enableSessionCache(bool flag) -{ - if (flag) - { - SSL_CTX_set_session_cache_mode(_pSSLContext, isForServerUse() ? SSL_SESS_CACHE_SERVER : SSL_SESS_CACHE_CLIENT); - } - else - { - SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); - } -} - - -void Context::enableSessionCache(bool flag, const std::string& sessionIdContext) -{ - poco_assert (isForServerUse()); - - if (flag) - { - SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_SERVER); - } - else - { - SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); - } - - unsigned length = static_cast<unsigned>(sessionIdContext.length()); - if (length > SSL_MAX_SSL_SESSION_ID_LENGTH) length = SSL_MAX_SSL_SESSION_ID_LENGTH; - int rc = SSL_CTX_set_session_id_context(_pSSLContext, reinterpret_cast<const unsigned char*>(sessionIdContext.data()), length); - if (rc != 1) throw SSLContextException("cannot set session ID context"); -} - - -bool Context::sessionCacheEnabled() const -{ - return SSL_CTX_get_session_cache_mode(_pSSLContext) != SSL_SESS_CACHE_OFF; -} - - -void Context::setSessionCacheSize(std::size_t size) -{ - poco_assert (isForServerUse()); - - SSL_CTX_sess_set_cache_size(_pSSLContext, static_cast<long>(size)); -} - - -std::size_t Context::getSessionCacheSize() const -{ - poco_assert (isForServerUse()); - - return static_cast<std::size_t>(SSL_CTX_sess_get_cache_size(_pSSLContext)); -} - - -void Context::setSessionTimeout(long seconds) -{ - poco_assert (isForServerUse()); - - SSL_CTX_set_timeout(_pSSLContext, seconds); -} - - -long Context::getSessionTimeout() const -{ - poco_assert (isForServerUse()); - - return SSL_CTX_get_timeout(_pSSLContext); -} - - -void Context::flushSessionCache() -{ - poco_assert (isForServerUse()); - - Poco::Timestamp now; - SSL_CTX_flush_sessions(_pSSLContext, static_cast<long>(now.epochTime())); -} - - -void Context::enableExtendedCertificateVerification(bool flag) -{ - _extendedCertificateVerification = flag; -} - - -void Context::disableStatelessSessionResumption() -{ -#if defined(SSL_OP_NO_TICKET) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TICKET); -#endif -} - - -void Context::disableProtocols(int protocols) -{ - if (protocols & PROTO_SSLV2) - { -#if defined(SSL_OP_NO_SSLv2) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv2); -#endif - } - if (protocols & PROTO_SSLV3) - { -#if defined(SSL_OP_NO_SSLv3) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv3); -#endif - } - if (protocols & PROTO_TLSV1) - { -#if defined(SSL_OP_NO_TLSv1) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1); -#endif - } - if (protocols & PROTO_TLSV1_1) - { -#if defined(SSL_OP_NO_TLSv1_1) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_1); -#endif - } - if (protocols & PROTO_TLSV1_2) - { -#if defined(SSL_OP_NO_TLSv1_2) - SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_2); -#endif - } -} - - -void Context::preferServerCiphers() -{ -#if defined(SSL_OP_CIPHER_SERVER_PREFERENCE) - SSL_CTX_set_options(_pSSLContext, SSL_OP_CIPHER_SERVER_PREFERENCE); -#endif -} - - -void Context::createSSLContext() -{ - if (SSLManager::isFIPSEnabled()) - { - _pSSLContext = SSL_CTX_new(TLSv1_method()); - } - else - { - switch (_usage) - { - case CLIENT_USE: -#if OPENSSL_VERSION_NUMBER >= 0x10100000L - _pSSLContext = SSL_CTX_new(TLS_client_method()); -#else - _pSSLContext = SSL_CTX_new(SSLv23_client_method()); -#endif - break; - case SERVER_USE: -#if OPENSSL_VERSION_NUMBER >= 0x10100000L - _pSSLContext = SSL_CTX_new(TLS_server_method()); -#else - _pSSLContext = SSL_CTX_new(SSLv23_server_method()); -#endif - break; -#if defined(SSL_OP_NO_TLSv1) && !defined(OPENSSL_NO_TLS1) - case TLSV1_CLIENT_USE: - _pSSLContext = SSL_CTX_new(TLSv1_client_method()); - break; - case TLSV1_SERVER_USE: - _pSSLContext = SSL_CTX_new(TLSv1_server_method()); - break; -#endif -#if defined(SSL_OP_NO_TLSv1_1) && !defined(OPENSSL_NO_TLS1) -/* SSL_OP_NO_TLSv1_1 is defined in ssl.h if the library version supports TLSv1.1. - * OPENSSL_NO_TLS1 is defined in opensslconf.h or on the compiler command line - * if TLS1.x was removed at OpenSSL library build time via Configure options. - */ - case TLSV1_1_CLIENT_USE: - _pSSLContext = SSL_CTX_new(TLSv1_1_client_method()); - break; - case TLSV1_1_SERVER_USE: - _pSSLContext = SSL_CTX_new(TLSv1_1_server_method()); - break; -#endif -#if defined(SSL_OP_NO_TLSv1_2) && !defined(OPENSSL_NO_TLS1) - case TLSV1_2_CLIENT_USE: - _pSSLContext = SSL_CTX_new(TLSv1_2_client_method()); - break; - case TLSV1_2_SERVER_USE: - _pSSLContext = SSL_CTX_new(TLSv1_2_server_method()); - break; -#endif - default: - throw Poco::InvalidArgumentException("Invalid or unsupported usage"); - } - } - if (!_pSSLContext) - { - unsigned long err = ERR_get_error(); - throw SSLException("Cannot create SSL_CTX object", ERR_error_string(err, 0)); - } - - SSL_CTX_set_default_passwd_cb(_pSSLContext, &SSLManager::privateKeyPassphraseCallback); - Utility::clearErrorStack(); - SSL_CTX_set_options(_pSSLContext, SSL_OP_ALL); -} - - -void Context::initDH(const std::string& dhParamsFile) -{ -#ifndef OPENSSL_NO_DH - // 1024-bit MODP Group with 160-bit prime order subgroup (RFC5114) - // -----BEGIN DH PARAMETERS----- - // MIIBDAKBgQCxC4+WoIDgHd6S3l6uXVTsUsmfvPsGo8aaap3KUtI7YWBz4oZ1oj0Y - // mDjvHi7mUsAT7LSuqQYRIySXXDzUm4O/rMvdfZDEvXCYSI6cIZpzck7/1vrlZEc4 - // +qMaT/VbzMChUa9fDci0vUW/N982XBpl5oz9p21NpwjfH7K8LkpDcQKBgQCk0cvV - // w/00EmdlpELvuZkF+BBN0lisUH/WQGz/FCZtMSZv6h5cQVZLd35pD1UE8hMWAhe0 - // sBuIal6RVH+eJ0n01/vX07mpLuGQnQ0iY/gKdqaiTAh6CR9THb8KAWm2oorWYqTR - // jnOvoy13nVkY0IvIhY9Nzvl8KiSFXm7rIrOy5QICAKA= - // -----END DH PARAMETERS----- - // - - static const unsigned char dh1024_p[] = - { - 0xB1,0x0B,0x8F,0x96,0xA0,0x80,0xE0,0x1D,0xDE,0x92,0xDE,0x5E, - 0xAE,0x5D,0x54,0xEC,0x52,0xC9,0x9F,0xBC,0xFB,0x06,0xA3,0xC6, - 0x9A,0x6A,0x9D,0xCA,0x52,0xD2,0x3B,0x61,0x60,0x73,0xE2,0x86, - 0x75,0xA2,0x3D,0x18,0x98,0x38,0xEF,0x1E,0x2E,0xE6,0x52,0xC0, - 0x13,0xEC,0xB4,0xAE,0xA9,0x06,0x11,0x23,0x24,0x97,0x5C,0x3C, - 0xD4,0x9B,0x83,0xBF,0xAC,0xCB,0xDD,0x7D,0x90,0xC4,0xBD,0x70, - 0x98,0x48,0x8E,0x9C,0x21,0x9A,0x73,0x72,0x4E,0xFF,0xD6,0xFA, - 0xE5,0x64,0x47,0x38,0xFA,0xA3,0x1A,0x4F,0xF5,0x5B,0xCC,0xC0, - 0xA1,0x51,0xAF,0x5F,0x0D,0xC8,0xB4,0xBD,0x45,0xBF,0x37,0xDF, - 0x36,0x5C,0x1A,0x65,0xE6,0x8C,0xFD,0xA7,0x6D,0x4D,0xA7,0x08, - 0xDF,0x1F,0xB2,0xBC,0x2E,0x4A,0x43,0x71, - }; - - static const unsigned char dh1024_g[] = - { - 0xA4,0xD1,0xCB,0xD5,0xC3,0xFD,0x34,0x12,0x67,0x65,0xA4,0x42, - 0xEF,0xB9,0x99,0x05,0xF8,0x10,0x4D,0xD2,0x58,0xAC,0x50,0x7F, - 0xD6,0x40,0x6C,0xFF,0x14,0x26,0x6D,0x31,0x26,0x6F,0xEA,0x1E, - 0x5C,0x41,0x56,0x4B,0x77,0x7E,0x69,0x0F,0x55,0x04,0xF2,0x13, - 0x16,0x02,0x17,0xB4,0xB0,0x1B,0x88,0x6A,0x5E,0x91,0x54,0x7F, - 0x9E,0x27,0x49,0xF4,0xD7,0xFB,0xD7,0xD3,0xB9,0xA9,0x2E,0xE1, - 0x90,0x9D,0x0D,0x22,0x63,0xF8,0x0A,0x76,0xA6,0xA2,0x4C,0x08, - 0x7A,0x09,0x1F,0x53,0x1D,0xBF,0x0A,0x01,0x69,0xB6,0xA2,0x8A, - 0xD6,0x62,0xA4,0xD1,0x8E,0x73,0xAF,0xA3,0x2D,0x77,0x9D,0x59, - 0x18,0xD0,0x8B,0xC8,0x85,0x8F,0x4D,0xCE,0xF9,0x7C,0x2A,0x24, - 0x85,0x5E,0x6E,0xEB,0x22,0xB3,0xB2,0xE5, - }; - - DH* dh = 0; - if (!dhParamsFile.empty()) - { - BIO* bio = BIO_new_file(dhParamsFile.c_str(), "r"); - if (!bio) - { - std::string msg = Utility::getLastError(); - throw SSLContextException(std::string("Error opening Diffie-Hellman parameters file ") + dhParamsFile, msg); - } - dh = PEM_read_bio_DHparams(bio, 0, 0, 0); - BIO_free(bio); - if (!dh) - { - std::string msg = Utility::getLastError(); - throw SSLContextException(std::string("Error reading Diffie-Hellman parameters from file ") + dhParamsFile, msg); - } - } - else - { - dh = DH_new(); - if (!dh) - { - std::string msg = Utility::getLastError(); - throw SSLContextException("Error creating Diffie-Hellman parameters", msg); - } -#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) - BIGNUM* p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), 0); - BIGNUM* g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), 0); - DH_set0_pqg(dh, p, 0, g); - DH_set_length(dh, 160); - if (!p || !g) - { - DH_free(dh); - throw SSLContextException("Error creating Diffie-Hellman parameters"); - } -#else - dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), 0); - dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), 0); - dh->length = 160; - if ((!dh->p) || (!dh->g)) - { - DH_free(dh); - throw SSLContextException("Error creating Diffie-Hellman parameters"); - } -#endif - } - SSL_CTX_set_tmp_dh(_pSSLContext, dh); - SSL_CTX_set_options(_pSSLContext, SSL_OP_SINGLE_DH_USE); - DH_free(dh); -#else - if (!dhParamsFile.empty()) - throw SSLContextException("OpenSSL does not support DH"); -#endif -} - - -void Context::initECDH(const std::string& curve) -{ -#if OPENSSL_VERSION_NUMBER >= 0x0090800fL -#ifndef OPENSSL_NO_ECDH - int nid = 0; - if (!curve.empty()) - { - nid = OBJ_sn2nid(curve.c_str()); - } - else - { - nid = OBJ_sn2nid("prime256v1"); - } - if (nid == 0) - { - throw SSLContextException("Unknown ECDH curve name", curve); - } - - EC_KEY* ecdh = EC_KEY_new_by_curve_name(nid); - if (!ecdh) - { - throw SSLContextException("Cannot create ECDH curve"); - } - SSL_CTX_set_tmp_ecdh(_pSSLContext, ecdh); - SSL_CTX_set_options(_pSSLContext, SSL_OP_SINGLE_ECDH_USE); - EC_KEY_free(ecdh); -#endif -#endif -} - - -} } // namespace Poco::Net +// +// Context.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: Context +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/Context.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Net/SSLException.h" +#include "Poco/Net/Utility.h" +#include "Poco/Crypto/OpenSSLInitializer.h" +#include "Poco/File.h" +#include "Poco/Path.h" +#include "Poco/Timestamp.h" +#include <openssl/bio.h> +#include <openssl/err.h> +#include <openssl/ssl.h> +#include <openssl/x509v3.h> + + +namespace Poco { +namespace Net { + + +Context::Params::Params(): + verificationMode(VERIFY_RELAXED), + verificationDepth(9), + loadDefaultCAs(false), + cipherList("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH") +{ +} + + +Context::Context(Usage usage, const Params& params): + _usage(usage), + _mode(params.verificationMode), + _pSSLContext(0), + _extendedCertificateVerification(true) +{ + init(params); +} + + +Context::Context( + Usage usage, + const std::string& privateKeyFile, + const std::string& certificateFile, + const std::string& caLocation, + VerificationMode verificationMode, + int verificationDepth, + bool loadDefaultCAs, + const std::string& cipherList): + _usage(usage), + _mode(verificationMode), + _pSSLContext(0), + _extendedCertificateVerification(true) +{ + Params params; + params.privateKeyFile = privateKeyFile; + params.certificateFile = certificateFile; + params.caLocation = caLocation; + params.verificationMode = verificationMode; + params.verificationDepth = verificationDepth; + params.loadDefaultCAs = loadDefaultCAs; + params.cipherList = cipherList; + init(params); +} + + +Context::Context( + Usage usage, + const std::string& caLocation, + VerificationMode verificationMode, + int verificationDepth, + bool loadDefaultCAs, + const std::string& cipherList): + _usage(usage), + _mode(verificationMode), + _pSSLContext(0), + _extendedCertificateVerification(true) +{ + Params params; + params.caLocation = caLocation; + params.verificationMode = verificationMode; + params.verificationDepth = verificationDepth; + params.loadDefaultCAs = loadDefaultCAs; + params.cipherList = cipherList; + init(params); +} + + +Context::~Context() +{ + try + { + SSL_CTX_free(_pSSLContext); + Poco::Crypto::OpenSSLInitializer::uninitialize(); + } + catch (...) + { + poco_unexpected(); + } +} + + +void Context::init(const Params& params) +{ + Poco::Crypto::OpenSSLInitializer::initialize(); + + createSSLContext(); + + try + { + int errCode = 0; + if (!params.caLocation.empty()) + { + Poco::File aFile(params.caLocation); + if (aFile.isDirectory()) + errCode = SSL_CTX_load_verify_locations(_pSSLContext, 0, Poco::Path::transcode(params.caLocation).c_str()); + else + errCode = SSL_CTX_load_verify_locations(_pSSLContext, Poco::Path::transcode(params.caLocation).c_str(), 0); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException(std::string("Cannot load CA file/directory at ") + params.caLocation, msg); + } + } + + if (params.loadDefaultCAs) + { + errCode = SSL_CTX_set_default_verify_paths(_pSSLContext); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot load default CA certificates", msg); + } + } + + if (!params.privateKeyFile.empty()) + { + errCode = SSL_CTX_use_PrivateKey_file(_pSSLContext, Poco::Path::transcode(params.privateKeyFile).c_str(), SSL_FILETYPE_PEM); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException(std::string("Error loading private key from file ") + params.privateKeyFile, msg); + } + } + + if (!params.certificateFile.empty()) + { + errCode = SSL_CTX_use_certificate_chain_file(_pSSLContext, Poco::Path::transcode(params.certificateFile).c_str()); + if (errCode != 1) + { + std::string errMsg = Utility::getLastError(); + throw SSLContextException(std::string("Error loading certificate from file ") + params.certificateFile, errMsg); + } + } + + if (isForServerUse()) + SSL_CTX_set_verify(_pSSLContext, params.verificationMode, &SSLManager::verifyServerCallback); + else + SSL_CTX_set_verify(_pSSLContext, params.verificationMode, &SSLManager::verifyClientCallback); + + SSL_CTX_set_cipher_list(_pSSLContext, params.cipherList.c_str()); + SSL_CTX_set_verify_depth(_pSSLContext, params.verificationDepth); + SSL_CTX_set_mode(_pSSLContext, SSL_MODE_AUTO_RETRY); + SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); + + initDH(params.dhParamsFile); + initECDH(params.ecdhCurve); + } + catch (...) + { + SSL_CTX_free(_pSSLContext); + throw; + } +} + + +void Context::useCertificate(const Poco::Crypto::X509Certificate& certificate) +{ + int errCode = SSL_CTX_use_certificate(_pSSLContext, const_cast<X509*>(certificate.certificate())); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot set certificate for Context", msg); + } +} + + +void Context::addChainCertificate(const Poco::Crypto::X509Certificate& certificate) +{ + X509* pCert = certificate.dup(); + int errCode = SSL_CTX_add_extra_chain_cert(_pSSLContext, pCert); + if (errCode != 1) + { + X509_free(pCert); + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot add chain certificate to Context", msg); + } +} + + +void Context::addCertificateAuthority(const Crypto::X509Certificate &certificate) +{ + if (X509_STORE* store = SSL_CTX_get_cert_store(_pSSLContext)) + { + int errCode = X509_STORE_add_cert(store, const_cast<X509*>(certificate.certificate())); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot add certificate authority to Context", msg); + } + } + else + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot add certificate authority to Context", msg); + } +} + + +void Context::usePrivateKey(const Poco::Crypto::RSAKey& key) +{ + int errCode = SSL_CTX_use_RSAPrivateKey(_pSSLContext, key.impl()->getRSA()); + if (errCode != 1) + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Cannot set private key for Context", msg); + } +} + + +void Context::enableSessionCache(bool flag) +{ + if (flag) + { + SSL_CTX_set_session_cache_mode(_pSSLContext, isForServerUse() ? SSL_SESS_CACHE_SERVER : SSL_SESS_CACHE_CLIENT); + } + else + { + SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); + } +} + + +void Context::enableSessionCache(bool flag, const std::string& sessionIdContext) +{ + poco_assert (isForServerUse()); + + if (flag) + { + SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_SERVER); + } + else + { + SSL_CTX_set_session_cache_mode(_pSSLContext, SSL_SESS_CACHE_OFF); + } + + unsigned length = static_cast<unsigned>(sessionIdContext.length()); + if (length > SSL_MAX_SSL_SESSION_ID_LENGTH) length = SSL_MAX_SSL_SESSION_ID_LENGTH; + int rc = SSL_CTX_set_session_id_context(_pSSLContext, reinterpret_cast<const unsigned char*>(sessionIdContext.data()), length); + if (rc != 1) throw SSLContextException("cannot set session ID context"); +} + + +bool Context::sessionCacheEnabled() const +{ + return SSL_CTX_get_session_cache_mode(_pSSLContext) != SSL_SESS_CACHE_OFF; +} + + +void Context::setSessionCacheSize(std::size_t size) +{ + poco_assert (isForServerUse()); + + SSL_CTX_sess_set_cache_size(_pSSLContext, static_cast<long>(size)); +} + + +std::size_t Context::getSessionCacheSize() const +{ + poco_assert (isForServerUse()); + + return static_cast<std::size_t>(SSL_CTX_sess_get_cache_size(_pSSLContext)); +} + + +void Context::setSessionTimeout(long seconds) +{ + poco_assert (isForServerUse()); + + SSL_CTX_set_timeout(_pSSLContext, seconds); +} + + +long Context::getSessionTimeout() const +{ + poco_assert (isForServerUse()); + + return SSL_CTX_get_timeout(_pSSLContext); +} + + +void Context::flushSessionCache() +{ + poco_assert (isForServerUse()); + + Poco::Timestamp now; + SSL_CTX_flush_sessions(_pSSLContext, static_cast<long>(now.epochTime())); +} + + +void Context::enableExtendedCertificateVerification(bool flag) +{ + _extendedCertificateVerification = flag; +} + + +void Context::disableStatelessSessionResumption() +{ +#if defined(SSL_OP_NO_TICKET) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TICKET); +#endif +} + + +void Context::disableProtocols(int protocols) +{ + if (protocols & PROTO_SSLV2) + { +#if defined(SSL_OP_NO_SSLv2) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv2); +#endif + } + if (protocols & PROTO_SSLV3) + { +#if defined(SSL_OP_NO_SSLv3) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv3); +#endif + } + if (protocols & PROTO_TLSV1) + { +#if defined(SSL_OP_NO_TLSv1) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1); +#endif + } + if (protocols & PROTO_TLSV1_1) + { +#if defined(SSL_OP_NO_TLSv1_1) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_1); +#endif + } + if (protocols & PROTO_TLSV1_2) + { +#if defined(SSL_OP_NO_TLSv1_2) + SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_2); +#endif + } +} + + +void Context::preferServerCiphers() +{ +#if defined(SSL_OP_CIPHER_SERVER_PREFERENCE) + SSL_CTX_set_options(_pSSLContext, SSL_OP_CIPHER_SERVER_PREFERENCE); +#endif +} + + +void Context::createSSLContext() +{ + if (SSLManager::isFIPSEnabled()) + { + _pSSLContext = SSL_CTX_new(TLSv1_method()); + } + else + { + switch (_usage) + { + case CLIENT_USE: +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + _pSSLContext = SSL_CTX_new(TLS_client_method()); +#else + _pSSLContext = SSL_CTX_new(SSLv23_client_method()); +#endif + break; + case SERVER_USE: +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + _pSSLContext = SSL_CTX_new(TLS_server_method()); +#else + _pSSLContext = SSL_CTX_new(SSLv23_server_method()); +#endif + break; +#if defined(SSL_OP_NO_TLSv1) && !defined(OPENSSL_NO_TLS1) + case TLSV1_CLIENT_USE: + _pSSLContext = SSL_CTX_new(TLSv1_client_method()); + break; + case TLSV1_SERVER_USE: + _pSSLContext = SSL_CTX_new(TLSv1_server_method()); + break; +#endif +#if defined(SSL_OP_NO_TLSv1_1) && !defined(OPENSSL_NO_TLS1) +/* SSL_OP_NO_TLSv1_1 is defined in ssl.h if the library version supports TLSv1.1. + * OPENSSL_NO_TLS1 is defined in opensslconf.h or on the compiler command line + * if TLS1.x was removed at OpenSSL library build time via Configure options. + */ + case TLSV1_1_CLIENT_USE: + _pSSLContext = SSL_CTX_new(TLSv1_1_client_method()); + break; + case TLSV1_1_SERVER_USE: + _pSSLContext = SSL_CTX_new(TLSv1_1_server_method()); + break; +#endif +#if defined(SSL_OP_NO_TLSv1_2) && !defined(OPENSSL_NO_TLS1) + case TLSV1_2_CLIENT_USE: + _pSSLContext = SSL_CTX_new(TLSv1_2_client_method()); + break; + case TLSV1_2_SERVER_USE: + _pSSLContext = SSL_CTX_new(TLSv1_2_server_method()); + break; +#endif + default: + throw Poco::InvalidArgumentException("Invalid or unsupported usage"); + } + } + if (!_pSSLContext) + { + unsigned long err = ERR_get_error(); + throw SSLException("Cannot create SSL_CTX object", ERR_error_string(err, 0)); + } + + SSL_CTX_set_default_passwd_cb(_pSSLContext, &SSLManager::privateKeyPassphraseCallback); + Utility::clearErrorStack(); + SSL_CTX_set_options(_pSSLContext, SSL_OP_ALL); +} + + +void Context::initDH(const std::string& dhParamsFile) +{ +#ifndef OPENSSL_NO_DH + // 1024-bit MODP Group with 160-bit prime order subgroup (RFC5114) + // -----BEGIN DH PARAMETERS----- + // MIIBDAKBgQCxC4+WoIDgHd6S3l6uXVTsUsmfvPsGo8aaap3KUtI7YWBz4oZ1oj0Y + // mDjvHi7mUsAT7LSuqQYRIySXXDzUm4O/rMvdfZDEvXCYSI6cIZpzck7/1vrlZEc4 + // +qMaT/VbzMChUa9fDci0vUW/N982XBpl5oz9p21NpwjfH7K8LkpDcQKBgQCk0cvV + // w/00EmdlpELvuZkF+BBN0lisUH/WQGz/FCZtMSZv6h5cQVZLd35pD1UE8hMWAhe0 + // sBuIal6RVH+eJ0n01/vX07mpLuGQnQ0iY/gKdqaiTAh6CR9THb8KAWm2oorWYqTR + // jnOvoy13nVkY0IvIhY9Nzvl8KiSFXm7rIrOy5QICAKA= + // -----END DH PARAMETERS----- + // + + static const unsigned char dh1024_p[] = + { + 0xB1,0x0B,0x8F,0x96,0xA0,0x80,0xE0,0x1D,0xDE,0x92,0xDE,0x5E, + 0xAE,0x5D,0x54,0xEC,0x52,0xC9,0x9F,0xBC,0xFB,0x06,0xA3,0xC6, + 0x9A,0x6A,0x9D,0xCA,0x52,0xD2,0x3B,0x61,0x60,0x73,0xE2,0x86, + 0x75,0xA2,0x3D,0x18,0x98,0x38,0xEF,0x1E,0x2E,0xE6,0x52,0xC0, + 0x13,0xEC,0xB4,0xAE,0xA9,0x06,0x11,0x23,0x24,0x97,0x5C,0x3C, + 0xD4,0x9B,0x83,0xBF,0xAC,0xCB,0xDD,0x7D,0x90,0xC4,0xBD,0x70, + 0x98,0x48,0x8E,0x9C,0x21,0x9A,0x73,0x72,0x4E,0xFF,0xD6,0xFA, + 0xE5,0x64,0x47,0x38,0xFA,0xA3,0x1A,0x4F,0xF5,0x5B,0xCC,0xC0, + 0xA1,0x51,0xAF,0x5F,0x0D,0xC8,0xB4,0xBD,0x45,0xBF,0x37,0xDF, + 0x36,0x5C,0x1A,0x65,0xE6,0x8C,0xFD,0xA7,0x6D,0x4D,0xA7,0x08, + 0xDF,0x1F,0xB2,0xBC,0x2E,0x4A,0x43,0x71, + }; + + static const unsigned char dh1024_g[] = + { + 0xA4,0xD1,0xCB,0xD5,0xC3,0xFD,0x34,0x12,0x67,0x65,0xA4,0x42, + 0xEF,0xB9,0x99,0x05,0xF8,0x10,0x4D,0xD2,0x58,0xAC,0x50,0x7F, + 0xD6,0x40,0x6C,0xFF,0x14,0x26,0x6D,0x31,0x26,0x6F,0xEA,0x1E, + 0x5C,0x41,0x56,0x4B,0x77,0x7E,0x69,0x0F,0x55,0x04,0xF2,0x13, + 0x16,0x02,0x17,0xB4,0xB0,0x1B,0x88,0x6A,0x5E,0x91,0x54,0x7F, + 0x9E,0x27,0x49,0xF4,0xD7,0xFB,0xD7,0xD3,0xB9,0xA9,0x2E,0xE1, + 0x90,0x9D,0x0D,0x22,0x63,0xF8,0x0A,0x76,0xA6,0xA2,0x4C,0x08, + 0x7A,0x09,0x1F,0x53,0x1D,0xBF,0x0A,0x01,0x69,0xB6,0xA2,0x8A, + 0xD6,0x62,0xA4,0xD1,0x8E,0x73,0xAF,0xA3,0x2D,0x77,0x9D,0x59, + 0x18,0xD0,0x8B,0xC8,0x85,0x8F,0x4D,0xCE,0xF9,0x7C,0x2A,0x24, + 0x85,0x5E,0x6E,0xEB,0x22,0xB3,0xB2,0xE5, + }; + + DH* dh = 0; + if (!dhParamsFile.empty()) + { + BIO* bio = BIO_new_file(dhParamsFile.c_str(), "r"); + if (!bio) + { + std::string msg = Utility::getLastError(); + throw SSLContextException(std::string("Error opening Diffie-Hellman parameters file ") + dhParamsFile, msg); + } + dh = PEM_read_bio_DHparams(bio, 0, 0, 0); + BIO_free(bio); + if (!dh) + { + std::string msg = Utility::getLastError(); + throw SSLContextException(std::string("Error reading Diffie-Hellman parameters from file ") + dhParamsFile, msg); + } + } + else + { + dh = DH_new(); + if (!dh) + { + std::string msg = Utility::getLastError(); + throw SSLContextException("Error creating Diffie-Hellman parameters", msg); + } +#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) + BIGNUM* p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), 0); + BIGNUM* g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), 0); + DH_set0_pqg(dh, p, 0, g); + DH_set_length(dh, 160); + if (!p || !g) + { + DH_free(dh); + throw SSLContextException("Error creating Diffie-Hellman parameters"); + } +#else + dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), 0); + dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), 0); + dh->length = 160; + if ((!dh->p) || (!dh->g)) + { + DH_free(dh); + throw SSLContextException("Error creating Diffie-Hellman parameters"); + } +#endif + } + SSL_CTX_set_tmp_dh(_pSSLContext, dh); + SSL_CTX_set_options(_pSSLContext, SSL_OP_SINGLE_DH_USE); + DH_free(dh); +#else + if (!dhParamsFile.empty()) + throw SSLContextException("OpenSSL does not support DH"); +#endif +} + + +void Context::initECDH(const std::string& curve) +{ +#if OPENSSL_VERSION_NUMBER >= 0x0090800fL +#ifndef OPENSSL_NO_ECDH + int nid = 0; + if (!curve.empty()) + { + nid = OBJ_sn2nid(curve.c_str()); + } + else + { + nid = OBJ_sn2nid("prime256v1"); + } + if (nid == 0) + { + throw SSLContextException("Unknown ECDH curve name", curve); + } + + EC_KEY* ecdh = EC_KEY_new_by_curve_name(nid); + if (!ecdh) + { + throw SSLContextException("Cannot create ECDH curve"); + } + SSL_CTX_set_tmp_ecdh(_pSSLContext, ecdh); + SSL_CTX_set_options(_pSSLContext, SSL_OP_SINGLE_ECDH_USE); + EC_KEY_free(ecdh); +#endif +#endif +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSClientSession.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSClientSession.cpp index 325f36a60a..d8ffcc17b7 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSClientSession.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSClientSession.cpp @@ -1,189 +1,189 @@ -// -// HTTPSClientSession.cpp -// -// Library: NetSSL_OpenSSL -// Package: HTTPSClient -// Module: HTTPSClientSession -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/HTTPSClientSession.h" -#include "Poco/Net/SecureStreamSocket.h" -#include "Poco/Net/SecureStreamSocketImpl.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Net/SSLException.h" -#include "Poco/Net/HTTPRequest.h" -#include "Poco/Net/HTTPResponse.h" -#include "Poco/Net/NetException.h" -#include "Poco/NumberFormatter.h" - - -using Poco::NumberFormatter; -using Poco::IllegalStateException; - - -namespace Poco { -namespace Net { - - -HTTPSClientSession::HTTPSClientSession(): - HTTPClientSession(SecureStreamSocket()), - _pContext(SSLManager::instance().defaultClientContext()) -{ - setPort(HTTPS_PORT); -} - - -HTTPSClientSession::HTTPSClientSession(const SecureStreamSocket& socket): - HTTPClientSession(socket), - _pContext(socket.context()) -{ - setPort(HTTPS_PORT); -} - - -HTTPSClientSession::HTTPSClientSession(const SecureStreamSocket& socket, Session::Ptr pSession): - HTTPClientSession(socket), - _pContext(socket.context()), - _pSession(pSession) -{ - setPort(HTTPS_PORT); -} - - -HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port): - HTTPClientSession(SecureStreamSocket()), - _pContext(SSLManager::instance().defaultClientContext()) -{ - setHost(host); - setPort(port); -} - - -HTTPSClientSession::HTTPSClientSession(Context::Ptr pContext): - HTTPClientSession(SecureStreamSocket(pContext)), - _pContext(pContext) -{ -} - - -HTTPSClientSession::HTTPSClientSession(Context::Ptr pContext, Session::Ptr pSession): - HTTPClientSession(SecureStreamSocket(pContext, pSession)), - _pContext(pContext), - _pSession(pSession) -{ -} - - -HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext): - HTTPClientSession(SecureStreamSocket(pContext)), - _pContext(pContext) -{ - setHost(host); - setPort(port); -} - - -HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext, Session::Ptr pSession): - HTTPClientSession(SecureStreamSocket(pContext, pSession)), - _pContext(pContext), - _pSession(pSession) -{ - setHost(host); - setPort(port); -} - - -HTTPSClientSession::~HTTPSClientSession() -{ -} - - -bool HTTPSClientSession::secure() const -{ - return true; -} - - -void HTTPSClientSession::abort() -{ - SecureStreamSocket sss(socket()); - sss.abort(); -} - - -X509Certificate HTTPSClientSession::serverCertificate() -{ - SecureStreamSocket sss(socket()); - return sss.peerCertificate(); -} - - -std::string HTTPSClientSession::proxyRequestPrefix() const -{ - return std::string(); -} - - -void HTTPSClientSession::proxyAuthenticate(HTTPRequest& request) -{ -} - - -void HTTPSClientSession::connect(const SocketAddress& address) -{ - if (getProxyHost().empty() || bypassProxy()) - { - SecureStreamSocket sss(socket()); - if (sss.getPeerHostName().empty()) - { - sss.setPeerHostName(getHost()); - } - if (_pContext->sessionCacheEnabled()) - { - sss.useSession(_pSession); - } - HTTPSession::connect(address); - if (_pContext->sessionCacheEnabled()) - { - _pSession = sss.currentSession(); - } - } - else - { - StreamSocket proxySocket(proxyConnect()); - SecureStreamSocket secureSocket = SecureStreamSocket::attach(proxySocket, getHost(), _pContext, _pSession); - attachSocket(secureSocket); - if (_pContext->sessionCacheEnabled()) - { - _pSession = secureSocket.currentSession(); - } - } -} - - -int HTTPSClientSession::read(char* buffer, std::streamsize length) -{ - try - { - return HTTPSession::read(buffer, length); +// +// HTTPSClientSession.cpp +// +// Library: NetSSL_OpenSSL +// Package: HTTPSClient +// Module: HTTPSClientSession +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/HTTPSClientSession.h" +#include "Poco/Net/SecureStreamSocket.h" +#include "Poco/Net/SecureStreamSocketImpl.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Net/SSLException.h" +#include "Poco/Net/HTTPRequest.h" +#include "Poco/Net/HTTPResponse.h" +#include "Poco/Net/NetException.h" +#include "Poco/NumberFormatter.h" + + +using Poco::NumberFormatter; +using Poco::IllegalStateException; + + +namespace Poco { +namespace Net { + + +HTTPSClientSession::HTTPSClientSession(): + HTTPClientSession(SecureStreamSocket()), + _pContext(SSLManager::instance().defaultClientContext()) +{ + setPort(HTTPS_PORT); +} + + +HTTPSClientSession::HTTPSClientSession(const SecureStreamSocket& socket): + HTTPClientSession(socket), + _pContext(socket.context()) +{ + setPort(HTTPS_PORT); +} + + +HTTPSClientSession::HTTPSClientSession(const SecureStreamSocket& socket, Session::Ptr pSession): + HTTPClientSession(socket), + _pContext(socket.context()), + _pSession(pSession) +{ + setPort(HTTPS_PORT); +} + + +HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port): + HTTPClientSession(SecureStreamSocket()), + _pContext(SSLManager::instance().defaultClientContext()) +{ + setHost(host); + setPort(port); +} + + +HTTPSClientSession::HTTPSClientSession(Context::Ptr pContext): + HTTPClientSession(SecureStreamSocket(pContext)), + _pContext(pContext) +{ +} + + +HTTPSClientSession::HTTPSClientSession(Context::Ptr pContext, Session::Ptr pSession): + HTTPClientSession(SecureStreamSocket(pContext, pSession)), + _pContext(pContext), + _pSession(pSession) +{ +} + + +HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext): + HTTPClientSession(SecureStreamSocket(pContext)), + _pContext(pContext) +{ + setHost(host); + setPort(port); +} + + +HTTPSClientSession::HTTPSClientSession(const std::string& host, Poco::UInt16 port, Context::Ptr pContext, Session::Ptr pSession): + HTTPClientSession(SecureStreamSocket(pContext, pSession)), + _pContext(pContext), + _pSession(pSession) +{ + setHost(host); + setPort(port); +} + + +HTTPSClientSession::~HTTPSClientSession() +{ +} + + +bool HTTPSClientSession::secure() const +{ + return true; +} + + +void HTTPSClientSession::abort() +{ + SecureStreamSocket sss(socket()); + sss.abort(); +} + + +X509Certificate HTTPSClientSession::serverCertificate() +{ + SecureStreamSocket sss(socket()); + return sss.peerCertificate(); +} + + +std::string HTTPSClientSession::proxyRequestPrefix() const +{ + return std::string(); +} + + +void HTTPSClientSession::proxyAuthenticate(HTTPRequest& request) +{ +} + + +void HTTPSClientSession::connect(const SocketAddress& address) +{ + if (getProxyHost().empty() || bypassProxy()) + { + SecureStreamSocket sss(socket()); + if (sss.getPeerHostName().empty()) + { + sss.setPeerHostName(getHost()); + } + if (_pContext->sessionCacheEnabled()) + { + sss.useSession(_pSession); + } + HTTPSession::connect(address); + if (_pContext->sessionCacheEnabled()) + { + _pSession = sss.currentSession(); + } } - catch(SSLConnectionUnexpectedlyClosedException&) - { - return 0; - } -} - - -Session::Ptr HTTPSClientSession::sslSession() -{ - return _pSession; -} - - -} } // namespace Poco::Net + else + { + StreamSocket proxySocket(proxyConnect()); + SecureStreamSocket secureSocket = SecureStreamSocket::attach(proxySocket, getHost(), _pContext, _pSession); + attachSocket(secureSocket); + if (_pContext->sessionCacheEnabled()) + { + _pSession = secureSocket.currentSession(); + } + } +} + + +int HTTPSClientSession::read(char* buffer, std::streamsize length) +{ + try + { + return HTTPSession::read(buffer, length); + } + catch(SSLConnectionUnexpectedlyClosedException&) + { + return 0; + } +} + + +Session::Ptr HTTPSClientSession::sslSession() +{ + return _pSession; +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSSessionInstantiator.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSSessionInstantiator.cpp index fb8774d654..cff887ce22 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSSessionInstantiator.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSSessionInstantiator.cpp @@ -1,71 +1,71 @@ -// -// HTTPSSessionInstantiator.cpp -// -// Library: NetSSL_OpenSSL -// Package: HTTPSClient -// Module: HTTPSSessionInstantiator -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/HTTPSSessionInstantiator.h" -#include "Poco/Net/HTTPSessionFactory.h" -#include "Poco/Net/HTTPSClientSession.h" - - -namespace Poco { -namespace Net { - - -HTTPSSessionInstantiator::HTTPSSessionInstantiator() -{ -} - - -HTTPSSessionInstantiator::HTTPSSessionInstantiator(Context::Ptr pContext) : - _pContext(pContext) -{ -} - - -HTTPSSessionInstantiator::~HTTPSSessionInstantiator() -{ -} - - -HTTPClientSession* HTTPSSessionInstantiator::createClientSession(const Poco::URI& uri) -{ - poco_assert (uri.getScheme() == "https"); - HTTPSClientSession* pSession = _pContext.isNull() ? new HTTPSClientSession(uri.getHost(), uri.getPort()) : new HTTPSClientSession(uri.getHost(), uri.getPort(), _pContext); - if (!proxyHost().empty()) - { - pSession->setProxy(proxyHost(), proxyPort()); - pSession->setProxyCredentials(proxyUsername(), proxyPassword()); - } - return pSession; -} - - -void HTTPSSessionInstantiator::registerInstantiator() -{ - HTTPSessionFactory::defaultFactory().registerProtocol("https", new HTTPSSessionInstantiator); -} - - -void HTTPSSessionInstantiator::registerInstantiator(Context::Ptr context) -{ - HTTPSessionFactory::defaultFactory().registerProtocol("https", new HTTPSSessionInstantiator(context)); -} - - -void HTTPSSessionInstantiator::unregisterInstantiator() -{ - HTTPSessionFactory::defaultFactory().unregisterProtocol("https"); -} - - -} } // namespace Poco::Net +// +// HTTPSSessionInstantiator.cpp +// +// Library: NetSSL_OpenSSL +// Package: HTTPSClient +// Module: HTTPSSessionInstantiator +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/HTTPSSessionInstantiator.h" +#include "Poco/Net/HTTPSessionFactory.h" +#include "Poco/Net/HTTPSClientSession.h" + + +namespace Poco { +namespace Net { + + +HTTPSSessionInstantiator::HTTPSSessionInstantiator() +{ +} + + +HTTPSSessionInstantiator::HTTPSSessionInstantiator(Context::Ptr pContext) : + _pContext(pContext) +{ +} + + +HTTPSSessionInstantiator::~HTTPSSessionInstantiator() +{ +} + + +HTTPClientSession* HTTPSSessionInstantiator::createClientSession(const Poco::URI& uri) +{ + poco_assert (uri.getScheme() == "https"); + HTTPSClientSession* pSession = _pContext.isNull() ? new HTTPSClientSession(uri.getHost(), uri.getPort()) : new HTTPSClientSession(uri.getHost(), uri.getPort(), _pContext); + if (!proxyHost().empty()) + { + pSession->setProxy(proxyHost(), proxyPort()); + pSession->setProxyCredentials(proxyUsername(), proxyPassword()); + } + return pSession; +} + + +void HTTPSSessionInstantiator::registerInstantiator() +{ + HTTPSessionFactory::defaultFactory().registerProtocol("https", new HTTPSSessionInstantiator); +} + + +void HTTPSSessionInstantiator::registerInstantiator(Context::Ptr context) +{ + HTTPSessionFactory::defaultFactory().registerProtocol("https", new HTTPSSessionInstantiator(context)); +} + + +void HTTPSSessionInstantiator::unregisterInstantiator() +{ + HTTPSessionFactory::defaultFactory().unregisterProtocol("https"); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSStreamFactory.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSStreamFactory.cpp index 6ef20e63ff..4c2e4db37c 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSStreamFactory.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/HTTPSStreamFactory.cpp @@ -1,194 +1,194 @@ -// -// HTTPSStreamFactory.cpp -// -// Library: NetSSL_OpenSSL -// Package: HTTPSClient -// Module: HTTPSStreamFactory -// -// Copyright (c) 2006-2012, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/HTTPSStreamFactory.h" -#include "Poco/Net/HTTPSClientSession.h" -#include "Poco/Net/HTTPIOStream.h" -#include "Poco/Net/HTTPRequest.h" -#include "Poco/Net/HTTPResponse.h" -#include "Poco/Net/HTTPCredentials.h" -#include "Poco/Net/NetException.h" -#include "Poco/URI.h" -#include "Poco/URIStreamOpener.h" -#include "Poco/UnbufferedStreamBuf.h" -#include "Poco/NullStream.h" -#include "Poco/StreamCopier.h" -#include "Poco/Format.h" -#include "Poco/Version.h" - - -using Poco::URIStreamFactory; -using Poco::URI; -using Poco::URIStreamOpener; -using Poco::UnbufferedStreamBuf; - - -namespace Poco { -namespace Net { - - -HTTPSStreamFactory::HTTPSStreamFactory(): - _proxyPort(HTTPSession::HTTP_PORT) -{ -} - - -HTTPSStreamFactory::HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort): - _proxyHost(proxyHost), - _proxyPort(proxyPort) -{ -} - - -HTTPSStreamFactory::HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword): - _proxyHost(proxyHost), - _proxyPort(proxyPort), - _proxyUsername(proxyUsername), - _proxyPassword(proxyPassword) -{ -} - - -HTTPSStreamFactory::~HTTPSStreamFactory() -{ -} - - -std::istream* HTTPSStreamFactory::open(const URI& uri) -{ - poco_assert (uri.getScheme() == "https" || uri.getScheme() == "http"); - - URI resolvedURI(uri); - URI proxyUri; - HTTPClientSession* pSession = 0; - HTTPResponse res; - try - { - bool retry = false; - bool authorize = false; - int redirects = 0; - std::string username; - std::string password; - - do - { - if (!pSession) - { - if (resolvedURI.getScheme() != "http") - pSession = new HTTPSClientSession(resolvedURI.getHost(), resolvedURI.getPort()); - else - pSession = new HTTPClientSession(resolvedURI.getHost(), resolvedURI.getPort()); - - if (proxyUri.empty()) - { - if (!_proxyHost.empty()) - { - pSession->setProxy(_proxyHost, _proxyPort); - pSession->setProxyCredentials(_proxyUsername, _proxyPassword); - } - } - else - { - pSession->setProxy(proxyUri.getHost(), proxyUri.getPort()); - if (!_proxyUsername.empty()) - { - pSession->setProxyCredentials(_proxyUsername, _proxyPassword); - } - } - } - std::string path = resolvedURI.getPathAndQuery(); - if (path.empty()) path = "/"; - HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); - - if (authorize) - { - HTTPCredentials::extractCredentials(uri, username, password); - HTTPCredentials cred(username, password); - cred.authenticate(req, res); - } - - req.set("User-Agent", Poco::format("poco/%d.%d.%d", - (POCO_VERSION >> 24) & 0xFF, - (POCO_VERSION >> 16) & 0xFF, - (POCO_VERSION >> 8) & 0xFF)); - req.set("Accept", "*/*"); - - pSession->sendRequest(req); - std::istream& rs = pSession->receiveResponse(res); - bool moved = (res.getStatus() == HTTPResponse::HTTP_MOVED_PERMANENTLY || - res.getStatus() == HTTPResponse::HTTP_FOUND || - res.getStatus() == HTTPResponse::HTTP_SEE_OTHER || - res.getStatus() == HTTPResponse::HTTP_TEMPORARY_REDIRECT); - if (moved) - { - resolvedURI.resolve(res.get("Location")); - if (!username.empty()) - { - resolvedURI.setUserInfo(username + ":" + password); - authorize = false; - } - delete pSession; - pSession = 0; - ++redirects; - retry = true; - } - else if (res.getStatus() == HTTPResponse::HTTP_OK) - { - return new HTTPResponseStream(rs, pSession); - } - else if (res.getStatus() == HTTPResponse::HTTP_USEPROXY && !retry) - { - // The requested resource MUST be accessed through the proxy - // given by the Location field. The Location field gives the - // URI of the proxy. The recipient is expected to repeat this - // single request via the proxy. 305 responses MUST only be generated by origin servers. - // only use for one single request! - proxyUri.resolve(res.get("Location")); - delete pSession; - pSession = 0; - retry = true; // only allow useproxy once - } - else if (res.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED && !authorize) - { - authorize = true; - retry = true; - Poco::NullOutputStream null; - Poco::StreamCopier::copyStream(rs, null); - } - else throw HTTPException(res.getReason(), uri.toString()); - } - while (retry && redirects < MAX_REDIRECTS); - throw HTTPException("Too many redirects", uri.toString()); - } - catch (...) - { - delete pSession; - throw; - } -} - - -void HTTPSStreamFactory::registerFactory() -{ - URIStreamOpener::defaultOpener().registerStreamFactory("https", new HTTPSStreamFactory); -} - - -void HTTPSStreamFactory::unregisterFactory() -{ - URIStreamOpener::defaultOpener().unregisterStreamFactory("https"); -} - - -} } // namespace Poco::Net +// +// HTTPSStreamFactory.cpp +// +// Library: NetSSL_OpenSSL +// Package: HTTPSClient +// Module: HTTPSStreamFactory +// +// Copyright (c) 2006-2012, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/HTTPSStreamFactory.h" +#include "Poco/Net/HTTPSClientSession.h" +#include "Poco/Net/HTTPIOStream.h" +#include "Poco/Net/HTTPRequest.h" +#include "Poco/Net/HTTPResponse.h" +#include "Poco/Net/HTTPCredentials.h" +#include "Poco/Net/NetException.h" +#include "Poco/URI.h" +#include "Poco/URIStreamOpener.h" +#include "Poco/UnbufferedStreamBuf.h" +#include "Poco/NullStream.h" +#include "Poco/StreamCopier.h" +#include "Poco/Format.h" +#include "Poco/Version.h" + + +using Poco::URIStreamFactory; +using Poco::URI; +using Poco::URIStreamOpener; +using Poco::UnbufferedStreamBuf; + + +namespace Poco { +namespace Net { + + +HTTPSStreamFactory::HTTPSStreamFactory(): + _proxyPort(HTTPSession::HTTP_PORT) +{ +} + + +HTTPSStreamFactory::HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort): + _proxyHost(proxyHost), + _proxyPort(proxyPort) +{ +} + + +HTTPSStreamFactory::HTTPSStreamFactory(const std::string& proxyHost, Poco::UInt16 proxyPort, const std::string& proxyUsername, const std::string& proxyPassword): + _proxyHost(proxyHost), + _proxyPort(proxyPort), + _proxyUsername(proxyUsername), + _proxyPassword(proxyPassword) +{ +} + + +HTTPSStreamFactory::~HTTPSStreamFactory() +{ +} + + +std::istream* HTTPSStreamFactory::open(const URI& uri) +{ + poco_assert (uri.getScheme() == "https" || uri.getScheme() == "http"); + + URI resolvedURI(uri); + URI proxyUri; + HTTPClientSession* pSession = 0; + HTTPResponse res; + try + { + bool retry = false; + bool authorize = false; + int redirects = 0; + std::string username; + std::string password; + + do + { + if (!pSession) + { + if (resolvedURI.getScheme() != "http") + pSession = new HTTPSClientSession(resolvedURI.getHost(), resolvedURI.getPort()); + else + pSession = new HTTPClientSession(resolvedURI.getHost(), resolvedURI.getPort()); + + if (proxyUri.empty()) + { + if (!_proxyHost.empty()) + { + pSession->setProxy(_proxyHost, _proxyPort); + pSession->setProxyCredentials(_proxyUsername, _proxyPassword); + } + } + else + { + pSession->setProxy(proxyUri.getHost(), proxyUri.getPort()); + if (!_proxyUsername.empty()) + { + pSession->setProxyCredentials(_proxyUsername, _proxyPassword); + } + } + } + std::string path = resolvedURI.getPathAndQuery(); + if (path.empty()) path = "/"; + HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); + + if (authorize) + { + HTTPCredentials::extractCredentials(uri, username, password); + HTTPCredentials cred(username, password); + cred.authenticate(req, res); + } + + req.set("User-Agent", Poco::format("poco/%d.%d.%d", + (POCO_VERSION >> 24) & 0xFF, + (POCO_VERSION >> 16) & 0xFF, + (POCO_VERSION >> 8) & 0xFF)); + req.set("Accept", "*/*"); + + pSession->sendRequest(req); + std::istream& rs = pSession->receiveResponse(res); + bool moved = (res.getStatus() == HTTPResponse::HTTP_MOVED_PERMANENTLY || + res.getStatus() == HTTPResponse::HTTP_FOUND || + res.getStatus() == HTTPResponse::HTTP_SEE_OTHER || + res.getStatus() == HTTPResponse::HTTP_TEMPORARY_REDIRECT); + if (moved) + { + resolvedURI.resolve(res.get("Location")); + if (!username.empty()) + { + resolvedURI.setUserInfo(username + ":" + password); + authorize = false; + } + delete pSession; + pSession = 0; + ++redirects; + retry = true; + } + else if (res.getStatus() == HTTPResponse::HTTP_OK) + { + return new HTTPResponseStream(rs, pSession); + } + else if (res.getStatus() == HTTPResponse::HTTP_USEPROXY && !retry) + { + // The requested resource MUST be accessed through the proxy + // given by the Location field. The Location field gives the + // URI of the proxy. The recipient is expected to repeat this + // single request via the proxy. 305 responses MUST only be generated by origin servers. + // only use for one single request! + proxyUri.resolve(res.get("Location")); + delete pSession; + pSession = 0; + retry = true; // only allow useproxy once + } + else if (res.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED && !authorize) + { + authorize = true; + retry = true; + Poco::NullOutputStream null; + Poco::StreamCopier::copyStream(rs, null); + } + else throw HTTPException(res.getReason(), uri.toString()); + } + while (retry && redirects < MAX_REDIRECTS); + throw HTTPException("Too many redirects", uri.toString()); + } + catch (...) + { + delete pSession; + throw; + } +} + + +void HTTPSStreamFactory::registerFactory() +{ + URIStreamOpener::defaultOpener().registerStreamFactory("https", new HTTPSStreamFactory); +} + + +void HTTPSStreamFactory::unregisterFactory() +{ + URIStreamOpener::defaultOpener().unregisterStreamFactory("https"); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/InvalidCertificateHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/InvalidCertificateHandler.cpp index 7cf68613c4..cf31c70788 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/InvalidCertificateHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/InvalidCertificateHandler.cpp @@ -1,52 +1,52 @@ -// -// InvalidCertificateHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: InvalidCertificateHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/InvalidCertificateHandler.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Delegate.h" - - -using Poco::Delegate; - - -namespace Poco { -namespace Net { - - -InvalidCertificateHandler::InvalidCertificateHandler(bool handleErrorsOnServerSide): _handleErrorsOnServerSide(handleErrorsOnServerSide) -{ - if (_handleErrorsOnServerSide) - SSLManager::instance().ServerVerificationError += Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); - else - SSLManager::instance().ClientVerificationError += Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); -} - - -InvalidCertificateHandler::~InvalidCertificateHandler() -{ - try - { - if (_handleErrorsOnServerSide) - SSLManager::instance().ServerVerificationError -= Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); - else - SSLManager::instance().ClientVerificationError -= Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); - } - catch (...) - { - poco_unexpected(); - } -} - - -} } // namespace Poco::Net +// +// InvalidCertificateHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: InvalidCertificateHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/InvalidCertificateHandler.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Delegate.h" + + +using Poco::Delegate; + + +namespace Poco { +namespace Net { + + +InvalidCertificateHandler::InvalidCertificateHandler(bool handleErrorsOnServerSide): _handleErrorsOnServerSide(handleErrorsOnServerSide) +{ + if (_handleErrorsOnServerSide) + SSLManager::instance().ServerVerificationError += Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); + else + SSLManager::instance().ClientVerificationError += Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); +} + + +InvalidCertificateHandler::~InvalidCertificateHandler() +{ + try + { + if (_handleErrorsOnServerSide) + SSLManager::instance().ServerVerificationError -= Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); + else + SSLManager::instance().ClientVerificationError -= Delegate<InvalidCertificateHandler, VerificationErrorArgs>(this, &InvalidCertificateHandler::onInvalidCertificate); + } + catch (...) + { + poco_unexpected(); + } +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/KeyConsoleHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/KeyConsoleHandler.cpp index a0a144216e..f75e7986b5 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/KeyConsoleHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/KeyConsoleHandler.cpp @@ -1,40 +1,40 @@ -// -// KeyConsoleHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: KeyConsoleHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/KeyConsoleHandler.h" -#include <iostream> - - -namespace Poco { -namespace Net { - - -KeyConsoleHandler::KeyConsoleHandler(bool server):PrivateKeyPassphraseHandler(server) -{ -} - - -KeyConsoleHandler::~KeyConsoleHandler() -{ -} - - -void KeyConsoleHandler::onPrivateKeyRequested(const void* /*pSender*/, std::string& privateKey) -{ - std::cout << "Please enter the passphrase for the private key: "; - std::cin >> privateKey; -} - - -} } // namespace Poco::Net +// +// KeyConsoleHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: KeyConsoleHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/KeyConsoleHandler.h" +#include <iostream> + + +namespace Poco { +namespace Net { + + +KeyConsoleHandler::KeyConsoleHandler(bool server):PrivateKeyPassphraseHandler(server) +{ +} + + +KeyConsoleHandler::~KeyConsoleHandler() +{ +} + + +void KeyConsoleHandler::onPrivateKeyRequested(const void* /*pSender*/, std::string& privateKey) +{ + std::cout << "Please enter the passphrase for the private key: "; + std::cin >> privateKey; +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/KeyFileHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/KeyFileHandler.cpp index d188b4575c..1f538987b1 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/KeyFileHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/KeyFileHandler.cpp @@ -1,61 +1,61 @@ -// -// KeyFileHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: KeyFileHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/KeyFileHandler.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/File.h" -#include "Poco/Util/AbstractConfiguration.h" -#include "Poco/Util/Application.h" -#include "Poco/Util/OptionException.h" - - -namespace Poco { -namespace Net { - - -const std::string KeyFileHandler::CFG_PRIV_KEY_FILE("privateKeyPassphraseHandler.options.password"); - - -KeyFileHandler::KeyFileHandler(bool server):PrivateKeyPassphraseHandler(server) -{ -} - - -KeyFileHandler::~KeyFileHandler() -{ -} - - -void KeyFileHandler::onPrivateKeyRequested(const void* /*pSender*/, std::string& privateKey) -{ - try - { - Poco::Util::AbstractConfiguration& config = Poco::Util::Application::instance().config(); - std::string prefix = serverSide() ? SSLManager::CFG_SERVER_PREFIX : SSLManager::CFG_CLIENT_PREFIX; - if (!config.hasProperty(prefix + CFG_PRIV_KEY_FILE)) - throw Poco::Util::EmptyOptionException(std::string("Missing Configuration Entry: ") + prefix + CFG_PRIV_KEY_FILE); - - privateKey = config.getString(prefix + CFG_PRIV_KEY_FILE); - } - catch (Poco::NullPointerException&) - { - throw Poco::IllegalStateException( - "An application configuration is required to obtain the private key passphrase, " - "but no Poco::Util::Application instance is available." - ); - } -} - - -} } // namespace Poco::Net +// +// KeyFileHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: KeyFileHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/KeyFileHandler.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/File.h" +#include "Poco/Util/AbstractConfiguration.h" +#include "Poco/Util/Application.h" +#include "Poco/Util/OptionException.h" + + +namespace Poco { +namespace Net { + + +const std::string KeyFileHandler::CFG_PRIV_KEY_FILE("privateKeyPassphraseHandler.options.password"); + + +KeyFileHandler::KeyFileHandler(bool server):PrivateKeyPassphraseHandler(server) +{ +} + + +KeyFileHandler::~KeyFileHandler() +{ +} + + +void KeyFileHandler::onPrivateKeyRequested(const void* /*pSender*/, std::string& privateKey) +{ + try + { + Poco::Util::AbstractConfiguration& config = Poco::Util::Application::instance().config(); + std::string prefix = serverSide() ? SSLManager::CFG_SERVER_PREFIX : SSLManager::CFG_CLIENT_PREFIX; + if (!config.hasProperty(prefix + CFG_PRIV_KEY_FILE)) + throw Poco::Util::EmptyOptionException(std::string("Missing Configuration Entry: ") + prefix + CFG_PRIV_KEY_FILE); + + privateKey = config.getString(prefix + CFG_PRIV_KEY_FILE); + } + catch (Poco::NullPointerException&) + { + throw Poco::IllegalStateException( + "An application configuration is required to obtain the private key passphrase, " + "but no Poco::Util::Application instance is available." + ); + } +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactory.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactory.cpp index 90297c351e..d3ae93cb31 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactory.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactory.cpp @@ -1,44 +1,44 @@ -// -// PrivateKeyFactory.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: PrivateKeyFactory -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/PrivateKeyFactory.h" -#include "Poco/Net/SSLManager.h" - - -namespace Poco { -namespace Net { - - -PrivateKeyFactory::PrivateKeyFactory() -{ -} - - -PrivateKeyFactory::~PrivateKeyFactory() -{ -} - - -PrivateKeyFactoryRegistrar::PrivateKeyFactoryRegistrar(const std::string& name, PrivateKeyFactory* pFactory) -{ - SSLManager::instance().privateKeyFactoryMgr().setFactory(name, pFactory); -} - - -PrivateKeyFactoryRegistrar::~PrivateKeyFactoryRegistrar() -{ -} - - -} } // namespace Poco::Net +// +// PrivateKeyFactory.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: PrivateKeyFactory +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/PrivateKeyFactory.h" +#include "Poco/Net/SSLManager.h" + + +namespace Poco { +namespace Net { + + +PrivateKeyFactory::PrivateKeyFactory() +{ +} + + +PrivateKeyFactory::~PrivateKeyFactory() +{ +} + + +PrivateKeyFactoryRegistrar::PrivateKeyFactoryRegistrar(const std::string& name, PrivateKeyFactory* pFactory) +{ + SSLManager::instance().privateKeyFactoryMgr().setFactory(name, pFactory); +} + + +PrivateKeyFactoryRegistrar::~PrivateKeyFactoryRegistrar() +{ +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactoryMgr.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactoryMgr.cpp index 94b4ad34ba..c3e027ce81 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactoryMgr.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyFactoryMgr.cpp @@ -1,67 +1,67 @@ -// -// PrivateKeyFactoryMgr.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: PrivateKeyFactoryMgr -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/PrivateKeyFactoryMgr.h" -#include "Poco/Net/KeyFileHandler.h" -#include "Poco/Net/KeyConsoleHandler.h" - - -namespace Poco { -namespace Net { - - -PrivateKeyFactoryMgr::PrivateKeyFactoryMgr() -{ - setFactory("KeyFileHandler", new PrivateKeyFactoryImpl<KeyFileHandler>()); - setFactory("KeyConsoleHandler", new PrivateKeyFactoryImpl<KeyConsoleHandler>()); -} - - -PrivateKeyFactoryMgr::~PrivateKeyFactoryMgr() -{ -} - - -void PrivateKeyFactoryMgr::setFactory(const std::string& name, PrivateKeyFactory* pFactory) -{ - bool success = _factories.insert(make_pair(name, Poco::SharedPtr<PrivateKeyFactory>(pFactory))).second; - if (!success) - delete pFactory; - poco_assert(success); -} - - -bool PrivateKeyFactoryMgr::hasFactory(const std::string& name) const -{ - return _factories.find(name) != _factories.end(); -} - - -const PrivateKeyFactory* PrivateKeyFactoryMgr::getFactory(const std::string& name) const -{ - FactoriesMap::const_iterator it = _factories.find(name); - if (it != _factories.end()) - return it->second; - else - return 0; -} - - -void PrivateKeyFactoryMgr::removeFactory(const std::string& name) -{ - _factories.erase(name); -} - - -} } // namespace Poco::Net +// +// PrivateKeyFactoryMgr.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: PrivateKeyFactoryMgr +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/PrivateKeyFactoryMgr.h" +#include "Poco/Net/KeyFileHandler.h" +#include "Poco/Net/KeyConsoleHandler.h" + + +namespace Poco { +namespace Net { + + +PrivateKeyFactoryMgr::PrivateKeyFactoryMgr() +{ + setFactory("KeyFileHandler", new PrivateKeyFactoryImpl<KeyFileHandler>()); + setFactory("KeyConsoleHandler", new PrivateKeyFactoryImpl<KeyConsoleHandler>()); +} + + +PrivateKeyFactoryMgr::~PrivateKeyFactoryMgr() +{ +} + + +void PrivateKeyFactoryMgr::setFactory(const std::string& name, PrivateKeyFactory* pFactory) +{ + bool success = _factories.insert(make_pair(name, Poco::SharedPtr<PrivateKeyFactory>(pFactory))).second; + if (!success) + delete pFactory; + poco_assert(success); +} + + +bool PrivateKeyFactoryMgr::hasFactory(const std::string& name) const +{ + return _factories.find(name) != _factories.end(); +} + + +const PrivateKeyFactory* PrivateKeyFactoryMgr::getFactory(const std::string& name) const +{ + FactoriesMap::const_iterator it = _factories.find(name); + if (it != _factories.end()) + return it->second; + else + return 0; +} + + +void PrivateKeyFactoryMgr::removeFactory(const std::string& name) +{ + _factories.erase(name); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyPassphraseHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyPassphraseHandler.cpp index 9c1386c74c..1d44e68a1e 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyPassphraseHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/PrivateKeyPassphraseHandler.cpp @@ -1,46 +1,46 @@ -// -// PrivateKeyPassphraseHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: PrivateKeyPassphraseHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/PrivateKeyPassphraseHandler.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Delegate.h" - - -using Poco::Delegate; - - -namespace Poco { -namespace Net { - - -PrivateKeyPassphraseHandler::PrivateKeyPassphraseHandler(bool onServerSide): _serverSide(onServerSide) -{ - SSLManager::instance().PrivateKeyPassphraseRequired += Delegate<PrivateKeyPassphraseHandler, std::string>(this, &PrivateKeyPassphraseHandler::onPrivateKeyRequested); -} - - -PrivateKeyPassphraseHandler::~PrivateKeyPassphraseHandler() -{ - try - { - SSLManager::instance().PrivateKeyPassphraseRequired -= Delegate<PrivateKeyPassphraseHandler, std::string>(this, &PrivateKeyPassphraseHandler::onPrivateKeyRequested); - } - catch (...) - { - poco_unexpected(); - } -} - - -} } // namespace Poco::Net +// +// PrivateKeyPassphraseHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: PrivateKeyPassphraseHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/PrivateKeyPassphraseHandler.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Delegate.h" + + +using Poco::Delegate; + + +namespace Poco { +namespace Net { + + +PrivateKeyPassphraseHandler::PrivateKeyPassphraseHandler(bool onServerSide): _serverSide(onServerSide) +{ + SSLManager::instance().PrivateKeyPassphraseRequired += Delegate<PrivateKeyPassphraseHandler, std::string>(this, &PrivateKeyPassphraseHandler::onPrivateKeyRequested); +} + + +PrivateKeyPassphraseHandler::~PrivateKeyPassphraseHandler() +{ + try + { + SSLManager::instance().PrivateKeyPassphraseRequired -= Delegate<PrivateKeyPassphraseHandler, std::string>(this, &PrivateKeyPassphraseHandler::onPrivateKeyRequested); + } + catch (...) + { + poco_unexpected(); + } +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/RejectCertificateHandler.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/RejectCertificateHandler.cpp index 1502a13e86..5782550b01 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/RejectCertificateHandler.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/RejectCertificateHandler.cpp @@ -1,38 +1,38 @@ -// -// RejectCertificateHandler.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: RejectCertificateHandler -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/RejectCertificateHandler.h" - - -namespace Poco { -namespace Net { - - -RejectCertificateHandler::RejectCertificateHandler(bool server): InvalidCertificateHandler(server) -{ -} - - -RejectCertificateHandler::~RejectCertificateHandler() -{ -} - - -void RejectCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) -{ - errorCert.setIgnoreError(false); -} - - -} } // namespace Poco::Net +// +// RejectCertificateHandler.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: RejectCertificateHandler +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/RejectCertificateHandler.h" + + +namespace Poco { +namespace Net { + + +RejectCertificateHandler::RejectCertificateHandler(bool server): InvalidCertificateHandler(server) +{ +} + + +RejectCertificateHandler::~RejectCertificateHandler() +{ +} + + +void RejectCertificateHandler::onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) +{ + errorCert.setIgnoreError(false); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SSLException.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SSLException.cpp index 2b64d2a4d6..30716805d7 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SSLException.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SSLException.cpp @@ -1,30 +1,30 @@ -// -// SSLException.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: SSLException -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SSLException.h" -#include <typeinfo> - - -namespace Poco { -namespace Net { - - -POCO_IMPLEMENT_EXCEPTION(SSLException, NetException, "SSL Exception") -POCO_IMPLEMENT_EXCEPTION(SSLContextException, SSLException, "SSL context exception") -POCO_IMPLEMENT_EXCEPTION(InvalidCertificateException, SSLException, "Invalid certficate") -POCO_IMPLEMENT_EXCEPTION(CertificateValidationException, SSLException, "Certificate validation error") -POCO_IMPLEMENT_EXCEPTION(SSLConnectionUnexpectedlyClosedException, SSLException, "SSL connection unexpectedly closed") - - -} } // namespace Poco::Net +// +// SSLException.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: SSLException +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SSLException.h" +#include <typeinfo> + + +namespace Poco { +namespace Net { + + +POCO_IMPLEMENT_EXCEPTION(SSLException, NetException, "SSL Exception") +POCO_IMPLEMENT_EXCEPTION(SSLContextException, SSLException, "SSL context exception") +POCO_IMPLEMENT_EXCEPTION(InvalidCertificateException, SSLException, "Invalid certficate") +POCO_IMPLEMENT_EXCEPTION(CertificateValidationException, SSLException, "Certificate validation error") +POCO_IMPLEMENT_EXCEPTION(SSLConnectionUnexpectedlyClosedException, SSLException, "SSL connection unexpectedly closed") + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SSLManager.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SSLManager.cpp index abb4389f26..8aeaa199e2 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SSLManager.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SSLManager.cpp @@ -1,460 +1,460 @@ -// -// SSLManager.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: SSLManager -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SSLManager.h" -#include "Poco/Net/Context.h" -#include "Poco/Net/Utility.h" -#include "Poco/Net/PrivateKeyPassphraseHandler.h" -#include "Poco/Net/RejectCertificateHandler.h" -#include "Poco/Crypto/OpenSSLInitializer.h" -#include "Poco/Net/SSLException.h" -#include "Poco/SingletonHolder.h" -#include "Poco/Delegate.h" -#include "Poco/StringTokenizer.h" -#include "Poco/Util/Application.h" -#include "Poco/Util/OptionException.h" - - -namespace Poco { -namespace Net { - - -const std::string SSLManager::CFG_PRIV_KEY_FILE("privateKeyFile"); -const std::string SSLManager::CFG_CERTIFICATE_FILE("certificateFile"); -const std::string SSLManager::CFG_CA_LOCATION("caConfig"); -const std::string SSLManager::CFG_VER_MODE("verificationMode"); -const Context::VerificationMode SSLManager::VAL_VER_MODE(Context::VERIFY_RELAXED); -const std::string SSLManager::CFG_VER_DEPTH("verificationDepth"); -const int SSLManager::VAL_VER_DEPTH(9); -const std::string SSLManager::CFG_ENABLE_DEFAULT_CA("loadDefaultCAFile"); -const bool SSLManager::VAL_ENABLE_DEFAULT_CA(true); -const std::string SSLManager::CFG_CIPHER_LIST("cipherList"); -const std::string SSLManager::CFG_CYPHER_LIST("cypherList"); -const std::string SSLManager::VAL_CIPHER_LIST("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); -const std::string SSLManager::CFG_PREFER_SERVER_CIPHERS("preferServerCiphers"); -const std::string SSLManager::CFG_DELEGATE_HANDLER("privateKeyPassphraseHandler.name"); -const std::string SSLManager::VAL_DELEGATE_HANDLER("KeyConsoleHandler"); -const std::string SSLManager::CFG_CERTIFICATE_HANDLER("invalidCertificateHandler.name"); -const std::string SSLManager::VAL_CERTIFICATE_HANDLER("ConsoleCertificateHandler"); -const std::string SSLManager::CFG_SERVER_PREFIX("openSSL.server."); -const std::string SSLManager::CFG_CLIENT_PREFIX("openSSL.client."); -const std::string SSLManager::CFG_CACHE_SESSIONS("cacheSessions"); -const std::string SSLManager::CFG_SESSION_ID_CONTEXT("sessionIdContext"); -const std::string SSLManager::CFG_SESSION_CACHE_SIZE("sessionCacheSize"); -const std::string SSLManager::CFG_SESSION_TIMEOUT("sessionTimeout"); -const std::string SSLManager::CFG_EXTENDED_VERIFICATION("extendedVerification"); -const std::string SSLManager::CFG_REQUIRE_TLSV1("requireTLSv1"); -const std::string SSLManager::CFG_REQUIRE_TLSV1_1("requireTLSv1_1"); -const std::string SSLManager::CFG_REQUIRE_TLSV1_2("requireTLSv1_2"); -const std::string SSLManager::CFG_DISABLE_PROTOCOLS("disableProtocols"); -const std::string SSLManager::CFG_DH_PARAMS_FILE("dhParamsFile"); -const std::string SSLManager::CFG_ECDH_CURVE("ecdhCurve"); -#ifdef OPENSSL_FIPS -const std::string SSLManager::CFG_FIPS_MODE("openSSL.fips"); -const bool SSLManager::VAL_FIPS_MODE(false); -#endif - - -SSLManager::SSLManager() -{ -} - - -SSLManager::~SSLManager() -{ - try - { - shutdown(); - } - catch (...) - { - poco_unexpected(); - } -} - - -void SSLManager::shutdown() -{ - PrivateKeyPassphraseRequired.clear(); - ClientVerificationError.clear(); - ServerVerificationError.clear(); - _ptrDefaultServerContext = 0; - _ptrDefaultClientContext = 0; -} - - -namespace -{ - static Poco::SingletonHolder<SSLManager> singleton; -} - - -SSLManager& SSLManager::instance() -{ - return *singleton.get(); -} - - -void SSLManager::initializeServer(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrHandler, Context::Ptr ptrContext) -{ - _ptrServerPassphraseHandler = ptrPassphraseHandler; - _ptrServerCertificateHandler = ptrHandler; - _ptrDefaultServerContext = ptrContext; -} - - -void SSLManager::initializeClient(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrHandler, Context::Ptr ptrContext) -{ - _ptrClientPassphraseHandler = ptrPassphraseHandler; - _ptrClientCertificateHandler = ptrHandler; - _ptrDefaultClientContext = ptrContext; -} - - -Context::Ptr SSLManager::defaultServerContext() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrDefaultServerContext) - initDefaultContext(true); - - return _ptrDefaultServerContext; -} - - -Context::Ptr SSLManager::defaultClientContext() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrDefaultClientContext) - { - try - { - initDefaultContext(false); - } - catch (Poco::IllegalStateException&) - { - _ptrClientCertificateHandler = new RejectCertificateHandler(false); - _ptrDefaultClientContext = new Context(Context::CLIENT_USE, "", Context::VERIFY_RELAXED, 9, true); - _ptrDefaultClientContext->disableProtocols(Context::PROTO_SSLV2 | Context::PROTO_SSLV3); - } - } - - return _ptrDefaultClientContext; -} - - -SSLManager::PrivateKeyPassphraseHandlerPtr SSLManager::serverPassphraseHandler() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrServerPassphraseHandler) - initPassphraseHandler(true); - - return _ptrServerPassphraseHandler; -} - - -SSLManager::PrivateKeyPassphraseHandlerPtr SSLManager::clientPassphraseHandler() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrClientPassphraseHandler) - initPassphraseHandler(false); - - return _ptrClientPassphraseHandler; -} - - -SSLManager::InvalidCertificateHandlerPtr SSLManager::serverCertificateHandler() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrServerCertificateHandler) - initCertificateHandler(true); - - return _ptrServerCertificateHandler; -} - - -SSLManager::InvalidCertificateHandlerPtr SSLManager::clientCertificateHandler() -{ - Poco::FastMutex::ScopedLock lock(_mutex); - - if (!_ptrClientCertificateHandler) - initCertificateHandler(false); - - return _ptrClientCertificateHandler; -} - - -int SSLManager::verifyCallback(bool server, int ok, X509_STORE_CTX* pStore) -{ - if (!ok) - { - X509* pCert = X509_STORE_CTX_get_current_cert(pStore); - X509Certificate x509(pCert, true); - int depth = X509_STORE_CTX_get_error_depth(pStore); - int err = X509_STORE_CTX_get_error(pStore); - std::string error(X509_verify_cert_error_string(err)); - VerificationErrorArgs args(x509, depth, err, error); - if (server) - SSLManager::instance().ServerVerificationError.notify(&SSLManager::instance(), args); - else - SSLManager::instance().ClientVerificationError.notify(&SSLManager::instance(), args); - ok = args.getIgnoreError() ? 1 : 0; - } - - return ok; -} - - -int SSLManager::privateKeyPassphraseCallback(char* pBuf, int size, int /*flag*/, void* /*userData*/) -{ - std::string pwd; - SSLManager::instance().PrivateKeyPassphraseRequired.notify(&SSLManager::instance(), pwd); - - strncpy(pBuf, (char *)(pwd.c_str()), size); - pBuf[size - 1] = '\0'; - if (size > pwd.length()) - size = (int) pwd.length(); - - return size; -} - - -void SSLManager::initDefaultContext(bool server) -{ - if (server && _ptrDefaultServerContext) return; - if (!server && _ptrDefaultClientContext) return; - - Poco::Crypto::OpenSSLInitializer openSSLInitializer; - initEvents(server); - Poco::Util::AbstractConfiguration& config = appConfig(); - -#ifdef OPENSSL_FIPS - bool fipsEnabled = config.getBool(CFG_FIPS_MODE, VAL_FIPS_MODE); - if (fipsEnabled && !Poco::Crypto::OpenSSLInitializer::isFIPSEnabled()) - { - Poco::Crypto::OpenSSLInitializer::enableFIPSMode(true); - } -#endif - - std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; - - Context::Params params; - // mandatory options - params.privateKeyFile = config.getString(prefix + CFG_PRIV_KEY_FILE, ""); - params.certificateFile = config.getString(prefix + CFG_CERTIFICATE_FILE, params.privateKeyFile); - params.caLocation = config.getString(prefix + CFG_CA_LOCATION, ""); - - if (server && params.certificateFile.empty() && params.privateKeyFile.empty()) - throw SSLException("Configuration error: no certificate file has been specified"); - - // optional options for which we have defaults defined - params.verificationMode = VAL_VER_MODE; - if (config.hasProperty(prefix + CFG_VER_MODE)) - { - // either: none, relaxed, strict, once - std::string mode = config.getString(prefix + CFG_VER_MODE); - params.verificationMode = Utility::convertVerificationMode(mode); - } - - params.verificationDepth = config.getInt(prefix + CFG_VER_DEPTH, VAL_VER_DEPTH); - params.loadDefaultCAs = config.getBool(prefix + CFG_ENABLE_DEFAULT_CA, VAL_ENABLE_DEFAULT_CA); - params.cipherList = config.getString(prefix + CFG_CIPHER_LIST, VAL_CIPHER_LIST); - params.cipherList = config.getString(prefix + CFG_CYPHER_LIST, params.cipherList); // for backwards compatibility - bool requireTLSv1 = config.getBool(prefix + CFG_REQUIRE_TLSV1, false); - bool requireTLSv1_1 = config.getBool(prefix + CFG_REQUIRE_TLSV1_1, false); - bool requireTLSv1_2 = config.getBool(prefix + CFG_REQUIRE_TLSV1_2, false); - - params.dhParamsFile = config.getString(prefix + CFG_DH_PARAMS_FILE, ""); - params.ecdhCurve = config.getString(prefix + CFG_ECDH_CURVE, ""); - - Context::Usage usage; - - if (server) - { - if (requireTLSv1_2) - usage = Context::TLSV1_2_SERVER_USE; - else if (requireTLSv1_1) - usage = Context::TLSV1_1_SERVER_USE; - else if (requireTLSv1) - usage = Context::TLSV1_SERVER_USE; - else - usage = Context::SERVER_USE; - _ptrDefaultServerContext = new Context(usage, params); - } - else - { - if (requireTLSv1_2) - usage = Context::TLSV1_2_CLIENT_USE; - else if (requireTLSv1_1) - usage = Context::TLSV1_1_CLIENT_USE; - else if (requireTLSv1) - usage = Context::TLSV1_CLIENT_USE; - else - usage = Context::CLIENT_USE; - _ptrDefaultClientContext = new Context(usage, params); - } - - std::string disabledProtocolsList = config.getString(prefix + CFG_DISABLE_PROTOCOLS, ""); - Poco::StringTokenizer dpTok(disabledProtocolsList, ";,", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); - int disabledProtocols = 0; - for (Poco::StringTokenizer::Iterator it = dpTok.begin(); it != dpTok.end(); ++it) - { - if (*it == "sslv2") - disabledProtocols |= Context::PROTO_SSLV2; - else if (*it == "sslv3") - disabledProtocols |= Context::PROTO_SSLV3; - else if (*it == "tlsv1") - disabledProtocols |= Context::PROTO_TLSV1; - else if (*it == "tlsv1_1") - disabledProtocols |= Context::PROTO_TLSV1_1; - else if (*it == "tlsv1_2") - disabledProtocols |= Context::PROTO_TLSV1_2; - } - if (server) - _ptrDefaultServerContext->disableProtocols(disabledProtocols); - else - _ptrDefaultClientContext->disableProtocols(disabledProtocols); - - bool cacheSessions = config.getBool(prefix + CFG_CACHE_SESSIONS, false); - if (server) - { - std::string sessionIdContext = config.getString(prefix + CFG_SESSION_ID_CONTEXT, config.getString("application.name", "")); - _ptrDefaultServerContext->enableSessionCache(cacheSessions, sessionIdContext); - if (config.hasProperty(prefix + CFG_SESSION_CACHE_SIZE)) - { - int cacheSize = config.getInt(prefix + CFG_SESSION_CACHE_SIZE); - _ptrDefaultServerContext->setSessionCacheSize(cacheSize); - } - if (config.hasProperty(prefix + CFG_SESSION_TIMEOUT)) - { - int timeout = config.getInt(prefix + CFG_SESSION_TIMEOUT); - _ptrDefaultServerContext->setSessionTimeout(timeout); - } - } - else - { - _ptrDefaultClientContext->enableSessionCache(cacheSessions); - } - bool extendedVerification = config.getBool(prefix + CFG_EXTENDED_VERIFICATION, false); - if (server) - _ptrDefaultServerContext->enableExtendedCertificateVerification(extendedVerification); - else - _ptrDefaultClientContext->enableExtendedCertificateVerification(extendedVerification); - - bool preferServerCiphers = config.getBool(prefix + CFG_PREFER_SERVER_CIPHERS, false); - if (preferServerCiphers) - { - if (server) - _ptrDefaultServerContext->preferServerCiphers(); - else - _ptrDefaultClientContext->preferServerCiphers(); - } -} - - -void SSLManager::initEvents(bool server) -{ - initPassphraseHandler(server); - initCertificateHandler(server); -} - - -void SSLManager::initPassphraseHandler(bool server) -{ - if (server && _ptrServerPassphraseHandler) return; - if (!server && _ptrClientPassphraseHandler) return; - - std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; - Poco::Util::AbstractConfiguration& config = appConfig(); - - std::string className(config.getString(prefix + CFG_DELEGATE_HANDLER, VAL_DELEGATE_HANDLER)); - - const PrivateKeyFactory* pFactory = 0; - if (privateKeyFactoryMgr().hasFactory(className)) - { - pFactory = privateKeyFactoryMgr().getFactory(className); - } - - if (pFactory) - { - if (server) - _ptrServerPassphraseHandler = pFactory->create(server); - else - _ptrClientPassphraseHandler = pFactory->create(server); - } - else throw Poco::Util::UnknownOptionException(std::string("No passphrase handler known with the name ") + className); -} - - -void SSLManager::initCertificateHandler(bool server) -{ - if (server && _ptrServerCertificateHandler) return; - if (!server && _ptrClientCertificateHandler) return; - - std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; - Poco::Util::AbstractConfiguration& config = appConfig(); - - std::string className(config.getString(prefix+CFG_CERTIFICATE_HANDLER, VAL_CERTIFICATE_HANDLER)); - - const CertificateHandlerFactory* pFactory = 0; - if (certificateHandlerFactoryMgr().hasFactory(className)) - { - pFactory = certificateHandlerFactoryMgr().getFactory(className); - } - - if (pFactory) - { - if (server) - _ptrServerCertificateHandler = pFactory->create(true); - else - _ptrClientCertificateHandler = pFactory->create(false); - } - else throw Poco::Util::UnknownOptionException(std::string("No InvalidCertificate handler known with the name ") + className); -} - - -Poco::Util::AbstractConfiguration& SSLManager::appConfig() -{ - try - { - return Poco::Util::Application::instance().config(); - } - catch (Poco::NullPointerException&) - { - throw Poco::IllegalStateException( - "An application configuration is required to initialize the Poco::Net::SSLManager, " - "but no Poco::Util::Application instance is available." - ); - } -} - - -void initializeSSL() -{ - Poco::Crypto::initializeCrypto(); -} - - -void uninitializeSSL() -{ - SSLManager::instance().shutdown(); - Poco::Crypto::uninitializeCrypto(); -} - - -} } // namespace Poco::Net +// +// SSLManager.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: SSLManager +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SSLManager.h" +#include "Poco/Net/Context.h" +#include "Poco/Net/Utility.h" +#include "Poco/Net/PrivateKeyPassphraseHandler.h" +#include "Poco/Net/RejectCertificateHandler.h" +#include "Poco/Crypto/OpenSSLInitializer.h" +#include "Poco/Net/SSLException.h" +#include "Poco/SingletonHolder.h" +#include "Poco/Delegate.h" +#include "Poco/StringTokenizer.h" +#include "Poco/Util/Application.h" +#include "Poco/Util/OptionException.h" + + +namespace Poco { +namespace Net { + + +const std::string SSLManager::CFG_PRIV_KEY_FILE("privateKeyFile"); +const std::string SSLManager::CFG_CERTIFICATE_FILE("certificateFile"); +const std::string SSLManager::CFG_CA_LOCATION("caConfig"); +const std::string SSLManager::CFG_VER_MODE("verificationMode"); +const Context::VerificationMode SSLManager::VAL_VER_MODE(Context::VERIFY_RELAXED); +const std::string SSLManager::CFG_VER_DEPTH("verificationDepth"); +const int SSLManager::VAL_VER_DEPTH(9); +const std::string SSLManager::CFG_ENABLE_DEFAULT_CA("loadDefaultCAFile"); +const bool SSLManager::VAL_ENABLE_DEFAULT_CA(true); +const std::string SSLManager::CFG_CIPHER_LIST("cipherList"); +const std::string SSLManager::CFG_CYPHER_LIST("cypherList"); +const std::string SSLManager::VAL_CIPHER_LIST("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); +const std::string SSLManager::CFG_PREFER_SERVER_CIPHERS("preferServerCiphers"); +const std::string SSLManager::CFG_DELEGATE_HANDLER("privateKeyPassphraseHandler.name"); +const std::string SSLManager::VAL_DELEGATE_HANDLER("KeyConsoleHandler"); +const std::string SSLManager::CFG_CERTIFICATE_HANDLER("invalidCertificateHandler.name"); +const std::string SSLManager::VAL_CERTIFICATE_HANDLER("ConsoleCertificateHandler"); +const std::string SSLManager::CFG_SERVER_PREFIX("openSSL.server."); +const std::string SSLManager::CFG_CLIENT_PREFIX("openSSL.client."); +const std::string SSLManager::CFG_CACHE_SESSIONS("cacheSessions"); +const std::string SSLManager::CFG_SESSION_ID_CONTEXT("sessionIdContext"); +const std::string SSLManager::CFG_SESSION_CACHE_SIZE("sessionCacheSize"); +const std::string SSLManager::CFG_SESSION_TIMEOUT("sessionTimeout"); +const std::string SSLManager::CFG_EXTENDED_VERIFICATION("extendedVerification"); +const std::string SSLManager::CFG_REQUIRE_TLSV1("requireTLSv1"); +const std::string SSLManager::CFG_REQUIRE_TLSV1_1("requireTLSv1_1"); +const std::string SSLManager::CFG_REQUIRE_TLSV1_2("requireTLSv1_2"); +const std::string SSLManager::CFG_DISABLE_PROTOCOLS("disableProtocols"); +const std::string SSLManager::CFG_DH_PARAMS_FILE("dhParamsFile"); +const std::string SSLManager::CFG_ECDH_CURVE("ecdhCurve"); +#ifdef OPENSSL_FIPS +const std::string SSLManager::CFG_FIPS_MODE("openSSL.fips"); +const bool SSLManager::VAL_FIPS_MODE(false); +#endif + + +SSLManager::SSLManager() +{ +} + + +SSLManager::~SSLManager() +{ + try + { + shutdown(); + } + catch (...) + { + poco_unexpected(); + } +} + + +void SSLManager::shutdown() +{ + PrivateKeyPassphraseRequired.clear(); + ClientVerificationError.clear(); + ServerVerificationError.clear(); + _ptrDefaultServerContext = 0; + _ptrDefaultClientContext = 0; +} + + +namespace +{ + static Poco::SingletonHolder<SSLManager> singleton; +} + + +SSLManager& SSLManager::instance() +{ + return *singleton.get(); +} + + +void SSLManager::initializeServer(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrHandler, Context::Ptr ptrContext) +{ + _ptrServerPassphraseHandler = ptrPassphraseHandler; + _ptrServerCertificateHandler = ptrHandler; + _ptrDefaultServerContext = ptrContext; +} + + +void SSLManager::initializeClient(PrivateKeyPassphraseHandlerPtr ptrPassphraseHandler, InvalidCertificateHandlerPtr ptrHandler, Context::Ptr ptrContext) +{ + _ptrClientPassphraseHandler = ptrPassphraseHandler; + _ptrClientCertificateHandler = ptrHandler; + _ptrDefaultClientContext = ptrContext; +} + + +Context::Ptr SSLManager::defaultServerContext() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrDefaultServerContext) + initDefaultContext(true); + + return _ptrDefaultServerContext; +} + + +Context::Ptr SSLManager::defaultClientContext() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrDefaultClientContext) + { + try + { + initDefaultContext(false); + } + catch (Poco::IllegalStateException&) + { + _ptrClientCertificateHandler = new RejectCertificateHandler(false); + _ptrDefaultClientContext = new Context(Context::CLIENT_USE, "", Context::VERIFY_RELAXED, 9, true); + _ptrDefaultClientContext->disableProtocols(Context::PROTO_SSLV2 | Context::PROTO_SSLV3); + } + } + + return _ptrDefaultClientContext; +} + + +SSLManager::PrivateKeyPassphraseHandlerPtr SSLManager::serverPassphraseHandler() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrServerPassphraseHandler) + initPassphraseHandler(true); + + return _ptrServerPassphraseHandler; +} + + +SSLManager::PrivateKeyPassphraseHandlerPtr SSLManager::clientPassphraseHandler() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrClientPassphraseHandler) + initPassphraseHandler(false); + + return _ptrClientPassphraseHandler; +} + + +SSLManager::InvalidCertificateHandlerPtr SSLManager::serverCertificateHandler() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrServerCertificateHandler) + initCertificateHandler(true); + + return _ptrServerCertificateHandler; +} + + +SSLManager::InvalidCertificateHandlerPtr SSLManager::clientCertificateHandler() +{ + Poco::FastMutex::ScopedLock lock(_mutex); + + if (!_ptrClientCertificateHandler) + initCertificateHandler(false); + + return _ptrClientCertificateHandler; +} + + +int SSLManager::verifyCallback(bool server, int ok, X509_STORE_CTX* pStore) +{ + if (!ok) + { + X509* pCert = X509_STORE_CTX_get_current_cert(pStore); + X509Certificate x509(pCert, true); + int depth = X509_STORE_CTX_get_error_depth(pStore); + int err = X509_STORE_CTX_get_error(pStore); + std::string error(X509_verify_cert_error_string(err)); + VerificationErrorArgs args(x509, depth, err, error); + if (server) + SSLManager::instance().ServerVerificationError.notify(&SSLManager::instance(), args); + else + SSLManager::instance().ClientVerificationError.notify(&SSLManager::instance(), args); + ok = args.getIgnoreError() ? 1 : 0; + } + + return ok; +} + + +int SSLManager::privateKeyPassphraseCallback(char* pBuf, int size, int /*flag*/, void* /*userData*/) +{ + std::string pwd; + SSLManager::instance().PrivateKeyPassphraseRequired.notify(&SSLManager::instance(), pwd); + + strncpy(pBuf, (char *)(pwd.c_str()), size); + pBuf[size - 1] = '\0'; + if (size > pwd.length()) + size = (int) pwd.length(); + + return size; +} + + +void SSLManager::initDefaultContext(bool server) +{ + if (server && _ptrDefaultServerContext) return; + if (!server && _ptrDefaultClientContext) return; + + Poco::Crypto::OpenSSLInitializer openSSLInitializer; + initEvents(server); + Poco::Util::AbstractConfiguration& config = appConfig(); + +#ifdef OPENSSL_FIPS + bool fipsEnabled = config.getBool(CFG_FIPS_MODE, VAL_FIPS_MODE); + if (fipsEnabled && !Poco::Crypto::OpenSSLInitializer::isFIPSEnabled()) + { + Poco::Crypto::OpenSSLInitializer::enableFIPSMode(true); + } +#endif + + std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; + + Context::Params params; + // mandatory options + params.privateKeyFile = config.getString(prefix + CFG_PRIV_KEY_FILE, ""); + params.certificateFile = config.getString(prefix + CFG_CERTIFICATE_FILE, params.privateKeyFile); + params.caLocation = config.getString(prefix + CFG_CA_LOCATION, ""); + + if (server && params.certificateFile.empty() && params.privateKeyFile.empty()) + throw SSLException("Configuration error: no certificate file has been specified"); + + // optional options for which we have defaults defined + params.verificationMode = VAL_VER_MODE; + if (config.hasProperty(prefix + CFG_VER_MODE)) + { + // either: none, relaxed, strict, once + std::string mode = config.getString(prefix + CFG_VER_MODE); + params.verificationMode = Utility::convertVerificationMode(mode); + } + + params.verificationDepth = config.getInt(prefix + CFG_VER_DEPTH, VAL_VER_DEPTH); + params.loadDefaultCAs = config.getBool(prefix + CFG_ENABLE_DEFAULT_CA, VAL_ENABLE_DEFAULT_CA); + params.cipherList = config.getString(prefix + CFG_CIPHER_LIST, VAL_CIPHER_LIST); + params.cipherList = config.getString(prefix + CFG_CYPHER_LIST, params.cipherList); // for backwards compatibility + bool requireTLSv1 = config.getBool(prefix + CFG_REQUIRE_TLSV1, false); + bool requireTLSv1_1 = config.getBool(prefix + CFG_REQUIRE_TLSV1_1, false); + bool requireTLSv1_2 = config.getBool(prefix + CFG_REQUIRE_TLSV1_2, false); + + params.dhParamsFile = config.getString(prefix + CFG_DH_PARAMS_FILE, ""); + params.ecdhCurve = config.getString(prefix + CFG_ECDH_CURVE, ""); + + Context::Usage usage; + + if (server) + { + if (requireTLSv1_2) + usage = Context::TLSV1_2_SERVER_USE; + else if (requireTLSv1_1) + usage = Context::TLSV1_1_SERVER_USE; + else if (requireTLSv1) + usage = Context::TLSV1_SERVER_USE; + else + usage = Context::SERVER_USE; + _ptrDefaultServerContext = new Context(usage, params); + } + else + { + if (requireTLSv1_2) + usage = Context::TLSV1_2_CLIENT_USE; + else if (requireTLSv1_1) + usage = Context::TLSV1_1_CLIENT_USE; + else if (requireTLSv1) + usage = Context::TLSV1_CLIENT_USE; + else + usage = Context::CLIENT_USE; + _ptrDefaultClientContext = new Context(usage, params); + } + + std::string disabledProtocolsList = config.getString(prefix + CFG_DISABLE_PROTOCOLS, ""); + Poco::StringTokenizer dpTok(disabledProtocolsList, ";,", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); + int disabledProtocols = 0; + for (Poco::StringTokenizer::Iterator it = dpTok.begin(); it != dpTok.end(); ++it) + { + if (*it == "sslv2") + disabledProtocols |= Context::PROTO_SSLV2; + else if (*it == "sslv3") + disabledProtocols |= Context::PROTO_SSLV3; + else if (*it == "tlsv1") + disabledProtocols |= Context::PROTO_TLSV1; + else if (*it == "tlsv1_1") + disabledProtocols |= Context::PROTO_TLSV1_1; + else if (*it == "tlsv1_2") + disabledProtocols |= Context::PROTO_TLSV1_2; + } + if (server) + _ptrDefaultServerContext->disableProtocols(disabledProtocols); + else + _ptrDefaultClientContext->disableProtocols(disabledProtocols); + + bool cacheSessions = config.getBool(prefix + CFG_CACHE_SESSIONS, false); + if (server) + { + std::string sessionIdContext = config.getString(prefix + CFG_SESSION_ID_CONTEXT, config.getString("application.name", "")); + _ptrDefaultServerContext->enableSessionCache(cacheSessions, sessionIdContext); + if (config.hasProperty(prefix + CFG_SESSION_CACHE_SIZE)) + { + int cacheSize = config.getInt(prefix + CFG_SESSION_CACHE_SIZE); + _ptrDefaultServerContext->setSessionCacheSize(cacheSize); + } + if (config.hasProperty(prefix + CFG_SESSION_TIMEOUT)) + { + int timeout = config.getInt(prefix + CFG_SESSION_TIMEOUT); + _ptrDefaultServerContext->setSessionTimeout(timeout); + } + } + else + { + _ptrDefaultClientContext->enableSessionCache(cacheSessions); + } + bool extendedVerification = config.getBool(prefix + CFG_EXTENDED_VERIFICATION, false); + if (server) + _ptrDefaultServerContext->enableExtendedCertificateVerification(extendedVerification); + else + _ptrDefaultClientContext->enableExtendedCertificateVerification(extendedVerification); + + bool preferServerCiphers = config.getBool(prefix + CFG_PREFER_SERVER_CIPHERS, false); + if (preferServerCiphers) + { + if (server) + _ptrDefaultServerContext->preferServerCiphers(); + else + _ptrDefaultClientContext->preferServerCiphers(); + } +} + + +void SSLManager::initEvents(bool server) +{ + initPassphraseHandler(server); + initCertificateHandler(server); +} + + +void SSLManager::initPassphraseHandler(bool server) +{ + if (server && _ptrServerPassphraseHandler) return; + if (!server && _ptrClientPassphraseHandler) return; + + std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; + Poco::Util::AbstractConfiguration& config = appConfig(); + + std::string className(config.getString(prefix + CFG_DELEGATE_HANDLER, VAL_DELEGATE_HANDLER)); + + const PrivateKeyFactory* pFactory = 0; + if (privateKeyFactoryMgr().hasFactory(className)) + { + pFactory = privateKeyFactoryMgr().getFactory(className); + } + + if (pFactory) + { + if (server) + _ptrServerPassphraseHandler = pFactory->create(server); + else + _ptrClientPassphraseHandler = pFactory->create(server); + } + else throw Poco::Util::UnknownOptionException(std::string("No passphrase handler known with the name ") + className); +} + + +void SSLManager::initCertificateHandler(bool server) +{ + if (server && _ptrServerCertificateHandler) return; + if (!server && _ptrClientCertificateHandler) return; + + std::string prefix = server ? CFG_SERVER_PREFIX : CFG_CLIENT_PREFIX; + Poco::Util::AbstractConfiguration& config = appConfig(); + + std::string className(config.getString(prefix+CFG_CERTIFICATE_HANDLER, VAL_CERTIFICATE_HANDLER)); + + const CertificateHandlerFactory* pFactory = 0; + if (certificateHandlerFactoryMgr().hasFactory(className)) + { + pFactory = certificateHandlerFactoryMgr().getFactory(className); + } + + if (pFactory) + { + if (server) + _ptrServerCertificateHandler = pFactory->create(true); + else + _ptrClientCertificateHandler = pFactory->create(false); + } + else throw Poco::Util::UnknownOptionException(std::string("No InvalidCertificate handler known with the name ") + className); +} + + +Poco::Util::AbstractConfiguration& SSLManager::appConfig() +{ + try + { + return Poco::Util::Application::instance().config(); + } + catch (Poco::NullPointerException&) + { + throw Poco::IllegalStateException( + "An application configuration is required to initialize the Poco::Net::SSLManager, " + "but no Poco::Util::Application instance is available." + ); + } +} + + +void initializeSSL() +{ + Poco::Crypto::initializeCrypto(); +} + + +void uninitializeSSL() +{ + SSLManager::instance().shutdown(); + Poco::Crypto::uninitializeCrypto(); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSMTPClientSession.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSMTPClientSession.cpp index c1a9569bc7..ff0fd5b0d4 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSMTPClientSession.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSMTPClientSession.cpp @@ -1,64 +1,64 @@ -// -// SecureSMTPClientSession.h -// -// Library: NetSSL_OpenSSL -// Package: Mail -// Module: SecureSMTPClientSession -// -// Copyright (c) 2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureSMTPClientSession.h" -#include "Poco/Net/SecureStreamSocket.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Net/DialogSocket.h" - - -namespace Poco { -namespace Net { - - -SecureSMTPClientSession::SecureSMTPClientSession(const StreamSocket& socket): - SMTPClientSession(socket) -{ -} - - -SecureSMTPClientSession::SecureSMTPClientSession(const std::string& host, Poco::UInt16 port): - SMTPClientSession(host, port), - _host(host) -{ -} - - -SecureSMTPClientSession::~SecureSMTPClientSession() -{ -} - - -bool SecureSMTPClientSession::startTLS() -{ - return startTLS(SSLManager::instance().defaultClientContext()); -} - - -bool SecureSMTPClientSession::startTLS(Context::Ptr pContext) -{ - int status = 0; - std::string response; - - status = sendCommand("STARTTLS", response); - if (!isPositiveCompletion(status)) return false; - - SecureStreamSocket sss(SecureStreamSocket::attach(socket(), _host, pContext)); - socket() = sss; - - return true; -} - - -} } // namespace Poco::Net +// +// SecureSMTPClientSession.h +// +// Library: NetSSL_OpenSSL +// Package: Mail +// Module: SecureSMTPClientSession +// +// Copyright (c) 2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureSMTPClientSession.h" +#include "Poco/Net/SecureStreamSocket.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Net/DialogSocket.h" + + +namespace Poco { +namespace Net { + + +SecureSMTPClientSession::SecureSMTPClientSession(const StreamSocket& socket): + SMTPClientSession(socket) +{ +} + + +SecureSMTPClientSession::SecureSMTPClientSession(const std::string& host, Poco::UInt16 port): + SMTPClientSession(host, port), + _host(host) +{ +} + + +SecureSMTPClientSession::~SecureSMTPClientSession() +{ +} + + +bool SecureSMTPClientSession::startTLS() +{ + return startTLS(SSLManager::instance().defaultClientContext()); +} + + +bool SecureSMTPClientSession::startTLS(Context::Ptr pContext) +{ + int status = 0; + std::string response; + + status = sendCommand("STARTTLS", response); + if (!isPositiveCompletion(status)) return false; + + SecureStreamSocket sss(SecureStreamSocket::attach(socket(), _host, pContext)); + socket() = sss; + + return true; +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocket.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocket.cpp index a394304ace..b5ab4c15f0 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocket.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocket.cpp @@ -1,121 +1,121 @@ -// -// SecureServerSocket.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLSockets -// Module: SecureServerSocket -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureServerSocket.h" -#include "Poco/Net/SecureServerSocketImpl.h" -#include "Poco/Net/SecureStreamSocket.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Exception.h" - - -using Poco::InvalidArgumentException; - - -namespace Poco { -namespace Net { - - -SecureServerSocket::SecureServerSocket(): - ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) -{ -} - - -SecureServerSocket::SecureServerSocket(Context::Ptr pContext): - ServerSocket(new SecureServerSocketImpl(pContext), true) -{ -} - - -SecureServerSocket::SecureServerSocket(const Socket& socket): - ServerSocket(socket) -{ - if (!dynamic_cast<SecureServerSocketImpl*>(impl())) - throw InvalidArgumentException("Cannot assign incompatible socket"); -} - - -SecureServerSocket::SecureServerSocket(const SocketAddress& address, int backlog): - ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) -{ - impl()->bind(address, true); - impl()->listen(backlog); -} - - -SecureServerSocket::SecureServerSocket(const SocketAddress& address, int backlog, Context::Ptr pContext): - ServerSocket(new SecureServerSocketImpl(pContext), true) -{ - impl()->bind(address, true); - impl()->listen(backlog); -} - - -SecureServerSocket::SecureServerSocket(Poco::UInt16 port, int backlog): - ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) -{ - IPAddress wildcardAddr; - SocketAddress address(wildcardAddr, port); - impl()->bind(address, true); - impl()->listen(backlog); -} - -SecureServerSocket::SecureServerSocket(Poco::UInt16 port, int backlog, Context::Ptr pContext): - ServerSocket(new SecureServerSocketImpl(pContext), true) -{ - IPAddress wildcardAddr; - SocketAddress address(wildcardAddr, port); - impl()->bind(address, true); - impl()->listen(backlog); -} - - -SecureServerSocket::~SecureServerSocket() -{ -} - - -SecureServerSocket& SecureServerSocket::operator = (const Socket& socket) -{ - if (&socket != this) - { - if (dynamic_cast<SecureServerSocketImpl*>(socket.impl())) - ServerSocket::operator = (socket); - else - throw InvalidArgumentException("Cannot assign incompatible socket"); - } - return *this; -} - - -StreamSocket SecureServerSocket::acceptConnection(SocketAddress& clientAddr) -{ - return SecureStreamSocket(impl()->acceptConnection(clientAddr)); -} - - -StreamSocket SecureServerSocket::acceptConnection() -{ - SocketAddress clientAddr; - return SecureStreamSocket(impl()->acceptConnection(clientAddr)); -} - - -Context::Ptr SecureServerSocket::context() const -{ - return static_cast<SecureServerSocketImpl*>(impl())->context(); -} - - -} } // namespace Poco::Net +// +// SecureServerSocket.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLSockets +// Module: SecureServerSocket +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureServerSocket.h" +#include "Poco/Net/SecureServerSocketImpl.h" +#include "Poco/Net/SecureStreamSocket.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Exception.h" + + +using Poco::InvalidArgumentException; + + +namespace Poco { +namespace Net { + + +SecureServerSocket::SecureServerSocket(): + ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) +{ +} + + +SecureServerSocket::SecureServerSocket(Context::Ptr pContext): + ServerSocket(new SecureServerSocketImpl(pContext), true) +{ +} + + +SecureServerSocket::SecureServerSocket(const Socket& socket): + ServerSocket(socket) +{ + if (!dynamic_cast<SecureServerSocketImpl*>(impl())) + throw InvalidArgumentException("Cannot assign incompatible socket"); +} + + +SecureServerSocket::SecureServerSocket(const SocketAddress& address, int backlog): + ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) +{ + impl()->bind(address, true); + impl()->listen(backlog); +} + + +SecureServerSocket::SecureServerSocket(const SocketAddress& address, int backlog, Context::Ptr pContext): + ServerSocket(new SecureServerSocketImpl(pContext), true) +{ + impl()->bind(address, true); + impl()->listen(backlog); +} + + +SecureServerSocket::SecureServerSocket(Poco::UInt16 port, int backlog): + ServerSocket(new SecureServerSocketImpl(SSLManager::instance().defaultServerContext()), true) +{ + IPAddress wildcardAddr; + SocketAddress address(wildcardAddr, port); + impl()->bind(address, true); + impl()->listen(backlog); +} + +SecureServerSocket::SecureServerSocket(Poco::UInt16 port, int backlog, Context::Ptr pContext): + ServerSocket(new SecureServerSocketImpl(pContext), true) +{ + IPAddress wildcardAddr; + SocketAddress address(wildcardAddr, port); + impl()->bind(address, true); + impl()->listen(backlog); +} + + +SecureServerSocket::~SecureServerSocket() +{ +} + + +SecureServerSocket& SecureServerSocket::operator = (const Socket& socket) +{ + if (&socket != this) + { + if (dynamic_cast<SecureServerSocketImpl*>(socket.impl())) + ServerSocket::operator = (socket); + else + throw InvalidArgumentException("Cannot assign incompatible socket"); + } + return *this; +} + + +StreamSocket SecureServerSocket::acceptConnection(SocketAddress& clientAddr) +{ + return SecureStreamSocket(impl()->acceptConnection(clientAddr)); +} + + +StreamSocket SecureServerSocket::acceptConnection() +{ + SocketAddress clientAddr; + return SecureStreamSocket(impl()->acceptConnection(clientAddr)); +} + + +Context::Ptr SecureServerSocket::context() const +{ + return static_cast<SecureServerSocketImpl*>(impl())->context(); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocketImpl.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocketImpl.cpp index 0175622a73..46df3b1cc5 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocketImpl.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureServerSocketImpl.cpp @@ -1,122 +1,122 @@ -// -// SecureServerSocketImpl.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLSockets -// Module: SecureServerSocketImpl -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureServerSocketImpl.h" - - -namespace Poco { -namespace Net { - - -SecureServerSocketImpl::SecureServerSocketImpl(Context::Ptr pContext): - _impl(new ServerSocketImpl, pContext) -{ -} - - -SecureServerSocketImpl::~SecureServerSocketImpl() -{ - try - { - reset(); - } - catch (...) - { - poco_unexpected(); - } -} - - -SocketImpl* SecureServerSocketImpl::acceptConnection(SocketAddress& clientAddr) -{ - return _impl.acceptConnection(clientAddr); -} - - -void SecureServerSocketImpl::connect(const SocketAddress& /*address*/) -{ - throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); -} - - -void SecureServerSocketImpl::connect(const SocketAddress& /*address*/, const Poco::Timespan& /*timeout*/) -{ - throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); -} - - -void SecureServerSocketImpl::connectNB(const SocketAddress& /*address*/) -{ - throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); -} - - -void SecureServerSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) -{ - _impl.bind(address, reuseAddress, reusePort); - reset(_impl.sockfd()); -} - - -void SecureServerSocketImpl::listen(int backlog) -{ - _impl.listen(backlog); - reset(_impl.sockfd()); -} - - -void SecureServerSocketImpl::close() -{ - reset(); - _impl.close(); -} - - -int SecureServerSocketImpl::sendBytes(const void* /*buffer*/, int /*length*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot sendBytes() on a SecureServerSocket"); -} - - -int SecureServerSocketImpl::receiveBytes(void* /*buffer*/, int /*length*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot receiveBytes() on a SecureServerSocket"); -} - - -int SecureServerSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot sendTo() on a SecureServerSocket"); -} - - -int SecureServerSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot receiveFrom() on a SecureServerSocket"); -} - - -void SecureServerSocketImpl::sendUrgent(unsigned char /*data*/) -{ - throw Poco::InvalidAccessException("Cannot sendUrgent() on a SecureServerSocket"); -} - - -bool SecureServerSocketImpl::secure() const -{ - return true; -} - - -} } // namespace Poco::Net +// +// SecureServerSocketImpl.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLSockets +// Module: SecureServerSocketImpl +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureServerSocketImpl.h" + + +namespace Poco { +namespace Net { + + +SecureServerSocketImpl::SecureServerSocketImpl(Context::Ptr pContext): + _impl(new ServerSocketImpl, pContext) +{ +} + + +SecureServerSocketImpl::~SecureServerSocketImpl() +{ + try + { + reset(); + } + catch (...) + { + poco_unexpected(); + } +} + + +SocketImpl* SecureServerSocketImpl::acceptConnection(SocketAddress& clientAddr) +{ + return _impl.acceptConnection(clientAddr); +} + + +void SecureServerSocketImpl::connect(const SocketAddress& /*address*/) +{ + throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); +} + + +void SecureServerSocketImpl::connect(const SocketAddress& /*address*/, const Poco::Timespan& /*timeout*/) +{ + throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); +} + + +void SecureServerSocketImpl::connectNB(const SocketAddress& /*address*/) +{ + throw Poco::InvalidAccessException("Cannot connect() a SecureServerSocket"); +} + + +void SecureServerSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) +{ + _impl.bind(address, reuseAddress, reusePort); + reset(_impl.sockfd()); +} + + +void SecureServerSocketImpl::listen(int backlog) +{ + _impl.listen(backlog); + reset(_impl.sockfd()); +} + + +void SecureServerSocketImpl::close() +{ + reset(); + _impl.close(); +} + + +int SecureServerSocketImpl::sendBytes(const void* /*buffer*/, int /*length*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot sendBytes() on a SecureServerSocket"); +} + + +int SecureServerSocketImpl::receiveBytes(void* /*buffer*/, int /*length*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot receiveBytes() on a SecureServerSocket"); +} + + +int SecureServerSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot sendTo() on a SecureServerSocket"); +} + + +int SecureServerSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot receiveFrom() on a SecureServerSocket"); +} + + +void SecureServerSocketImpl::sendUrgent(unsigned char /*data*/) +{ + throw Poco::InvalidAccessException("Cannot sendUrgent() on a SecureServerSocket"); +} + + +bool SecureServerSocketImpl::secure() const +{ + return true; +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSocketImpl.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSocketImpl.cpp index ef924d66ac..564bc18683 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSocketImpl.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureSocketImpl.cpp @@ -1,49 +1,49 @@ -// -// SecureSocketImpl.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLSockets -// Module: SecureSocketImpl -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureSocketImpl.h" -#include "Poco/Net/SSLException.h" -#include "Poco/Net/Context.h" -#include "Poco/Net/X509Certificate.h" -#include "Poco/Net/Utility.h" -#include "Poco/Net/SecureStreamSocket.h" -#include "Poco/Net/SecureStreamSocketImpl.h" -#include "Poco/Net/StreamSocketImpl.h" -#include "Poco/Net/StreamSocket.h" -#include "Poco/Net/NetException.h" -#include "Poco/Net/DNS.h" -#include "Poco/NumberFormatter.h" -#include "Poco/NumberParser.h" -#include "Poco/Format.h" -#include <openssl/x509v3.h> -#include <openssl/err.h> - - -using Poco::IOException; -using Poco::TimeoutException; -using Poco::InvalidArgumentException; -using Poco::NumberFormatter; -using Poco::Timespan; - - -// workaround for C++-incompatible macro -#define POCO_BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(void*)((n)?"a":NULL)) - - -namespace Poco { -namespace Net { - +// +// SecureSocketImpl.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLSockets +// Module: SecureSocketImpl +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureSocketImpl.h" +#include "Poco/Net/SSLException.h" +#include "Poco/Net/Context.h" +#include "Poco/Net/X509Certificate.h" +#include "Poco/Net/Utility.h" +#include "Poco/Net/SecureStreamSocket.h" +#include "Poco/Net/SecureStreamSocketImpl.h" +#include "Poco/Net/StreamSocketImpl.h" +#include "Poco/Net/StreamSocket.h" +#include "Poco/Net/NetException.h" +#include "Poco/Net/DNS.h" +#include "Poco/NumberFormatter.h" +#include "Poco/NumberParser.h" +#include "Poco/Format.h" +#include <openssl/x509v3.h> +#include <openssl/err.h> + + +using Poco::IOException; +using Poco::TimeoutException; +using Poco::InvalidArgumentException; +using Poco::NumberFormatter; +using Poco::Timespan; + + +// workaround for C++-incompatible macro +#define POCO_BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(void*)((n)?"a":NULL)) + + +namespace Poco { +namespace Net { + struct RemainingTimeCounter { RemainingTimeCounter(Poco::Timespan& remainingTime_) : remainingTime(remainingTime_) {}; @@ -60,137 +60,137 @@ private: Poco::Timespan& remainingTime; Poco::Timestamp start; }; - -SecureSocketImpl::SecureSocketImpl(Poco::AutoPtr<SocketImpl> pSocketImpl, Context::Ptr pContext): - _pSSL(0), - _pSocket(pSocketImpl), - _pContext(pContext), - _needHandshake(false) -{ - poco_check_ptr (_pSocket); - poco_check_ptr (_pContext); -} - - -SecureSocketImpl::~SecureSocketImpl() -{ - try - { - reset(); - } - catch (...) - { - poco_unexpected(); - } -} - - -SocketImpl* SecureSocketImpl::acceptConnection(SocketAddress& clientAddr) -{ - poco_assert (!_pSSL); - - StreamSocket ss = _pSocket->acceptConnection(clientAddr); - Poco::AutoPtr<SecureStreamSocketImpl> pSecureStreamSocketImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(ss.impl()), _pContext); - pSecureStreamSocketImpl->acceptSSL(); - pSecureStreamSocketImpl->duplicate(); - return pSecureStreamSocketImpl; -} - - -void SecureSocketImpl::acceptSSL() -{ - poco_assert (!_pSSL); - - BIO* pBIO = BIO_new(BIO_s_socket()); - if (!pBIO) throw SSLException("Cannot create BIO object"); - BIO_set_fd(pBIO, static_cast<int>(_pSocket->sockfd()), BIO_NOCLOSE); - - _pSSL = SSL_new(_pContext->sslContext()); - if (!_pSSL) - { - BIO_free(pBIO); - throw SSLException("Cannot create SSL object"); - } - SSL_set_bio(_pSSL, pBIO, pBIO); - SSL_set_accept_state(_pSSL); - _needHandshake = true; -} - - -void SecureSocketImpl::connect(const SocketAddress& address, bool performHandshake) -{ - if (_pSSL) reset(); - - poco_assert (!_pSSL); - - _pSocket->connect(address); - connectSSL(performHandshake); -} - - -void SecureSocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout, bool performHandshake) -{ - if (_pSSL) reset(); - - poco_assert (!_pSSL); - - _pSocket->connect(address, timeout); + +SecureSocketImpl::SecureSocketImpl(Poco::AutoPtr<SocketImpl> pSocketImpl, Context::Ptr pContext): + _pSSL(0), + _pSocket(pSocketImpl), + _pContext(pContext), + _needHandshake(false) +{ + poco_check_ptr (_pSocket); + poco_check_ptr (_pContext); +} + + +SecureSocketImpl::~SecureSocketImpl() +{ + try + { + reset(); + } + catch (...) + { + poco_unexpected(); + } +} + + +SocketImpl* SecureSocketImpl::acceptConnection(SocketAddress& clientAddr) +{ + poco_assert (!_pSSL); + + StreamSocket ss = _pSocket->acceptConnection(clientAddr); + Poco::AutoPtr<SecureStreamSocketImpl> pSecureStreamSocketImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(ss.impl()), _pContext); + pSecureStreamSocketImpl->acceptSSL(); + pSecureStreamSocketImpl->duplicate(); + return pSecureStreamSocketImpl; +} + + +void SecureSocketImpl::acceptSSL() +{ + poco_assert (!_pSSL); + + BIO* pBIO = BIO_new(BIO_s_socket()); + if (!pBIO) throw SSLException("Cannot create BIO object"); + BIO_set_fd(pBIO, static_cast<int>(_pSocket->sockfd()), BIO_NOCLOSE); + + _pSSL = SSL_new(_pContext->sslContext()); + if (!_pSSL) + { + BIO_free(pBIO); + throw SSLException("Cannot create SSL object"); + } + SSL_set_bio(_pSSL, pBIO, pBIO); + SSL_set_accept_state(_pSSL); + _needHandshake = true; +} + + +void SecureSocketImpl::connect(const SocketAddress& address, bool performHandshake) +{ + if (_pSSL) reset(); + + poco_assert (!_pSSL); + + _pSocket->connect(address); + connectSSL(performHandshake); +} + + +void SecureSocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout, bool performHandshake) +{ + if (_pSSL) reset(); + + poco_assert (!_pSSL); + + _pSocket->connect(address, timeout); //FIXME it updates timeouts of SecureStreamSocketImpl::underlying_socket it does not update timeouts of SecureStreamSocketImpl //However, timeouts of SecureStreamSocketImpl are not used in connectSSL() and previous settings are restored after - Poco::Timespan receiveTimeout = _pSocket->getReceiveTimeout(); - Poco::Timespan sendTimeout = _pSocket->getSendTimeout(); - _pSocket->setReceiveTimeout(timeout); - _pSocket->setSendTimeout(timeout); - connectSSL(performHandshake); - _pSocket->setReceiveTimeout(receiveTimeout); - _pSocket->setSendTimeout(sendTimeout); -} - - -void SecureSocketImpl::connectNB(const SocketAddress& address) -{ - if (_pSSL) reset(); - - poco_assert (!_pSSL); - - _pSocket->connectNB(address); - connectSSL(false); -} - - -void SecureSocketImpl::connectSSL(bool performHandshake) -{ - poco_assert (!_pSSL); - poco_assert (_pSocket->initialized()); - - BIO* pBIO = BIO_new(BIO_s_socket()); - if (!pBIO) throw SSLException("Cannot create SSL BIO object"); - BIO_set_fd(pBIO, static_cast<int>(_pSocket->sockfd()), BIO_NOCLOSE); - - _pSSL = SSL_new(_pContext->sslContext()); - if (!_pSSL) - { - BIO_free(pBIO); - throw SSLException("Cannot create SSL object"); - } - SSL_set_bio(_pSSL, pBIO, pBIO); - -#if OPENSSL_VERSION_NUMBER >= 0x0908060L && !defined(OPENSSL_NO_TLSEXT) - if (!_peerHostName.empty()) - { - SSL_set_tlsext_host_name(_pSSL, _peerHostName.c_str()); - } -#endif - - if (_pSession) - { - SSL_set_session(_pSSL, _pSession->sslSession()); - } - - try - { - if (performHandshake && _pSocket->getBlocking()) - { + Poco::Timespan receiveTimeout = _pSocket->getReceiveTimeout(); + Poco::Timespan sendTimeout = _pSocket->getSendTimeout(); + _pSocket->setReceiveTimeout(timeout); + _pSocket->setSendTimeout(timeout); + connectSSL(performHandshake); + _pSocket->setReceiveTimeout(receiveTimeout); + _pSocket->setSendTimeout(sendTimeout); +} + + +void SecureSocketImpl::connectNB(const SocketAddress& address) +{ + if (_pSSL) reset(); + + poco_assert (!_pSSL); + + _pSocket->connectNB(address); + connectSSL(false); +} + + +void SecureSocketImpl::connectSSL(bool performHandshake) +{ + poco_assert (!_pSSL); + poco_assert (_pSocket->initialized()); + + BIO* pBIO = BIO_new(BIO_s_socket()); + if (!pBIO) throw SSLException("Cannot create SSL BIO object"); + BIO_set_fd(pBIO, static_cast<int>(_pSocket->sockfd()), BIO_NOCLOSE); + + _pSSL = SSL_new(_pContext->sslContext()); + if (!_pSSL) + { + BIO_free(pBIO); + throw SSLException("Cannot create SSL object"); + } + SSL_set_bio(_pSSL, pBIO, pBIO); + +#if OPENSSL_VERSION_NUMBER >= 0x0908060L && !defined(OPENSSL_NO_TLSEXT) + if (!_peerHostName.empty()) + { + SSL_set_tlsext_host_name(_pSSL, _peerHostName.c_str()); + } +#endif + + if (_pSession) + { + SSL_set_session(_pSSL, _pSession->sslSession()); + } + + try + { + if (performHandshake && _pSocket->getBlocking()) + { int ret; Poco::Timespan remaining_time = getMaxTimeout(); do @@ -199,237 +199,237 @@ void SecureSocketImpl::connectSSL(bool performHandshake) ret = SSL_connect(_pSSL); } while (mustRetry(ret, remaining_time)); - handleError(ret); - verifyPeerCertificate(); - } - else - { - SSL_set_connect_state(_pSSL); - _needHandshake = true; - } - } - catch (...) - { - SSL_free(_pSSL); - _pSSL = 0; - throw; - } -} - - -void SecureSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) -{ - poco_check_ptr (_pSocket); - - _pSocket->bind(address, reuseAddress, reusePort); -} - - -void SecureSocketImpl::listen(int backlog) -{ - poco_check_ptr (_pSocket); - - _pSocket->listen(backlog); -} - - -void SecureSocketImpl::shutdown() -{ - if (_pSSL) - { - // Don't shut down the socket more than once. - int shutdownState = SSL_get_shutdown(_pSSL); - bool shutdownSent = (shutdownState & SSL_SENT_SHUTDOWN) == SSL_SENT_SHUTDOWN; - if (!shutdownSent) - { - // A proper clean shutdown would require us to - // retry the shutdown if we get a zero return - // value, until SSL_shutdown() returns 1. - // However, this will lead to problems with - // most web browsers, so we just set the shutdown - // flag by calling SSL_shutdown() once and be - // done with it. - int rc = SSL_shutdown(_pSSL); - if (rc < 0) handleError(rc); - if (_pSocket->getBlocking()) - { - _pSocket->shutdown(); - } - } - } -} - - -void SecureSocketImpl::close() -{ - try - { - shutdown(); - } - catch (...) - { - } - _pSocket->close(); -} - - -int SecureSocketImpl::sendBytes(const void* buffer, int length, int /*flags*/) -{ - poco_assert (_pSocket->initialized()); - poco_check_ptr (_pSSL); - - int rc; - if (_needHandshake) - { - rc = completeHandshake(); - if (rc == 1) - verifyPeerCertificate(); - else if (rc == 0) - throw SSLConnectionUnexpectedlyClosedException(); - else - return rc; - } + handleError(ret); + verifyPeerCertificate(); + } + else + { + SSL_set_connect_state(_pSSL); + _needHandshake = true; + } + } + catch (...) + { + SSL_free(_pSSL); + _pSSL = 0; + throw; + } +} + + +void SecureSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) +{ + poco_check_ptr (_pSocket); + + _pSocket->bind(address, reuseAddress, reusePort); +} + + +void SecureSocketImpl::listen(int backlog) +{ + poco_check_ptr (_pSocket); + + _pSocket->listen(backlog); +} + + +void SecureSocketImpl::shutdown() +{ + if (_pSSL) + { + // Don't shut down the socket more than once. + int shutdownState = SSL_get_shutdown(_pSSL); + bool shutdownSent = (shutdownState & SSL_SENT_SHUTDOWN) == SSL_SENT_SHUTDOWN; + if (!shutdownSent) + { + // A proper clean shutdown would require us to + // retry the shutdown if we get a zero return + // value, until SSL_shutdown() returns 1. + // However, this will lead to problems with + // most web browsers, so we just set the shutdown + // flag by calling SSL_shutdown() once and be + // done with it. + int rc = SSL_shutdown(_pSSL); + if (rc < 0) handleError(rc); + if (_pSocket->getBlocking()) + { + _pSocket->shutdown(); + } + } + } +} + + +void SecureSocketImpl::close() +{ + try + { + shutdown(); + } + catch (...) + { + } + _pSocket->close(); +} + + +int SecureSocketImpl::sendBytes(const void* buffer, int length, int /*flags*/) +{ + poco_assert (_pSocket->initialized()); + poco_check_ptr (_pSSL); + + int rc; + if (_needHandshake) + { + rc = completeHandshake(); + if (rc == 1) + verifyPeerCertificate(); + else if (rc == 0) + throw SSLConnectionUnexpectedlyClosedException(); + else + return rc; + } Poco::Timespan remaining_time = getMaxTimeout(); - do - { + do + { RemainingTimeCounter counter(remaining_time); - rc = SSL_write(_pSSL, buffer, length); - } + rc = SSL_write(_pSSL, buffer, length); + } while (mustRetry(rc, remaining_time)); - if (rc <= 0) - { - rc = handleError(rc); - if (rc == 0) throw SSLConnectionUnexpectedlyClosedException(); - } - return rc; -} - - -int SecureSocketImpl::receiveBytes(void* buffer, int length, int /*flags*/) -{ - poco_assert (_pSocket->initialized()); - poco_check_ptr (_pSSL); - - int rc; - if (_needHandshake) - { - rc = completeHandshake(); - if (rc == 1) - verifyPeerCertificate(); - else - return rc; - } + if (rc <= 0) + { + rc = handleError(rc); + if (rc == 0) throw SSLConnectionUnexpectedlyClosedException(); + } + return rc; +} + + +int SecureSocketImpl::receiveBytes(void* buffer, int length, int /*flags*/) +{ + poco_assert (_pSocket->initialized()); + poco_check_ptr (_pSSL); + + int rc; + if (_needHandshake) + { + rc = completeHandshake(); + if (rc == 1) + verifyPeerCertificate(); + else + return rc; + } Poco::Timespan remaining_time = getMaxTimeout(); - do - { + do + { /// SSL record may consist of several TCP packets, /// so thread can be blocked on recv/send and epoll_wait several times /// until SSL_read will return rc > 0. Let's use our own time counter. RemainingTimeCounter counter(remaining_time); - rc = SSL_read(_pSSL, buffer, length); - } + rc = SSL_read(_pSSL, buffer, length); + } while (mustRetry(rc, remaining_time)); - if (rc <= 0) - { - return handleError(rc); - } - return rc; -} - - -int SecureSocketImpl::available() const -{ - poco_check_ptr (_pSSL); - - return SSL_pending(_pSSL); -} - - -int SecureSocketImpl::completeHandshake() -{ - poco_assert (_pSocket->initialized()); - poco_check_ptr (_pSSL); - - int rc; + if (rc <= 0) + { + return handleError(rc); + } + return rc; +} + + +int SecureSocketImpl::available() const +{ + poco_check_ptr (_pSSL); + + return SSL_pending(_pSSL); +} + + +int SecureSocketImpl::completeHandshake() +{ + poco_assert (_pSocket->initialized()); + poco_check_ptr (_pSSL); + + int rc; Poco::Timespan remaining_time = getMaxTimeout(); - do - { + do + { RemainingTimeCounter counter(remaining_time); - rc = SSL_do_handshake(_pSSL); - } + rc = SSL_do_handshake(_pSSL); + } while (mustRetry(rc, remaining_time)); - if (rc <= 0) - { - return handleError(rc); - } - _needHandshake = false; - return rc; -} - - -void SecureSocketImpl::verifyPeerCertificate() -{ - if (_peerHostName.empty()) - verifyPeerCertificate(_pSocket->peerAddress().host().toString()); - else - verifyPeerCertificate(_peerHostName); -} - - -void SecureSocketImpl::verifyPeerCertificate(const std::string& hostName) -{ - long certErr = verifyPeerCertificateImpl(hostName); - if (certErr != X509_V_OK) - { - std::string msg = Utility::convertCertificateError(certErr); - throw CertificateValidationException("Unacceptable certificate from " + hostName, msg); - } -} - - -long SecureSocketImpl::verifyPeerCertificateImpl(const std::string& hostName) -{ - Context::VerificationMode mode = _pContext->verificationMode(); - if (mode == Context::VERIFY_NONE || !_pContext->extendedCertificateVerificationEnabled() || - (mode != Context::VERIFY_STRICT && isLocalHost(hostName))) - { - return X509_V_OK; - } - - X509* pCert = SSL_get_peer_certificate(_pSSL); - if (pCert) - { - X509Certificate cert(pCert); - return cert.verify(hostName) ? X509_V_OK : X509_V_ERR_APPLICATION_VERIFICATION; - } - else return X509_V_OK; -} - - -bool SecureSocketImpl::isLocalHost(const std::string& hostName) -{ - try - { - SocketAddress addr(hostName, 0); - return addr.host().isLoopback(); - } - catch (Poco::Exception&) - { - return false; - } -} - - -X509* SecureSocketImpl::peerCertificate() const -{ - if (_pSSL) - return SSL_get_peer_certificate(_pSSL); - else - return 0; -} - + if (rc <= 0) + { + return handleError(rc); + } + _needHandshake = false; + return rc; +} + + +void SecureSocketImpl::verifyPeerCertificate() +{ + if (_peerHostName.empty()) + verifyPeerCertificate(_pSocket->peerAddress().host().toString()); + else + verifyPeerCertificate(_peerHostName); +} + + +void SecureSocketImpl::verifyPeerCertificate(const std::string& hostName) +{ + long certErr = verifyPeerCertificateImpl(hostName); + if (certErr != X509_V_OK) + { + std::string msg = Utility::convertCertificateError(certErr); + throw CertificateValidationException("Unacceptable certificate from " + hostName, msg); + } +} + + +long SecureSocketImpl::verifyPeerCertificateImpl(const std::string& hostName) +{ + Context::VerificationMode mode = _pContext->verificationMode(); + if (mode == Context::VERIFY_NONE || !_pContext->extendedCertificateVerificationEnabled() || + (mode != Context::VERIFY_STRICT && isLocalHost(hostName))) + { + return X509_V_OK; + } + + X509* pCert = SSL_get_peer_certificate(_pSSL); + if (pCert) + { + X509Certificate cert(pCert); + return cert.verify(hostName) ? X509_V_OK : X509_V_ERR_APPLICATION_VERIFICATION; + } + else return X509_V_OK; +} + + +bool SecureSocketImpl::isLocalHost(const std::string& hostName) +{ + try + { + SocketAddress addr(hostName, 0); + return addr.host().isLoopback(); + } + catch (Poco::Exception&) + { + return false; + } +} + + +X509* SecureSocketImpl::peerCertificate() const +{ + if (_pSSL) + return SSL_get_peer_certificate(_pSSL); + else + return 0; +} + Poco::Timespan SecureSocketImpl::getMaxTimeout() { Poco::Timespan remaining_time = _pSocket->getReceiveTimeout(); @@ -438,164 +438,164 @@ Poco::Timespan SecureSocketImpl::getMaxTimeout() remaining_time = send_timeout; return remaining_time; } - + bool SecureSocketImpl::mustRetry(int rc, Poco::Timespan& remaining_time) -{ - if (rc <= 0) - { - int sslError = SSL_get_error(_pSSL, rc); - int socketError = _pSocket->lastError(); - switch (sslError) - { - case SSL_ERROR_WANT_READ: - if (_pSocket->getBlocking()) - { +{ + if (rc <= 0) + { + int sslError = SSL_get_error(_pSSL, rc); + int socketError = _pSocket->lastError(); + switch (sslError) + { + case SSL_ERROR_WANT_READ: + if (_pSocket->getBlocking()) + { /// Level-triggered mode of epoll_wait is used, so if SSL_read don't read all available data from socket, /// epoll_wait returns true without waiting for new data even if remaining_time == 0 if (_pSocket->pollImpl(remaining_time, Poco::Net::Socket::SELECT_READ) && remaining_time != 0) - return true; - else - throw Poco::TimeoutException(); - } - break; - case SSL_ERROR_WANT_WRITE: - if (_pSocket->getBlocking()) - { + return true; + else + throw Poco::TimeoutException(); + } + break; + case SSL_ERROR_WANT_WRITE: + if (_pSocket->getBlocking()) + { /// The same as for SSL_ERROR_WANT_READ if (_pSocket->pollImpl(remaining_time, Poco::Net::Socket::SELECT_WRITE) && remaining_time != 0) - return true; - else - throw Poco::TimeoutException(); - } - break; - case SSL_ERROR_SYSCALL: - return socketError == POCO_EAGAIN || socketError == POCO_EINTR; - default: - return socketError == POCO_EINTR; - } - } - return false; -} - - -int SecureSocketImpl::handleError(int rc) -{ - if (rc > 0) return rc; - - int sslError = SSL_get_error(_pSSL, rc); - int error = SocketImpl::lastError(); - - switch (sslError) - { - case SSL_ERROR_ZERO_RETURN: - return 0; - case SSL_ERROR_WANT_READ: - return SecureStreamSocket::ERR_SSL_WANT_READ; - case SSL_ERROR_WANT_WRITE: - return SecureStreamSocket::ERR_SSL_WANT_WRITE; - case SSL_ERROR_WANT_CONNECT: - case SSL_ERROR_WANT_ACCEPT: - case SSL_ERROR_WANT_X509_LOOKUP: - // these should not occur - poco_bugcheck(); - return rc; - case SSL_ERROR_SYSCALL: - if (error != 0) - { - SocketImpl::error(error); - } - // fallthrough - default: - { - long lastError = ERR_get_error(); - if (lastError == 0) - { - if (rc == 0) - { - // Most web browsers do this, don't report an error - if (_pContext->isForServerUse()) - return 0; - else - throw SSLConnectionUnexpectedlyClosedException(); - } - else if (rc == -1) - { - throw SSLConnectionUnexpectedlyClosedException(); - } - else - { - SecureStreamSocketImpl::error(Poco::format("The BIO reported an error: %d", rc)); - } - } - else - { - char buffer[256]; - ERR_error_string_n(lastError, buffer, sizeof(buffer)); - std::string msg(buffer); - throw SSLException(msg); - } - } - break; - } - return rc; -} - - -void SecureSocketImpl::setPeerHostName(const std::string& peerHostName) -{ - _peerHostName = peerHostName; -} - - -void SecureSocketImpl::reset() -{ - close(); - if (_pSSL) - { - SSL_free(_pSSL); - _pSSL = 0; - } -} - - -void SecureSocketImpl::abort() -{ - _pSocket->shutdown(); -} - - -Session::Ptr SecureSocketImpl::currentSession() -{ - if (_pSSL) - { - SSL_SESSION* pSession = SSL_get1_session(_pSSL); - if (pSession) - { - if (_pSession && pSession == _pSession->sslSession()) - { - SSL_SESSION_free(pSession); - return _pSession; - } - else return new Session(pSession); - } - } - return 0; -} - - -void SecureSocketImpl::useSession(Session::Ptr pSession) -{ - _pSession = pSession; -} - - -bool SecureSocketImpl::sessionWasReused() -{ - if (_pSSL) - return SSL_session_reused(_pSSL) != 0; - else - return false; -} - - -} } // namespace Poco::Net + return true; + else + throw Poco::TimeoutException(); + } + break; + case SSL_ERROR_SYSCALL: + return socketError == POCO_EAGAIN || socketError == POCO_EINTR; + default: + return socketError == POCO_EINTR; + } + } + return false; +} + + +int SecureSocketImpl::handleError(int rc) +{ + if (rc > 0) return rc; + + int sslError = SSL_get_error(_pSSL, rc); + int error = SocketImpl::lastError(); + + switch (sslError) + { + case SSL_ERROR_ZERO_RETURN: + return 0; + case SSL_ERROR_WANT_READ: + return SecureStreamSocket::ERR_SSL_WANT_READ; + case SSL_ERROR_WANT_WRITE: + return SecureStreamSocket::ERR_SSL_WANT_WRITE; + case SSL_ERROR_WANT_CONNECT: + case SSL_ERROR_WANT_ACCEPT: + case SSL_ERROR_WANT_X509_LOOKUP: + // these should not occur + poco_bugcheck(); + return rc; + case SSL_ERROR_SYSCALL: + if (error != 0) + { + SocketImpl::error(error); + } + // fallthrough + default: + { + long lastError = ERR_get_error(); + if (lastError == 0) + { + if (rc == 0) + { + // Most web browsers do this, don't report an error + if (_pContext->isForServerUse()) + return 0; + else + throw SSLConnectionUnexpectedlyClosedException(); + } + else if (rc == -1) + { + throw SSLConnectionUnexpectedlyClosedException(); + } + else + { + SecureStreamSocketImpl::error(Poco::format("The BIO reported an error: %d", rc)); + } + } + else + { + char buffer[256]; + ERR_error_string_n(lastError, buffer, sizeof(buffer)); + std::string msg(buffer); + throw SSLException(msg); + } + } + break; + } + return rc; +} + + +void SecureSocketImpl::setPeerHostName(const std::string& peerHostName) +{ + _peerHostName = peerHostName; +} + + +void SecureSocketImpl::reset() +{ + close(); + if (_pSSL) + { + SSL_free(_pSSL); + _pSSL = 0; + } +} + + +void SecureSocketImpl::abort() +{ + _pSocket->shutdown(); +} + + +Session::Ptr SecureSocketImpl::currentSession() +{ + if (_pSSL) + { + SSL_SESSION* pSession = SSL_get1_session(_pSSL); + if (pSession) + { + if (_pSession && pSession == _pSession->sslSession()) + { + SSL_SESSION_free(pSession); + return _pSession; + } + else return new Session(pSession); + } + } + return 0; +} + + +void SecureSocketImpl::useSession(Session::Ptr pSession) +{ + _pSession = pSession; +} + + +bool SecureSocketImpl::sessionWasReused() +{ + if (_pSSL) + return SSL_session_reused(_pSSL) != 0; + else + return false; +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocket.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocket.cpp index f4766ca6f9..a62fcd33d4 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocket.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocket.cpp @@ -1,287 +1,287 @@ -// -// SecureStreamSocket.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLSockets -// Module: SecureStreamSocket -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureStreamSocket.h" -#include "Poco/Net/SecureStreamSocketImpl.h" -#include "Poco/Net/SocketImpl.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Exception.h" - - -using Poco::InvalidArgumentException; - - -namespace Poco { -namespace Net { - - -SecureStreamSocket::SecureStreamSocket(): - StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) -{ -} - - -SecureStreamSocket::SecureStreamSocket(Context::Ptr pContext): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ -} - - -SecureStreamSocket::SecureStreamSocket(Context::Ptr pContext, Session::Ptr pSession): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ - useSession(pSession); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address): - StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) -{ - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName): - StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) -{ - static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext, Session::Ptr pSession): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ - useSession(pSession); - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ - static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext, Session::Ptr pSession): - StreamSocket(new SecureStreamSocketImpl(pContext)) -{ - static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); - useSession(pSession); - connect(address); -} - - -SecureStreamSocket::SecureStreamSocket(const Socket& socket): - StreamSocket(socket) -{ - if (!dynamic_cast<SecureStreamSocketImpl*>(impl())) - throw InvalidArgumentException("Cannot assign incompatible socket"); -} - - -SecureStreamSocket::SecureStreamSocket(SocketImpl* pImpl): - StreamSocket(pImpl) -{ - if (!dynamic_cast<SecureStreamSocketImpl*>(impl())) - throw InvalidArgumentException("Cannot assign incompatible socket"); -} - - -SecureStreamSocket::~SecureStreamSocket() -{ -} - - -SecureStreamSocket& SecureStreamSocket::operator = (const Socket& socket) -{ - if (dynamic_cast<SecureStreamSocketImpl*>(socket.impl())) - StreamSocket::operator = (socket); - else - throw InvalidArgumentException("Cannot assign incompatible socket"); - return *this; -} - - -bool SecureStreamSocket::havePeerCertificate() const -{ - return static_cast<SecureStreamSocketImpl*>(impl())->havePeerCertificate(); -} - - -X509Certificate SecureStreamSocket::peerCertificate() const -{ - return static_cast<SecureStreamSocketImpl*>(impl())->peerCertificate(); -} - - -void SecureStreamSocket::setPeerHostName(const std::string& hostName) -{ - static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); -} - - -const std::string& SecureStreamSocket::getPeerHostName() const -{ - return static_cast<SecureStreamSocketImpl*>(impl())->getPeerHostName(); -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), SSLManager::instance().defaultClientContext()); - SecureStreamSocket result(pImpl); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, Context::Ptr pContext) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); - SecureStreamSocket result(pImpl); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, Context::Ptr pContext, Session::Ptr pSession) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); - SecureStreamSocket result(pImpl); - result.useSession(pSession); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), SSLManager::instance().defaultClientContext()); - SecureStreamSocket result(pImpl); - result.setPeerHostName(peerHostName); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); - SecureStreamSocket result(pImpl); - result.setPeerHostName(peerHostName); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext, Session::Ptr pSession) -{ - SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); - SecureStreamSocket result(pImpl); - result.setPeerHostName(peerHostName); - result.useSession(pSession); - if (pImpl->context()->isForServerUse()) - pImpl->acceptSSL(); - else - pImpl->connectSSL(); - return result; -} - - -Context::Ptr SecureStreamSocket::context() const -{ - return static_cast<SecureStreamSocketImpl*>(impl())->context(); -} - - -void SecureStreamSocket::setLazyHandshake(bool flag) -{ - static_cast<SecureStreamSocketImpl*>(impl())->setLazyHandshake(flag); -} - - -bool SecureStreamSocket::getLazyHandshake() const -{ - return static_cast<SecureStreamSocketImpl*>(impl())->getLazyHandshake(); -} - - -void SecureStreamSocket::verifyPeerCertificate() -{ - static_cast<SecureStreamSocketImpl*>(impl())->verifyPeerCertificate(); -} - - -void SecureStreamSocket::verifyPeerCertificate(const std::string& hostName) -{ - static_cast<SecureStreamSocketImpl*>(impl())->verifyPeerCertificate(hostName); -} - - -int SecureStreamSocket::completeHandshake() -{ - return static_cast<SecureStreamSocketImpl*>(impl())->completeHandshake(); -} - - -Session::Ptr SecureStreamSocket::currentSession() -{ - return static_cast<SecureStreamSocketImpl*>(impl())->currentSession(); -} - - -void SecureStreamSocket::useSession(Session::Ptr pSession) -{ - static_cast<SecureStreamSocketImpl*>(impl())->useSession(pSession); -} - - -bool SecureStreamSocket::sessionWasReused() -{ - return static_cast<SecureStreamSocketImpl*>(impl())->sessionWasReused(); -} - - -void SecureStreamSocket::abort() -{ - static_cast<SecureStreamSocketImpl*>(impl())->abort(); -} - - -} } // namespace Poco::Net +// +// SecureStreamSocket.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLSockets +// Module: SecureStreamSocket +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureStreamSocket.h" +#include "Poco/Net/SecureStreamSocketImpl.h" +#include "Poco/Net/SocketImpl.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Exception.h" + + +using Poco::InvalidArgumentException; + + +namespace Poco { +namespace Net { + + +SecureStreamSocket::SecureStreamSocket(): + StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) +{ +} + + +SecureStreamSocket::SecureStreamSocket(Context::Ptr pContext): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ +} + + +SecureStreamSocket::SecureStreamSocket(Context::Ptr pContext, Session::Ptr pSession): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ + useSession(pSession); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address): + StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) +{ + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName): + StreamSocket(new SecureStreamSocketImpl(SSLManager::instance().defaultClientContext())) +{ + static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, Context::Ptr pContext, Session::Ptr pSession): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ + useSession(pSession); + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ + static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const SocketAddress& address, const std::string& hostName, Context::Ptr pContext, Session::Ptr pSession): + StreamSocket(new SecureStreamSocketImpl(pContext)) +{ + static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); + useSession(pSession); + connect(address); +} + + +SecureStreamSocket::SecureStreamSocket(const Socket& socket): + StreamSocket(socket) +{ + if (!dynamic_cast<SecureStreamSocketImpl*>(impl())) + throw InvalidArgumentException("Cannot assign incompatible socket"); +} + + +SecureStreamSocket::SecureStreamSocket(SocketImpl* pImpl): + StreamSocket(pImpl) +{ + if (!dynamic_cast<SecureStreamSocketImpl*>(impl())) + throw InvalidArgumentException("Cannot assign incompatible socket"); +} + + +SecureStreamSocket::~SecureStreamSocket() +{ +} + + +SecureStreamSocket& SecureStreamSocket::operator = (const Socket& socket) +{ + if (dynamic_cast<SecureStreamSocketImpl*>(socket.impl())) + StreamSocket::operator = (socket); + else + throw InvalidArgumentException("Cannot assign incompatible socket"); + return *this; +} + + +bool SecureStreamSocket::havePeerCertificate() const +{ + return static_cast<SecureStreamSocketImpl*>(impl())->havePeerCertificate(); +} + + +X509Certificate SecureStreamSocket::peerCertificate() const +{ + return static_cast<SecureStreamSocketImpl*>(impl())->peerCertificate(); +} + + +void SecureStreamSocket::setPeerHostName(const std::string& hostName) +{ + static_cast<SecureStreamSocketImpl*>(impl())->setPeerHostName(hostName); +} + + +const std::string& SecureStreamSocket::getPeerHostName() const +{ + return static_cast<SecureStreamSocketImpl*>(impl())->getPeerHostName(); +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), SSLManager::instance().defaultClientContext()); + SecureStreamSocket result(pImpl); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, Context::Ptr pContext) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); + SecureStreamSocket result(pImpl); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, Context::Ptr pContext, Session::Ptr pSession) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); + SecureStreamSocket result(pImpl); + result.useSession(pSession); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), SSLManager::instance().defaultClientContext()); + SecureStreamSocket result(pImpl); + result.setPeerHostName(peerHostName); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); + SecureStreamSocket result(pImpl); + result.setPeerHostName(peerHostName); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +SecureStreamSocket SecureStreamSocket::attach(const StreamSocket& streamSocket, const std::string& peerHostName, Context::Ptr pContext, Session::Ptr pSession) +{ + SecureStreamSocketImpl* pImpl = new SecureStreamSocketImpl(static_cast<StreamSocketImpl*>(streamSocket.impl()), pContext); + SecureStreamSocket result(pImpl); + result.setPeerHostName(peerHostName); + result.useSession(pSession); + if (pImpl->context()->isForServerUse()) + pImpl->acceptSSL(); + else + pImpl->connectSSL(); + return result; +} + + +Context::Ptr SecureStreamSocket::context() const +{ + return static_cast<SecureStreamSocketImpl*>(impl())->context(); +} + + +void SecureStreamSocket::setLazyHandshake(bool flag) +{ + static_cast<SecureStreamSocketImpl*>(impl())->setLazyHandshake(flag); +} + + +bool SecureStreamSocket::getLazyHandshake() const +{ + return static_cast<SecureStreamSocketImpl*>(impl())->getLazyHandshake(); +} + + +void SecureStreamSocket::verifyPeerCertificate() +{ + static_cast<SecureStreamSocketImpl*>(impl())->verifyPeerCertificate(); +} + + +void SecureStreamSocket::verifyPeerCertificate(const std::string& hostName) +{ + static_cast<SecureStreamSocketImpl*>(impl())->verifyPeerCertificate(hostName); +} + + +int SecureStreamSocket::completeHandshake() +{ + return static_cast<SecureStreamSocketImpl*>(impl())->completeHandshake(); +} + + +Session::Ptr SecureStreamSocket::currentSession() +{ + return static_cast<SecureStreamSocketImpl*>(impl())->currentSession(); +} + + +void SecureStreamSocket::useSession(Session::Ptr pSession) +{ + static_cast<SecureStreamSocketImpl*>(impl())->useSession(pSession); +} + + +bool SecureStreamSocket::sessionWasReused() +{ + return static_cast<SecureStreamSocketImpl*>(impl())->sessionWasReused(); +} + + +void SecureStreamSocket::abort() +{ + static_cast<SecureStreamSocketImpl*>(impl())->abort(); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocketImpl.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocketImpl.cpp index bef198ae69..d562fe8c5b 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocketImpl.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/SecureStreamSocketImpl.cpp @@ -1,241 +1,241 @@ -// -// SecureStreamSocketImpl.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLSockets -// Module: SecureStreamSocketImpl -// -// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/SecureStreamSocketImpl.h" -#include "Poco/Net/SSLException.h" -#include "Poco/Thread.h" - - -namespace Poco { -namespace Net { - - -SecureStreamSocketImpl::SecureStreamSocketImpl(Context::Ptr pContext): +// +// SecureStreamSocketImpl.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLSockets +// Module: SecureStreamSocketImpl +// +// Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/SecureStreamSocketImpl.h" +#include "Poco/Net/SSLException.h" +#include "Poco/Thread.h" + + +namespace Poco { +namespace Net { + + +SecureStreamSocketImpl::SecureStreamSocketImpl(Context::Ptr pContext): underlying_socket(new StreamSocketImpl), _impl(underlying_socket, pContext), - _lazyHandshake(false) -{ -} - - -SecureStreamSocketImpl::SecureStreamSocketImpl(StreamSocketImpl* pStreamSocket, Context::Ptr pContext): + _lazyHandshake(false) +{ +} + + +SecureStreamSocketImpl::SecureStreamSocketImpl(StreamSocketImpl* pStreamSocket, Context::Ptr pContext): underlying_socket(pStreamSocket), _impl(underlying_socket, pContext), - _lazyHandshake(false) -{ - pStreamSocket->duplicate(); - reset(_impl.sockfd()); -} - - -SecureStreamSocketImpl::~SecureStreamSocketImpl() -{ - try - { - reset(); - } - catch (...) - { - poco_unexpected(); - } -} - + _lazyHandshake(false) +{ + pStreamSocket->duplicate(); + reset(_impl.sockfd()); +} + + +SecureStreamSocketImpl::~SecureStreamSocketImpl() +{ + try + { + reset(); + } + catch (...) + { + poco_unexpected(); + } +} + void SecureStreamSocketImpl::setSendTimeout(const Poco::Timespan& timeout) { underlying_socket->setSendTimeout(timeout); _sndTimeout = underlying_socket->getSendTimeout(); } - + void SecureStreamSocketImpl::setReceiveTimeout(const Poco::Timespan& timeout) { underlying_socket->setReceiveTimeout(timeout); _recvTimeout = underlying_socket->getReceiveTimeout(); } -SocketImpl* SecureStreamSocketImpl::acceptConnection(SocketAddress& /*clientAddr*/) -{ - throw Poco::InvalidAccessException("Cannot acceptConnection() on a SecureStreamSocketImpl"); -} - - -void SecureStreamSocketImpl::acceptSSL() -{ - _impl.acceptSSL(); -} - - -void SecureStreamSocketImpl::connect(const SocketAddress& address) -{ - _impl.connect(address, !_lazyHandshake); - reset(_impl.sockfd()); -} - - -void SecureStreamSocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout) -{ - _impl.connect(address, timeout, !_lazyHandshake); - reset(_impl.sockfd()); -} - - -void SecureStreamSocketImpl::connectNB(const SocketAddress& address) -{ - _impl.connectNB(address); - reset(_impl.sockfd()); -} - - -void SecureStreamSocketImpl::connectSSL() -{ - _impl.connectSSL(!_lazyHandshake); -} - - -void SecureStreamSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) -{ - throw Poco::InvalidAccessException("Cannot bind() a SecureStreamSocketImpl"); -} - - -void SecureStreamSocketImpl::listen(int /*backlog*/) -{ - throw Poco::InvalidAccessException("Cannot listen() on a SecureStreamSocketImpl"); -} - - -void SecureStreamSocketImpl::close() -{ - reset(); - _impl.close(); -} - - -void SecureStreamSocketImpl::abort() -{ - reset(); - _impl.abort(); -} - - -int SecureStreamSocketImpl::sendBytes(const void* buffer, int length, int flags) -{ - return _impl.sendBytes(buffer, length, flags); -} - - -int SecureStreamSocketImpl::receiveBytes(void* buffer, int length, int flags) -{ - return _impl.receiveBytes(buffer, length, flags); -} - - -int SecureStreamSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot sendTo() on a SecureStreamSocketImpl"); -} - - -int SecureStreamSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/) -{ - throw Poco::InvalidAccessException("Cannot receiveFrom() on a SecureStreamSocketImpl"); -} - - -void SecureStreamSocketImpl::sendUrgent(unsigned char /*data*/) -{ - throw Poco::InvalidAccessException("Cannot sendUrgent() on a SecureStreamSocketImpl"); -} - - -int SecureStreamSocketImpl::available() -{ - return _impl.available(); -} - - -void SecureStreamSocketImpl::shutdownReceive() -{ -} - - -void SecureStreamSocketImpl::shutdownSend() -{ -} - - -void SecureStreamSocketImpl::shutdown() -{ - _impl.shutdown(); -} - - -bool SecureStreamSocketImpl::secure() const -{ - return true; -} - - -bool SecureStreamSocketImpl::havePeerCertificate() const -{ - X509* pCert = _impl.peerCertificate(); - if (pCert) - { - X509_free(pCert); - return true; - } - else return false; -} - - -X509Certificate SecureStreamSocketImpl::peerCertificate() const -{ - X509* pCert = _impl.peerCertificate(); - if (pCert) - return X509Certificate(pCert); - else - throw SSLException("No certificate available"); -} - - -void SecureStreamSocketImpl::setLazyHandshake(bool flag) -{ - _lazyHandshake = flag; -} - - -bool SecureStreamSocketImpl::getLazyHandshake() const -{ - return _lazyHandshake; -} - - -void SecureStreamSocketImpl::verifyPeerCertificate() -{ - _impl.verifyPeerCertificate(); -} - - -void SecureStreamSocketImpl::verifyPeerCertificate(const std::string& hostName) -{ - _impl.verifyPeerCertificate(hostName); -} - - -int SecureStreamSocketImpl::completeHandshake() -{ - return _impl.completeHandshake(); -} - - -} } // namespace Poco::Net +SocketImpl* SecureStreamSocketImpl::acceptConnection(SocketAddress& /*clientAddr*/) +{ + throw Poco::InvalidAccessException("Cannot acceptConnection() on a SecureStreamSocketImpl"); +} + + +void SecureStreamSocketImpl::acceptSSL() +{ + _impl.acceptSSL(); +} + + +void SecureStreamSocketImpl::connect(const SocketAddress& address) +{ + _impl.connect(address, !_lazyHandshake); + reset(_impl.sockfd()); +} + + +void SecureStreamSocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout) +{ + _impl.connect(address, timeout, !_lazyHandshake); + reset(_impl.sockfd()); +} + + +void SecureStreamSocketImpl::connectNB(const SocketAddress& address) +{ + _impl.connectNB(address); + reset(_impl.sockfd()); +} + + +void SecureStreamSocketImpl::connectSSL() +{ + _impl.connectSSL(!_lazyHandshake); +} + + +void SecureStreamSocketImpl::bind(const SocketAddress& address, bool reuseAddress, bool reusePort) +{ + throw Poco::InvalidAccessException("Cannot bind() a SecureStreamSocketImpl"); +} + + +void SecureStreamSocketImpl::listen(int /*backlog*/) +{ + throw Poco::InvalidAccessException("Cannot listen() on a SecureStreamSocketImpl"); +} + + +void SecureStreamSocketImpl::close() +{ + reset(); + _impl.close(); +} + + +void SecureStreamSocketImpl::abort() +{ + reset(); + _impl.abort(); +} + + +int SecureStreamSocketImpl::sendBytes(const void* buffer, int length, int flags) +{ + return _impl.sendBytes(buffer, length, flags); +} + + +int SecureStreamSocketImpl::receiveBytes(void* buffer, int length, int flags) +{ + return _impl.receiveBytes(buffer, length, flags); +} + + +int SecureStreamSocketImpl::sendTo(const void* /*buffer*/, int /*length*/, const SocketAddress& /*address*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot sendTo() on a SecureStreamSocketImpl"); +} + + +int SecureStreamSocketImpl::receiveFrom(void* /*buffer*/, int /*length*/, SocketAddress& /*address*/, int /*flags*/) +{ + throw Poco::InvalidAccessException("Cannot receiveFrom() on a SecureStreamSocketImpl"); +} + + +void SecureStreamSocketImpl::sendUrgent(unsigned char /*data*/) +{ + throw Poco::InvalidAccessException("Cannot sendUrgent() on a SecureStreamSocketImpl"); +} + + +int SecureStreamSocketImpl::available() +{ + return _impl.available(); +} + + +void SecureStreamSocketImpl::shutdownReceive() +{ +} + + +void SecureStreamSocketImpl::shutdownSend() +{ +} + + +void SecureStreamSocketImpl::shutdown() +{ + _impl.shutdown(); +} + + +bool SecureStreamSocketImpl::secure() const +{ + return true; +} + + +bool SecureStreamSocketImpl::havePeerCertificate() const +{ + X509* pCert = _impl.peerCertificate(); + if (pCert) + { + X509_free(pCert); + return true; + } + else return false; +} + + +X509Certificate SecureStreamSocketImpl::peerCertificate() const +{ + X509* pCert = _impl.peerCertificate(); + if (pCert) + return X509Certificate(pCert); + else + throw SSLException("No certificate available"); +} + + +void SecureStreamSocketImpl::setLazyHandshake(bool flag) +{ + _lazyHandshake = flag; +} + + +bool SecureStreamSocketImpl::getLazyHandshake() const +{ + return _lazyHandshake; +} + + +void SecureStreamSocketImpl::verifyPeerCertificate() +{ + _impl.verifyPeerCertificate(); +} + + +void SecureStreamSocketImpl::verifyPeerCertificate(const std::string& hostName) +{ + _impl.verifyPeerCertificate(hostName); +} + + +int SecureStreamSocketImpl::completeHandshake() +{ + return _impl.completeHandshake(); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/Session.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/Session.cpp index 96a507d946..a4e0989d53 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/Session.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/Session.cpp @@ -1,40 +1,40 @@ -// -// Session.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: Session -// -// Copyright (c) 2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#if defined(__APPLE__) -// Some OpenSSL functions are deprecated in OS X 10.7 -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - - -#include "Poco/Net/Session.h" - - -namespace Poco { -namespace Net { - - -Session::Session(SSL_SESSION* pSession): - _pSession(pSession) -{ -} - - -Session::~Session() -{ - SSL_SESSION_free(_pSession); -} - - -} } // namespace Poco::Net +// +// Session.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: Session +// +// Copyright (c) 2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#if defined(__APPLE__) +// Some OpenSSL functions are deprecated in OS X 10.7 +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + + +#include "Poco/Net/Session.h" + + +namespace Poco { +namespace Net { + + +Session::Session(SSL_SESSION* pSession): + _pSession(pSession) +{ +} + + +Session::~Session() +{ + SSL_SESSION_free(_pSession); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/Utility.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/Utility.cpp index 5428b76996..f6ab6cbeb6 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/Utility.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/Utility.cpp @@ -1,71 +1,71 @@ -// -// Utility.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: Utility -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/Utility.h" -#include "Poco/String.h" -#include "Poco/Util/OptionException.h" -#include <openssl/err.h> - - -namespace Poco { -namespace Net { - - -Context::VerificationMode Utility::convertVerificationMode(const std::string& vMode) -{ - std::string mode = Poco::toLower(vMode); - Context::VerificationMode verMode = Context::VERIFY_STRICT; - - if (mode == "none") - verMode = Context::VERIFY_NONE; - else if (mode == "relaxed") - verMode = Context::VERIFY_RELAXED; - else if (mode == "strict") - verMode = Context::VERIFY_STRICT; - else if (mode == "once") - verMode = Context::VERIFY_ONCE; - else - throw Poco::InvalidArgumentException("Invalid verification mode. Should be relaxed, strict or once but got", vMode); - - return verMode; -} - - -std::string Utility::convertCertificateError(long errCode) -{ - std::string errMsg(X509_verify_cert_error_string(errCode)); - return errMsg; -} - - -std::string Utility::getLastError() -{ - unsigned long errCode = ERR_get_error(); - if (errCode != 0) - { - char buffer[256]; - ERR_error_string_n(errCode, buffer, sizeof(buffer)); - return std::string(buffer); - } - else return "No error"; -} - - -void Utility::clearErrorStack() -{ - ERR_clear_error(); -} - - -} } // namespace Poco::Net +// +// Utility.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: Utility +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/Utility.h" +#include "Poco/String.h" +#include "Poco/Util/OptionException.h" +#include <openssl/err.h> + + +namespace Poco { +namespace Net { + + +Context::VerificationMode Utility::convertVerificationMode(const std::string& vMode) +{ + std::string mode = Poco::toLower(vMode); + Context::VerificationMode verMode = Context::VERIFY_STRICT; + + if (mode == "none") + verMode = Context::VERIFY_NONE; + else if (mode == "relaxed") + verMode = Context::VERIFY_RELAXED; + else if (mode == "strict") + verMode = Context::VERIFY_STRICT; + else if (mode == "once") + verMode = Context::VERIFY_ONCE; + else + throw Poco::InvalidArgumentException("Invalid verification mode. Should be relaxed, strict or once but got", vMode); + + return verMode; +} + + +std::string Utility::convertCertificateError(long errCode) +{ + std::string errMsg(X509_verify_cert_error_string(errCode)); + return errMsg; +} + + +std::string Utility::getLastError() +{ + unsigned long errCode = ERR_get_error(); + if (errCode != 0) + { + char buffer[256]; + ERR_error_string_n(errCode, buffer, sizeof(buffer)); + return std::string(buffer); + } + else return "No error"; +} + + +void Utility::clearErrorStack() +{ + ERR_clear_error(); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/VerificationErrorArgs.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/VerificationErrorArgs.cpp index f7f6451b1c..cb6917340a 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/VerificationErrorArgs.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/VerificationErrorArgs.cpp @@ -1,37 +1,37 @@ -// -// VerificationErrorArgs.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: VerificationErrorArgs -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/VerificationErrorArgs.h" - - -namespace Poco { -namespace Net { - - -VerificationErrorArgs::VerificationErrorArgs(const X509Certificate& cert, int errDepth, int errNum, const std::string& errMsg): - _cert(cert), - _errorDepth(errDepth), - _errorNumber(errNum), - _errorMessage(errMsg), - _ignoreError(false) -{ -} - - -VerificationErrorArgs::~VerificationErrorArgs() -{ -} - - -} } // namespace Poco::Net +// +// VerificationErrorArgs.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: VerificationErrorArgs +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/VerificationErrorArgs.h" + + +namespace Poco { +namespace Net { + + +VerificationErrorArgs::VerificationErrorArgs(const X509Certificate& cert, int errDepth, int errNum, const std::string& errMsg): + _cert(cert), + _errorDepth(errDepth), + _errorNumber(errNum), + _errorMessage(errMsg), + _ignoreError(false) +{ +} + + +VerificationErrorArgs::~VerificationErrorArgs() +{ +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/src/X509Certificate.cpp b/contrib/libs/poco/NetSSL_OpenSSL/src/X509Certificate.cpp index 54651c3ac8..188d909790 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/src/X509Certificate.cpp +++ b/contrib/libs/poco/NetSSL_OpenSSL/src/X509Certificate.cpp @@ -1,175 +1,175 @@ -// -// X509Certificate.cpp -// -// Library: NetSSL_OpenSSL -// Package: SSLCore -// Module: X509Certificate -// -// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/X509Certificate.h" -#include "Poco/Net/SSLException.h" -#include "Poco/Net/SSLManager.h" -#include "Poco/Net/DNS.h" -#include "Poco/TemporaryFile.h" -#include "Poco/FileStream.h" -#include "Poco/StreamCopier.h" -#include "Poco/String.h" -#include "Poco/RegularExpression.h" -#include "Poco/DateTimeParser.h" -#include <openssl/pem.h> -#include <openssl/x509v3.h> -#include <openssl/err.h> - - -namespace Poco { -namespace Net { - - -X509Certificate::X509Certificate(std::istream& istr): - Poco::Crypto::X509Certificate(istr) -{ -} - - -X509Certificate::X509Certificate(const std::string& path): - Poco::Crypto::X509Certificate(path) -{ -} - - -X509Certificate::X509Certificate(X509* pCert): - Poco::Crypto::X509Certificate(pCert) -{ -} - - -X509Certificate::X509Certificate(X509* pCert, bool shared): - Poco::Crypto::X509Certificate(pCert, shared) -{ -} - - -X509Certificate::X509Certificate(const Poco::Crypto::X509Certificate& cert): - Poco::Crypto::X509Certificate(cert) -{ -} - - -X509Certificate& X509Certificate::operator = (const Poco::Crypto::X509Certificate& cert) -{ - X509Certificate tmp(cert); - swap(tmp); - return *this; -} - - -X509Certificate::~X509Certificate() -{ -} - - -bool X509Certificate::verify(const std::string& hostName) const -{ - return verify(*this, hostName); -} - - -bool X509Certificate::verify(const Poco::Crypto::X509Certificate& certificate, const std::string& hostName) -{ -#if OPENSSL_VERSION_NUMBER < 0x10002000L - std::string commonName; - std::set<std::string> dnsNames; - certificate.extractNames(commonName, dnsNames); - if (!commonName.empty()) dnsNames.insert(commonName); - bool ok = (dnsNames.find(hostName) != dnsNames.end()); - if (!ok) - { - for (std::set<std::string>::const_iterator it = dnsNames.begin(); !ok && it != dnsNames.end(); ++it) - { - try - { - // two cases: name contains wildcards or not - if (containsWildcards(*it)) - { - // a compare by IPAddress is not possible with wildcards - // only allow compare by name - ok = matchWildcard(*it, hostName); - } - else - { - // it depends on hostName whether we compare by IP or by alias - IPAddress ip; - if (IPAddress::tryParse(hostName, ip)) - { - // compare by IP - const HostEntry& heData = DNS::resolve(*it); - const HostEntry::AddressList& addr = heData.addresses(); - HostEntry::AddressList::const_iterator it = addr.begin(); - HostEntry::AddressList::const_iterator itEnd = addr.end(); - for (; it != itEnd && !ok; ++it) - { - ok = (*it == ip); - } - } - else - { - ok = Poco::icompare(*it, hostName) == 0; - } - } - } - catch (NoAddressFoundException&) - { - } - catch (HostNotFoundException&) - { - } - } - } - return ok; -#else - if (X509_check_host(const_cast<X509*>(certificate.certificate()), hostName.c_str(), hostName.length(), 0, NULL) == 1) - { - return true; - } - else - { - IPAddress ip; - if (IPAddress::tryParse(hostName, ip)) - { - return (X509_check_ip_asc(const_cast<X509*>(certificate.certificate()), hostName.c_str(), 0) == 1); - } - } - return false; -#endif -} - - -bool X509Certificate::containsWildcards(const std::string& commonName) -{ - return (commonName.find('*') != std::string::npos || commonName.find('?') != std::string::npos); -} - - -bool X509Certificate::matchWildcard(const std::string& wildcard, const std::string& hostName) -{ - // fix wildcards - std::string wildcardExpr("^"); - wildcardExpr += Poco::replace(wildcard, ".", "\\."); - Poco::replaceInPlace(wildcardExpr, "*", ".*"); - Poco::replaceInPlace(wildcardExpr, "..*", ".*"); - Poco::replaceInPlace(wildcardExpr, "?", ".?"); - Poco::replaceInPlace(wildcardExpr, "..?", ".?"); - wildcardExpr += "$"; - - Poco::RegularExpression expr(wildcardExpr, Poco::RegularExpression::RE_CASELESS); - return expr.match(hostName); -} - - -} } // namespace Poco::Net +// +// X509Certificate.cpp +// +// Library: NetSSL_OpenSSL +// Package: SSLCore +// Module: X509Certificate +// +// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/X509Certificate.h" +#include "Poco/Net/SSLException.h" +#include "Poco/Net/SSLManager.h" +#include "Poco/Net/DNS.h" +#include "Poco/TemporaryFile.h" +#include "Poco/FileStream.h" +#include "Poco/StreamCopier.h" +#include "Poco/String.h" +#include "Poco/RegularExpression.h" +#include "Poco/DateTimeParser.h" +#include <openssl/pem.h> +#include <openssl/x509v3.h> +#include <openssl/err.h> + + +namespace Poco { +namespace Net { + + +X509Certificate::X509Certificate(std::istream& istr): + Poco::Crypto::X509Certificate(istr) +{ +} + + +X509Certificate::X509Certificate(const std::string& path): + Poco::Crypto::X509Certificate(path) +{ +} + + +X509Certificate::X509Certificate(X509* pCert): + Poco::Crypto::X509Certificate(pCert) +{ +} + + +X509Certificate::X509Certificate(X509* pCert, bool shared): + Poco::Crypto::X509Certificate(pCert, shared) +{ +} + + +X509Certificate::X509Certificate(const Poco::Crypto::X509Certificate& cert): + Poco::Crypto::X509Certificate(cert) +{ +} + + +X509Certificate& X509Certificate::operator = (const Poco::Crypto::X509Certificate& cert) +{ + X509Certificate tmp(cert); + swap(tmp); + return *this; +} + + +X509Certificate::~X509Certificate() +{ +} + + +bool X509Certificate::verify(const std::string& hostName) const +{ + return verify(*this, hostName); +} + + +bool X509Certificate::verify(const Poco::Crypto::X509Certificate& certificate, const std::string& hostName) +{ +#if OPENSSL_VERSION_NUMBER < 0x10002000L + std::string commonName; + std::set<std::string> dnsNames; + certificate.extractNames(commonName, dnsNames); + if (!commonName.empty()) dnsNames.insert(commonName); + bool ok = (dnsNames.find(hostName) != dnsNames.end()); + if (!ok) + { + for (std::set<std::string>::const_iterator it = dnsNames.begin(); !ok && it != dnsNames.end(); ++it) + { + try + { + // two cases: name contains wildcards or not + if (containsWildcards(*it)) + { + // a compare by IPAddress is not possible with wildcards + // only allow compare by name + ok = matchWildcard(*it, hostName); + } + else + { + // it depends on hostName whether we compare by IP or by alias + IPAddress ip; + if (IPAddress::tryParse(hostName, ip)) + { + // compare by IP + const HostEntry& heData = DNS::resolve(*it); + const HostEntry::AddressList& addr = heData.addresses(); + HostEntry::AddressList::const_iterator it = addr.begin(); + HostEntry::AddressList::const_iterator itEnd = addr.end(); + for (; it != itEnd && !ok; ++it) + { + ok = (*it == ip); + } + } + else + { + ok = Poco::icompare(*it, hostName) == 0; + } + } + } + catch (NoAddressFoundException&) + { + } + catch (HostNotFoundException&) + { + } + } + } + return ok; +#else + if (X509_check_host(const_cast<X509*>(certificate.certificate()), hostName.c_str(), hostName.length(), 0, NULL) == 1) + { + return true; + } + else + { + IPAddress ip; + if (IPAddress::tryParse(hostName, ip)) + { + return (X509_check_ip_asc(const_cast<X509*>(certificate.certificate()), hostName.c_str(), 0) == 1); + } + } + return false; +#endif +} + + +bool X509Certificate::containsWildcards(const std::string& commonName) +{ + return (commonName.find('*') != std::string::npos || commonName.find('?') != std::string::npos); +} + + +bool X509Certificate::matchWildcard(const std::string& wildcard, const std::string& hostName) +{ + // fix wildcards + std::string wildcardExpr("^"); + wildcardExpr += Poco::replace(wildcard, ".", "\\."); + Poco::replaceInPlace(wildcardExpr, "*", ".*"); + Poco::replaceInPlace(wildcardExpr, "..*", ".*"); + Poco::replaceInPlace(wildcardExpr, "?", ".?"); + Poco::replaceInPlace(wildcardExpr, "..?", ".?"); + wildcardExpr += "$"; + + Poco::RegularExpression expr(wildcardExpr, Poco::RegularExpression::RE_CASELESS); + return expr.match(hostName); +} + + +} } // namespace Poco::Net diff --git a/contrib/libs/poco/NetSSL_OpenSSL/ya.make b/contrib/libs/poco/NetSSL_OpenSSL/ya.make index ba6f99d872..c72bf7603f 100644 --- a/contrib/libs/poco/NetSSL_OpenSSL/ya.make +++ b/contrib/libs/poco/NetSSL_OpenSSL/ya.make @@ -1,7 +1,7 @@ -# Generated by devtools/yamaker. - -LIBRARY() - +# Generated by devtools/yamaker. + +LIBRARY() + OWNER( orivej g:cpp-contrib @@ -14,57 +14,57 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -PEERDIR( - contrib/libs/openssl - contrib/libs/poco/Crypto - contrib/libs/poco/Foundation - contrib/libs/poco/JSON - contrib/libs/poco/Net - contrib/libs/poco/Util - contrib/libs/poco/XML -) - -ADDINCL( - GLOBAL contrib/libs/poco/NetSSL_OpenSSL/include - contrib/libs/poco/Crypto/include - contrib/libs/poco/Foundation/include - contrib/libs/poco/Net/include - contrib/libs/poco/NetSSL_OpenSSL/src - contrib/libs/poco/Util/include -) - -NO_COMPILER_WARNINGS() - -NO_UTIL() - -SRCS( - src/AcceptCertificateHandler.cpp - src/CertificateHandlerFactory.cpp - src/CertificateHandlerFactoryMgr.cpp - src/ConsoleCertificateHandler.cpp - src/Context.cpp - src/HTTPSClientSession.cpp - src/HTTPSSessionInstantiator.cpp - src/HTTPSStreamFactory.cpp - src/InvalidCertificateHandler.cpp - src/KeyConsoleHandler.cpp - src/KeyFileHandler.cpp - src/PrivateKeyFactory.cpp - src/PrivateKeyFactoryMgr.cpp - src/PrivateKeyPassphraseHandler.cpp - src/RejectCertificateHandler.cpp - src/SSLException.cpp - src/SSLManager.cpp - src/SecureSMTPClientSession.cpp - src/SecureServerSocket.cpp - src/SecureServerSocketImpl.cpp - src/SecureSocketImpl.cpp - src/SecureStreamSocket.cpp - src/SecureStreamSocketImpl.cpp - src/Session.cpp - src/Utility.cpp - src/VerificationErrorArgs.cpp - src/X509Certificate.cpp -) - -END() +PEERDIR( + contrib/libs/openssl + contrib/libs/poco/Crypto + contrib/libs/poco/Foundation + contrib/libs/poco/JSON + contrib/libs/poco/Net + contrib/libs/poco/Util + contrib/libs/poco/XML +) + +ADDINCL( + GLOBAL contrib/libs/poco/NetSSL_OpenSSL/include + contrib/libs/poco/Crypto/include + contrib/libs/poco/Foundation/include + contrib/libs/poco/Net/include + contrib/libs/poco/NetSSL_OpenSSL/src + contrib/libs/poco/Util/include +) + +NO_COMPILER_WARNINGS() + +NO_UTIL() + +SRCS( + src/AcceptCertificateHandler.cpp + src/CertificateHandlerFactory.cpp + src/CertificateHandlerFactoryMgr.cpp + src/ConsoleCertificateHandler.cpp + src/Context.cpp + src/HTTPSClientSession.cpp + src/HTTPSSessionInstantiator.cpp + src/HTTPSStreamFactory.cpp + src/InvalidCertificateHandler.cpp + src/KeyConsoleHandler.cpp + src/KeyFileHandler.cpp + src/PrivateKeyFactory.cpp + src/PrivateKeyFactoryMgr.cpp + src/PrivateKeyPassphraseHandler.cpp + src/RejectCertificateHandler.cpp + src/SSLException.cpp + src/SSLManager.cpp + src/SecureSMTPClientSession.cpp + src/SecureServerSocket.cpp + src/SecureServerSocketImpl.cpp + src/SecureSocketImpl.cpp + src/SecureStreamSocket.cpp + src/SecureStreamSocketImpl.cpp + src/Session.cpp + src/Utility.cpp + src/VerificationErrorArgs.cpp + src/X509Certificate.cpp +) + +END() |