Fix encryption function.

Fix pointer parameters as function returns.
Add file clean-up as an atexit functionality.
This commit is contained in:
Érico Rolim 2020-09-13 01:06:39 -03:00
parent 593aaabfec
commit 32f9910ece
3 changed files with 50 additions and 14 deletions

View File

@ -7,14 +7,38 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include "libbaseencode/baseencode.h"
#include "purr.h" #include "purr.h"
int encrypt_FILE(FILE **filep, uint8_t **keyp, uint8_t **ivp, char **tempp) #define MAX_FILES 32
static char *files_to_delete[32] = { 0 };
static bool called_atexit = false;
static void clean_up_files(void)
{ {
for (int i = 0; i < MAX_FILES && files_to_delete[i]; i++) {
unlink(files_to_delete[i]);
free(files_to_delete[i]);
}
}
/*
* This function takes a FILE pointer, and creates an encrypted file from it.
* The created file is passed to an atexit function so it can be deleted automatically.
* Args:
* filep: original FILE pointer, will be closed and changed for the new encrypted FILE
* keyp: will receive the newly generated random key
* ivp: will receive the newly generated random IV (if enabled in purr.h)
*/
int encrypt_FILE(FILE **filep, uint8_t **keyp, uint8_t **ivp)
{
if (!called_atexit) {
atexit(clean_up_files);
}
FILE *input = *filep; FILE *input = *filep;
uint8_t *key = *keyp;
uint8_t *iv = *ivp;
char *temp = *tempp;
if (input == stdin) { if (input == stdin) {
fputs("currently can't encrypt stdin!\n", stderr); fputs("currently can't encrypt stdin!\n", stderr);
@ -31,8 +55,8 @@ int encrypt_FILE(FILE **filep, uint8_t **keyp, uint8_t **ivp, char **tempp)
if (blocks * br_aes_big_BLOCK_SIZE < file_size) blocks++; if (blocks * br_aes_big_BLOCK_SIZE < file_size) blocks++;
file_size = blocks * br_aes_big_BLOCK_SIZE; file_size = blocks * br_aes_big_BLOCK_SIZE;
key = calloc(KEY_LEN, 1); uint8_t *key = calloc(KEY_LEN, 1);
iv = calloc(IV_LEN, 1); uint8_t *iv = calloc(IV_LEN, 1);
if (key == NULL || iv == NULL) { if (key == NULL || iv == NULL) {
perror("allocation failure"); perror("allocation failure");
return -1; return -1;
@ -52,11 +76,20 @@ int encrypt_FILE(FILE **filep, uint8_t **keyp, uint8_t **ivp, char **tempp)
} }
#endif #endif
temp = strdup("/tmp/purrito.XXXXXX"); char temp[] = "/tmp/purrito.XXXXXX";
int tfd = mkstemp(temp); int tfd = mkstemp(temp);
if (tfd < 0) { if (tfd < 0) {
perror("couldn't create temp file"); perror("couldn't create temp file");
return -1; return -1;
} else {
// add cleanup for file
int i = 0;
for (; i < MAX_FILES && files_to_delete[i]; i++);
if (i == MAX_FILES) {
fputs("couldn't add file to files_to_delete\n", stderr);
} else {
files_to_delete[i] = strdup(temp);
}
} }
int errfa = posix_fallocate(tfd, 0, file_size); int errfa = posix_fallocate(tfd, 0, file_size);
if (errfa) { if (errfa) {
@ -85,13 +118,14 @@ int encrypt_FILE(FILE **filep, uint8_t **keyp, uint8_t **ivp, char **tempp)
fclose(input); fclose(input);
munmap(temp_map, file_size); munmap(temp_map, file_size);
input = fopen(temp, "r"); // pass pointers to caller
*filep = fopen(temp, "r");
if (input == NULL) { if (input == NULL) {
perror("couldn't read temp file"); perror("couldn't read temp file");
return -1; return -1;
} }
fstat(fileno(input), &s); *keyp = key;
fprintf(stderr, "output file size: %lu\n", s.st_size); *ivp = iv;
return 0; return 0;
} }

8
purr.c
View File

@ -221,10 +221,9 @@ int main (int argc, char **argv)
uint8_t *key = NULL; uint8_t *key = NULL;
uint8_t *iv = NULL; uint8_t *iv = NULL;
char *temp = NULL;
if (send && encrypt) { if (send && encrypt) {
// requires error checking // requires error checking
encrypt_FILE(&input, &key, &iv, &temp); encrypt_FILE(&input, &key, &iv);
} }
int socket = host_connect(link, port, debug); int socket = host_connect(link, port, debug);
@ -245,6 +244,10 @@ int main (int argc, char **argv)
rv = send_and_receive(&ci); rv = send_and_receive(&ci);
if (encrypt) {
print_hex(key, KEY_LEN, true);
}
//out: //out:
close(socket); close(socket);
free(link); free(link);
@ -253,7 +256,6 @@ int main (int argc, char **argv)
free(request); free(request);
free(key); free(key);
free(iv); free(iv);
free(temp);
early_out: early_out:
if (input != stdin) fclose(input); if (input != stdin) fclose(input);
if (output != stdout) fclose(output); if (output != stdout) fclose(output);

2
purr.h
View File

@ -62,6 +62,6 @@ int send_and_receive(struct connection_information *);
char *print_hex(uint8_t *, int, bool); char *print_hex(uint8_t *, int, bool);
/* encrypt.c */ /* encrypt.c */
int encrypt_FILE(FILE **, uint8_t **, uint8_t **, char **); int encrypt_FILE(FILE **, uint8_t **, uint8_t **);
#endif // __PURR_H_ #endif // __PURR_H_