Make compatible with both libnx v2.0.0 and v1.6.0

This commit is contained in:
shchmue 2019-01-04 15:54:34 -05:00
parent 352c39ae8a
commit d4b4f868b1
6 changed files with 57 additions and 11 deletions

View file

@ -32,7 +32,7 @@ include $(DEVKITPRO)/libnx/switch_rules
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
APP_TITLE := Lockpick APP_TITLE := Lockpick
APP_AUTHOR := shchmue APP_AUTHOR := shchmue
APP_VERSION := 1.1.1 APP_VERSION := 1.2
TARGET := $(subst $e ,_,$(notdir $(APP_TITLE))) TARGET := $(subst $e ,_,$(notdir $(APP_TITLE)))
BUILD := build BUILD := build

View file

@ -34,7 +34,7 @@ Notes
Building Building
= =
Release built with `libnx v1.6.0`. Release built with `libnx v2.0.0` but still builds and runs with `v1.6.0`.
Uses `freetype` which comes with `switch-portlibs` via `devkitPro pacman`: Uses `freetype` which comes with `switch-portlibs` via `devkitPro pacman`:
``` ```

View file

@ -1,4 +1,14 @@
# Changelog # Changelog
## Version 1.2
* Update for libnx v2.0.0 compatibility and still runs when built with v1.6.0
* The binary got even smaller!
* Accelerate finding FS keys
* No longer find BIS sources as they're hardcoded (whoops)
* Find all keys on first pass hashing FS instead of hashing the whole thing from the beginning repeatedly (__*whoops*__)
## Version 1.1.1
* No longer try to dump SD seed and ES keys on 1.0.0 as they're not available until 2.0.0
## Version 1.1 ## Version 1.1
* Changed titlekey dump methodology * Changed titlekey dump methodology
* No longer crashes sysmodule, reboot no longer needed * No longer crashes sysmodule, reboot no longer needed

View file

