Initial commit: PrivateBin API C++ DLL implementation
This commit is contained in:
121
src/json_parser.cpp
Normal file
121
src/json_parser.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user