mirror of https://github.com/ericonr/purr-c.git
Add decryption for recv.
A few fixes and hacks all around, but can now do: ./purr -e recv (./purr -e send makefile) And output the original page.
This commit is contained in:
parent
e20d8ae124
commit
f13c0c2e3e
59
encrypt.c
59
encrypt.c
|
@ -2,6 +2,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <sys/random.h>
|
#include <sys/random.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -68,11 +69,12 @@ struct mmap_file encrypt_mmap(struct mmap_file file, uint8_t **keyp, uint8_t **i
|
||||||
br_aes_big_cbcenc_keys br = { 0 };
|
br_aes_big_cbcenc_keys br = { 0 };
|
||||||
br_aes_big_cbcenc_init(&br, key, KEY_LEN);
|
br_aes_big_cbcenc_init(&br, key, KEY_LEN);
|
||||||
br_aes_big_cbcenc_run(&br, iv_throwaway, rv.data, file_size);
|
br_aes_big_cbcenc_run(&br, iv_throwaway, rv.data, file_size);
|
||||||
|
free(iv_throwaway);
|
||||||
|
|
||||||
#ifdef ENCODE_BASE_64
|
#ifdef ENCODE_BASE_64
|
||||||
baseencode_error_t berr;
|
baseencode_error_t berr;
|
||||||
const char *data = base64_encode(rv.data, rv.size, &berr);
|
const char *data = base64_encode(rv.data, rv.size, &berr);
|
||||||
if (data == NULL || berr != SUCCESS) {
|
if (data == NULL) {
|
||||||
fprintf(stderr, "base64_encode(): error code %d\n", berr);
|
fprintf(stderr, "base64_encode(): error code %d\n", berr);
|
||||||
// TODO: returns good rv
|
// TODO: returns good rv
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -87,6 +89,8 @@ struct mmap_file encrypt_mmap(struct mmap_file file, uint8_t **keyp, uint8_t **i
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
memcpy(rv_64.data, data, len);
|
memcpy(rv_64.data, data, len);
|
||||||
|
|
||||||
|
free(data);
|
||||||
munmap(rv.data, rv.size);
|
munmap(rv.data, rv.size);
|
||||||
rv = rv_64;
|
rv = rv_64;
|
||||||
#endif /* ENCODE_BASE_64 */
|
#endif /* ENCODE_BASE_64 */
|
||||||
|
@ -99,3 +103,56 @@ struct mmap_file encrypt_mmap(struct mmap_file file, uint8_t **keyp, uint8_t **i
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct mmap_file decrypt_mmap(struct mmap_file file, const uint8_t *key, const uint8_t *iv)
|
||||||
|
{
|
||||||
|
struct mmap_file rv =
|
||||||
|
{.size = file.size, .prot = PROT_WRITE | PROT_READ, .flags = MAP_ANONYMOUS | MAP_PRIVATE};
|
||||||
|
|
||||||
|
#ifdef DECODE_BASE_64
|
||||||
|
baseencode_error_t berr;
|
||||||
|
size_t data_len;
|
||||||
|
// TODO: find out why file.size is weird
|
||||||
|
uint8_t *data = base64_decode((char *)file.data, strlen(file.data), &berr, &data_len);
|
||||||
|
if (data == NULL) {
|
||||||
|
fprintf(stderr, "base64_decode(): error code %d\n", berr);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
// big hack to bypass issues
|
||||||
|
//assert(data_len % br_aes_big_BLOCK_SIZE == 0);
|
||||||
|
data_len -= data_len % br_aes_big_BLOCK_SIZE;
|
||||||
|
|
||||||
|
rv.size = data_len;
|
||||||
|
#endif /* DECODE_BASE_64 */
|
||||||
|
|
||||||
|
|
||||||
|
rv.data = mmap(NULL, rv.size, rv.prot, rv.flags, -1, 0);
|
||||||
|
if (ERROR_MMAP(rv)) {
|
||||||
|
perror("mmap()");
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DECODE_BASE_64
|
||||||
|
memcpy(rv.data, data, rv.size);
|
||||||
|
free(data);
|
||||||
|
#else
|
||||||
|
memcpy(rv.data, file.data, file.size);
|
||||||
|
#endif /* DECODE_BASE_64 */
|
||||||
|
|
||||||
|
munmap(file.data, file.size);
|
||||||
|
|
||||||
|
uint8_t *iv_throwaway = calloc(IV_LEN, 1);
|
||||||
|
if (iv_throwaway == NULL) {
|
||||||
|
perror("malloc()");
|
||||||
|
// TODO: returns good rv
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
memcpy(iv_throwaway, iv, IV_LEN);
|
||||||
|
|
||||||
|
br_aes_big_cbcdec_keys br = { 0 };
|
||||||
|
br_aes_big_cbcdec_init(&br, key, KEY_LEN);
|
||||||
|
br_aes_big_cbcdec_run(&br, iv_throwaway, rv.data, rv.size);
|
||||||
|
free(iv_throwaway);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ base64_encode(const unsigned char *user_data, size_t data_len, baseencode_error_
|
||||||
|
|
||||||
|
|
||||||
unsigned char *
|
unsigned char *
|
||||||
base64_decode(const char *user_data_untrimmed, size_t data_len, baseencode_error_t *err)
|
base64_decode(const char *user_data_untrimmed, size_t data_len, baseencode_error_t *err, size_t *output_len)
|
||||||
{
|
{
|
||||||
baseencode_error_t error;
|
baseencode_error_t error;
|
||||||
check_input((unsigned char *)user_data_untrimmed, data_len, MAX_DECODE_BASE64_INPUT_LEN, &error);
|
check_input((unsigned char *)user_data_untrimmed, data_len, MAX_DECODE_BASE64_INPUT_LEN, &error);
|
||||||
|
@ -130,6 +130,7 @@ base64_decode(const char *user_data_untrimmed, size_t data_len, baseencode_error
|
||||||
free(user_data);
|
free(user_data);
|
||||||
|
|
||||||
*err = SUCCESS;
|
*err = SUCCESS;
|
||||||
|
*output_len = output_length;
|
||||||
return decoded_data;
|
return decoded_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,4 +25,5 @@ char *base64_encode (const unsigned char *input_string,
|
||||||
|
|
||||||
unsigned char *base64_decode (const char *input_string,
|
unsigned char *base64_decode (const char *input_string,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
baseencode_error_t *err);
|
baseencode_error_t *err,
|
||||||
|
size_t *output_len);
|
||||||
|
|
21
purr.c
21
purr.c
|
@ -162,6 +162,12 @@ int main (int argc, char **argv)
|
||||||
rv = EXIT_FAILURE;
|
rv = EXIT_FAILURE;
|
||||||
goto early_out;
|
goto early_out;
|
||||||
}
|
}
|
||||||
|
} else if (recv && encrypt) {
|
||||||
|
int err = get_encryption_params(path, &key, &iv);
|
||||||
|
if (err) {
|
||||||
|
fputs("get_encription_params(): error decoding url\n", stderr);
|
||||||
|
goto early_out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: fix size
|
// TODO: fix size
|
||||||
|
@ -255,8 +261,8 @@ int main (int argc, char **argv)
|
||||||
|
|
||||||
rv = send_and_receive(&ci);
|
rv = send_and_receive(&ci);
|
||||||
|
|
||||||
if (encrypt) {
|
if (send && encrypt) {
|
||||||
size_t allocate_res = strlen((char *)output.data);
|
size_t allocate_res = strlen((char *)output.data) + 1;
|
||||||
char *link_res = calloc(allocate_res, 1);
|
char *link_res = calloc(allocate_res, 1);
|
||||||
char *path_res = calloc(allocate_res, 1);
|
char *path_res = calloc(allocate_res, 1);
|
||||||
char *port_res = calloc(16, 1);
|
char *port_res = calloc(16, 1);
|
||||||
|
@ -279,14 +285,18 @@ int main (int argc, char **argv)
|
||||||
goto early_out;
|
goto early_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(output_print, "%s/paste.html#%s_%s_%s",
|
// TODO: fix hack for https link
|
||||||
url, path_res + 1, key_s, iv_s);
|
fprintf(output_print, "https://%s/paste.html#%s_%s_%s",
|
||||||
|
link_res, path_res + 1, key_s, iv_s);
|
||||||
|
|
||||||
free(link_res);
|
free(link_res);
|
||||||
free(path_res);
|
free(path_res);
|
||||||
free(port_res);
|
free(port_res);
|
||||||
free(key_s);
|
free(key_s);
|
||||||
free(iv_s);
|
free(iv_s);
|
||||||
|
} else if (recv && encrypt) {
|
||||||
|
output = decrypt_mmap(output, key, iv);
|
||||||
|
fwrite(output.data, 1, output.size, output_print);
|
||||||
} else if (fwrite(output.data, 1, output.offset, output_print) < output.offset) {
|
} else if (fwrite(output.data, 1, output.offset, output_print) < output.offset) {
|
||||||
fputs("might not have written all data\n", stderr);
|
fputs("might not have written all data\n", stderr);
|
||||||
}
|
}
|
||||||
|
@ -299,7 +309,8 @@ int main (int argc, char **argv)
|
||||||
free(request);
|
free(request);
|
||||||
free(key);
|
free(key);
|
||||||
free(iv);
|
free(iv);
|
||||||
early_out:
|
early_out:
|
||||||
|
if (output_print != stdout) fclose(output_print);
|
||||||
CLOSE_MMAP(input);
|
CLOSE_MMAP(input);
|
||||||
CLOSE_MMAP(output);
|
CLOSE_MMAP(output);
|
||||||
|
|
||||||
|
|
2
purr.h
2
purr.h
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#define RANDOMIZE_IV
|
#define RANDOMIZE_IV
|
||||||
#define ENCODE_BASE_64
|
#define ENCODE_BASE_64
|
||||||
|
#define DECODE_BASE_64
|
||||||
|
|
||||||
#define RESET_MMAP(file) do{(file).offset = 0; (file).cursor = 0}while(0);
|
#define RESET_MMAP(file) do{(file).offset = 0; (file).cursor = 0}while(0);
|
||||||
#define ERROR_MMAP(file) ((file).data == MAP_FAILED || (file).data == NULL)
|
#define ERROR_MMAP(file) ((file).data == MAP_FAILED || (file).data == NULL)
|
||||||
|
@ -74,5 +75,6 @@ int decode_hex(const char *, uint8_t *, int);
|
||||||
|
|
||||||
/* encrypt.c */
|
/* encrypt.c */
|
||||||
struct mmap_file encrypt_mmap(struct mmap_file, uint8_t **, uint8_t **);
|
struct mmap_file encrypt_mmap(struct mmap_file, uint8_t **, uint8_t **);
|
||||||
|
struct mmap_file decrypt_mmap(struct mmap_file, const uint8_t *, const uint8_t *);
|
||||||
|
|
||||||
#endif // __PURR_H_
|
#endif // __PURR_H_
|
||||||
|
|
Loading…
Reference in New Issue