MCPcopy Create free account
hub / github.com/7thSamurai/steganography / encode

Function encode

src/main.cpp:43–163  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

41};
42
43int encode(Image &image, const std::array<std::uint8_t, 32> &password, const std::string &input, const std::string &output, Image::EncodingLevel level) {
44 // Open the data file
45 std::ifstream file(input, std::ios::in | std::ios::binary | std::ios::ate);
46 if (!file.is_open()) {
47 std::cerr << "ERROR: Unable to open file '" << input << "'" << std::endl;
48 return -1;
49 }
50
51 std::cout << "* Image size: " << image.w() << "x" << image.h() << " pixels" << std::endl;
52 std::cout << "* Encoding level: " << level_to_str[static_cast<int>(level)] << std::endl;
53
54 // Find the data and padded-data size
55 std::size_t size = file.tellg();
56 std::size_t padded_size = size + 1; // At least one byte of padding
57
58 if (padded_size % 16)
59 padded_size = (size / 16 + 1) * 16;
60
61 // Find the maximum possible size for the file
62 unsigned int max_size = image.w()*image.h()*4/Image::encoded_size(1, level) - Image::encoded_size(sizeof(Header)+32, Image::EncodingLevel::Low); // FIXME
63
64 std::cout << "* Max embed size: " << data_size(max_size) << std::endl;
65 std::cout << "* Embed size: " << data_size(size) << std::endl;
66 std::cout << "* Encrypted embed size: " << data_size(padded_size) << std::endl;
67
68 // Make sure that it isn't too big
69 if (padded_size > max_size) {
70 std::cerr << "ERROR: Data-File too big, maximum possible size: " << (max_size / 1024) << " KiB" << std::endl;
71 return -1;
72 }
73
74 // Read the data
75 auto padded_data = std::make_unique<uint8_t[]>(padded_size);
76 file.seekg(0, std::ios::beg);
77 file.read(reinterpret_cast<char*>(padded_data.get()), size);
78 file.close();
79
80 // Pad the data (#PKCS7)
81 std::uint8_t left = padded_size - size;
82 std::fill_n(padded_data.get() + size, left, left);
83
84 // Pick a random offset inside the image to store the data
85 std::uint32_t offset;
86 Random random;
87 if (!random.get(&offset, sizeof(offset)))
88 {
89 std::cerr << "Unable to generate random number" << std::endl;
90 return -1;
91 }
92
93 offset = (offset + Image::encoded_size(sizeof(Header) + 32, Image::EncodingLevel::Low)) % (Image::encoded_size(max_size - padded_size, level));
94
95 // Calculate a hash of the data
96 CRC32 crc;
97 crc.update(padded_data.get(), size);
98
99 std::cout << "* Generated CRC32 checksum" << std::endl;
100

Callers 1

mainFunction · 0.85

Calls 10

data_sizeFunction · 0.85
pbkdf2_hmac_sha256Function · 0.85
wMethod · 0.80
hMethod · 0.80
cbc_encryptMethod · 0.80
encodeMethod · 0.80
saveMethod · 0.80
getMethod · 0.45
updateMethod · 0.45
get_hashMethod · 0.45

Tested by

no test coverage detected