mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-09-13 02:27:10 +02:00
Major plugin refactor and cleanup.
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
This commit is contained in:
136
vendor/POCO/Crypto/include/Poco/Crypto/Cipher.h
vendored
Normal file
136
vendor/POCO/Crypto/include/Poco/Crypto/Cipher.h
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
//
|
||||
// Cipher.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: Cipher
|
||||
//
|
||||
// Definition of the Cipher class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_Cipher_INCLUDED
|
||||
#define Crypto_Cipher_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CryptoTransform.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API Cipher: public Poco::RefCountedObject
|
||||
/// Represents the abstract base class from which all implementations of
|
||||
/// symmetric/asymmetric encryption algorithms must inherit. Use the CipherFactory
|
||||
/// class to obtain an instance of this class:
|
||||
///
|
||||
/// CipherFactory& factory = CipherFactory::defaultFactory();
|
||||
/// // Creates a 256-bit AES cipher
|
||||
/// Cipher* pCipher = factory.createCipher(CipherKey("aes-256"));
|
||||
/// Cipher* pRSACipher = factory.createCipher(RSAKey(RSAKey::KL_1024, RSAKey::EXP_SMALL));
|
||||
///
|
||||
/// Check the different Key constructors on how to initialize/create
|
||||
/// a key. The above example auto-generates random keys.
|
||||
///
|
||||
/// Note that you won't be able to decrypt data encrypted with a random key
|
||||
/// once the Cipher is destroyed unless you persist the generated key and IV.
|
||||
/// An example usage for random keys is to encrypt data saved in a temporary
|
||||
/// file.
|
||||
///
|
||||
/// Once your key is set up, you can use the Cipher object to encrypt or
|
||||
/// decrypt strings or, in conjunction with a CryptoInputStream or a
|
||||
/// CryptoOutputStream, to encrypt streams of data.
|
||||
///
|
||||
/// Since encrypted strings will contain arbitrary binary data that will cause
|
||||
/// problems in applications that are not binary-safe (eg., when sending
|
||||
/// encrypted data in e-mails), the encryptString() and decryptString() can
|
||||
/// encode (or decode, respectively) encrypted data using a "transport encoding".
|
||||
/// Supported encodings are Base64 and BinHex.
|
||||
///
|
||||
/// The following example encrypts and decrypts a string utilizing Base64
|
||||
/// encoding:
|
||||
///
|
||||
/// std::string plainText = "This is my secret information";
|
||||
/// std::string encrypted = pCipher->encryptString(plainText, Cipher::ENC_BASE64);
|
||||
/// std::string decrypted = pCipher->decryptString(encrypted, Cipher::ENC_BASE64);
|
||||
///
|
||||
/// In order to encrypt a stream of data (eg. to encrypt files), you can use
|
||||
/// a CryptoStream:
|
||||
///
|
||||
/// // Create an output stream that will encrypt all data going through it
|
||||
/// // and write pass it to the underlying file stream.
|
||||
/// Poco::FileOutputStream sink("encrypted.dat");
|
||||
/// CryptoOutputStream encryptor(sink, pCipher->createEncryptor());
|
||||
///
|
||||
/// Poco::FileInputStream source("source.txt");
|
||||
/// Poco::StreamCopier::copyStream(source, encryptor);
|
||||
///
|
||||
/// // Always close output streams to flush all internal buffers
|
||||
/// encryptor.close();
|
||||
/// sink.close();
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::AutoPtr<Cipher>;
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
enum Encoding
|
||||
/// Transport encoding to use for encryptString() and decryptString().
|
||||
{
|
||||
ENC_NONE = 0x00, /// Plain binary output
|
||||
ENC_BASE64 = 0x01, /// Base64-encoded output
|
||||
ENC_BINHEX = 0x02, /// BinHex-encoded output
|
||||
ENC_BASE64_NO_LF = 0x81, /// Base64-encoded output, no linefeeds
|
||||
ENC_BINHEX_NO_LF = 0x82 /// BinHex-encoded output, no linefeeds
|
||||
|
||||
};
|
||||
|
||||
virtual ~Cipher();
|
||||
/// Destroys the Cipher.
|
||||
|
||||
virtual const std::string& name() const = 0;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
virtual CryptoTransform::Ptr createEncryptor() = 0;
|
||||
/// Creates an encryptor object to be used with a CryptoStream.
|
||||
|
||||
virtual CryptoTransform::Ptr createDecryptor() = 0;
|
||||
/// Creates a decryptor object to be used with a CryptoStream.
|
||||
|
||||
virtual std::string encryptString(const std::string& str, Encoding encoding = ENC_NONE);
|
||||
/// Directly encrypt a string and encode it using the given encoding.
|
||||
|
||||
virtual std::string decryptString(const std::string& str, Encoding encoding = ENC_NONE);
|
||||
/// Directly decrypt a string that is encoded with the given encoding.
|
||||
|
||||
virtual void encrypt(std::istream& source, std::ostream& sink, Encoding encoding = ENC_NONE);
|
||||
/// Directly encrypts an input stream and encodes it using the given encoding.
|
||||
|
||||
virtual void decrypt(std::istream& source, std::ostream& sink, Encoding encoding = ENC_NONE);
|
||||
/// Directly decrypt an input stream that is encoded with the given encoding.
|
||||
|
||||
protected:
|
||||
Cipher();
|
||||
/// Creates a new Cipher object.
|
||||
|
||||
private:
|
||||
Cipher(const Cipher&);
|
||||
Cipher& operator = (const Cipher&);
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_Cipher_INCLUDED
|
75
vendor/POCO/Crypto/include/Poco/Crypto/CipherFactory.h
vendored
Normal file
75
vendor/POCO/Crypto/include/Poco/Crypto/CipherFactory.h
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
//
|
||||
// CipherFactory.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CipherFactory
|
||||
//
|
||||
// Definition of the CipherFactory class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CipherFactory_INCLUDED
|
||||
#define Crypto_CipherFactory_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Cipher;
|
||||
class CipherKey;
|
||||
class RSAKey;
|
||||
|
||||
|
||||
class Crypto_API CipherFactory
|
||||
/// A factory for Cipher objects. See the Cipher class for examples on how to
|
||||
/// use the CipherFactory.
|
||||
{
|
||||
public:
|
||||
CipherFactory();
|
||||
/// Creates a new CipherFactory object.
|
||||
|
||||
virtual ~CipherFactory();
|
||||
/// Destroys the CipherFactory.
|
||||
|
||||
Cipher* createCipher(const CipherKey& key);
|
||||
/// Creates a Cipher object for the given Cipher name. Valid cipher
|
||||
/// names depend on the OpenSSL version the library is linked with;
|
||||
/// see the output of
|
||||
///
|
||||
/// openssl enc --help
|
||||
///
|
||||
/// for a list of supported block and stream ciphers.
|
||||
///
|
||||
/// Common examples are:
|
||||
///
|
||||
/// * AES: "aes-128", "aes-256"
|
||||
/// * DES: "des", "des3"
|
||||
/// * Blowfish: "bf"
|
||||
|
||||
Cipher* createCipher(const RSAKey& key, RSAPaddingMode paddingMode = RSA_PADDING_PKCS1);
|
||||
/// Creates a RSACipher using the given RSA key and padding mode
|
||||
/// for public key encryption/private key decryption.
|
||||
|
||||
static CipherFactory& defaultFactory();
|
||||
/// Returns the default CipherFactory.
|
||||
|
||||
private:
|
||||
CipherFactory(const CipherFactory&);
|
||||
CipherFactory& operator = (const CipherFactory&);
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CipherFactory_INCLUDED
|
69
vendor/POCO/Crypto/include/Poco/Crypto/CipherImpl.h
vendored
Normal file
69
vendor/POCO/Crypto/include/Poco/Crypto/CipherImpl.h
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// CipherImpl.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CipherImpl
|
||||
//
|
||||
// Definition of the CipherImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CipherImpl_INCLUDED
|
||||
#define Crypto_CipherImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/Cipher.h"
|
||||
#include "Poco/Crypto/CipherKey.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include <openssl/evp.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class CipherImpl: public Cipher
|
||||
/// An implementation of the Cipher class for OpenSSL's crypto library.
|
||||
{
|
||||
public:
|
||||
CipherImpl(const CipherKey& key);
|
||||
/// Creates a new CipherImpl object for the given CipherKey.
|
||||
|
||||
virtual ~CipherImpl();
|
||||
/// Destroys the CipherImpl.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the cipher.
|
||||
|
||||
CryptoTransform::Ptr createEncryptor();
|
||||
/// Creates an encryptor object.
|
||||
|
||||
CryptoTransform::Ptr createDecryptor();
|
||||
/// Creates a decryptor object.
|
||||
|
||||
private:
|
||||
CipherKey _key;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Inlines
|
||||
//
|
||||
inline const std::string& CipherImpl::name() const
|
||||
{
|
||||
return _key.name();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CipherImpl_INCLUDED
|
213
vendor/POCO/Crypto/include/Poco/Crypto/CipherKey.h
vendored
Normal file
213
vendor/POCO/Crypto/include/Poco/Crypto/CipherKey.h
vendored
Normal file
@@ -0,0 +1,213 @@
|
||||
//
|
||||
// CipherKey.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CipherKey
|
||||
//
|
||||
// Definition of the CipherKey class.
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CipherKey_INCLUDED
|
||||
#define Crypto_CipherKey_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CipherKeyImpl.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API CipherKey
|
||||
/// CipherKey stores the key information for decryption/encryption of data.
|
||||
/// To create a random key, using the following code:
|
||||
///
|
||||
/// CipherKey key("aes-256");
|
||||
///
|
||||
/// Note that you won't be able to decrypt data encrypted with a random key
|
||||
/// once the Cipher is destroyed unless you persist the generated key and IV.
|
||||
/// An example usage for random keys is to encrypt data saved in a temporary
|
||||
/// file.
|
||||
///
|
||||
/// To create a key using a human-readable password
|
||||
/// string, use the following code. We create a AES Cipher and
|
||||
/// use a salt value to make the key more robust:
|
||||
///
|
||||
/// std::string password = "secret";
|
||||
/// std::string salt("asdff8723lasdf(**923412");
|
||||
/// CipherKey key("aes-256", password, salt);
|
||||
///
|
||||
/// You may also control the digest and the number of iterations used to generate the key
|
||||
/// by specifying the specific values. Here we create a key with the same data as before,
|
||||
/// except that we use 100 iterations instead of DEFAULT_ITERATION_COUNT, and sha1 instead of
|
||||
/// the default md5:
|
||||
///
|
||||
/// std::string password = "secret";
|
||||
/// std::string salt("asdff8723lasdf(**923412");
|
||||
/// std::string digest ("sha1");
|
||||
/// CipherKey key("aes-256", password, salt, 100, digest);
|
||||
///
|
||||
{
|
||||
public:
|
||||
using Mode = CipherKeyImpl::Mode;
|
||||
using ByteVec = CipherKeyImpl::ByteVec;
|
||||
|
||||
enum
|
||||
{
|
||||
DEFAULT_ITERATION_COUNT = 2000
|
||||
/// Default iteration count to use with
|
||||
/// generateKey(). RSA security recommends
|
||||
/// an iteration count of at least 1000.
|
||||
};
|
||||
|
||||
CipherKey(const std::string& name,
|
||||
const std::string& passphrase,
|
||||
const std::string& salt = "",
|
||||
int iterationCount = DEFAULT_ITERATION_COUNT,
|
||||
const std::string& digest = "md5");
|
||||
/// Creates a new CipherKeyImpl object using the given
|
||||
/// cipher name, passphrase, salt value, iteration count and digest.
|
||||
|
||||
CipherKey(const std::string& name,
|
||||
const ByteVec& key,
|
||||
const ByteVec& iv);
|
||||
/// Creates a new CipherKeyImpl object using the given cipher
|
||||
/// name, key and initialization vector (IV).
|
||||
///
|
||||
/// The size of the IV must match the cipher's expected
|
||||
/// IV size (see ivSize()), except for GCM mode, which allows
|
||||
/// a custom IV size.
|
||||
|
||||
CipherKey(const std::string& name);
|
||||
/// Creates a new CipherKeyImpl object. Autoinitializes key and
|
||||
/// initialization vector.
|
||||
|
||||
CipherKey(const CipherKey& other);
|
||||
/// Copy constructor.
|
||||
|
||||
CipherKey(CipherKey&& other) noexcept;
|
||||
/// Copy constructor.
|
||||
|
||||
~CipherKey();
|
||||
/// Destroys the CipherKeyImpl.
|
||||
|
||||
CipherKey& operator = (const CipherKey& other);
|
||||
/// Assignment.
|
||||
|
||||
CipherKey& operator = (CipherKey&& other) noexcept;
|
||||
/// Move assignment.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
int keySize() const;
|
||||
/// Returns the key size of the Cipher.
|
||||
|
||||
int blockSize() const;
|
||||
/// Returns the block size of the Cipher.
|
||||
|
||||
int ivSize() const;
|
||||
/// Returns the IV size of the Cipher.
|
||||
|
||||
Mode mode() const;
|
||||
/// Returns the Cipher's mode of operation.
|
||||
|
||||
const ByteVec& getKey() const;
|
||||
/// Returns the key for the Cipher.
|
||||
|
||||
void setKey(const ByteVec& key);
|
||||
/// Sets the key for the Cipher.
|
||||
|
||||
const ByteVec& getIV() const;
|
||||
/// Returns the initialization vector (IV) for the Cipher.
|
||||
|
||||
void setIV(const ByteVec& iv);
|
||||
/// Sets the initialization vector (IV) for the Cipher.
|
||||
///
|
||||
/// The size of the vector must match the cipher's expected
|
||||
/// IV size (see ivSize()), except for GCM mode, which allows
|
||||
/// a custom IV size.
|
||||
|
||||
CipherKeyImpl::Ptr impl();
|
||||
/// Returns the impl object
|
||||
|
||||
private:
|
||||
CipherKeyImpl::Ptr _pImpl;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline const std::string& CipherKey::name() const
|
||||
{
|
||||
return _pImpl->name();
|
||||
}
|
||||
|
||||
|
||||
inline int CipherKey::keySize() const
|
||||
{
|
||||
return _pImpl->keySize();
|
||||
}
|
||||
|
||||
|
||||
inline int CipherKey::blockSize() const
|
||||
{
|
||||
return _pImpl->blockSize();
|
||||
}
|
||||
|
||||
|
||||
inline int CipherKey::ivSize() const
|
||||
{
|
||||
return _pImpl->ivSize();
|
||||
}
|
||||
|
||||
|
||||
inline CipherKey::Mode CipherKey::mode() const
|
||||
{
|
||||
return _pImpl->mode();
|
||||
}
|
||||
|
||||
|
||||
inline const CipherKey::ByteVec& CipherKey::getKey() const
|
||||
{
|
||||
return _pImpl->getKey();
|
||||
}
|
||||
|
||||
|
||||
inline void CipherKey::setKey(const CipherKey::ByteVec& key)
|
||||
{
|
||||
_pImpl->setKey(key);
|
||||
}
|
||||
|
||||
|
||||
inline const CipherKey::ByteVec& CipherKey::getIV() const
|
||||
{
|
||||
return _pImpl->getIV();
|
||||
}
|
||||
|
||||
|
||||
inline void CipherKey::setIV(const CipherKey::ByteVec& iv)
|
||||
{
|
||||
_pImpl->setIV(iv);
|
||||
}
|
||||
|
||||
|
||||
inline CipherKeyImpl::Ptr CipherKey::impl()
|
||||
{
|
||||
return _pImpl;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CipherKey_INCLUDED
|
168
vendor/POCO/Crypto/include/Poco/Crypto/CipherKeyImpl.h
vendored
Normal file
168
vendor/POCO/Crypto/include/Poco/Crypto/CipherKeyImpl.h
vendored
Normal file
@@ -0,0 +1,168 @@
|
||||
//
|
||||
// CipherKeyImpl.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CipherKeyImpl
|
||||
//
|
||||
// Definition of the CipherKeyImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CipherKeyImpl_INCLUDED
|
||||
#define Crypto_CipherKeyImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
struct evp_cipher_st;
|
||||
typedef struct evp_cipher_st EVP_CIPHER;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class CipherKeyImpl: public RefCountedObject
|
||||
/// An implementation of the CipherKey class for OpenSSL's crypto library.
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::AutoPtr<CipherKeyImpl>;
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
enum Mode
|
||||
/// Cipher mode of operation. This mode determines how multiple blocks
|
||||
/// are connected; this is essential to improve security.
|
||||
{
|
||||
MODE_STREAM_CIPHER, /// Stream cipher
|
||||
MODE_ECB, /// Electronic codebook (plain concatenation)
|
||||
MODE_CBC, /// Cipher block chaining (default)
|
||||
MODE_CFB, /// Cipher feedback
|
||||
MODE_OFB, /// Output feedback
|
||||
MODE_CTR, /// Counter mode
|
||||
MODE_GCM, /// Galois/Counter mode
|
||||
MODE_CCM /// Counter with CBC-MAC
|
||||
};
|
||||
|
||||
CipherKeyImpl(const std::string& name,
|
||||
const std::string& passphrase,
|
||||
const std::string& salt,
|
||||
int iterationCount,
|
||||
const std::string& digest);
|
||||
/// Creates a new CipherKeyImpl object, using
|
||||
/// the given cipher name, passphrase, salt value
|
||||
/// and iteration count.
|
||||
|
||||
CipherKeyImpl(const std::string& name,
|
||||
const ByteVec& key,
|
||||
const ByteVec& iv);
|
||||
/// Creates a new CipherKeyImpl object, using the
|
||||
/// given cipher name, key and initialization vector.
|
||||
|
||||
CipherKeyImpl(const std::string& name);
|
||||
/// Creates a new CipherKeyImpl object. Autoinitializes key
|
||||
/// and initialization vector.
|
||||
|
||||
virtual ~CipherKeyImpl();
|
||||
/// Destroys the CipherKeyImpl.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
int keySize() const;
|
||||
/// Returns the key size of the Cipher.
|
||||
|
||||
int blockSize() const;
|
||||
/// Returns the block size of the Cipher.
|
||||
|
||||
int ivSize() const;
|
||||
/// Returns the IV size of the Cipher.
|
||||
|
||||
Mode mode() const;
|
||||
/// Returns the Cipher's mode of operation.
|
||||
|
||||
const ByteVec& getKey() const;
|
||||
/// Returns the key for the Cipher.
|
||||
|
||||
void setKey(const ByteVec& key);
|
||||
/// Sets the key for the Cipher.
|
||||
|
||||
const ByteVec& getIV() const;
|
||||
/// Returns the initialization vector (IV) for the Cipher.
|
||||
|
||||
void setIV(const ByteVec& iv);
|
||||
/// Sets the initialization vector (IV) for the Cipher.
|
||||
|
||||
const EVP_CIPHER* cipher();
|
||||
/// Returns the cipher object
|
||||
|
||||
private:
|
||||
void generateKey(const std::string& passphrase,
|
||||
const std::string& salt,
|
||||
int iterationCount);
|
||||
/// Generates key and IV from a password and optional salt string.
|
||||
|
||||
void generateKey();
|
||||
/// Generates key and IV from random data.
|
||||
|
||||
void getRandomBytes(ByteVec& vec, std::size_t count);
|
||||
/// Stores random bytes in vec.
|
||||
|
||||
private:
|
||||
const EVP_CIPHER* _pCipher;
|
||||
const EVP_MD* _pDigest;
|
||||
std::string _name;
|
||||
ByteVec _key;
|
||||
ByteVec _iv;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Inlines
|
||||
//
|
||||
inline const std::string& CipherKeyImpl::name() const
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
|
||||
inline const CipherKeyImpl::ByteVec& CipherKeyImpl::getKey() const
|
||||
{
|
||||
return _key;
|
||||
}
|
||||
|
||||
|
||||
inline void CipherKeyImpl::setKey(const ByteVec& key)
|
||||
{
|
||||
poco_assert(key.size() == static_cast<ByteVec::size_type>(keySize()));
|
||||
_key = key;
|
||||
}
|
||||
|
||||
|
||||
inline const CipherKeyImpl::ByteVec& CipherKeyImpl::getIV() const
|
||||
{
|
||||
return _iv;
|
||||
}
|
||||
|
||||
|
||||
inline const EVP_CIPHER* CipherKeyImpl::cipher()
|
||||
{
|
||||
return _pCipher;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CipherKeyImpl_INCLUDED
|
195
vendor/POCO/Crypto/include/Poco/Crypto/Crypto.h
vendored
Normal file
195
vendor/POCO/Crypto/include/Poco/Crypto/Crypto.h
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
//
|
||||
// Crypto.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: CryptoCore
|
||||
// Module: Crypto
|
||||
//
|
||||
// Basic definitions for the Poco Crypto library.
|
||||
// This file must be the first file included by every other Crypto
|
||||
// header file.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_Crypto_INCLUDED
|
||||
#define Crypto_Crypto_INCLUDED
|
||||
|
||||
|
||||
#define POCO_EXTERNAL_OPENSSL_DEFAULT 1
|
||||
#define POCO_EXTERNAL_OPENSSL_SLPRO 2
|
||||
|
||||
|
||||
#include "Poco/Foundation.h"
|
||||
#include <openssl/opensslv.h>
|
||||
|
||||
|
||||
#ifndef OPENSSL_VERSION_PREREQ
|
||||
#if defined(OPENSSL_VERSION_MAJOR) && defined(OPENSSL_VERSION_MINOR)
|
||||
#define OPENSSL_VERSION_PREREQ(maj, min) \
|
||||
((OPENSSL_VERSION_MAJOR << 16) + OPENSSL_VERSION_MINOR >= ((maj) << 16) + (min))
|
||||
#else
|
||||
#define OPENSSL_VERSION_PREREQ(maj, min) \
|
||||
(OPENSSL_VERSION_NUMBER >= (((maj) << 28) | ((min) << 20)))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
enum RSAPaddingMode
|
||||
/// The padding mode used for RSA public key encryption.
|
||||
{
|
||||
RSA_PADDING_PKCS1,
|
||||
/// PKCS #1 v1.5 padding. This currently is the most widely used mode.
|
||||
|
||||
RSA_PADDING_PKCS1_OAEP,
|
||||
/// EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty
|
||||
/// encoding parameter. This mode is recommended for all new applications.
|
||||
|
||||
RSA_PADDING_SSLV23,
|
||||
/// PKCS #1 v1.5 padding with an SSL-specific modification that denotes
|
||||
/// that the server is SSL3 capable.
|
||||
|
||||
RSA_PADDING_NONE
|
||||
/// Raw RSA encryption. This mode should only be used to implement cryptographically
|
||||
/// sound padding modes in the application code. Encrypting user data directly with RSA
|
||||
/// is insecure.
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// 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 Crypto_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
|
||||
// Crypto_API functions as being imported from a DLL, whereas this DLL sees symbols
|
||||
// defined with this macro as being exported.
|
||||
//
|
||||
#if defined(_WIN32)
|
||||
#if defined(POCO_DLL)
|
||||
#if defined(Crypto_EXPORTS)
|
||||
#define Crypto_API __declspec(dllexport)
|
||||
#else
|
||||
#define Crypto_API __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(Crypto_API)
|
||||
#if !defined(POCO_NO_GCC_API_ATTRIBUTE) && defined (__GNUC__) && (__GNUC__ >= 4)
|
||||
#define Crypto_API __attribute__ ((visibility ("default")))
|
||||
#else
|
||||
#define Crypto_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Automatically link Crypto and OpenSSL libraries.
|
||||
//
|
||||
#if defined(_MSC_VER)
|
||||
#if !defined(POCO_NO_AUTOMATIC_LIBS)
|
||||
#if defined(POCO_INTERNAL_OPENSSL_MSVC_VER)
|
||||
#if defined(POCO_EXTERNAL_OPENSSL)
|
||||
#pragma message("External OpenSSL defined but internal headers used - possible mismatch!")
|
||||
#endif // POCO_EXTERNAL_OPENSSL
|
||||
#if !defined(_DEBUG)
|
||||
#define POCO_DEBUG_SUFFIX ""
|
||||
#if !defined (_DLL)
|
||||
#define POCO_STATIC_SUFFIX "mt"
|
||||
#else // _DLL
|
||||
#define POCO_STATIC_SUFFIX ""
|
||||
#endif
|
||||
#else // _DEBUG
|
||||
#define POCO_DEBUG_SUFFIX "d"
|
||||
#if !defined (_DLL)
|
||||
#define POCO_STATIC_SUFFIX "mt"
|
||||
#else // _DLL
|
||||
#define POCO_STATIC_SUFFIX ""
|
||||
#endif
|
||||
#endif
|
||||
#pragma comment(lib, "libcrypto" POCO_STATIC_SUFFIX POCO_DEBUG_SUFFIX ".lib")
|
||||
#pragma comment(lib, "libssl" POCO_STATIC_SUFFIX POCO_DEBUG_SUFFIX ".lib")
|
||||
#if !defined(_WIN64) && !defined (_DLL) && \
|
||||
(POCO_INTERNAL_OPENSSL_MSVC_VER == 120) && \
|
||||
(POCO_MSVC_VERSION < POCO_INTERNAL_OPENSSL_MSVC_VER)
|
||||
#pragma comment(lib, "libPreVS2013CRT" POCO_STATIC_SUFFIX POCO_DEBUG_SUFFIX ".lib")
|
||||
#endif
|
||||
#if !defined (_DLL) && (POCO_MSVS_VERSION >= 2015)
|
||||
#pragma comment(lib, "legacy_stdio_definitions.lib")
|
||||
#pragma comment(lib, "legacy_stdio_wide_specifiers.lib")
|
||||
#endif
|
||||
#elif defined(POCO_EXTERNAL_OPENSSL)
|
||||
#if POCO_EXTERNAL_OPENSSL == POCO_EXTERNAL_OPENSSL_SLPRO
|
||||
#if defined(POCO_DLL)
|
||||
#if OPENSSL_VERSION_PREREQ(1,1)
|
||||
#pragma comment(lib, "libcrypto.lib")
|
||||
#pragma comment(lib, "libssl.lib")
|
||||
#else
|
||||
#pragma comment(lib, "libeay32.lib")
|
||||
#pragma comment(lib, "ssleay32.lib")
|
||||
#endif
|
||||
#else
|
||||
#if OPENSSL_VERSION_PREREQ(1,1)
|
||||
#if defined(_WIN64)
|
||||
#pragma comment(lib, "libcrypto64" POCO_LIB_SUFFIX)
|
||||
#pragma comment(lib, "libssl64" POCO_LIB_SUFFIX)
|
||||
#else
|
||||
#pragma comment(lib, "libcrypto32" POCO_LIB_SUFFIX)
|
||||
#pragma comment(lib, "libssl32" POCO_LIB_SUFFIX)
|
||||
#endif
|
||||
#else
|
||||
#pragma comment(lib, "libeay32" POCO_LIB_SUFFIX)
|
||||
#pragma comment(lib, "ssleay32" POCO_LIB_SUFFIX)
|
||||
#endif
|
||||
#endif
|
||||
#elif POCO_EXTERNAL_OPENSSL == POCO_EXTERNAL_OPENSSL_DEFAULT
|
||||
#if OPENSSL_VERSION_PREREQ(1,1)
|
||||
#pragma comment(lib, "libcrypto.lib")
|
||||
#pragma comment(lib, "libssl.lib")
|
||||
#else
|
||||
#pragma comment(lib, "libeay32.lib")
|
||||
#pragma comment(lib, "ssleay32.lib")
|
||||
#endif
|
||||
#endif
|
||||
#endif // POCO_INTERNAL_OPENSSL_MSVC_VER
|
||||
#if !defined(Crypto_EXPORTS)
|
||||
#pragma comment(lib, "PocoCrypto" POCO_LIB_SUFFIX)
|
||||
#endif
|
||||
#endif // POCO_NO_AUTOMATIC_LIBS
|
||||
#endif
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
void Crypto_API initializeCrypto();
|
||||
/// Initialize the Crypto library, as well as the underlying OpenSSL
|
||||
/// libraries, by calling OpenSSLInitializer::initialize().
|
||||
///
|
||||
/// Should be called before using any class from the Crypto library.
|
||||
/// The Crypto library will be initialized automatically, through
|
||||
/// OpenSSLInitializer instances held by various Crypto classes
|
||||
/// (Cipher, CipherKey, RSAKey, X509Certificate).
|
||||
/// However, it is recommended to call initializeCrypto()
|
||||
/// in any case at application startup.
|
||||
///
|
||||
/// Can be called multiple times; however, for every call to
|
||||
/// initializeCrypto(), a matching call to uninitializeCrypto()
|
||||
/// must be performed.
|
||||
|
||||
|
||||
void Crypto_API uninitializeCrypto();
|
||||
/// Uninitializes the Crypto library by calling
|
||||
/// OpenSSLInitializer::uninitialize().
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_Crypto_INCLUDED
|
56
vendor/POCO/Crypto/include/Poco/Crypto/CryptoException.h
vendored
Normal file
56
vendor/POCO/Crypto/include/Poco/Crypto/CryptoException.h
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// CryptoException.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Crypto
|
||||
// Module: CryptoException
|
||||
//
|
||||
// Definition of the CryptoException class.
|
||||
//
|
||||
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CryptoException_INCLUDED
|
||||
#define Crypto_CryptoException_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Exception.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
POCO_DECLARE_EXCEPTION(Crypto_API, CryptoException, Poco::Exception)
|
||||
|
||||
|
||||
class Crypto_API OpenSSLException : public CryptoException
|
||||
{
|
||||
public:
|
||||
OpenSSLException(int code = 0);
|
||||
OpenSSLException(const std::string& msg, int code = 0);
|
||||
OpenSSLException(const std::string& msg, const std::string& arg, int code = 0);
|
||||
OpenSSLException(const std::string& msg, const Poco::Exception& exc, int code = 0);
|
||||
OpenSSLException(const OpenSSLException& exc);
|
||||
~OpenSSLException() noexcept;
|
||||
OpenSSLException& operator = (const OpenSSLException& exc);
|
||||
const char* name() const noexcept;
|
||||
const char* className() const noexcept;
|
||||
Poco::Exception* clone() const;
|
||||
void rethrow() const;
|
||||
|
||||
private:
|
||||
void setExtMessage();
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CryptoException_INCLUDED
|
193
vendor/POCO/Crypto/include/Poco/Crypto/CryptoStream.h
vendored
Normal file
193
vendor/POCO/Crypto/include/Poco/Crypto/CryptoStream.h
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
//
|
||||
// CryptoStream.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CryptoStream
|
||||
//
|
||||
// Definition of the CryptoStreamBuf, CryptoInputStream and CryptoOutputStream
|
||||
// classes.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CryptoStream_INCLUDED
|
||||
#define Crypto_CryptoStream_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CryptoTransform.h"
|
||||
#include "Poco/BufferedStreamBuf.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class CryptoTransform;
|
||||
class Cipher;
|
||||
|
||||
|
||||
class Crypto_API CryptoStreamBuf: public Poco::BufferedStreamBuf
|
||||
/// This stream buffer performs cryptographic transformation on the data
|
||||
/// going through it.
|
||||
{
|
||||
public:
|
||||
CryptoStreamBuf(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoStreamBuf(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
|
||||
virtual ~CryptoStreamBuf();
|
||||
|
||||
void close();
|
||||
/// Flushes all buffers and finishes the encryption.
|
||||
|
||||
protected:
|
||||
int readFromDevice(char* buffer, std::streamsize length);
|
||||
int writeToDevice(const char* buffer, std::streamsize length);
|
||||
|
||||
private:
|
||||
CryptoTransform::Ptr _pTransform;
|
||||
std::istream* _pIstr;
|
||||
std::ostream* _pOstr;
|
||||
bool _eof;
|
||||
|
||||
Poco::Buffer<unsigned char> _buffer;
|
||||
|
||||
CryptoStreamBuf(const CryptoStreamBuf&);
|
||||
CryptoStreamBuf& operator = (const CryptoStreamBuf&);
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API CryptoIOS: public virtual std::ios
|
||||
/// The base class for CryptoInputStream and CryptoOutputStream.
|
||||
///
|
||||
/// This class is needed to ensure correct initialization order of the
|
||||
/// stream buffer and base classes.
|
||||
{
|
||||
public:
|
||||
CryptoIOS(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
CryptoIOS(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
~CryptoIOS();
|
||||
CryptoStreamBuf* rdbuf();
|
||||
|
||||
protected:
|
||||
CryptoStreamBuf _buf;
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API CryptoInputStream: public CryptoIOS, public std::istream
|
||||
/// This stream transforms all data passing through it using the given
|
||||
/// CryptoTransform.
|
||||
///
|
||||
/// Use a CryptoTransform object provided by Cipher::createEncrytor() or
|
||||
/// Cipher::createDecryptor() to create an encrypting or decrypting stream,
|
||||
/// respectively.
|
||||
{
|
||||
public:
|
||||
CryptoInputStream(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
/// Create a new CryptoInputStream object. The CryptoInputStream takes the
|
||||
/// ownership of the given CryptoTransform object.
|
||||
|
||||
CryptoInputStream(std::istream& istr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new encrypting CryptoInputStream object using the given cipher.
|
||||
|
||||
~CryptoInputStream();
|
||||
/// Destroys the CryptoInputStream.
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API CryptoOutputStream: public CryptoIOS, public std::ostream
|
||||
/// This stream transforms all data passing through it using the given
|
||||
/// CryptoTransform.
|
||||
///
|
||||
/// Use a CryptoTransform object provided by Cipher::createEncrytor() or
|
||||
/// Cipher::createDecryptor() to create an encrypting or decrypting stream,
|
||||
/// respectively.
|
||||
///
|
||||
/// After all data has been passed through the stream, close() must be called
|
||||
/// to ensure completion of cryptographic transformation.
|
||||
{
|
||||
public:
|
||||
CryptoOutputStream(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192);
|
||||
/// Create a new CryptoOutputStream object. The CryptoOutputStream takes the
|
||||
/// ownership of the given CryptoTransform object.
|
||||
|
||||
CryptoOutputStream(std::ostream& ostr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new decrypting CryptoOutputStream object using the given cipher.
|
||||
|
||||
~CryptoOutputStream();
|
||||
/// Destroys the CryptoOutputStream.
|
||||
|
||||
void close();
|
||||
/// Flushes all buffers and finishes the encryption.
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API DecryptingInputStream: public CryptoIOS, public std::istream
|
||||
/// This stream decrypts all data passing through it using the given
|
||||
/// Cipher.
|
||||
{
|
||||
public:
|
||||
DecryptingInputStream(std::istream& istr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new DecryptingInputStream object using the given cipher.
|
||||
|
||||
~DecryptingInputStream();
|
||||
/// Destroys the DecryptingInputStream.
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API DecryptingOutputStream: public CryptoIOS, public std::ostream
|
||||
/// This stream decrypts all data passing through it using the given
|
||||
/// Cipher.
|
||||
{
|
||||
public:
|
||||
DecryptingOutputStream(std::ostream& ostr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new DecryptingOutputStream object using the given cipher.
|
||||
|
||||
~DecryptingOutputStream();
|
||||
/// Destroys the DecryptingOutputStream.
|
||||
|
||||
void close();
|
||||
/// Flushes all buffers and finishes the decryption.
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API EncryptingInputStream: public CryptoIOS, public std::istream
|
||||
/// This stream encrypts all data passing through it using the given
|
||||
/// Cipher.
|
||||
{
|
||||
public:
|
||||
EncryptingInputStream(std::istream& istr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new EncryptingInputStream object using the given cipher.
|
||||
|
||||
~EncryptingInputStream();
|
||||
/// Destroys the EncryptingInputStream.
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API EncryptingOutputStream: public CryptoIOS, public std::ostream
|
||||
/// This stream encrypts all data passing through it using the given
|
||||
/// Cipher.
|
||||
{
|
||||
public:
|
||||
EncryptingOutputStream(std::ostream& ostr, Cipher& cipher, std::streamsize bufferSize = 8192);
|
||||
/// Create a new EncryptingOutputStream object using the given cipher.
|
||||
|
||||
~EncryptingOutputStream();
|
||||
/// Destroys the EncryptingOutputStream.
|
||||
|
||||
void close();
|
||||
/// Flushes all buffers and finishes the encryption.
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CryptoStream_INCLUDED
|
90
vendor/POCO/Crypto/include/Poco/Crypto/CryptoTransform.h
vendored
Normal file
90
vendor/POCO/Crypto/include/Poco/Crypto/CryptoTransform.h
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
//
|
||||
// CryptoTransform.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Cipher
|
||||
// Module: CryptoTransform
|
||||
//
|
||||
// Definition of the CryptoTransform class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_CryptoTransform_INCLUDED
|
||||
#define Crypto_CryptoTransform_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/SharedPtr.h"
|
||||
#include <ios>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API CryptoTransform
|
||||
/// This interface represents the basic operations for cryptographic
|
||||
/// transformations to be used with a CryptoInputStream or a
|
||||
/// CryptoOutputStream.
|
||||
///
|
||||
/// Implementations of this class are returned by the Cipher class to
|
||||
/// perform encryption or decryption of data.
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::SharedPtr<CryptoTransform>;
|
||||
|
||||
CryptoTransform();
|
||||
/// Creates a new CryptoTransform object.
|
||||
|
||||
virtual ~CryptoTransform();
|
||||
/// Destroys the CryptoTransform.
|
||||
|
||||
virtual std::size_t blockSize() const = 0;
|
||||
/// Returns the block size for this CryptoTransform.
|
||||
|
||||
virtual int setPadding(int padding);
|
||||
/// Enables or disables padding. By default encryption operations are padded using standard block
|
||||
/// padding and the padding is checked and removed when decrypting. If the padding parameter is zero then
|
||||
/// no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of
|
||||
/// the block size or an error will occur.
|
||||
|
||||
virtual std::string getTag(std::size_t tagSize = 16) = 0;
|
||||
/// Returns the GCM tag after encrypting using GCM mode.
|
||||
///
|
||||
/// Must be called after finalize().
|
||||
|
||||
virtual void setTag(const std::string& tag) = 0;
|
||||
/// Sets the GCM tag for authenticated decryption using GCM mode.
|
||||
///
|
||||
/// Must be set before finalize() is called, otherwise
|
||||
/// decryption will fail.
|
||||
|
||||
virtual std::streamsize transform(
|
||||
const unsigned char* input,
|
||||
std::streamsize inputLength,
|
||||
unsigned char* output,
|
||||
std::streamsize outputLength) = 0;
|
||||
/// Transforms a chunk of data. The inputLength is arbitrary and does not
|
||||
/// need to be a multiple of the block size. The output buffer has a maximum
|
||||
/// capacity of the given outputLength that must be at least
|
||||
/// inputLength + blockSize() - 1
|
||||
/// Returns the number of bytes written to the output buffer.
|
||||
|
||||
virtual std::streamsize finalize(unsigned char* output, std::streamsize length) = 0;
|
||||
/// Finalizes the transformation. The output buffer must contain enough
|
||||
/// space for at least two blocks, ie.
|
||||
/// length >= 2*blockSize()
|
||||
/// must be true. Returns the number of bytes written to the output
|
||||
/// buffer.
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_CryptoTransform_INCLUDED
|
80
vendor/POCO/Crypto/include/Poco/Crypto/DigestEngine.h
vendored
Normal file
80
vendor/POCO/Crypto/include/Poco/Crypto/DigestEngine.h
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
//
|
||||
// DigestEngine.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Digest
|
||||
// Module: DigestEngine
|
||||
//
|
||||
// Definition of the DigestEngine class.
|
||||
//
|
||||
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_DigestEngine_INCLUDED
|
||||
#define Crypto_DigestEngine_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/DigestEngine.h"
|
||||
#include <openssl/evp.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API DigestEngine: public Poco::DigestEngine
|
||||
/// This class implements a Poco::DigestEngine for all
|
||||
/// digest algorithms supported by OpenSSL.
|
||||
{
|
||||
public:
|
||||
DigestEngine(const std::string& name);
|
||||
/// Creates a DigestEngine using the digest with the given name
|
||||
/// (e.g., "MD5", "SHA1", "SHA256", "SHA512", etc.).
|
||||
/// See the OpenSSL documentation for a list of supported digest algorithms.
|
||||
///
|
||||
/// Throws a Poco::NotFoundException if no algorithm with the given name exists.
|
||||
|
||||
~DigestEngine();
|
||||
/// Destroys the DigestEngine.
|
||||
|
||||
const std::string& algorithm() const;
|
||||
/// Returns the name of the digest algorithm.
|
||||
|
||||
int nid() const;
|
||||
/// Returns the NID (OpenSSL object identifier) of the digest algorithm.
|
||||
|
||||
// DigestEngine
|
||||
std::size_t digestLength() const;
|
||||
void reset();
|
||||
const Poco::DigestEngine::Digest& digest();
|
||||
|
||||
protected:
|
||||
void updateImpl(const void* data, std::size_t length);
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
EVP_MD_CTX* _pContext;
|
||||
Poco::DigestEngine::Digest _digest;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline const std::string& DigestEngine::algorithm() const
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_DigestEngine_INCLUDED
|
130
vendor/POCO/Crypto/include/Poco/Crypto/ECDSADigestEngine.h
vendored
Normal file
130
vendor/POCO/Crypto/include/Poco/Crypto/ECDSADigestEngine.h
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
//
|
||||
// ECDSADigestEngine.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: ECDSA
|
||||
// Module: ECDSADigestEngine
|
||||
//
|
||||
// Definition of the ECDSADigestEngine class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_ECDSADigestEngine_INCLUDED
|
||||
#define Crypto_ECDSADigestEngine_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/ECKey.h"
|
||||
#include "Poco/DigestEngine.h"
|
||||
#include "Poco/Crypto/DigestEngine.h"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API ECDSADigestEngine: public Poco::DigestEngine
|
||||
/// This class implements a Poco::DigestEngine that can be
|
||||
/// used to compute a secure digital signature.
|
||||
///
|
||||
/// First another Poco::Crypto::DigestEngine is created and
|
||||
/// used to compute a cryptographic hash of the data to be
|
||||
/// signed. Then, the hash value is encrypted, using
|
||||
/// the ECDSA private key.
|
||||
///
|
||||
/// To verify a signature, pass it to the verify()
|
||||
/// member function. It will decrypt the signature
|
||||
/// using the ECDSA public key and compare the resulting
|
||||
/// hash with the actual hash of the data.
|
||||
{
|
||||
public:
|
||||
|
||||
ECDSADigestEngine(const ECKey& key, const std::string &name);
|
||||
/// Creates the ECDSADigestEngine with the given ECDSA key,
|
||||
/// using the hash algorithm with the given name
|
||||
/// (e.g., "SHA1", "SHA256", "SHA512", etc.).
|
||||
/// See the OpenSSL documentation for a list of supported digest algorithms.
|
||||
///
|
||||
/// Throws a Poco::NotFoundException if no algorithm with the given name exists.
|
||||
|
||||
~ECDSADigestEngine();
|
||||
/// Destroys the ECDSADigestEngine.
|
||||
|
||||
std::size_t digestLength() const;
|
||||
/// Returns the length of the digest in bytes.
|
||||
|
||||
void reset();
|
||||
/// Resets the engine so that a new
|
||||
/// digest can be computed.
|
||||
|
||||
const DigestEngine::Digest& digest();
|
||||
/// Finishes the computation of the digest
|
||||
/// (the first time it's called) and
|
||||
/// returns the message digest.
|
||||
///
|
||||
/// Can be called multiple times.
|
||||
|
||||
const DigestEngine::Digest& signature();
|
||||
/// Signs the digest using the ECDSADSA algorithm
|
||||
/// and the private key (the first time it's
|
||||
/// called) and returns the result.
|
||||
///
|
||||
/// Can be called multiple times.
|
||||
|
||||
bool verify(const DigestEngine::Digest& signature);
|
||||
/// Verifies the data against the signature.
|
||||
///
|
||||
/// Returns true if the signature can be verified, false otherwise.
|
||||
|
||||
protected:
|
||||
void updateImpl(const void* data, std::size_t length);
|
||||
|
||||
private:
|
||||
ECKey _key;
|
||||
Poco::Crypto::DigestEngine _engine;
|
||||
Poco::DigestEngine::Digest _digest;
|
||||
Poco::DigestEngine::Digest _signature;
|
||||
};
|
||||
|
||||
|
||||
class Crypto_API ECDSASignature
|
||||
/// A helper class for dealing with ECDSA signatures.
|
||||
{
|
||||
public:
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
explicit ECDSASignature(const ByteVec& derSignature);
|
||||
/// Creates the ECDSASignature from a DER-encoded signature.
|
||||
|
||||
ECDSASignature(const ByteVec& rawR, const ByteVec& rawS);
|
||||
/// Creates the ECDSASignature from raw r and s values.
|
||||
|
||||
~ECDSASignature();
|
||||
/// Destroys the ECDSASignature.
|
||||
|
||||
ByteVec toDER() const;
|
||||
/// Returns a buffer containing the DER-encoded signature.
|
||||
|
||||
ByteVec rawR() const;
|
||||
/// Returns a raw P value.
|
||||
|
||||
ByteVec rawS() const;
|
||||
/// Returns a raw Q value.
|
||||
|
||||
private:
|
||||
ECDSA_SIG* _pSig;
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_ECDSADigestEngine_INCLUDED
|
145
vendor/POCO/Crypto/include/Poco/Crypto/ECKey.h
vendored
Normal file
145
vendor/POCO/Crypto/include/Poco/Crypto/ECKey.h
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
//
|
||||
// ECKey.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: EC
|
||||
// Module: ECKey
|
||||
//
|
||||
// Definition of the ECKey class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_ECKey_INCLUDED
|
||||
#define Crypto_ECKey_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/KeyPair.h"
|
||||
#include "Poco/Crypto/ECKeyImpl.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class X509Certificate;
|
||||
class PKCS12Container;
|
||||
|
||||
|
||||
class Crypto_API ECKey: public KeyPair
|
||||
/// This class stores an EC key pair, consisting
|
||||
/// of private and public key. Storage of the private
|
||||
/// key is optional.
|
||||
///
|
||||
/// If a private key is available, the ECKey can be
|
||||
/// used for decrypting data (encrypted with the public key)
|
||||
/// or computing secure digital signatures.
|
||||
{
|
||||
public:
|
||||
ECKey(const EVPPKey& key);
|
||||
/// Constructs ECKeyImpl by extracting the EC key.
|
||||
|
||||
ECKey(const X509Certificate& cert);
|
||||
/// Extracts the EC public key from the given certificate.
|
||||
|
||||
ECKey(const PKCS12Container& cert);
|
||||
/// Extracts the EC private key from the given certificate.
|
||||
|
||||
ECKey(const std::string& eccGroup);
|
||||
/// Creates the ECKey. Creates a new public/private keypair using the given parameters.
|
||||
/// Can be used to sign data and verify signatures.
|
||||
|
||||
ECKey(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the ECKey, by reading public and private key from the given files and
|
||||
/// using the given passphrase for the private key.
|
||||
///
|
||||
/// Cannot be used for signing or decryption unless a private key is available.
|
||||
///
|
||||
/// If a private key is specified, you don't need to specify a public key file.
|
||||
/// OpenSSL will auto-create the public key from the private key.
|
||||
|
||||
ECKey(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream = 0, const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the ECKey, by reading public and private key from the given streams and
|
||||
/// using the given passphrase for the private key.
|
||||
///
|
||||
/// Cannot be used for signing or decryption unless a private key is available.
|
||||
///
|
||||
/// If a private key is specified, you don't need to specify a public key file.
|
||||
/// OpenSSL will auto-create the public key from the private key.
|
||||
|
||||
ECKey(const ECKey& key);
|
||||
/// Creates the ECKey by copying another one.
|
||||
|
||||
ECKey(ECKey&& key) noexcept;
|
||||
/// Creates the ECKey by moving another one.
|
||||
|
||||
~ECKey();
|
||||
/// Destroys the ECKey.
|
||||
|
||||
ECKey& operator = (const ECKey& other);
|
||||
/// Assignment.
|
||||
|
||||
ECKey& operator = (ECKey&& other) noexcept;
|
||||
/// Move assignment.
|
||||
|
||||
ECKeyImpl::Ptr impl() const;
|
||||
/// Returns the impl object.
|
||||
|
||||
static std::string getCurveName(int nid = -1);
|
||||
/// Returns elliptical curve name corresponding to
|
||||
/// the given nid; if nid is not found, returns
|
||||
/// empty string.
|
||||
///
|
||||
/// If nid is -1, returns first curve name.
|
||||
///
|
||||
/// If no curves are found, returns empty string;
|
||||
|
||||
static int getCurveNID(std::string& name);
|
||||
/// Returns the NID of the specified curve.
|
||||
///
|
||||
/// If name is empty, returns the first curve NID
|
||||
/// and updates the name accordingly.
|
||||
|
||||
static bool hasCurve(const std::string& name);
|
||||
/// Returns true if the named curve is found,
|
||||
/// false otherwise.
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline ECKeyImpl::Ptr ECKey::impl() const
|
||||
{
|
||||
return KeyPair::impl().cast<ECKeyImpl>();
|
||||
}
|
||||
|
||||
|
||||
inline std::string ECKey::getCurveName(int nid)
|
||||
{
|
||||
return ECKeyImpl::getCurveName(nid);
|
||||
}
|
||||
|
||||
|
||||
inline int ECKey::getCurveNID(std::string& name)
|
||||
{
|
||||
return ECKeyImpl::getCurveNID(name);
|
||||
}
|
||||
|
||||
|
||||
inline bool ECKey::hasCurve(const std::string& name)
|
||||
{
|
||||
return ECKeyImpl::hasCurve(name);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_ECKey_INCLUDED
|
174
vendor/POCO/Crypto/include/Poco/Crypto/ECKeyImpl.h
vendored
Normal file
174
vendor/POCO/Crypto/include/Poco/Crypto/ECKeyImpl.h
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
//
|
||||
// ECKeyImpl.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: EC
|
||||
// Module: ECKeyImpl
|
||||
//
|
||||
// Definition of the ECKeyImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_ECKeyImplImpl_INCLUDED
|
||||
#define Crypto_ECKeyImplImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/EVPPKey.h"
|
||||
#include "Poco/Crypto/KeyPairImpl.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/ec.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class X509Certificate;
|
||||
class PKCS12Container;
|
||||
|
||||
|
||||
class ECKeyImpl: public KeyPairImpl
|
||||
/// Elliptic Curve key clas implementation.
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::AutoPtr<ECKeyImpl>;
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
ECKeyImpl(const EVPPKey& key);
|
||||
/// Constructs ECKeyImpl by extracting the EC key.
|
||||
|
||||
ECKeyImpl(const X509Certificate& cert);
|
||||
/// Constructs ECKeyImpl by extracting the EC public key from the given certificate.
|
||||
|
||||
ECKeyImpl(const PKCS12Container& cert);
|
||||
/// Constructs ECKeyImpl by extracting the EC private key from the given certificate.
|
||||
|
||||
ECKeyImpl(int eccGroup);
|
||||
/// Creates the ECKey of the specified group. Creates a new public/private keypair using the given parameters.
|
||||
/// Can be used to sign data and verify signatures.
|
||||
|
||||
ECKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
||||
/// Creates the ECKey, by reading public and private key from the given files and
|
||||
/// using the given passphrase for the private key. Can only by used for signing if
|
||||
/// a private key is available.
|
||||
|
||||
ECKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
||||
/// Creates the ECKey. Can only by used for signing if pPrivKey
|
||||
/// is not null. If a private key file is specified, you don't need to
|
||||
/// specify a public key file. OpenSSL will auto-create it from the private key.
|
||||
|
||||
~ECKeyImpl();
|
||||
/// Destroys the ECKeyImpl.
|
||||
|
||||
EC_KEY* getECKey();
|
||||
/// Returns the OpenSSL EC key.
|
||||
|
||||
const EC_KEY* getECKey() const;
|
||||
/// Returns the OpenSSL EC key.
|
||||
|
||||
int size() const;
|
||||
/// Returns the EC key length in bits.
|
||||
|
||||
int groupId() const;
|
||||
/// Returns the EC key group integer Id.
|
||||
|
||||
std::string groupName() const;
|
||||
/// Returns the EC key group name.
|
||||
|
||||
void save(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile = "",
|
||||
const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and private keys to the given files.
|
||||
///
|
||||
/// If an empty filename is specified, the corresponding key
|
||||
/// is not exported.
|
||||
|
||||
void save(std::ostream* pPublicKeyStream,
|
||||
std::ostream* pPrivateKeyStream = 0,
|
||||
const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and private key to the given streams.
|
||||
///
|
||||
/// If a null pointer is passed for a stream, the corresponding
|
||||
/// key is not exported.
|
||||
|
||||
static std::string getCurveName(int nid = -1);
|
||||
/// Returns elliptical curve name corresponding to
|
||||
/// the given nid; if nid is not found, returns
|
||||
/// empty string.
|
||||
///
|
||||
/// If nid is -1, returns first curve name.
|
||||
///
|
||||
/// If no curves are found, returns empty string;
|
||||
|
||||
static int getCurveNID(std::string& name);
|
||||
/// Returns the NID of the specified curve.
|
||||
///
|
||||
/// If name is empty, returns the first curve NID
|
||||
/// and updates the name accordingly.
|
||||
|
||||
static bool hasCurve(const std::string& name);
|
||||
/// Returns true if the named curve is found,
|
||||
/// false otherwise.
|
||||
|
||||
private:
|
||||
void checkEC(const std::string& method, const std::string& func) const;
|
||||
void freeEC();
|
||||
|
||||
EC_KEY* _pEC;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline EC_KEY* ECKeyImpl::getECKey()
|
||||
{
|
||||
return _pEC;
|
||||
}
|
||||
|
||||
|
||||
inline const EC_KEY* ECKeyImpl::getECKey() const
|
||||
{
|
||||
return _pEC;
|
||||
}
|
||||
|
||||
|
||||
inline std::string ECKeyImpl::groupName() const
|
||||
{
|
||||
return OBJ_nid2sn(groupId());
|
||||
}
|
||||
|
||||
|
||||
inline void ECKeyImpl::save(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile,
|
||||
const std::string& privateKeyPassphrase) const
|
||||
{
|
||||
EVPPKey(_pEC).save(publicKeyFile, privateKeyFile, privateKeyPassphrase);
|
||||
}
|
||||
|
||||
|
||||
inline void ECKeyImpl::save(std::ostream* pPublicKeyStream,
|
||||
std::ostream* pPrivateKeyStream,
|
||||
const std::string& privateKeyPassphrase) const
|
||||
{
|
||||
EVPPKey(_pEC).save(pPublicKeyStream, pPrivateKeyStream, privateKeyPassphrase);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_ECKeyImplImpl_INCLUDED
|
350
vendor/POCO/Crypto/include/Poco/Crypto/EVPPKey.h
vendored
Normal file
350
vendor/POCO/Crypto/include/Poco/Crypto/EVPPKey.h
vendored
Normal file
@@ -0,0 +1,350 @@
|
||||
//
|
||||
// EVPPKey.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: CryptoCore
|
||||
// Module: EVPPKey
|
||||
//
|
||||
// Definition of the EVPPKey class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_EVPPKeyImpl_INCLUDED
|
||||
#define Crypto_EVPPKeyImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/CryptoException.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include <openssl/ec.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <sstream>
|
||||
#include <typeinfo>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class ECKey;
|
||||
class RSAKey;
|
||||
|
||||
|
||||
class Crypto_API EVPPKey
|
||||
/// Utility class for conversion of native keys to EVP.
|
||||
/// Currently, only RSA and EC keys are supported.
|
||||
{
|
||||
public:
|
||||
explicit EVPPKey(const std::string& ecCurveName);
|
||||
/// Constructs EVPPKey from ECC curve name.
|
||||
///
|
||||
/// Only EC keys can be wrapped by an EVPPKey
|
||||
/// created using this constructor.
|
||||
|
||||
explicit EVPPKey(const char* ecCurveName);
|
||||
/// Constructs EVPPKey from ECC curve name.
|
||||
///
|
||||
/// Only EC keys can be wrapped by an EVPPKey
|
||||
/// created using this constructor.
|
||||
|
||||
explicit EVPPKey(EVP_PKEY* pEVPPKey);
|
||||
/// Constructs EVPPKey from EVP_PKEY pointer.
|
||||
/// The content behind the supplied pointer is internally duplicated.
|
||||
|
||||
template<typename K>
|
||||
explicit EVPPKey(K* pKey): _pEVPPKey(EVP_PKEY_new())
|
||||
/// Constructs EVPPKey from a "native" OpenSSL (RSA or EC_KEY),
|
||||
/// or a Poco wrapper (RSAKey, ECKey) key pointer.
|
||||
{
|
||||
if (!_pEVPPKey) throw OpenSSLException();
|
||||
setKey(pKey);
|
||||
}
|
||||
|
||||
EVPPKey(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the EVPPKey, by reading public and private key from the given files and
|
||||
/// using the given passphrase for the private key. Can only by used for signing if
|
||||
/// a private key is available.
|
||||
|
||||
EVPPKey(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the EVPPKey. Can only by used for signing if pPrivKey
|
||||
/// is not null. If a private key file is specified, you don't need to
|
||||
/// specify a public key file. OpenSSL will auto-create it from the private key.
|
||||
|
||||
EVPPKey(const EVPPKey& other);
|
||||
/// Copy constructor.
|
||||
|
||||
EVPPKey(EVPPKey&& other) noexcept;
|
||||
/// Move constructor.
|
||||
|
||||
EVPPKey& operator = (const EVPPKey& other);
|
||||
/// Assignment operator.
|
||||
|
||||
EVPPKey& operator = (EVPPKey&& other) noexcept;
|
||||
/// Assignment move operator.
|
||||
|
||||
~EVPPKey();
|
||||
/// Destroys the EVPPKey.
|
||||
|
||||
bool operator == (const EVPPKey& other) const;
|
||||
/// Comparison operator.
|
||||
/// Returns true if public key components and parameters
|
||||
/// of the other key are equal to this key.
|
||||
///
|
||||
/// Works as expected when one key contains only public key,
|
||||
/// while the other one contains private (thus also public) key.
|
||||
|
||||
bool operator != (const EVPPKey& other) const;
|
||||
/// Comparison operator.
|
||||
/// Returns true if public key components and parameters
|
||||
/// of the other key are different from this key.
|
||||
///
|
||||
/// Works as expected when one key contains only public key,
|
||||
/// while the other one contains private (thus also public) key.
|
||||
|
||||
void save(const std::string& publicKeyFile, const std::string& privateKeyFile = "", const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and/or private keys to the given files.
|
||||
///
|
||||
/// If an empty filename is specified, the corresponding key
|
||||
/// is not exported.
|
||||
|
||||
void save(std::ostream* pPublicKeyStream, std::ostream* pPrivateKeyStream = 0, const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and/or private key to the given streams.
|
||||
///
|
||||
/// If a null pointer is passed for a stream, the corresponding
|
||||
/// key is not exported.
|
||||
|
||||
int type() const;
|
||||
/// Retuns the EVPPKey type NID.
|
||||
|
||||
bool isSupported(int type) const;
|
||||
/// Returns true if OpenSSL type is supported
|
||||
|
||||
operator const EVP_PKEY*() const;
|
||||
/// Returns const pointer to the OpenSSL EVP_PKEY structure.
|
||||
|
||||
operator EVP_PKEY*();
|
||||
/// Returns pointer to the OpenSSL EVP_PKEY structure.
|
||||
|
||||
static EVP_PKEY* duplicate(const EVP_PKEY* pFromKey, EVP_PKEY** pToKey);
|
||||
/// Duplicates pFromKey into *pToKey and returns
|
||||
// the pointer to duplicated EVP_PKEY.
|
||||
|
||||
private:
|
||||
EVPPKey();
|
||||
|
||||
static int type(const EVP_PKEY* pEVPPKey);
|
||||
void newECKey(const char* group);
|
||||
void duplicate(EVP_PKEY* pEVPPKey);
|
||||
|
||||
void setKey(ECKey* pKey);
|
||||
void setKey(RSAKey* pKey);
|
||||
void setKey(EC_KEY* pKey);
|
||||
void setKey(RSA* pKey);
|
||||
static int passCB(char* buf, int size, int, void* pass);
|
||||
|
||||
typedef EVP_PKEY* (*PEM_read_FILE_Key_fn)(FILE*, EVP_PKEY**, pem_password_cb*, void*);
|
||||
typedef EVP_PKEY* (*PEM_read_BIO_Key_fn)(BIO*, EVP_PKEY**, pem_password_cb*, void*);
|
||||
typedef void* (*EVP_PKEY_get_Key_fn)(EVP_PKEY*);
|
||||
|
||||
// The following load*() functions are used by both native and EVP_PKEY type key
|
||||
// loading from BIO/FILE.
|
||||
// When used for EVP key loading, getFunc is null (ie. native key is not extracted
|
||||
// from the loaded EVP_PKEY).
|
||||
template <typename K, typename F>
|
||||
static bool loadKey(K** ppKey,
|
||||
PEM_read_FILE_Key_fn readFunc,
|
||||
F getFunc,
|
||||
const std::string& keyFile,
|
||||
const std::string& pass = "")
|
||||
{
|
||||
poco_assert_dbg (((typeid(K*) == typeid(RSA*) || typeid(K*) == typeid(EC_KEY*)) && getFunc) ||
|
||||
((typeid(K*) == typeid(EVP_PKEY*)) && !getFunc));
|
||||
poco_check_ptr (ppKey);
|
||||
poco_assert_dbg (!*ppKey);
|
||||
|
||||
FILE* pFile = 0;
|
||||
if (!keyFile.empty())
|
||||
{
|
||||
if (!getFunc) *ppKey = (K*)EVP_PKEY_new();
|
||||
EVP_PKEY* pKey = getFunc ? EVP_PKEY_new() : (EVP_PKEY*)*ppKey;
|
||||
if (pKey)
|
||||
{
|
||||
pFile = fopen(keyFile.c_str(), "r");
|
||||
if (pFile)
|
||||
{
|
||||
pem_password_cb* pCB = pass.empty() ? (pem_password_cb*)0 : &passCB;
|
||||
void* pPassword = pass.empty() ? (void*)0 : (void*)pass.c_str();
|
||||
if (readFunc(pFile, &pKey, pCB, pPassword))
|
||||
{
|
||||
fclose(pFile); pFile = 0;
|
||||
if(getFunc)
|
||||
{
|
||||
*ppKey = (K*)getFunc(pKey);
|
||||
EVP_PKEY_free(pKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert_dbg (typeid(K*) == typeid(EVP_PKEY*));
|
||||
*ppKey = (K*)pKey;
|
||||
}
|
||||
if(!*ppKey) goto error;
|
||||
return true;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (getFunc) EVP_PKEY_free(pKey);
|
||||
throw IOException("ECKeyImpl, cannot open file", keyFile);
|
||||
}
|
||||
}
|
||||
else goto error;
|
||||
}
|
||||
return false;
|
||||
|
||||
error:
|
||||
if (pFile) fclose(pFile);
|
||||
throw OpenSSLException("EVPKey::loadKey(string)");
|
||||
}
|
||||
|
||||
template <typename K, typename F>
|
||||
static bool loadKey(K** ppKey,
|
||||
PEM_read_BIO_Key_fn readFunc,
|
||||
F getFunc,
|
||||
std::istream* pIstr,
|
||||
const std::string& pass = "")
|
||||
{
|
||||
poco_assert_dbg (((typeid(K*) == typeid(RSA*) || typeid(K*) == typeid(EC_KEY*)) && getFunc) ||
|
||||
((typeid(K*) == typeid(EVP_PKEY*)) && !getFunc));
|
||||
poco_check_ptr(ppKey);
|
||||
poco_assert_dbg(!*ppKey);
|
||||
|
||||
BIO* pBIO = 0;
|
||||
if (pIstr)
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
Poco::StreamCopier::copyStream(*pIstr, ostr);
|
||||
std::string key = ostr.str();
|
||||
pBIO = BIO_new_mem_buf(const_cast<char*>(key.data()), static_cast<int>(key.size()));
|
||||
if (pBIO)
|
||||
{
|
||||
if (!getFunc) *ppKey = (K*)EVP_PKEY_new();
|
||||
EVP_PKEY* pKey = getFunc ? EVP_PKEY_new() : (EVP_PKEY*)*ppKey;
|
||||
if (pKey)
|
||||
{
|
||||
pem_password_cb* pCB = pass.empty() ? (pem_password_cb*)0 : &passCB;
|
||||
void* pPassword = pass.empty() ? (void*)0 : (void*)pass.c_str();
|
||||
if (readFunc(pBIO, &pKey, pCB, pPassword))
|
||||
{
|
||||
BIO_free(pBIO); pBIO = 0;
|
||||
if (getFunc)
|
||||
{
|
||||
*ppKey = (K*)getFunc(pKey);
|
||||
EVP_PKEY_free(pKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert_dbg (typeid(K*) == typeid(EVP_PKEY*));
|
||||
*ppKey = (K*)pKey;
|
||||
}
|
||||
if (!*ppKey) goto error;
|
||||
return true;
|
||||
}
|
||||
if (getFunc) EVP_PKEY_free(pKey);
|
||||
goto error;
|
||||
}
|
||||
else goto error;
|
||||
}
|
||||
else goto error;
|
||||
}
|
||||
return false;
|
||||
|
||||
error:
|
||||
if (pBIO) BIO_free(pBIO);
|
||||
throw OpenSSLException("EVPKey::loadKey(stream)");
|
||||
}
|
||||
|
||||
EVP_PKEY* _pEVPPKey;
|
||||
|
||||
friend class ECKeyImpl;
|
||||
friend class RSAKeyImpl;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
|
||||
|
||||
inline bool EVPPKey::operator == (const EVPPKey& other) const
|
||||
{
|
||||
poco_check_ptr (other._pEVPPKey);
|
||||
poco_check_ptr (_pEVPPKey);
|
||||
return (1 == EVP_PKEY_cmp(_pEVPPKey, other._pEVPPKey));
|
||||
}
|
||||
|
||||
|
||||
inline bool EVPPKey::operator != (const EVPPKey& other) const
|
||||
{
|
||||
return !(other == *this);
|
||||
}
|
||||
|
||||
|
||||
inline int EVPPKey::type(const EVP_PKEY* pEVPPKey)
|
||||
{
|
||||
if (!pEVPPKey) return NID_undef;
|
||||
|
||||
return EVP_PKEY_type(EVP_PKEY_id(pEVPPKey));
|
||||
}
|
||||
|
||||
|
||||
inline int EVPPKey::type() const
|
||||
{
|
||||
return type(_pEVPPKey);
|
||||
}
|
||||
|
||||
|
||||
inline bool EVPPKey::isSupported(int type) const
|
||||
{
|
||||
return type == EVP_PKEY_EC || type == EVP_PKEY_RSA;
|
||||
}
|
||||
|
||||
|
||||
inline EVPPKey::operator const EVP_PKEY*() const
|
||||
{
|
||||
return _pEVPPKey;
|
||||
}
|
||||
|
||||
|
||||
inline EVPPKey::operator EVP_PKEY*()
|
||||
{
|
||||
return _pEVPPKey;
|
||||
}
|
||||
|
||||
|
||||
inline void EVPPKey::setKey(EC_KEY* pKey)
|
||||
{
|
||||
if (!EVP_PKEY_set1_EC_KEY(_pEVPPKey, pKey))
|
||||
throw OpenSSLException();
|
||||
}
|
||||
|
||||
|
||||
inline void EVPPKey::setKey(RSA* pKey)
|
||||
{
|
||||
if (!EVP_PKEY_set1_RSA(_pEVPPKey, pKey))
|
||||
throw OpenSSLException();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_EVPPKeyImpl_INCLUDED
|
144
vendor/POCO/Crypto/include/Poco/Crypto/KeyPair.h
vendored
Normal file
144
vendor/POCO/Crypto/include/Poco/Crypto/KeyPair.h
vendored
Normal file
@@ -0,0 +1,144 @@
|
||||
//
|
||||
// KeyPair.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: CryptoCore
|
||||
// Module: KeyPair
|
||||
//
|
||||
// Definition of the KeyPair class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_KeyPair_INCLUDED
|
||||
#define Crypto_KeyPair_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/KeyPairImpl.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class X509Certificate;
|
||||
|
||||
|
||||
class Crypto_API KeyPair
|
||||
/// This is a parent class for classes storing a key pair, consisting
|
||||
/// of private and public key. Storage of the private key is optional.
|
||||
///
|
||||
/// If a private key is available, the KeyPair can be
|
||||
/// used for decrypting data (encrypted with the public key)
|
||||
/// or computing secure digital signatures.
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
KT_RSA = KeyPairImpl::KT_RSA_IMPL,
|
||||
KT_EC = KeyPairImpl::KT_EC_IMPL
|
||||
};
|
||||
|
||||
explicit KeyPair(KeyPairImpl::Ptr pKeyPairImpl = 0);
|
||||
/// Extracts the RSA public key from the given certificate.
|
||||
|
||||
KeyPair(const KeyPair& other);
|
||||
/// Copy constructor.
|
||||
|
||||
KeyPair(KeyPair&& other) noexcept;
|
||||
/// Move constructor.
|
||||
|
||||
KeyPair& operator = (const KeyPair& other);
|
||||
/// Assignment.
|
||||
|
||||
KeyPair& operator = (KeyPair&& other) noexcept;
|
||||
/// Move assignment.
|
||||
|
||||
virtual ~KeyPair();
|
||||
/// Destroys the KeyPair.
|
||||
|
||||
virtual int size() const;
|
||||
/// Returns the RSA modulus size.
|
||||
|
||||
virtual void save(const std::string& publicKeyPairFile,
|
||||
const std::string& privateKeyPairFile = "",
|
||||
const std::string& privateKeyPairPassphrase = "") const;
|
||||
/// Exports the public and private keys to the given files.
|
||||
///
|
||||
/// If an empty filename is specified, the corresponding key
|
||||
/// is not exported.
|
||||
|
||||
virtual void save(std::ostream* pPublicKeyPairStream,
|
||||
std::ostream* pPrivateKeyPairStream = 0,
|
||||
const std::string& privateKeyPairPassphrase = "") const;
|
||||
/// Exports the public and private key to the given streams.
|
||||
///
|
||||
/// If a null pointer is passed for a stream, the corresponding
|
||||
/// key is not exported.
|
||||
|
||||
KeyPairImpl::Ptr impl() const;
|
||||
/// Returns the impl object.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns key pair name
|
||||
|
||||
Type type() const;
|
||||
/// Returns key pair type
|
||||
|
||||
private:
|
||||
KeyPairImpl::Ptr _pImpl;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline int KeyPair::size() const
|
||||
{
|
||||
return _pImpl->size();
|
||||
}
|
||||
|
||||
|
||||
inline void KeyPair::save(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile,
|
||||
const std::string& privateKeyPassphrase) const
|
||||
{
|
||||
_pImpl->save(publicKeyFile, privateKeyFile, privateKeyPassphrase);
|
||||
}
|
||||
|
||||
|
||||
inline void KeyPair::save(std::ostream* pPublicKeyStream,
|
||||
std::ostream* pPrivateKeyStream,
|
||||
const std::string& privateKeyPassphrase) const
|
||||
{
|
||||
_pImpl->save(pPublicKeyStream, pPrivateKeyStream, privateKeyPassphrase);
|
||||
}
|
||||
|
||||
|
||||
inline const std::string& KeyPair::name() const
|
||||
{
|
||||
return _pImpl->name();
|
||||
}
|
||||
|
||||
|
||||
inline KeyPairImpl::Ptr KeyPair::impl() const
|
||||
{
|
||||
return _pImpl;
|
||||
}
|
||||
|
||||
|
||||
inline KeyPair::Type KeyPair::type() const
|
||||
{
|
||||
return (KeyPair::Type)impl()->type();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_KeyPair_INCLUDED
|
107
vendor/POCO/Crypto/include/Poco/Crypto/KeyPairImpl.h
vendored
Normal file
107
vendor/POCO/Crypto/include/Poco/Crypto/KeyPairImpl.h
vendored
Normal file
@@ -0,0 +1,107 @@
|
||||
//
|
||||
// KeyPairImpl.h
|
||||
//
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: CryptoCore
|
||||
// Module: KeyPairImpl
|
||||
//
|
||||
// Definition of the KeyPairImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_KeyPairImplImpl_INCLUDED
|
||||
#define Crypto_KeyPairImplImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class KeyPairImpl: public Poco::RefCountedObject
|
||||
/// Class KeyPairImpl
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
KT_RSA_IMPL = 0,
|
||||
KT_EC_IMPL
|
||||
};
|
||||
|
||||
using Ptr = Poco::AutoPtr<KeyPairImpl>;
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
KeyPairImpl(const std::string& name, Type type);
|
||||
/// Create KeyPairImpl with specified type and name.
|
||||
|
||||
virtual ~KeyPairImpl();
|
||||
/// Destroys the KeyPairImpl.
|
||||
|
||||
virtual int size() const = 0;
|
||||
/// Returns the key size.
|
||||
|
||||
virtual void save(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile = "",
|
||||
const std::string& privateKeyPassphrase = "") const = 0;
|
||||
/// Exports the public and private keys to the given files.
|
||||
///
|
||||
/// If an empty filename is specified, the corresponding key
|
||||
/// is not exported.
|
||||
|
||||
virtual void save(std::ostream* pPublicKeyStream,
|
||||
std::ostream* pPrivateKeyStream = 0,
|
||||
const std::string& privateKeyPassphrase = "") const = 0;
|
||||
/// Exports the public and private key to the given streams.
|
||||
///
|
||||
/// If a null pointer is passed for a stream, the corresponding
|
||||
/// key is not exported.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns key pair name
|
||||
|
||||
Type type() const;
|
||||
/// Returns key pair type
|
||||
|
||||
private:
|
||||
KeyPairImpl();
|
||||
|
||||
std::string _name;
|
||||
Type _type;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
|
||||
|
||||
inline const std::string& KeyPairImpl::name() const
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
|
||||
inline KeyPairImpl::Type KeyPairImpl::type() const
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_KeyPairImplImpl_INCLUDED
|
115
vendor/POCO/Crypto/include/Poco/Crypto/OpenSSLInitializer.h
vendored
Normal file
115
vendor/POCO/Crypto/include/Poco/Crypto/OpenSSLInitializer.h
vendored
Normal file
@@ -0,0 +1,115 @@
|
||||
//
|
||||
// OpenSSLInitializer.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: CryptoCore
|
||||
// Module: OpenSSLInitializer
|
||||
//
|
||||
// Definition of the OpenSSLInitializer class.
|
||||
//
|
||||
// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_OpenSSLInitializer_INCLUDED
|
||||
#define Crypto_OpenSSLInitializer_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Mutex.h"
|
||||
#include "Poco/AtomicCounter.h"
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
#if defined(OPENSSL_FIPS) && OPENSSL_VERSION_NUMBER < 0x010001000L
|
||||
#include <openssl/fips.h>
|
||||
#endif
|
||||
|
||||
|
||||
extern "C"
|
||||
{
|
||||
struct CRYPTO_dynlock_value
|
||||
{
|
||||
Poco::FastMutex _mutex;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API OpenSSLInitializer
|
||||
/// Initalizes the OpenSSL library.
|
||||
///
|
||||
/// The class ensures the earliest initialization and the
|
||||
/// latest shutdown of the OpenSSL library.
|
||||
{
|
||||
public:
|
||||
OpenSSLInitializer();
|
||||
/// Automatically initialize OpenSSL on startup.
|
||||
|
||||
~OpenSSLInitializer();
|
||||
/// Automatically shut down OpenSSL on exit.
|
||||
|
||||
static void initialize();
|
||||
/// Initializes the OpenSSL machinery.
|
||||
|
||||
static void uninitialize();
|
||||
/// Shuts down the OpenSSL machinery.
|
||||
|
||||
static bool isFIPSEnabled();
|
||||
// Returns true if FIPS mode is enabled, false otherwise.
|
||||
|
||||
static void enableFIPSMode(bool enabled);
|
||||
// Enable or disable FIPS mode. If FIPS is not available, this method doesn't do anything.
|
||||
|
||||
protected:
|
||||
enum
|
||||
{
|
||||
SEEDSIZE = 256
|
||||
};
|
||||
|
||||
// OpenSSL multithreading support
|
||||
static void lock(int mode, int n, const char* file, int line);
|
||||
static unsigned long id();
|
||||
static struct CRYPTO_dynlock_value* dynlockCreate(const char* file, int line);
|
||||
static void dynlock(int mode, struct CRYPTO_dynlock_value* lock, const char* file, int line);
|
||||
static void dynlockDestroy(struct CRYPTO_dynlock_value* lock, const char* file, int line);
|
||||
|
||||
private:
|
||||
static Poco::FastMutex* _mutexes;
|
||||
static Poco::AtomicCounter _rc;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline bool OpenSSLInitializer::isFIPSEnabled()
|
||||
{
|
||||
#ifdef OPENSSL_FIPS
|
||||
return FIPS_mode() ? true : false;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef OPENSSL_FIPS
|
||||
inline void OpenSSLInitializer::enableFIPSMode(bool enabled)
|
||||
{
|
||||
FIPS_mode_set(enabled);
|
||||
}
|
||||
#else
|
||||
inline void OpenSSLInitializer::enableFIPSMode(bool /*enabled*/)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_OpenSSLInitializer_INCLUDED
|
151
vendor/POCO/Crypto/include/Poco/Crypto/PKCS12Container.h
vendored
Normal file
151
vendor/POCO/Crypto/include/Poco/Crypto/PKCS12Container.h
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
//
|
||||
// PKCS12Container.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Certificate
|
||||
// Module: PKCS12Container
|
||||
//
|
||||
// Definition of the PKCS12Container class.
|
||||
//
|
||||
// Copyright (c) 2006-2009, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_PKCS12Container_INCLUDED
|
||||
#define Crypto_PKCS12Container_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/Crypto/X509Certificate.h"
|
||||
#include "Poco/Crypto/EVPPKey.h"
|
||||
#include "Poco/Path.h"
|
||||
#include <memory>
|
||||
#include <istream>
|
||||
#include <openssl/pkcs12.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API PKCS12Container
|
||||
/// This class implements PKCS#12 container functionality.
|
||||
{
|
||||
public:
|
||||
using CAList = X509Certificate::List;
|
||||
using CANameList = std::vector<std::string>;
|
||||
|
||||
explicit PKCS12Container(std::istream& istr, const std::string& password = "");
|
||||
/// Creates the PKCS12Container object from a stream.
|
||||
|
||||
explicit PKCS12Container(const std::string& path, const std::string& password = "");
|
||||
/// Creates the PKCS12Container object from a file.
|
||||
|
||||
PKCS12Container(const PKCS12Container& cont);
|
||||
/// Copy constructor.
|
||||
|
||||
PKCS12Container(PKCS12Container&& cont) noexcept;
|
||||
/// Move constructor.
|
||||
|
||||
PKCS12Container& operator = (const PKCS12Container& cont);
|
||||
/// Assignment operator.
|
||||
|
||||
PKCS12Container& operator = (PKCS12Container&& cont) noexcept;
|
||||
/// Move assignment operator.
|
||||
|
||||
~PKCS12Container();
|
||||
/// Destroys the PKCS12Container.
|
||||
|
||||
bool hasKey() const;
|
||||
/// Returns true if container contains the key.
|
||||
|
||||
EVPPKey getKey() const;
|
||||
/// Return key as openssl EVP_PKEY wrapper object.
|
||||
|
||||
bool hasX509Certificate() const;
|
||||
/// Returns true if container has X509 certificate.
|
||||
|
||||
const X509Certificate& getX509Certificate() const;
|
||||
/// Returns the X509 certificate.
|
||||
/// Throws NotFoundException if there is no certificate.
|
||||
|
||||
const CAList& getCACerts() const;
|
||||
/// Returns the list of CA certificates in this container.
|
||||
|
||||
const std::string& getFriendlyName() const;
|
||||
/// Returns the friendly name of the certificate bag.
|
||||
|
||||
const CANameList& getFriendlyNamesCA() const;
|
||||
/// Returns a list of CA certificates friendly names.
|
||||
|
||||
private:
|
||||
void load(PKCS12* pPKCS12, const std::string& password = "");
|
||||
std::string extractFriendlyName(X509* pCert);
|
||||
|
||||
using CertPtr = std::unique_ptr<X509Certificate>;
|
||||
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
EVP_PKEY* _pKey;
|
||||
CertPtr _pX509Cert;
|
||||
CAList _caCertList;
|
||||
CANameList _caCertNames;
|
||||
std::string _pkcsFriendlyName;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
|
||||
inline bool PKCS12Container::hasX509Certificate() const
|
||||
{
|
||||
return _pX509Cert.get() != 0;
|
||||
}
|
||||
|
||||
|
||||
inline const X509Certificate& PKCS12Container::getX509Certificate() const
|
||||
{
|
||||
if (!hasX509Certificate())
|
||||
throw NotFoundException("PKCS12Container X509 certificate");
|
||||
return *_pX509Cert;
|
||||
}
|
||||
|
||||
|
||||
inline const std::string& PKCS12Container::getFriendlyName() const
|
||||
{
|
||||
return _pkcsFriendlyName;
|
||||
}
|
||||
|
||||
|
||||
inline const PKCS12Container::CAList& PKCS12Container::getCACerts() const
|
||||
{
|
||||
return _caCertList;
|
||||
}
|
||||
|
||||
|
||||
inline const PKCS12Container::CANameList& PKCS12Container::getFriendlyNamesCA() const
|
||||
{
|
||||
return _caCertNames;
|
||||
}
|
||||
|
||||
|
||||
inline bool PKCS12Container::hasKey() const
|
||||
{
|
||||
return _pKey != 0;
|
||||
}
|
||||
|
||||
|
||||
inline EVPPKey PKCS12Container::getKey() const
|
||||
{
|
||||
return EVPPKey(_pKey);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_PKCS12Container_INCLUDED
|
77
vendor/POCO/Crypto/include/Poco/Crypto/RSACipherImpl.h
vendored
Normal file
77
vendor/POCO/Crypto/include/Poco/Crypto/RSACipherImpl.h
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
//
|
||||
// RSACipherImpl.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: RSA
|
||||
// Module: RSACipherImpl
|
||||
//
|
||||
// Definition of the RSACipherImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_RSACipherImpl_INCLUDED
|
||||
#define Crypto_RSACipherImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/Cipher.h"
|
||||
#include "Poco/Crypto/RSAKey.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include <openssl/evp.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class RSACipherImpl: public Cipher
|
||||
/// An implementation of the Cipher class for
|
||||
/// asymmetric (public-private key) encryption
|
||||
/// based on the the RSA algorithm in OpenSSL's
|
||||
/// crypto library.
|
||||
///
|
||||
/// Encryption is using the public key, decryption
|
||||
/// requires the private key.
|
||||
{
|
||||
public:
|
||||
RSACipherImpl(const RSAKey& key, RSAPaddingMode paddingMode);
|
||||
/// Creates a new RSACipherImpl object for the given RSAKey
|
||||
/// and using the given padding mode.
|
||||
|
||||
virtual ~RSACipherImpl();
|
||||
/// Destroys the RSACipherImpl.
|
||||
|
||||
const std::string& name() const;
|
||||
/// Returns the name of the Cipher.
|
||||
|
||||
CryptoTransform::Ptr createEncryptor();
|
||||
/// Creates an encryptor object.
|
||||
|
||||
CryptoTransform::Ptr createDecryptor();
|
||||
/// Creates a decryptor object.
|
||||
|
||||
private:
|
||||
RSAKey _key;
|
||||
RSAPaddingMode _paddingMode;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Inlines
|
||||
//
|
||||
inline const std::string& RSACipherImpl::name() const
|
||||
{
|
||||
return _key.name();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_RSACipherImpl_INCLUDED
|
111
vendor/POCO/Crypto/include/Poco/Crypto/RSADigestEngine.h
vendored
Normal file
111
vendor/POCO/Crypto/include/Poco/Crypto/RSADigestEngine.h
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
//
|
||||
// RSADigestEngine.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: RSA
|
||||
// Module: RSADigestEngine
|
||||
//
|
||||
// Definition of the RSADigestEngine class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_RSADigestEngine_INCLUDED
|
||||
#define Crypto_RSADigestEngine_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/RSAKey.h"
|
||||
#include "Poco/DigestEngine.h"
|
||||
#include "Poco/Crypto/DigestEngine.h"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API RSADigestEngine: public Poco::DigestEngine
|
||||
/// This class implements a Poco::DigestEngine that can be
|
||||
/// used to compute a secure digital signature.
|
||||
///
|
||||
/// First another Poco::Crypto::DigestEngine is created and
|
||||
/// used to compute a cryptographic hash of the data to be
|
||||
/// signed. Then, the hash value is encrypted, using
|
||||
/// the RSA private key.
|
||||
///
|
||||
/// To verify a signature, pass it to the verify()
|
||||
/// member function. It will decrypt the signature
|
||||
/// using the RSA public key and compare the resulting
|
||||
/// hash with the actual hash of the data.
|
||||
{
|
||||
public:
|
||||
enum DigestType
|
||||
{
|
||||
DIGEST_MD5,
|
||||
DIGEST_SHA1
|
||||
};
|
||||
|
||||
//@ deprecated
|
||||
RSADigestEngine(const RSAKey& key, DigestType digestType = DIGEST_SHA1);
|
||||
/// Creates the RSADigestEngine with the given RSA key,
|
||||
/// using the MD5 or SHA-1 hash algorithm.
|
||||
/// Kept for backward compatibility
|
||||
|
||||
RSADigestEngine(const RSAKey& key, const std::string &name);
|
||||
/// Creates the RSADigestEngine with the given RSA key,
|
||||
/// using the hash algorithm with the given name
|
||||
/// (e.g., "MD5", "SHA1", "SHA256", "SHA512", etc.).
|
||||
/// See the OpenSSL documentation for a list of supported digest algorithms.
|
||||
///
|
||||
/// Throws a Poco::NotFoundException if no algorithm with the given name exists.
|
||||
|
||||
~RSADigestEngine();
|
||||
/// Destroys the RSADigestEngine.
|
||||
|
||||
std::size_t digestLength() const;
|
||||
/// Returns the length of the digest in bytes.
|
||||
|
||||
void reset();
|
||||
/// Resets the engine so that a new
|
||||
/// digest can be computed.
|
||||
|
||||
const DigestEngine::Digest& digest();
|
||||
/// Finishes the computation of the digest
|
||||
/// (the first time it's called) and
|
||||
/// returns the message digest.
|
||||
///
|
||||
/// Can be called multiple times.
|
||||
|
||||
const DigestEngine::Digest& signature();
|
||||
/// Signs the digest using the RSA algorithm
|
||||
/// and the private key (the first time it's
|
||||
/// called) and returns the result.
|
||||
///
|
||||
/// Can be called multiple times.
|
||||
|
||||
bool verify(const DigestEngine::Digest& signature);
|
||||
/// Verifies the data against the signature.
|
||||
///
|
||||
/// Returns true if the signature can be verified, false otherwise.
|
||||
|
||||
protected:
|
||||
void updateImpl(const void* data, std::size_t length);
|
||||
|
||||
private:
|
||||
RSAKey _key;
|
||||
Poco::Crypto::DigestEngine _engine;
|
||||
Poco::DigestEngine::Digest _digest;
|
||||
Poco::DigestEngine::Digest _signature;
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_RSADigestEngine_INCLUDED
|
134
vendor/POCO/Crypto/include/Poco/Crypto/RSAKey.h
vendored
Normal file
134
vendor/POCO/Crypto/include/Poco/Crypto/RSAKey.h
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
//
|
||||
// RSAKey.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: RSA
|
||||
// Module: RSAKey
|
||||
//
|
||||
// Definition of the RSAKey class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_RSAKey_INCLUDED
|
||||
#define Crypto_RSAKey_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/KeyPair.h"
|
||||
#include "Poco/Crypto/RSAKeyImpl.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class X509Certificate;
|
||||
class PKCS12Container;
|
||||
|
||||
|
||||
class Crypto_API RSAKey: public KeyPair
|
||||
/// This class stores an RSA key pair, consisting
|
||||
/// of private and public key. Storage of the private
|
||||
/// key is optional.
|
||||
///
|
||||
/// If a private key is available, the RSAKey can be
|
||||
/// used for decrypting data (encrypted with the public key)
|
||||
/// or computing secure digital signatures.
|
||||
{
|
||||
public:
|
||||
enum KeyLength
|
||||
{
|
||||
KL_512 = 512,
|
||||
KL_1024 = 1024,
|
||||
KL_2048 = 2048,
|
||||
KL_4096 = 4096
|
||||
};
|
||||
|
||||
enum Exponent
|
||||
{
|
||||
EXP_SMALL = 0,
|
||||
EXP_LARGE
|
||||
};
|
||||
|
||||
RSAKey(const EVPPKey& key);
|
||||
/// Constructs ECKeyImpl by extracting the EC key.
|
||||
|
||||
RSAKey(const X509Certificate& cert);
|
||||
/// Extracts the RSA public key from the given certificate.
|
||||
|
||||
RSAKey(const PKCS12Container& cert);
|
||||
/// Extracts the RSA private key from the given certificate.
|
||||
|
||||
RSAKey(KeyLength keyLength, Exponent exp);
|
||||
/// Creates the RSAKey. Creates a new public/private keypair using the given parameters.
|
||||
/// Can be used to sign data and verify signatures.
|
||||
|
||||
RSAKey(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile = "",
|
||||
const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the RSAKey, by reading public and private key from the given files and
|
||||
/// using the given passphrase for the private key.
|
||||
///
|
||||
/// Cannot be used for signing or decryption unless a private key is available.
|
||||
///
|
||||
/// If a private key is specified, you don't need to specify a public key file.
|
||||
/// OpenSSL will auto-create the public key from the private key.
|
||||
|
||||
RSAKey(std::istream* pPublicKeyStream,
|
||||
std::istream* pPrivateKeyStream = 0,
|
||||
const std::string& privateKeyPassphrase = "");
|
||||
/// Creates the RSAKey, by reading public and private key from the given streams and
|
||||
/// using the given passphrase for the private key.
|
||||
///
|
||||
/// Cannot be used for signing or decryption unless a private key is available.
|
||||
///
|
||||
/// If a private key is specified, you don't need to specify a public key file.
|
||||
/// OpenSSL will auto-create the public key from the private key.
|
||||
|
||||
RSAKey(const RSAKey& other);
|
||||
/// Copy constructor.
|
||||
|
||||
RSAKey(RSAKey&& other) noexcept;
|
||||
/// Move constructor.
|
||||
|
||||
~RSAKey();
|
||||
/// Destroys the RSAKey.
|
||||
|
||||
RSAKey& operator = (const RSAKey& other);
|
||||
/// Assignment.
|
||||
|
||||
RSAKey& operator = (RSAKey&& other) noexcept;
|
||||
/// Move assignment.
|
||||
|
||||
RSAKeyImpl::ByteVec modulus() const;
|
||||
/// Returns the RSA modulus.
|
||||
|
||||
RSAKeyImpl::ByteVec encryptionExponent() const;
|
||||
/// Returns the RSA encryption exponent.
|
||||
|
||||
RSAKeyImpl::ByteVec decryptionExponent() const;
|
||||
/// Returns the RSA decryption exponent.
|
||||
|
||||
RSAKeyImpl::Ptr impl() const;
|
||||
/// Returns the impl object.
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline RSAKeyImpl::Ptr RSAKey::impl() const
|
||||
{
|
||||
return KeyPair::impl().cast<RSAKeyImpl>();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_RSAKey_INCLUDED
|
141
vendor/POCO/Crypto/include/Poco/Crypto/RSAKeyImpl.h
vendored
Normal file
141
vendor/POCO/Crypto/include/Poco/Crypto/RSAKeyImpl.h
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
//
|
||||
// RSAKeyImpl.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: RSA
|
||||
// Module: RSAKeyImpl
|
||||
//
|
||||
// Definition of the RSAKeyImpl class.
|
||||
//
|
||||
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Crypto_RSAKeyImplImpl_INCLUDED
|
||||
#define Crypto_RSAKeyImplImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/EVPPKey.h"
|
||||
#include "Poco/Crypto/KeyPairImpl.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
|
||||
struct bignum_st;
|
||||
struct rsa_st;
|
||||
typedef struct bignum_st BIGNUM;
|
||||
typedef struct rsa_st RSA;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class X509Certificate;
|
||||
class PKCS12Container;
|
||||
|
||||
|
||||
class RSAKeyImpl: public KeyPairImpl
|
||||
/// class RSAKeyImpl
|
||||
{
|
||||
public:
|
||||
using Ptr = Poco::AutoPtr<RSAKeyImpl>;
|
||||
using ByteVec = std::vector<unsigned char>;
|
||||
|
||||
RSAKeyImpl(const EVPPKey& key);
|
||||
/// Constructs ECKeyImpl by extracting the EC key.
|
||||
|
||||
RSAKeyImpl(const X509Certificate& cert);
|
||||
/// Extracts the RSA public key from the given certificate.
|
||||
|
||||
RSAKeyImpl(const PKCS12Container& cert);
|
||||
/// Extracts the EC private key from the given certificate.
|
||||
|
||||
RSAKeyImpl(int keyLength, unsigned long exponent);
|
||||
/// Creates the RSAKey. Creates a new public/private keypair using the given parameters.
|
||||
/// Can be used to sign data and verify signatures.
|
||||
|
||||
RSAKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
||||
/// Creates the RSAKey, by reading public and private key from the given files and
|
||||
/// using the given passphrase for the private key. Can only by used for signing if
|
||||
/// a private key is available.
|
||||
|
||||
RSAKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
||||
/// Creates the RSAKey. Can only by used for signing if pPrivKey
|
||||
/// is not null. If a private key file is specified, you don't need to
|
||||
/// specify a public key file. OpenSSL will auto-create it from the private key.
|
||||
|
||||
~RSAKeyImpl();
|
||||
/// Destroys the RSAKeyImpl.
|
||||
|
||||
RSA* getRSA();
|
||||
/// Returns the OpenSSL RSA object.
|
||||
|
||||
const RSA* getRSA() const;
|
||||
/// Returns the OpenSSL RSA object.
|
||||
|
||||
int size() const;
|
||||
/// Returns the RSA modulus size.
|
||||
|
||||
ByteVec modulus() const;
|
||||
/// Returns the RSA modulus.
|
||||
|
||||
ByteVec encryptionExponent() const;
|
||||
/// Returns the RSA encryption exponent.
|
||||
|
||||
ByteVec decryptionExponent() const;
|
||||
/// Returns the RSA decryption exponent.
|
||||
|
||||
void save(const std::string& publicKeyFile,
|
||||
const std::string& privateKeyFile = "",
|
||||
const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and private keys to the given files.
|
||||
///
|
||||
/// If an empty filename is specified, the corresponding key
|
||||
/// is not exported.
|
||||
|
||||
void save(std::ostream* pPublicKeyStream,
|
||||
std::ostream* pPrivateKeyStream = 0,
|
||||
const std::string& privateKeyPassphrase = "") const;
|
||||
/// Exports the public and private key to the given streams.
|
||||
///
|
||||
/// If a null pointer is passed for a stream, the corresponding
|
||||
/// key is not exported.
|
||||
|
||||
private:
|
||||
RSAKeyImpl();
|
||||
|
||||
void freeRSA();
|
||||
static ByteVec convertToByteVec(const BIGNUM* bn);
|
||||
|
||||
RSA* _pRSA;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline RSA* RSAKeyImpl::getRSA()
|
||||
{
|
||||
return _pRSA;
|
||||
}
|
||||
|
||||
|
||||
inline const RSA* RSAKeyImpl::getRSA() const
|
||||
{
|
||||
return _pRSA;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_RSAKeyImplImpl_INCLUDED
|
251
vendor/POCO/Crypto/include/Poco/Crypto/X509Certificate.h
vendored
Normal file
251
vendor/POCO/Crypto/include/Poco/Crypto/X509Certificate.h
vendored
Normal file
@@ -0,0 +1,251 @@
|
||||
//
|
||||
// X509Certificate.h
|
||||
//
|
||||
// Library: Crypto
|
||||
// Package: Certificate
|
||||
// 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 Crypto_X509Certificate_INCLUDED
|
||||
#define Crypto_X509Certificate_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Crypto/Crypto.h"
|
||||
#include "Poco/Crypto/OpenSSLInitializer.h"
|
||||
#include "Poco/DateTime.h"
|
||||
#include "Poco/SharedPtr.h"
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <istream>
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Crypto {
|
||||
|
||||
|
||||
class Crypto_API X509Certificate
|
||||
/// This class represents a X509 Certificate.
|
||||
{
|
||||
public:
|
||||
using List = std::vector<X509Certificate>;
|
||||
|
||||
enum NID
|
||||
/// Name identifier for extracting information from
|
||||
/// a certificate subject's or issuer's distinguished name.
|
||||
{
|
||||
NID_COMMON_NAME = 13,
|
||||
NID_COUNTRY = 14,
|
||||
NID_LOCALITY_NAME = 15,
|
||||
NID_STATE_OR_PROVINCE = 16,
|
||||
NID_ORGANIZATION_NAME = 17,
|
||||
NID_ORGANIZATION_UNIT_NAME = 18,
|
||||
NID_PKCS9_EMAIL_ADDRESS = 48,
|
||||
NID_SERIAL_NUMBER = 105
|
||||
};
|
||||
|
||||
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 X509Certificate& cert);
|
||||
/// Creates the certificate by copying another one.
|
||||
|
||||
X509Certificate(X509Certificate&& cert) noexcept;
|
||||
/// Creates the certificate by moving another one.
|
||||
|
||||
X509Certificate& operator = (const X509Certificate& cert);
|
||||
/// Assigns a certificate.
|
||||
|
||||
X509Certificate& operator = (X509Certificate&& cert) noexcept;
|
||||
/// Move assignment.
|
||||
|
||||
void swap(X509Certificate& cert);
|
||||
/// Exchanges the certificate with another one.
|
||||
|
||||
~X509Certificate();
|
||||
/// Destroys the X509Certificate.
|
||||
|
||||
long version() const;
|
||||
/// Returns the version of the certificate.
|
||||
|
||||
const std::string& serialNumber() const;
|
||||
/// Returns the certificate serial number as a
|
||||
/// string in decimal encoding.
|
||||
|
||||
const std::string& issuerName() const;
|
||||
/// Returns the certificate issuer's distinguished name.
|
||||
|
||||
std::string issuerName(NID nid) const;
|
||||
/// Extracts the information specified by the given
|
||||
/// NID (name identifier) from the certificate issuer's
|
||||
/// distinguished name.
|
||||
|
||||
const std::string& subjectName() const;
|
||||
/// Returns the certificate subject's distinguished name.
|
||||
|
||||
std::string subjectName(NID nid) const;
|
||||
/// Extracts the information specified by the given
|
||||
/// NID (name identifier) from the certificate subject's
|
||||
/// distinguished name.
|
||||
|
||||
std::string commonName() const;
|
||||
/// Returns the common name stored in the certificate
|
||||
/// subject's distinguished name.
|
||||
|
||||
void extractNames(std::string& commonName, std::set<std::string>& domainNames) const;
|
||||
/// Extracts the common name and the alias domain names from the
|
||||
/// certificate.
|
||||
|
||||
Poco::DateTime validFrom() const;
|
||||
/// Returns the date and time the certificate is valid from.
|
||||
|
||||
Poco::DateTime expiresOn() const;
|
||||
/// Returns the date and time the certificate expires.
|
||||
|
||||
void save(std::ostream& stream) const;
|
||||
/// Writes the certificate to the given stream.
|
||||
/// The certificate is written in PEM format.
|
||||
|
||||
void save(const std::string& path) const;
|
||||
/// Writes the certificate to the file given by path.
|
||||
/// The certificate is written in PEM format.
|
||||
|
||||
bool issuedBy(const X509Certificate& issuerCertificate) const;
|
||||
/// Checks whether the certificate has been issued by
|
||||
/// the issuer given by issuerCertificate. This can be
|
||||
/// used to validate a certificate chain.
|
||||
///
|
||||
/// Verifies if the certificate has been signed with the
|
||||
/// issuer's private key, using the public key from the issuer
|
||||
/// certificate.
|
||||
///
|
||||
/// Returns true if verification against the issuer certificate
|
||||
/// was successful, false otherwise.
|
||||
|
||||
bool equals(const X509Certificate& otherCertificate) const;
|
||||
/// Checks whether the certificate is equal to
|
||||
/// the other certificate, by comparing the hashes
|
||||
/// of both certificates.
|
||||
///
|
||||
/// Returns true if both certificates are identical,
|
||||
/// otherwise false.
|
||||
|
||||
const X509* certificate() const;
|
||||
/// Returns the underlying OpenSSL certificate.
|
||||
|
||||
X509* dup() const;
|
||||
/// Duplicates and returns the underlying OpenSSL certificate. Note that
|
||||
/// the caller assumes responsibility for the lifecycle of the created
|
||||
/// certificate.
|
||||
|
||||
std::string signatureAlgorithm() const;
|
||||
/// Returns the certificate signature algorithm long name.
|
||||
|
||||
void print(std::ostream& out) const;
|
||||
/// Prints the certificate information to ostream.
|
||||
|
||||
static List readPEM(const std::string& pemFileName);
|
||||
/// Reads and returns a list of certificates from
|
||||
/// the specified PEM file.
|
||||
|
||||
static void writePEM(const std::string& pemFileName, const List& list);
|
||||
/// Writes the list of certificates to the specified PEM file.
|
||||
|
||||
protected:
|
||||
void load(std::istream& stream);
|
||||
/// Loads the certificate from the given stream. The
|
||||
/// certificate must be in PEM format.
|
||||
|
||||
void load(const std::string& path);
|
||||
/// Loads the certificate from the given file. The
|
||||
/// certificate must be in PEM format.
|
||||
|
||||
void init();
|
||||
/// Extracts issuer and subject name from the certificate.
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
NAME_BUFFER_SIZE = 256
|
||||
};
|
||||
|
||||
std::string _issuerName;
|
||||
std::string _subjectName;
|
||||
std::string _serialNumber;
|
||||
X509* _pCert;
|
||||
OpenSSLInitializer _openSSLInitializer;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
|
||||
|
||||
inline long X509Certificate::version() const
|
||||
{
|
||||
// This is defined by standards (X.509 et al) to be
|
||||
// one less than the certificate version.
|
||||
// So, eg. a version 3 certificate will return 2.
|
||||
return X509_get_version(_pCert) + 1;
|
||||
}
|
||||
|
||||
|
||||
inline const std::string& X509Certificate::serialNumber() const
|
||||
{
|
||||
return _serialNumber;
|
||||
}
|
||||
|
||||
|
||||
inline const std::string& X509Certificate::issuerName() const
|
||||
{
|
||||
return _issuerName;
|
||||
}
|
||||
|
||||
|
||||
inline const std::string& X509Certificate::subjectName() const
|
||||
{
|
||||
return _subjectName;
|
||||
}
|
||||
|
||||
|
||||
inline const X509* X509Certificate::certificate() const
|
||||
{
|
||||
return _pCert;
|
||||
}
|
||||
|
||||
|
||||
inline X509* X509Certificate::dup() const
|
||||
{
|
||||
return X509_dup(_pCert);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Crypto
|
||||
|
||||
|
||||
#endif // Crypto_X509Certificate_INCLUDED
|
Reference in New Issue
Block a user