51 lines
1.4 KiB
C
51 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
#include <unistd.h>
|
|
#include "png.h"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
// Error handling
|
|
if (argc != 2) {
|
|
printf("Usage: %s <png file>\n", argv[0]);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (strlen(argv[1]) > PATH_MAX) {
|
|
printf("Path too long\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
// Read file
|
|
char *path = argv[1];
|
|
char *png_buffer = load_file(path);
|
|
if (!is_png(png_buffer)) {
|
|
printf("It's not a PNG file\n");
|
|
exit(EXIT_FAILURE);
|
|
} else {
|
|
printf("It's a PNG file\n");
|
|
}
|
|
png_chunk **chunks = get_png_chunks(png_buffer);
|
|
free(png_buffer);
|
|
// Done with buffer, as chunks are a structured way to access the data
|
|
// Iterate over chunks to display info and "decrypt" IDAT chunks
|
|
int size = get_number_of_chunks(chunks);
|
|
for (int i = 0; i < size; i++) {
|
|
// Check if header is IDAT or IEND
|
|
bool is_idat = memcmp(chunks[i]->type, "IDAT", 4) == 0;
|
|
bool is_iend = memcmp(chunks[i]->type, "IEND", 4) == 0;
|
|
if (is_idat || is_iend) {
|
|
printf("Found %.4s\n", chunks[i]->type);
|
|
if (is_idat) {
|
|
xor_data(chunks[i]);
|
|
}
|
|
} else {
|
|
printf("Found unknown: %.4s\n", chunks[i]->type);
|
|
}
|
|
printf("Chunk size is:%d\n", chunks[i]->length);
|
|
}
|
|
// Write file and free memory
|
|
write_png_chunks(path, chunks);
|
|
destroy_chunks(chunks);
|
|
return EXIT_SUCCESS;
|
|
} |