diff --git a/Crypto/include/Poco/Crypto/Cipher.h b/Crypto/include/Poco/Crypto/Cipher.h index 67625d7fd..30cb0506d 100644 --- a/Crypto/include/Poco/Crypto/Cipher.h +++ b/Crypto/include/Poco/Crypto/Cipher.h @@ -19,6 +19,7 @@ #include "Poco/Crypto/Crypto.h" +#include "Poco/Crypto/CryptoTransform.h" #include "Poco/RefCountedObject.h" #include "Poco/AutoPtr.h" #include @@ -30,9 +31,6 @@ namespace Poco { namespace Crypto { -class CryptoTransform; - - 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 @@ -75,10 +73,10 @@ class Crypto_API Cipher: public Poco::RefCountedObject /// // 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(); @@ -95,7 +93,7 @@ public: 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(); @@ -104,10 +102,10 @@ public: virtual const std::string& name() const = 0; /// Returns the name of the Cipher. - virtual CryptoTransform* createEncryptor() = 0; + virtual CryptoTransform::Ptr createEncryptor() = 0; /// Creates an encryptor object to be used with a CryptoStream. - virtual CryptoTransform* createDecryptor() = 0; + 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); diff --git a/Crypto/include/Poco/Crypto/CipherImpl.h b/Crypto/include/Poco/Crypto/CipherImpl.h index d6e8e0e79..49a7476f8 100644 --- a/Crypto/include/Poco/Crypto/CipherImpl.h +++ b/Crypto/include/Poco/Crypto/CipherImpl.h @@ -42,10 +42,10 @@ public: const std::string& name() const; /// Returns the name of the cipher. - CryptoTransform* createEncryptor(); + CryptoTransform::Ptr createEncryptor(); /// Creates an encryptor object. - CryptoTransform* createDecryptor(); + CryptoTransform::Ptr createDecryptor(); /// Creates a decryptor object. private: diff --git a/Crypto/include/Poco/Crypto/CryptoStream.h b/Crypto/include/Poco/Crypto/CryptoStream.h index 25a99a4ae..e82373392 100644 --- a/Crypto/include/Poco/Crypto/CryptoStream.h +++ b/Crypto/include/Poco/Crypto/CryptoStream.h @@ -20,6 +20,7 @@ #include "Poco/Crypto/Crypto.h" +#include "Poco/Crypto/CryptoTransform.h" #include "Poco/BufferedStreamBuf.h" #include "Poco/Buffer.h" #include @@ -38,8 +39,8 @@ class Crypto_API CryptoStreamBuf: public Poco::BufferedStreamBuf /// going through it. { public: - CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); - CryptoStreamBuf(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); + CryptoStreamBuf(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192); + CryptoStreamBuf(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize = 8192); virtual ~CryptoStreamBuf(); @@ -51,7 +52,7 @@ protected: int writeToDevice(const char* buffer, std::streamsize length); private: - CryptoTransform* _pTransform; + CryptoTransform::Ptr _pTransform; std::istream* _pIstr; std::ostream* _pOstr; bool _eof; @@ -70,8 +71,8 @@ class Crypto_API CryptoIOS: public virtual std::ios /// stream buffer and base classes. { public: - CryptoIOS(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); - CryptoIOS(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); + 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(); @@ -89,7 +90,7 @@ class Crypto_API CryptoInputStream: public CryptoIOS, public std::istream /// respectively. { public: - CryptoInputStream(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); + 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. @@ -113,7 +114,7 @@ class Crypto_API CryptoOutputStream: public CryptoIOS, public std::ostream /// to ensure completion of cryptographic transformation. { public: - CryptoOutputStream(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize = 8192); + 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. diff --git a/Crypto/include/Poco/Crypto/CryptoTransform.h b/Crypto/include/Poco/Crypto/CryptoTransform.h index 9fa3806c6..8be450415 100644 --- a/Crypto/include/Poco/Crypto/CryptoTransform.h +++ b/Crypto/include/Poco/Crypto/CryptoTransform.h @@ -19,6 +19,7 @@ #include "Poco/Crypto/Crypto.h" +#include "Poco/SharedPtr.h" #include @@ -35,6 +36,8 @@ class Crypto_API CryptoTransform /// perform encryption or decryption of data. { public: + using Ptr = Poco::SharedPtr; + CryptoTransform(); /// Creates a new CryptoTransform object. diff --git a/Crypto/include/Poco/Crypto/RSACipherImpl.h b/Crypto/include/Poco/Crypto/RSACipherImpl.h index 2ebc38e3b..e71c8fad0 100644 --- a/Crypto/include/Poco/Crypto/RSACipherImpl.h +++ b/Crypto/include/Poco/Crypto/RSACipherImpl.h @@ -30,9 +30,9 @@ namespace Crypto { class RSACipherImpl: public Cipher - /// An implementation of the Cipher class for + /// An implementation of the Cipher class for /// asymmetric (public-private key) encryption - /// based on the the RSA algorithm in OpenSSL's + /// based on the the RSA algorithm in OpenSSL's /// crypto library. /// /// Encryption is using the public key, decryption @@ -48,11 +48,11 @@ public: const std::string& name() const; /// Returns the name of the Cipher. - - CryptoTransform* createEncryptor(); + + CryptoTransform::Ptr createEncryptor(); /// Creates an encryptor object. - CryptoTransform* createDecryptor(); + CryptoTransform::Ptr createDecryptor(); /// Creates a decryptor object. private: diff --git a/Crypto/src/CipherImpl.cpp b/Crypto/src/CipherImpl.cpp index 0bc2e7471..06a33621f 100644 --- a/Crypto/src/CipherImpl.cpp +++ b/Crypto/src/CipherImpl.cpp @@ -255,14 +255,14 @@ CipherImpl::~CipherImpl() } -CryptoTransform* CipherImpl::createEncryptor() +CryptoTransform::Ptr CipherImpl::createEncryptor() { CipherKeyImpl::Ptr p = _key.impl(); return new CryptoTransformImpl(p->cipher(), p->getKey(), p->getIV(), CryptoTransformImpl::DIR_ENCRYPT); } -CryptoTransform* CipherImpl::createDecryptor() +CryptoTransform::Ptr CipherImpl::createDecryptor() { CipherKeyImpl::Ptr p = _key.impl(); return new CryptoTransformImpl(p->cipher(), p->getKey(), p->getIV(), CryptoTransformImpl::DIR_DECRYPT); diff --git a/Crypto/src/CryptoStream.cpp b/Crypto/src/CryptoStream.cpp index 6b29b7f07..6892c5410 100644 --- a/Crypto/src/CryptoStream.cpp +++ b/Crypto/src/CryptoStream.cpp @@ -32,7 +32,7 @@ namespace Crypto { // -CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): Poco::BufferedStreamBuf(bufferSize, std::ios::in), _pTransform(pTransform), _pIstr(&istr), @@ -45,7 +45,7 @@ CryptoStreamBuf::CryptoStreamBuf(std::istream& istr, CryptoTransform* pTransform } -CryptoStreamBuf::CryptoStreamBuf(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoStreamBuf::CryptoStreamBuf(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): Poco::BufferedStreamBuf(bufferSize, std::ios::out), _pTransform(pTransform), _pIstr(0), @@ -67,7 +67,6 @@ CryptoStreamBuf::~CryptoStreamBuf() catch (...) { } - delete _pTransform; } @@ -86,10 +85,10 @@ void CryptoStreamBuf::close() // thrown. std::ostream* pOstr = _pOstr; _pOstr = 0; - + // Finalize transformation. std::streamsize n = _pTransform->finalize(_buffer.begin(), static_cast(_buffer.size())); - + if (n > 0) { pOstr->write(reinterpret_cast(_buffer.begin()), n); @@ -193,14 +192,14 @@ int CryptoStreamBuf::writeToDevice(const char* buffer, std::streamsize length) // -CryptoIOS::CryptoIOS(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoIOS::CryptoIOS(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): _buf(istr, pTransform, bufferSize) { poco_ios_init(&_buf); } -CryptoIOS::CryptoIOS(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoIOS::CryptoIOS(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): _buf(ostr, pTransform, bufferSize) { poco_ios_init(&_buf); @@ -223,7 +222,7 @@ CryptoStreamBuf* CryptoIOS::rdbuf() // -CryptoInputStream::CryptoInputStream(std::istream& istr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoInputStream::CryptoInputStream(std::istream& istr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): CryptoIOS(istr, pTransform, bufferSize), std::istream(&_buf) { @@ -247,7 +246,7 @@ CryptoInputStream::~CryptoInputStream() // -CryptoOutputStream::CryptoOutputStream(std::ostream& ostr, CryptoTransform* pTransform, std::streamsize bufferSize): +CryptoOutputStream::CryptoOutputStream(std::ostream& ostr, CryptoTransform::Ptr pTransform, std::streamsize bufferSize): CryptoIOS(ostr, pTransform, bufferSize), std::ostream(&_buf) { diff --git a/Crypto/src/RSACipherImpl.cpp b/Crypto/src/RSACipherImpl.cpp index 5c2e493ed..5b8dc6264 100644 --- a/Crypto/src/RSACipherImpl.cpp +++ b/Crypto/src/RSACipherImpl.cpp @@ -329,13 +329,13 @@ RSACipherImpl::~RSACipherImpl() } -CryptoTransform* RSACipherImpl::createEncryptor() +CryptoTransform::Ptr RSACipherImpl::createEncryptor() { return new RSAEncryptImpl(_key.impl()->getRSA(), _paddingMode); } -CryptoTransform* RSACipherImpl::createDecryptor() +CryptoTransform::Ptr RSACipherImpl::createDecryptor() { return new RSADecryptImpl(_key.impl()->getRSA(), _paddingMode); } diff --git a/Crypto/testsuite/src/CryptoTest.cpp b/Crypto/testsuite/src/CryptoTest.cpp index d42af41e7..7fe04e3fc 100644 --- a/Crypto/testsuite/src/CryptoTest.cpp +++ b/Crypto/testsuite/src/CryptoTest.cpp @@ -222,7 +222,7 @@ void CryptoTest::testEncryptDecryptGCM() for (std::size_t n = 1; n < MAX_DATA_SIZE; n++) { std::stringstream str; - CryptoTransform* pEncryptor = pCipher->createEncryptor(); + CryptoTransform::Ptr pEncryptor = pCipher->createEncryptor(); CryptoOutputStream encryptorStream(str, pEncryptor); std::string in(n, 'x'); encryptorStream << in; @@ -231,7 +231,7 @@ void CryptoTest::testEncryptDecryptGCM() std::string tag = pEncryptor->getTag(); - CryptoTransform* pDecryptor = pCipher->createDecryptor(); + CryptoTransform::Ptr pDecryptor = pCipher->createDecryptor(); pDecryptor->setTag(tag); CryptoInputStream decryptorStream(str, pDecryptor); std::string out; @@ -318,7 +318,7 @@ void CryptoTest::testStreams() DecryptingInputStream decryptor(sstr, *pCipher); std::string result; Poco::StreamCopier::copyToString(decryptor, result); - + assertTrue (result == SECRET_MESSAGE); assertTrue (decryptor.eof()); assertTrue (!decryptor.bad());