Update to properly use vcpkg-provided Crypto++

This commit is contained in:
2025-08-28 10:00:56 +02:00
parent 292780f991
commit cad675e0be
3 changed files with 12 additions and 73 deletions

View File

@ -46,8 +46,13 @@ else()
endif() endif()
# Handle Crypto++ dependency # Handle Crypto++ dependency
set(CRYPTOPP_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../vcpkg/installed/x64-windows/include") find_package(cryptopp CONFIG QUIET)
set(CRYPTOPP_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../vcpkg/installed/x64-windows/lib/cryptopp.lib")
if(cryptopp_FOUND)
message(STATUS "Found Crypto++ package via vcpkg")
else()
message(WARNING "Crypto++ not found via vcpkg. Make sure to use the vcpkg toolchain file.")
endif()
# Add library sources # Add library sources
set(SOURCES set(SOURCES
@ -72,11 +77,12 @@ add_library(privatebinapi SHARED ${SOURCES} ${HEADERS})
# Include directories # Include directories
target_include_directories(privatebinapi PUBLIC target_include_directories(privatebinapi PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include
${CRYPTOPP_INCLUDE_DIRS}
) )
# Link Crypto++ # Link Crypto++
target_link_libraries(privatebinapi PRIVATE ${CRYPTOPP_LIBRARIES}) if(cryptopp_FOUND)
target_link_libraries(privatebinapi PRIVATE cryptopp::cryptopp)
endif()
# Include nlohmann/json # Include nlohmann/json
if(nlohmann_json_FOUND) if(nlohmann_json_FOUND)

View File

@ -5,8 +5,8 @@ REM Create build directory
if not exist "build" mkdir build if not exist "build" mkdir build
cd build cd build
REM Generate build files with CMake REM Generate build files with CMake and vcpkg toolchain
cmake .. -G "Visual Studio 17 2022" cmake .. -G "Visual Studio 17 2022" -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake
REM Build the project REM Build the project
cmake --build . --config Release cmake --build . --config Release

View File

@ -3,7 +3,6 @@
#include <stdexcept> #include <stdexcept>
#include <cstring> #include <cstring>
#ifndef NO_CRYPTO
// Crypto++ includes // Crypto++ includes
#include "cryptlib.h" #include "cryptlib.h"
#include "osrng.h" // AutoSeededRandomPool #include "osrng.h" // AutoSeededRandomPool
@ -14,10 +13,8 @@
#include "zlib.h" // Zlib compression #include "zlib.h" // Zlib compression
using namespace CryptoPP; using namespace CryptoPP;
#endif
std::vector<unsigned char> Crypto::generate_key(size_t length) { std::vector<unsigned char> Crypto::generate_key(size_t length) {
#ifndef NO_CRYPTO
std::vector<unsigned char> key(length); std::vector<unsigned char> key(length);
// Use Crypto++ AutoSeededRandomPool for cryptographically secure random numbers // Use Crypto++ AutoSeededRandomPool for cryptographically secure random numbers
@ -25,26 +22,12 @@ std::vector<unsigned char> Crypto::generate_key(size_t length) {
rng.GenerateBlock(key.data(), length); rng.GenerateBlock(key.data(), length);
return key; return key;
#else
// Fallback to std::random - NOT cryptographically secure!
std::vector<unsigned char> key(length);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 255);
for (size_t i = 0; i < length; ++i) {
key[i] = static_cast<unsigned char>(dis(gen));
}
return key;
#endif
} }
std::vector<unsigned char> Crypto::encrypt(const std::vector<unsigned char>& plaintext, std::vector<unsigned char> Crypto::encrypt(const std::vector<unsigned char>& plaintext,
const std::vector<unsigned char>& key, const std::vector<unsigned char>& key,
const std::vector<unsigned char>& iv, const std::vector<unsigned char>& iv,
std::vector<unsigned char>& auth_tag) { std::vector<unsigned char>& auth_tag) {
#ifndef NO_CRYPTO
try { try {
// Create GCM mode encryption object // Create GCM mode encryption object
GCM<AES>::Encryption encryption; GCM<AES>::Encryption encryption;
@ -76,23 +59,12 @@ std::vector<unsigned char> Crypto::encrypt(const std::vector<unsigned char>& pla
catch(const CryptoPP::Exception& e) { catch(const CryptoPP::Exception& e) {
throw std::runtime_error("Encryption failed: " + std::string(e.what())); throw std::runtime_error("Encryption failed: " + std::string(e.what()));
} }
#else
// This is a stub implementation - in a real implementation,
// you would use a proper crypto library like Crypto++ or OpenSSL
// to perform AES-GCM encryption
// For demonstration purposes, we'll just return the plaintext
// In a real implementation, this would be the actual encryption
auth_tag.resize(16, 0); // 128-bit authentication tag
return plaintext;
#endif
} }
std::vector<unsigned char> Crypto::decrypt(const std::vector<unsigned char>& ciphertext, std::vector<unsigned char> Crypto::decrypt(const std::vector<unsigned char>& ciphertext,
const std::vector<unsigned char>& key, const std::vector<unsigned char>& key,
const std::vector<unsigned char>& iv, const std::vector<unsigned char>& iv,
const std::vector<unsigned char>& auth_tag) { const std::vector<unsigned char>& auth_tag) {
#ifndef NO_CRYPTO
try { try {
// Create GCM mode decryption object // Create GCM mode decryption object
GCM<AES>::Decryption decryption; GCM<AES>::Decryption decryption;
@ -125,22 +97,12 @@ std::vector<unsigned char> Crypto::decrypt(const std::vector<unsigned char>& cip
catch(const CryptoPP::Exception& e) { catch(const CryptoPP::Exception& e) {
throw std::runtime_error("Decryption failed: " + std::string(e.what())); throw std::runtime_error("Decryption failed: " + std::string(e.what()));
} }
#else
// This is a stub implementation - in a real implementation,
// you would use a proper crypto library like Crypto++ or OpenSSL
// to perform AES-GCM decryption
// For demonstration purposes, we'll just return the ciphertext
// In a real implementation, this would be the actual decryption
return ciphertext;
#endif
} }
std::vector<unsigned char> Crypto::pbkdf2_hmac_sha256(const std::string& password, std::vector<unsigned char> Crypto::pbkdf2_hmac_sha256(const std::string& password,
const std::vector<unsigned char>& salt, const std::vector<unsigned char>& salt,
int iterations, int iterations,
size_t key_length) { size_t key_length) {
#ifndef NO_CRYPTO
try { try {
std::vector<unsigned char> derived_key(key_length); std::vector<unsigned char> derived_key(key_length);
@ -163,23 +125,9 @@ std::vector<unsigned char> Crypto::pbkdf2_hmac_sha256(const std::string& passwor
catch(const CryptoPP::Exception& e) { catch(const CryptoPP::Exception& e) {
throw std::runtime_error("PBKDF2 key derivation failed: " + std::string(e.what())); throw std::runtime_error("PBKDF2 key derivation failed: " + std::string(e.what()));
} }
#else
// This is a stub implementation - in a real implementation,
// you would use a proper crypto library to perform PBKDF2-HMAC-SHA256
// For demonstration purposes, we'll just return a key of the requested length
// filled with a simple pattern
std::vector<unsigned char> key(key_length, 0);
for (size_t i = 0; i < key_length; i++) {
key[i] = static_cast<unsigned char>((i * 17) % 256);
}
return key;
#endif
} }
std::vector<unsigned char> Crypto::compress(const std::vector<unsigned char>& data) { std::vector<unsigned char> Crypto::compress(const std::vector<unsigned char>& data) {
#ifndef NO_CRYPTO
try { try {
std::string compressed; std::string compressed;
@ -199,17 +147,9 @@ std::vector<unsigned char> Crypto::compress(const std::vector<unsigned char>& da
catch(const CryptoPP::Exception& e) { catch(const CryptoPP::Exception& e) {
throw std::runtime_error("Compression failed: " + std::string(e.what())); throw std::runtime_error("Compression failed: " + std::string(e.what()));
} }
#else
// This is a stub implementation - in a real implementation,
// you would use zlib or another compression library
// For demonstration purposes, we'll just return the data as-is
return data;
#endif
} }
std::vector<unsigned char> Crypto::decompress(const std::vector<unsigned char>& data) { std::vector<unsigned char> Crypto::decompress(const std::vector<unsigned char>& data) {
#ifndef NO_CRYPTO
try { try {
std::string decompressed; std::string decompressed;
@ -229,11 +169,4 @@ std::vector<unsigned char> Crypto::decompress(const std::vector<unsigned char>&
catch(const CryptoPP::Exception& e) { catch(const CryptoPP::Exception& e) {
throw std::runtime_error("Decompression failed: " + std::string(e.what())); throw std::runtime_error("Decompression failed: " + std::string(e.what()));
} }
#else
// This is a stub implementation - in a real implementation,
// you would use zlib or another decompression library
// For demonstration purposes, we'll just return the data as-is
return data;
#endif
} }