diff options
author | Ben Wiederhake <BenWiederhake.GitHub@gmx> | 2015-10-01 18:11:33 +0300 |
---|---|---|
committer | Ben Wiederhake <BenWiederhake.GitHub@gmx> | 2015-10-04 18:51:49 +0300 |
commit | 7ab7f4126ebdd5a8afbea62604c276e229d3637a (patch) | |
tree | 88ab3d7a4d35730378785bc7d5dec6bf0d06c0e3 /telegram-base.c | |
parent | 57e6a777d98b5c21d6cb177a5b5c960e65aecac7 (diff) |
Avoid the PEM issue.
Diffstat (limited to 'telegram-base.c')
-rw-r--r-- | telegram-base.c | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/telegram-base.c b/telegram-base.c index 02990ce..15a7d8b 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -51,6 +51,64 @@ #define STATE_FILE_MAGIC 0x28949a93 #define SECRET_CHAT_FILE_MAGIC 0x37a1988a +static gboolean read_ui32 (int fd, unsigned int *ret) { + typedef char check_int_size[(sizeof (int) >= 4) ? 1 : -1]; + (void) sizeof (check_int_size); + + unsigned char buf[4]; + if (4 != read (fd, buf, 4)) { + return 0; + } + /* Ugly but works. */ + *ret = 0; + *ret |= buf[0]; + *ret <<= 8; + *ret |= buf[1]; + *ret <<= 8; + *ret |= buf[2]; + *ret <<= 8; + *ret |= buf[3]; + return 1; +} + +int read_pubkey_file (const char *name, struct rsa_pubkey *dst) { + /* Just to make sure nobody reads garbage. */ + dst->e = 0; + dst->n_len = 0; + dst->n_raw = NULL; + + int pubkey_fd = open (name, O_RDONLY); + if (pubkey_fd < 0) { + return 0; + } + + unsigned int e; + unsigned int n_len; + if (!read_ui32 (pubkey_fd, &e) || !read_ui32 (pubkey_fd, &n_len) // Ensure successful reads + || n_len < 128 || n_len > 1024 || e < 5) { // Ensure (at least remotely) sane parameters. + close (pubkey_fd); + return 0; + } + + unsigned char *n_raw = malloc (n_len); + if (!n_raw) { + close (pubkey_fd); + return 0; + } + + if (n_len != read (pubkey_fd, n_raw, n_len)) { + free (n_raw); + close (pubkey_fd); + return 0; + } + close (pubkey_fd); + + dst->e = e; + dst->n_len = n_len; + dst->n_raw = n_raw; + return 1; +} + void read_state_file (struct tgl_state *TLS) { char *name = 0; if (asprintf (&name, "%s/%s", TLS->base_path, "state") < 0) { @@ -406,13 +464,14 @@ gchar *get_download_dir (struct tgl_state *TLS) { return dir; } -void assert_file_exists (PurpleConnection *gc, const char *filepath, const char *format) { +gboolean assert_file_exists (PurpleConnection *gc, const char *filepath, const char *format) { if (!g_file_test (filepath, G_FILE_TEST_EXISTS)) { gchar *msg = g_strdup_printf (format, filepath); purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR, msg); g_free (msg); - return; + return 0; } + return 1; } void export_auth_callback (struct tgl_state *TLS, void *extra, int success) { |