Initial commit: PrivateBin API C++ DLL implementation

This commit is contained in:
2025-08-28 09:15:47 +02:00
commit 90d9a23dd2
21 changed files with 2053 additions and 0 deletions

121
src/json_parser.cpp Normal file
View File

@@ -0,0 +1,121 @@
#include "json_parser.h"
#include <iostream>
#include <chrono>
json JsonParser::create_paste_json(const std::vector<unsigned char>& cipher_text,
const std::vector<unsigned char>& auth_tag,
const std::vector<unsigned char>& iv,
const std::vector<unsigned char>& salt,
const std::string& expiration,
const std::string& format,
bool burn_after_reading,
bool open_discussion) {
// Convert binary data to base64 strings (stub implementation)
std::string cipher_text_b64(cipher_text.begin(), cipher_text.end());
std::string auth_tag_b64(auth_tag.begin(), auth_tag.end());
std::string iv_b64(iv.begin(), iv.end());
std::string salt_b64(salt.begin(), salt.end());
// Get current timestamp
auto now = std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
// Create the metadata array
json metadata = {
{
iv_b64, // base64(cipher_iv)
salt_b64, // base64(kdf_salt)
100000, // iterations
256, // key size
128, // tag size
"aes", // cipher
"gcm", // mode
"zlib" // compression
},
format, // format
burn_after_reading ? 1 : 0, // burn after reading
open_discussion ? 1 : 0 // open discussion
};
// Create the main JSON structure
json paste_json = {
{"v", 2}, // version
{"adata", metadata}, // metadata
{"ct", cipher_text_b64}, // cipher text
{"meta", {
{"expire", expiration},
{"created", now},
{"time_to_live", 300}, // This would be calculated based on expiration
{"icon", "data:image/png;base64,..."} // Placeholder
}}
};
return paste_json;
}
bool JsonParser::parse_paste_json(const json& json_data,
std::vector<unsigned char>& cipher_text,
std::vector<unsigned char>& auth_tag,
std::vector<unsigned char>& iv,
std::vector<unsigned char>& salt,
std::string& expiration) {
try {
// Extract cipher text
std::string ct = json_data["ct"];
cipher_text = std::vector<unsigned char>(ct.begin(), ct.end());
// Extract metadata
json adata = json_data["adata"];
if (adata.size() >= 1) {
json first_element = adata[0];
if (first_element.is_array() && first_element.size() >= 2) {
// Extract IV and salt (from base64 in real implementation)
std::string iv_str = first_element[0];
std::string salt_str = first_element[1];
iv = std::vector<unsigned char>(iv_str.begin(), iv_str.end());
salt = std::vector<unsigned char>(salt_str.begin(), salt_str.end());
}
}
// Extract expiration
expiration = json_data["meta"]["expire"];
// Auth tag would be extracted from the ciphertext in a real implementation
auth_tag.resize(16, 0);
return true;
} catch (...) {
return false;
}
}
bool JsonParser::parse_response(const std::string& response,
int& status,
std::string& message,
std::string& paste_id,
std::string& url,
std::string& delete_token) {
try {
json json_response = json::parse(response);
status = json_response["status"];
if (status == 0) {
// Success response
paste_id = json_response["id"];
url = json_response["url"];
delete_token = json_response["deletetoken"];
} else {
// Error response
message = json_response["message"];
}
return true;
} catch (...) {
return false;
}
}