mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-02-23 13:17:14 +01:00
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.
141 lines
2.5 KiB
C++
141 lines
2.5 KiB
C++
//
|
|
// Cipher.cpp
|
|
//
|
|
// Library: Crypto
|
|
// Package: Cipher
|
|
// Module: Cipher
|
|
//
|
|
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#include "Poco/Crypto/Cipher.h"
|
|
#include "Poco/Crypto/CryptoStream.h"
|
|
#include "Poco/Crypto/CryptoTransform.h"
|
|
#include "Poco/Base64Encoder.h"
|
|
#include "Poco/Base64Decoder.h"
|
|
#include "Poco/HexBinaryEncoder.h"
|
|
#include "Poco/HexBinaryDecoder.h"
|
|
#include "Poco/StreamCopier.h"
|
|
#include "Poco/Exception.h"
|
|
#include <sstream>
|
|
#include <memory>
|
|
|
|
|
|
namespace Poco {
|
|
namespace Crypto {
|
|
|
|
|
|
Cipher::Cipher()
|
|
{
|
|
}
|
|
|
|
|
|
Cipher::~Cipher()
|
|
{
|
|
}
|
|
|
|
|
|
std::string Cipher::encryptString(const std::string& str, Encoding encoding)
|
|
{
|
|
std::istringstream source(str);
|
|
std::ostringstream sink;
|
|
|
|
encrypt(source, sink, encoding);
|
|
|
|
return sink.str();
|
|
}
|
|
|
|
|
|
std::string Cipher::decryptString(const std::string& str, Encoding encoding)
|
|
{
|
|
std::istringstream source(str);
|
|
std::ostringstream sink;
|
|
|
|
decrypt(source, sink, encoding);
|
|
return sink.str();
|
|
}
|
|
|
|
|
|
void Cipher::encrypt(std::istream& source, std::ostream& sink, Encoding encoding)
|
|
{
|
|
CryptoInputStream encryptor(source, createEncryptor());
|
|
|
|
switch (encoding)
|
|
{
|
|
case ENC_NONE:
|
|
StreamCopier::copyStream(encryptor, sink);
|
|
break;
|
|
|
|
case ENC_BASE64:
|
|
case ENC_BASE64_NO_LF:
|
|
{
|
|
Poco::Base64Encoder encoder(sink);
|
|
if (encoding == ENC_BASE64_NO_LF)
|
|
{
|
|
encoder.rdbuf()->setLineLength(0);
|
|
}
|
|
StreamCopier::copyStream(encryptor, encoder);
|
|
encoder.close();
|
|
}
|
|
break;
|
|
|
|
case ENC_BINHEX:
|
|
case ENC_BINHEX_NO_LF:
|
|
{
|
|
Poco::HexBinaryEncoder encoder(sink);
|
|
if (encoding == ENC_BINHEX_NO_LF)
|
|
{
|
|
encoder.rdbuf()->setLineLength(0);
|
|
}
|
|
StreamCopier::copyStream(encryptor, encoder);
|
|
encoder.close();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
throw Poco::InvalidArgumentException("Invalid argument", "encoding");
|
|
}
|
|
}
|
|
|
|
|
|
void Cipher::decrypt(std::istream& source, std::ostream& sink, Encoding encoding)
|
|
{
|
|
CryptoOutputStream decryptor(sink, createDecryptor());
|
|
|
|
switch (encoding)
|
|
{
|
|
case ENC_NONE:
|
|
StreamCopier::copyStream(source, decryptor);
|
|
decryptor.close();
|
|
break;
|
|
|
|
case ENC_BASE64:
|
|
case ENC_BASE64_NO_LF:
|
|
{
|
|
Poco::Base64Decoder decoder(source);
|
|
StreamCopier::copyStream(decoder, decryptor);
|
|
decryptor.close();
|
|
}
|
|
break;
|
|
|
|
case ENC_BINHEX:
|
|
case ENC_BINHEX_NO_LF:
|
|
{
|
|
Poco::HexBinaryDecoder decoder(source);
|
|
StreamCopier::copyStream(decoder, decryptor);
|
|
decryptor.close();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
throw Poco::InvalidArgumentException("Invalid argument", "encoding");
|
|
}
|
|
}
|
|
|
|
|
|
} } // namespace Poco::Crypto
|