v3.0.0: Umschalten wartet nicht mehr aufs Auffrischen (abbrechbar, CA-Abruf zuletzt), schnellere Prüfintervalle

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-10-19 21:13:44 +02:00
co-authored by Claude Opus 5.5
parent c384c20558
commit f5fc0861c7
11 changed files with 113 additions and 53 deletions
+37 -12
View File
@@ -64,26 +64,51 @@ static u32 read_cached(u8 *der)
return n > 0 && n <= CA_MAX ? n : 0;
}
bool olvpatch_fetch_ca(const char *server, u8 *der, u32 *derLen, bool fresh)
// Erst in eine Hilfsdatei schreiben, dann umbenennen: Wird die App mittendrin beendet, bleibt die alte Datei heil
static bool write_atomic(const char *path, const u8 *data, u32 n)
{
if (!fresh && (*derLen = read_cached(der))) return true;
static u8 pem[2048];
u32 n = fetch(server, "/olv/ca.der", der, CA_MAX + 1);
if (n == 0 || n > CA_MAX) return !fresh ? false : (*derLen = read_cached(der)) != 0;
char tmp[96];
snprintf(tmp, sizeof(tmp), "%s.neu", path);
FILE *f = fopen(tmp, "wb");
bool ok = f && fwrite(data, 1, n, f) == n;
if (f) fclose(f);
if (ok) { remove(path); ok = rename(tmp, path) == 0; }
if (!ok) remove(tmp);
return ok;
}
// Holt die CA vom Server in den Zwischenspeicher. *changed: anders als vorher.
bool olvpatch_refresh_ca(const char *server, bool *changed)
{
static u8 der[CA_MAX + 1], old[CA_MAX + 1], pem[2048];
*changed = false;
u32 n = fetch(server, "/olv/ca.der", der, sizeof(der));
if (n == 0 || n > CA_MAX) return false;
u32 p = fetch(server, "/olv/ca.pem", pem, sizeof(pem));
if (p == 0) return false;
// Der Browser der Miiverse-App liest die CA von der SD-Karte
FILE *f = fopen(CA_PEM_FILE, "wb");
bool ok = f && fwrite(pem, 1, p, f) == p;
if (f) fclose(f);
u32 oldLen = read_cached(old);
if (oldLen == n && memcmp(old, der, n) == 0) return true; // unverändert
mkdir("sdmc:/3ds/mbmnet", 0777);
mkdir("sdmc:/3ds/mbmnet/cache", 0777);
f = fopen(CA_DER_CACHE, "wb");
if (f) { fwrite(der, 1, n, f); fclose(f); }
*derLen = n;
// Der Browser der Miiverse-App liest die CA (PEM) von der SD-Karte
bool ok = write_atomic(CA_PEM_FILE, pem, p) && write_atomic(CA_DER_CACHE, der, n);
*changed = ok;
return ok;
}
bool olvpatch_fetch_ca(const char *server, u8 *der, u32 *derLen)
{
if ((*derLen = read_cached(der))) return true;
bool changed;
return olvpatch_refresh_ca(server, &changed) && (*derLen = read_cached(der)) != 0;
}
bool olvpatch_ca_cached(void)
{
static u8 der[CA_MAX + 1];
return read_cached(der) != 0;
}
bool olvpatch_supported(const u8 *code, u32 size)
{
u32 off = DISCOVERY_ADDR - CODE_BASE;