@ -34,8 +34,16 @@
#include "sha256.h" #include "sha256.h"
#ifdef RGBX8
#define LIBNX_200
#endif
namespace Common { namespace Common {
static u32 framebuf_width = 0; static u32 framebuf_width = 0;
#ifdef LIBNX_200
static Framebuffer fb;
static u32 stride;
#endif
static u32 *framebuf; static u32 *framebuf;
// FreeType vars // FreeType vars
static FT_Library library; static FT_Library library;
@ -111,7 +119,9 @@ namespace Common {
PlFontData font; PlFontData font;
#ifndef LIBNX_200
consoleInit(NULL); consoleInit(NULL);
#endif
plGetSharedFontByType(&font, PlSharedFontType_Standard); plGetSharedFontByType(&font, PlSharedFontType_Standard);
@ -119,10 +129,18 @@ namespace Common {
FT_New_Memory_Face(library, static_cast<FT_Byte *>(font.address), font.size, 0, &face); FT_New_Memory_Face(library, static_cast<FT_Byte *>(font.address), font.size, 0, &face);
FT_Set_Char_Size(face, 0, 6*64, 300, 300); FT_Set_Char_Size(face, 0, 6*64, 300, 300);
gfxSetMode(GfxMode_LinearDouble); // todo: update for nwindow/framebuffer #ifdef LIBNX_200
framebufferCreate(&fb, nwindowGetDefault(), FB_WIDTH, FB_HEIGHT, PIXEL_FORMAT_RGBA_8888, 2);
framebufferMakeLinear(&fb);
framebuf = (u32 *)framebufferBegin(&fb, &stride);
framebuf_width = stride / sizeof(u32);
memset(framebuf, 0, stride*FB_HEIGHT);
framebufferEnd(&fb);
#else
gfxSetMode(GfxMode_LinearDouble);
framebuf = (u32 *)gfxGetFramebuffer(&framebuf_width, NULL); framebuf = (u32 *)gfxGetFramebuffer(&framebuf_width, NULL);
memset(framebuf, 0, gfxGetFramebufferSize()); memset(framebuf, 0, gfxGetFramebufferSize());
#endif
draw_text(0x10, 0x020, YELLOW, "Lockpick! by shchmue"); draw_text(0x10, 0x020, YELLOW, "Lockpick! by shchmue");
draw_set_rect(814, 452 + 42 * 0, 450, 42, FLAG_RED); draw_set_rect(814, 452 + 42 * 0, 450, 42, FLAG_RED);
@ -148,7 +166,7 @@ namespace Common {
draw_text(0x10, 0x0e0, CYAN, "Saving keys to keyfile..."); draw_text(0x10, 0x0e0, CYAN, "Saving keys to keyfile...");
draw_text(0x10, 0x110, CYAN, "Total time elapsed:"); draw_text(0x10, 0x110, CYAN, "Total time elapsed:");
consoleUpdate(NULL); update_display();
} }
void get_tegra_keys(Key &sbk, Key &tsec, Key &tsec_root) { void get_tegra_keys(Key &sbk, Key &tsec, Key &tsec_root) {
@ -206,17 +224,29 @@ namespace Common {
u64 kDown = hidKeysDown(CONTROLLER_P1_AUTO); u64 kDown = hidKeysDown(CONTROLLER_P1_AUTO);
if (kDown & KEY_PLUS) break; if (kDown & KEY_PLUS) break;
consoleUpdate(NULL); update_display();
} }
#ifdef LIBNX_200
framebufferClose(&fb);
#else
consoleExit(NULL);
#endif
FT_Done_Face(face); FT_Done_Face(face);
FT_Done_FreeType(library); FT_Done_FreeType(library);
consoleExit(NULL);
appletUnlockExit(); appletUnlockExit();
} }
void update_display() {
#ifdef LIBNX_200
framebufferBegin(&fb, &stride);
framebufferEnd(&fb);
#else
consoleUpdate(NULL);
#endif
}
void sha256(const u8 *data, u8 *hash, size_t length) { void sha256(const u8 *data, u8 *hash, size_t length) {
struct sha256_state ctx; struct sha256_state ctx;
sha256_init(&ctx); sha256_init(&ctx);

View file

@ -24,6 +24,9 @@
#include <switch/types.h> #include <switch/types.h>
#define FB_WIDTH 1280
#define FB_HEIGHT 720
#define GREEN RGBA8_MAXALPHA(0, 0xff, 0) #define GREEN RGBA8_MAXALPHA(0, 0xff, 0)
#define RED RGBA8_MAXALPHA(0xff, 0, 0) #define RED RGBA8_MAXALPHA(0xff, 0, 0)
#define CYAN RGBA8_MAXALPHA(0, 0xff, 0xff) #define CYAN RGBA8_MAXALPHA(0, 0xff, 0xff)
@ -61,6 +64,9 @@ namespace Common {
// print exit // print exit
void wait_to_exit(); void wait_to_exit();
// refresh display
void update_display();
void sha256(const u8 *data, u8 *hash, size_t length); void sha256(const u8 *data, u8 *hash, size_t length);
// reads "<keyname> = <hexkey>" and returns byte vector // reads "<keyname> = <hexkey>" and returns byte vector
byte_vector key_string_to_byte_vector(std::string key_string); byte_vector key_string_to_byte_vector(std::string key_string);

View file

@ -251,16 +251,16 @@ void KeyCollection::get_keys() {
char keys_str[32]; char keys_str[32];
sprintf(keys_str, "Total keys found: %lu", Key::get_saved_key_count()); sprintf(keys_str, "Total keys found: %lu", Key::get_saved_key_count());
Common::draw_text(0x2a0, 0x110, CYAN, keys_str); Common::draw_text(0x2a0, 0x110, CYAN, keys_str);
Common::draw_text(0x80, 0x140, GREEN, "Keys saved to \"/switch/prod.keys\"!"); Common::draw_text(0x80, 0x140, YELLOW, "Keys saved to \"/switch/prod.keys\"!");
Common::draw_text(0x10, 0x170, CYAN, "Dumping titlekeys..."); Common::draw_text(0x10, 0x170, CYAN, "Dumping titlekeys...");
consoleUpdate(NULL); Common::update_display();
profiler_time = profile(&KeyCollection::get_titlekeys, *this); profiler_time = profile(&KeyCollection::get_titlekeys, *this);
Common::draw_text_with_time(0x10, 0x170, GREEN, "Dumping titlekeys...", profiler_time); Common::draw_text_with_time(0x10, 0x170, GREEN, "Dumping titlekeys...", profiler_time);
sprintf(keys_str, "Titlekeys found: %lu", titlekeys_dumped); sprintf(keys_str, "Titlekeys found: %lu", titlekeys_dumped);
Common::draw_text(0x2a0, 0x170, CYAN, keys_str); Common::draw_text(0x2a0, 0x170, CYAN, keys_str);
if (titlekeys_dumped > 0) if (titlekeys_dumped > 0)
Common::draw_text(0x80, 0x1a0, GREEN, "Titlekeys saved to \"/switch/title.keys\"!"); Common::draw_text(0x80, 0x1a0, YELLOW, "Titlekeys saved to \"/switch/title.keys\"!");
else else
Common::draw_text(0x80, 0x1a0, GREEN, "No titlekeys found. Either you've never played or installed a game or dump failed."); Common::draw_text(0x80, 0x1a0, GREEN, "No titlekeys found. Either you've never played or installed a game or dump failed.");
} }