olm/fuzzers/fuzz_decrypt.cpp
2016-05-26 13:25:34 +01:00

65 lines
1.8 KiB
C++

#include "olm/olm.hh"
#include "fuzzing.hh"
int main(int argc, const char *argv[]) {
size_t ignored;
if (argc <= 3) {
const char * message = "Usage: decrypt: <session_key> <session_file>"
" <message_type>\n";
ignored = write(STDERR_FILENO, message, strlen(message));
exit(3);
}
const char * key = argv[1];
size_t key_length = strlen(key);
int session_fd = check_errno(
"Error opening session file", open(argv[2], O_RDONLY)
);
int message_type = atoi(argv[3]);
uint8_t *session_buffer;
ssize_t session_length = check_errno(
"Error reading session file", read_file(session_fd, &session_buffer)
);
int message_fd = STDIN_FILENO;
uint8_t * message_buffer;
ssize_t message_length = check_errno(
"Error reading message file", read_file(message_fd, &message_buffer)
);
uint8_t * tmp_buffer = (uint8_t *) malloc(message_length);
memcpy(tmp_buffer, message_buffer, message_length);
uint8_t session_memory[olm_session_size()];
OlmSession * session = olm_session(session_memory);
check_session(session, "Error unpickling session", olm_unpickle_session(
session, key, key_length, session_buffer, session_length
));
size_t max_length = check_session(
session,
"Error getting plaintext length",
olm_decrypt_max_plaintext_length(
session, message_type, tmp_buffer, message_length
)
);
uint8_t plaintext[max_length];
size_t length = check_session(
session, "Error decrypting message", olm_decrypt(
session, message_type,
message_buffer, message_length,
plaintext, max_length
)
);
ignored = write(STDOUT_FILENO, plaintext, length);
ignored = write(STDOUT_FILENO, "\n", 1);
return ignored;
}