summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPin <wf6DJd8a3xSSCZbn@protonmail.com>2021-11-11 00:50:08 -0500
committerPin <wf6DJd8a3xSSCZbn@protonmail.com>2021-11-11 00:50:08 -0500
commitb8600c17d54a13eac8c734d0cb75e37ba0260e45 (patch)
treed4d292d092b4cdbcf64f17c4ee606e336a32c7df
parent7caca5e7e6fa81087537f0c1f9582b1d8b118073 (diff)
filter updates
-rw-r--r--cmd/pspng.c125
1 files changed, 99 insertions, 26 deletions
diff --git a/cmd/pspng.c b/cmd/pspng.c
index 59c8699..0a632e0 100644
--- a/cmd/pspng.c
+++ b/cmd/pspng.c
@@ -8,6 +8,7 @@
#include <sodium.h>
#include <getopt.h>
#include <pthread.h>
+#include <math.h>
#include "crc_util.h"
#include "CRCLib.h"
#include "pspng.h"
@@ -70,11 +71,74 @@ int update_file_crc(unsigned char *addr, unsigned long offset , unsigned int crc
return 0;
}
-static void random_window_bit_change(unsigned char *data, int width, int rounds, int color_range, size_t length, size_t offset) {
+static unsigned char* create_raw_pixel_values(unsigned char *data, int width, int color_range, size_t length) {
+ // Generating twice the size we migth need
+ length = length * 2;
+ //length = 500000;
+ unsigned char* raw_data = calloc(length, sizeof(unsigned char*));
+ size_t filter_chunk_byte = 0;
+
+ for(size_t i = 0; i < length; i++) {
+ filter_chunk_byte = i - (i % ((width * color_range) + 1));
+ // Grabbing raw pixel data
+ if(data[filter_chunk_byte] == 0) {
+ // Filter: None
+ raw_data[i] = data[i];
+ } else if(data[filter_chunk_byte] == 1) {
+ // Filter: Sub
+ if ((i % ((width * color_range) + 1)) == 0) {
+ // Setting filter type
+ raw_data[i] = data[i];
+ } else if ((i - filter_chunk_byte) <= color_range) {
+ // Setting initial color_range byte
+ raw_data[i] = data[i];
+ } else {
+ // Setting remaining bytes
+ raw_data[i] = data[i] + raw_data[i - color_range];
+ }
+
+ } else if(data[filter_chunk_byte] == 3) {
+ // Filter: Average
+ if((i % ((width * color_range) + 1)) == 0) {
+ // Setting filter type
+ raw_data[i] = data[i];
+ } else {
+ // Setting remaining bytes
+ if(filter_chunk_byte == 0) {
+ // If no scanline is present before current
+ if((i - filter_chunk_byte) <= color_range) {
+ // If no pixel present before current
+ raw_data[i] = data[i] + floor((0 + 0) / 2);
+ } else {
+ // If pixel present before current
+ raw_data[i] = data[i] + floor((data[i - color_range] + 0) / 2);
+ }
+
+ } else {
+ // Scanline is present before current
+ if((i - filter_chunk_byte) <= color_range) {
+ // If no pixel present before current
+ raw_data[i] = data[i] + floor((0 + raw_data[i - ((width * color_range) + 1)]) / 2);
+ } else {
+ // If pixel present before current
+ raw_data[i] = data[i] + floor((raw_data[i - color_range] + raw_data[i - ((width * color_range) + 1)]) / 2);
+ }
+ }
+ }
+
+ } else {
+ // Filter: Error Unsupported
+ printf("Exiting due to unsupported filter type\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ return raw_data;
+}
+
+static void random_window_bit_change(unsigned char *data, unsigned char *raw_data, int width, int rounds, int color_range, size_t length, size_t offset) {
size_t random_num = 0;
size_t filter_chunk_byte = 0;
- size_t change_num = 0;
- long prior_chuck_check = 0;
for (int i = 0; i < rounds; i++) {
random_num = 0;
do {
@@ -93,17 +157,21 @@ static void random_window_bit_change(unsigned char *data, int width, int rounds,
// Sub Filter Type Change
if(data[random_num] == 255) {
data[random_num]--;
- change_num = 1;
+ raw_data[random_num]--;
} else {
data[random_num]++;
- change_num = -1;
+ raw_data[random_num]++;
+ }
+ // Fixing Next Pixel in Scanline
+ if(!(random_num+3 > (filter_chunk_byte + (width * color_range) + 1))){
+ data[random_num+color_range] = raw_data[random_num+color_range] - raw_data[random_num];
}
- // Starting after random change
- for(int j = 1; j < 2; j++) {
- data[random_num+(color_range * j)] = (data[random_num+(color_range * j)] + change_num) % 256;
+ // Checking Next Scanline type
+ if(data[filter_chunk_byte+((width * color_range) + 1)] == 3){
+ data[random_num+((width * color_range)+1)] = raw_data[random_num+((width * color_range)+1)] - floor((raw_data[random_num+((width * color_range)+1)-color_range] + raw_data[random_num]) / 2);
}
} else if(data[filter_chunk_byte] == 2) {
- printf("2\n");
+ // Add Support
if(data[random_num] == 255) {
data[random_num]--;
} else {
@@ -111,21 +179,23 @@ static void random_window_bit_change(unsigned char *data, int width, int rounds,
}
} else if(data[filter_chunk_byte] == 3) {
// Average Filter Type Change
- //printf("HEE: %d\n", data[(filter_chunk_byte - (width * color_range))-1]);
- prior_chuck_check = filter_chunk_byte;
- do {
- //printf("C: %d\n", data[prior_chuck_check]);
- prior_chuck_check = (prior_chuck_check - (width * color_range)-1);
- //printf("CH: %ld\n", prior_chuck_check);
- } while(prior_chuck_check >= 0);
-
- if(data[random_num] == 255) {
- data[random_num]--;
+ if(raw_data[random_num] == 255) {
+ raw_data[random_num]--;
} else {
- data[random_num]++;
+ raw_data[random_num]++;
+ }
+ // Update Current Pixel
+ data[random_num] = raw_data[random_num] - floor((raw_data[random_num-color_range] + raw_data[random_num-((width * color_range) + 1)]) / 2);
+ // Fixing Next Pixel in Scanline
+ if(!(random_num+color_range > (filter_chunk_byte + (width * color_range) + 1))){
+ data[random_num+color_range] = raw_data[random_num+color_range] - floor((raw_data[random_num] + raw_data[random_num-((width * color_range)+ 1)+color_range]) / 2);
+ }
+ // Checking Next Scanline type
+ if(data[filter_chunk_byte+((width * color_range) + 1)] == 3){
+ data[random_num+((width * color_range)+1)] = raw_data[random_num+((width * color_range)+1)] - floor((raw_data[random_num+((width * color_range)+1)-color_range] + raw_data[random_num]) / 2);
}
} else if(data[filter_chunk_byte] == 4) {
- printf("4\n");
+ // Add Support
if(data[random_num] == 255) {
data[random_num]--;
} else {
@@ -182,9 +252,11 @@ static int verify_crc_chunks(unsigned char *data, size_t data_length, int crc_de
static int crc_embed_data(unsigned char *data, unsigned int data_length, int bit_width, int color_range, unsigned int sliding_window, char message, size_t offset , size_t iteration) {
unsigned char *check_data;
+ unsigned char *raw_data;
size_t check_data_length = 0;
-
- random_window_bit_change(data, bit_width, 2, color_range, sliding_window, offset);
+
+ raw_data = create_raw_pixel_values(data, bit_width, color_range, sliding_window);
+ random_window_bit_change(data, raw_data, bit_width, 1, color_range, sliding_window, offset);
// Compressing data for test
zlib_compress_data(data, data_length, &check_data, &check_data_length);
@@ -197,6 +269,7 @@ static int crc_embed_data(unsigned char *data, unsigned int data_length, int bit
return 0;
}
free(check_data);
+ free(raw_data);
return 1;
}
@@ -215,8 +288,8 @@ void *random_data_change_thread_call(void *w) {
} else {
data->data_len = data->uncom_data_len;
}
- if(data->uncom_data_len > 16000) {
- data->win_size = 9000 + (9000 * data->cur_iteration);
+ if(data->uncom_data_len > 36000) {
+ data->win_size = 36000 + (36000 * data->cur_iteration);
} else {
data->win_size = data->uncom_data_len;
}
@@ -260,7 +333,7 @@ size_t generate_offset(unsigned char *data, size_t data_len, size_t iteration) {
void random_data_change(unsigned char *color_data, unsigned char *width, size_t length, char *message) {
int searching = 1;
- int core_count = 24;
+ int core_count = 28;
unsigned int sliding_window = 0;
unsigned int compress_data_length = 0;
// Needs to be turned into a variable