// same, signature given as string // int check_file_signature2( const char* md5, const char* signature_text, const char* key_text, bool& answer ) { R_RSA_PUBLIC_KEY key; unsigned char signature_buf[SIGNATURE_SIZE_BINARY]; int retval; DATA_BLOCK signature; retval = sscan_key_hex(key_text, (KEY*)&key, sizeof(key)); if (retval) { fprintf(stderr, "check_file_signature2: sscan_key_hex failed\n"); return retval; } signature.data = signature_buf; signature.len = sizeof(signature_buf); retval = sscan_hex_data(signature_text, signature); if (retval) return retval; return check_file_signature(md5, key, signature, answer); }
void cmd_avatar(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { if (argc < 2) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: No file path supplied."); return; } /* turns the avatar off */ if (strlen(argv[1]) < 3) { tox_unset_avatar(m); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No avatar set."); return; } if (argv[1][0] != '\"') { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Path must be enclosed in quotes."); return; } /* remove opening and closing quotes */ char path[MAX_STR_SIZE]; snprintf(path, sizeof(path), "%s", &argv[1][1]); int len = strlen(path) - 1; path[len] = '\0'; off_t sz = file_size(path); if (sz <= 8) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Invalid file."); return; } if (sz > TOX_AVATAR_MAX_DATA_LENGTH) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: File is too large."); return; } FILE *fp = fopen(path, "rb"); if (fp == NULL) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Could not open file."); return; } char PNG_signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; if (check_file_signature(PNG_signature, sizeof(PNG_signature), fp) != 0) { fclose(fp); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: File type not supported."); return; } char *avatar = malloc(sz); if (avatar == NULL) exit_toxic_err("Failed in set_avatar", FATALERR_MEMORY); if (fread(avatar, sz, 1, fp) != 1) { fclose(fp); free(avatar); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Read fail."); return; } if (tox_set_avatar(m, TOX_AVATAR_FORMAT_PNG, (const uint8_t *) avatar, (uint32_t) sz) == -1) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Core error."); char filename[MAX_STR_SIZE]; get_file_name(filename, sizeof(filename), path); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Avatar set to '%s'", filename); fclose(fp); free(avatar); }