bool load_passwords(void) { SceUID fd; char linebuf[LINEBUF], path[PATH_MAX]; rc4_key *pkey; STRCPY_S(path, scene_appdir()); STRCAT_S(path, "password.lst"); if (is_encrypted(path)) { rc4_prepare_key((u8 *) CRYPT_KEY, sizeof(CRYPT_KEY) - 1, &g_key); pkey = &g_key; } else { pkey = NULL; } fd = sceIoOpen(path, PSP_O_RDONLY, 0); if (fd < 0) { return false; } if (pkey != NULL) { sceIoLseek(fd, 4, PSP_SEEK_SET); } linebuf[sizeof(linebuf) - 1] = '\0'; while (read_lines(fd, linebuf, sizeof(linebuf) - 1, pkey) >= 0) { add_password(linebuf); } sceIoClose(fd); return true; }
G_MODULE_EXPORT gboolean file_dialog_okay(GtkButton *button, gtk_widgets_t *data) { gtk_widget_hide(data->open_dialog); gtk_widget_hide(data->save_dialog); gboolean en = TRUE; /* * check the source file exists (and is a file) */ char *open_file = gtk_file_chooser_get_filename((GtkFileChooser *)data->open_dialog); if (!open_file) open_file = gui_file_hack_source; if (open_file) /* if at first you don’t succeed, try, try again */ open_file = _filename_utf8(open_file); if (!open_file || !strlen(open_file)) en = FALSE; else { struct stat s; stat(open_file, &s); char *dir = open_file; if (S_ISREG(s.st_mode)) dir = basename(open_file); if (S_ISREG(s.st_mode) || S_ISDIR(s.st_mode)) { gtk_label_set_text((GtkLabel *)data->open_file_label, basename(open_file)); gtk_widget_show(data->open_file_image); /* * quickly see if the file is encrypted already */ char *ptr = malloc(0); char *c = ptr; char *h = ptr; char *m = ptr; if ((_encrypted = is_encrypted(open_file, &c, &h, &m))) auto_select_algorithms(data, c, h, m); free(ptr); free(c); free(h); free(m); gtk_button_set_label((GtkButton *)data->encrypt_button, _encrypted ? LABEL_DECRYPT : LABEL_ENCRYPT); en = TRUE; if (cwd) free(cwd); cwd = strdup(dir); } else en = FALSE; } if (open_file) g_free(open_file); char *save_file = gtk_file_chooser_get_filename((GtkFileChooser *)data->save_dialog); if (!save_file) save_file = gui_file_hack_output; if (save_file) save_file = _filename_utf8(save_file); if (!save_file || !strlen(save_file)) en = FALSE; else { struct stat s; stat(save_file, &s); /* * if the destination exists, it has to be a regular file */ char *dir = save_file; if (S_ISREG(s.st_mode)) dir = basename(save_file); if (errno == ENOENT || S_ISREG(s.st_mode) || S_ISDIR(s.st_mode)) { gtk_label_set_text((GtkLabel *)data->save_file_label, basename(save_file)); gtk_widget_show(data->save_file_image); if (cwd) free(cwd); cwd = strdup(dir); } else en = FALSE; } if (save_file) g_free(save_file); _files = en; if (_encrypted) { gtk_widget_set_sensitive(data->crypto_combo, FALSE); gtk_widget_set_sensitive(data->hash_combo, FALSE); gtk_widget_set_sensitive(data->mode_combo, FALSE); gtk_widget_set_sensitive(data->password_entry, en); gtk_widget_set_sensitive(data->key_button, en); } else { gtk_widget_set_sensitive(data->crypto_combo, en); gtk_widget_set_sensitive(data->hash_combo, en); gtk_widget_set_sensitive(data->mode_combo, en); if (en) algorithm_combo_callback(NULL, data); } return (void)button, TRUE; }
int decrypt_image(const char *src_file, const char *dst_file) { int ret = -1; uint32_t md_ctx = 0, offset = 0; uint32_t fsize = 0; FILE *file = NULL; struct ion_buf_handle ionbuf; int smcmod_fd = -1; int qseecom_fd = -1; size_t read; memset(&ionbuf, 0, sizeof(ionbuf)); ionbuf.ion_fd = -1; qseecom_fd = open("/dev/qseecom", O_RDWR); if (qseecom_fd < 0) { fprintf(stderr, "Failed to open /dev/qseecom device (%s)\n", strerror(errno)); goto exit; } smcmod_fd = open("/dev/smcmod", O_RDWR); if (smcmod_fd < 0) { fprintf(stderr, "Failed to open /dev/smcmod device (%s)\n", strerror(errno)); goto exit; } file = fopen(src_file, "rb"); if (!file) { fprintf(stderr, "Failed to open %s (%s)\n", src_file, strerror(errno)); goto exit; } fseek(file, 0, SEEK_END); fsize = ftell(file); fseek(file, 0, SEEK_SET); ret = ion_memalloc(&ionbuf, fsize, ION_PIL1_HEAP_ID); if (ret) goto exit; read = fread(ionbuf.buffer, fsize, 1, file); if (read != 1) { fprintf(stderr, "Failed to read %s (%s)\n", src_file, strerror(errno)); ret = -errno; goto exit; } ret = ion_buffer_clean_inval(&ionbuf, ION_IOC_CLEAN_INV_CACHES); if (ret < 0) goto exit; ret = ioctl(qseecom_fd, QSEECOM_IOCTL_PERF_ENABLE_REQ); if (ret < 0) goto exit; ret = is_encrypted(smcmod_fd, &ionbuf, fsize, &md_ctx, &offset); if (ret < 0) goto exit; if (ret == 1) { fprintf(stdout, "decrypting %s ...\n", src_file); ret = decrypt(smcmod_fd, &ionbuf, fsize, md_ctx, offset); if (ret < 0) goto exit; ion_buffer_clean_inval(&ionbuf, ION_IOC_INV_CACHES); ret = save_file(dst_file, ionbuf.buffer + offset, fsize - offset); if (ret < 0) goto exit; fprintf(stdout, "decrypting done!\n"); } exit: if (ionbuf.ion_fd >= 0) ion_memfree(&ionbuf); if (qseecom_fd >= 0) { ioctl(qseecom_fd, QSEECOM_IOCTL_PERF_DISABLE_REQ); close(qseecom_fd); } if (smcmod_fd >= 0) close(smcmod_fd); if (file) fclose(file); return ret; }