diff --git a/SysCheck HDE.pnproj b/SysCheck HDE.pnproj index db881e8..e151dae 100644 --- a/SysCheck HDE.pnproj +++ b/SysCheck HDE.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/boot.elf b/boot.elf index 241a290..a2acc39 100644 Binary files a/boot.elf and b/boot.elf differ diff --git a/include/languages.h b/include/languages.h index fc04128..1d55d53 100644 --- a/include/languages.h +++ b/include/languages.h @@ -61,6 +61,7 @@ const char* TXT_Flash; const char* TXT_NAND; const char* TXT_Boot2; const char* TXT_USB; +const char* TXT_BeerTicket; const char* TXT_NoPatch; const char* TXT_Priiloader; const char* TXT_PreFiix; diff --git a/include/ssl.h b/include/ssl.h new file mode 100644 index 0000000..013fb77 --- /dev/null +++ b/include/ssl.h @@ -0,0 +1,29 @@ +/* Code taken from http://wiibrew.org/wiki//dev/net/ssl/code */ + +#ifndef _SSL_H_ +#define _SSL_H_ + +#define IOCTLV_SSL_NEW 1 +#define IOCTLV_SSL_CONNECT 2 +#define IOCTLV_SSL_HANDSHAKE 3 +#define IOCTLV_SSL_READ 4 +#define IOCTLV_SSL_WRITE 5 +#define IOCTLV_SSL_SHUTDOWN 6 +#define IOCTLV_SSL_SETROOTCA 10 +#define IOCTLV_SSL_SETBUILTINCLIENTCERT 14 + +#define SSL_HEAP_SIZE 0xB000 + +u32 ssl_init(void); +u32 ssl_open(void); +u32 ssl_close(void); +s32 ssl_new(u8 * CN, u32 verify_options); +s32 ssl_setbuiltinclientcert(s32 ssl_context, s32 index); +s32 ssl_setrootca(s32 ssl_context, const void *root, u32 length); +s32 ssl_connect(s32 ssl_context, s32 socket); +s32 ssl_handshake(s32 ssl_context); +s32 ssl_read(s32 ssl_context, void* buffer, u32 length); +s32 ssl_write(s32 ssl_context, const void * buffer, u32 length); +s32 ssl_shutdown(s32 ssl_context); + +#endif diff --git a/include/sys.h b/include/sys.h index 693f863..11d2e72 100644 --- a/include/sys.h +++ b/include/sys.h @@ -81,6 +81,7 @@ typedef struct { bool infoUSB2; bool infoVersionPatch; bool infovIOS; + bool infoBeerTicket; s32 baseIOS; s32 mloadVersion; char info[64]; @@ -150,6 +151,7 @@ bool CheckNANDAccess(void); bool CheckBoot2Access(void); bool CheckMload(void); bool CheckUSB2(u32 titleID); +bool CheckBeerTicket(u32 titleID); bool IsKnownStub(u32 noIOS, s32 noRevision); s32 GetTMD(u64 TicketID, signed_blob **Output, u32 *Length); s32 read_file_from_nand(char *filepath, u8 **buffer, u32 *filesize); diff --git a/source/http.c b/source/http.c index b00e412..e4fd791 100644 --- a/source/http.c +++ b/source/http.c @@ -33,6 +33,7 @@ #include "languages.h" #include "gui.h" #include "gecko.h" +#include "ssl.h" char *http_host; u16 http_port; @@ -51,16 +52,19 @@ s32 tcp_socket (void) { s = net_socket (PF_INET, SOCK_STREAM, 0); if (s < 0) return s; - res = net_fcntl (s, F_GETFL, 0); - if (res < 0) { - net_close (s); - return res; - } - - res = net_fcntl (s, F_SETFL, res | 4); - if (res < 0) { - net_close (s); - return res; + if(http_port == 80) + { + res = net_fcntl (s, F_GETFL, 0); + if (res < 0) { + net_close (s); + return res; + } + //set non-blocking + res = net_fcntl (s, F_SETFL, res | 4); + if (res < 0) { + net_close (s); + return res; + } } return s; @@ -129,7 +133,10 @@ char * tcp_readln (const s32 s, const u16 max_length, const u64 start_time, cons if (ticks_to_millisecs (diff_ticks (start_time, gettime ())) > timeout) break; - res = net_read (s, &buf[c], 1); + if(http_port == 443) + res = ssl_read (s, &buf[c], 1); + else + res = net_read (s, &buf[c], 1); if ((res == 0) || (res == -EAGAIN)) { usleep (20 * 1000); @@ -180,7 +187,10 @@ bool tcp_read (const s32 s, u8 **buffer, const u32 length) { if (block > 2048) block = 2048; - res = net_read (s, p, block); + if(http_port == 443) + res = ssl_read (s, p, block); + else + res = net_read (s, p, block); if ((res == 0) || (res == -EAGAIN)) { usleep (20 * 1000); @@ -228,7 +238,10 @@ bool tcp_write (const s32 s, const u8 *buffer, const u32 length) { if (block > 2048) block = 2048; - res = net_write (s, p, block); + if(http_port == 443) + res = ssl_write (s, p, block); + else + res = net_write (s, p, block); if ((res == 0) || (res == -56)) { usleep (20 * 1000); @@ -255,10 +268,13 @@ bool http_split_url (char **host, char **path, const char *url) { const char *p; char *c; - if (strncasecmp (url, "http://", 7)) + if (strncasecmp (url, "http://", 7) == 0) + p = url + 7; + else if(strncasecmp (url, "https://", 8) == 0) + p = url + 8; + else return false; - p = url + 7; c = strchr (p, '/'); if (c[0] == 0) @@ -272,11 +288,16 @@ bool http_split_url (char **host, char **path, const char *url) { bool http_request (const char *url, const u32 max_size) { int linecount; + int sslcontext = -1; if (!http_split_url(&http_host, &http_path, url)) return false; - http_port = 80; + if (strncasecmp (url, "http://", 7) == 0) + http_port = 80; + else + http_port = 443; + http_max_size = max_size; - + http_status = 404; content_length = 0; http_data = NULL; @@ -286,21 +307,50 @@ bool http_request (const char *url, const u32 max_size) { result = HTTPR_ERR_CONNECT; return false; } - + if(http_port == 443) + { + //patched out anyways so just to set something + sslcontext = ssl_new((u8*)http_host,0); + if(sslcontext < 0) + { + gprintf("ssl_new\n"); + result = HTTPR_ERR_CONNECT; + net_close (s); + return false; + } + //patched out anyways so just to set something + ssl_setbuiltinclientcert(sslcontext,0); + if(ssl_connect(sslcontext,s) < 0) + { + gprintf("ssl_connect\n"); + result = HTTPR_ERR_CONNECT; + ssl_shutdown(sslcontext); + net_close (s); + return false; + } + int ret = ssl_handshake(sslcontext); + if(ret < 0) + { + gprintf("ssl_handshake %i\n", ret); + result = HTTPR_ERR_STATUS; + ssl_shutdown(sslcontext); + net_close (s); + return false; + } + } char *request = (char *) memalign (32, 1024*6); char *r = request; r += sprintf (r, "GET %s HTTP/1.1\r\n", http_path); r += sprintf (r, "Host: %s\r\n", http_host); r += sprintf (r, "Cache-Control: no-cache\r\n\r\n"); - - bool b = tcp_write (s, (u8 *) request, strlen (request)); + bool b = tcp_write (http_port == 443 ? sslcontext : s, (u8 *) request, strlen (request)); free (request); linecount = 0; for (linecount=0; linecount < 32; linecount++) { - char *line = tcp_readln (s, 0xff, gettime(), (u16)HTTP_TIMEOUT); + char *line = tcp_readln (http_port == 443 ? sslcontext : s, 0xff, gettime(), (u16)HTTP_TIMEOUT); if (!line) { http_status = 404; result = HTTPR_ERR_REQUEST; @@ -324,26 +374,34 @@ bool http_request (const char *url, const u32 max_size) { if (linecount == 32 || !content_length) http_status = 404; if (http_status != 200) { result = HTTPR_ERR_STATUS; + if(http_port == 443) + ssl_shutdown(sslcontext); net_close (s); return false; } if (content_length > http_max_size) { result = HTTPR_ERR_TOOBIG; + if(http_port == 443) + ssl_shutdown(sslcontext); net_close (s); return false; } http_data = (u8 *) memalign (32, content_length); - b = tcp_read (s, &http_data, content_length); + b = tcp_read (http_port == 443 ? sslcontext : s, &http_data, content_length); if (!b) { free (http_data); http_data = NULL; result = HTTPR_ERR_RECEIVE; + if(http_port == 443) + ssl_shutdown(sslcontext); net_close (s); return false; } result = HTTPR_OK; + if(http_port == 443) + ssl_shutdown(sslcontext); net_close (s); diff --git a/source/languages.c b/source/languages.c index 4822f3b..4ef51e8 100644 --- a/source/languages.c +++ b/source/languages.c @@ -77,6 +77,7 @@ int initLanguages(struct tm today) TXT_Boot2 = " Boot2 Zugriff,"; TXT_USB = " USB 2.0,"; TXT_VersionP = " ES_Version,"; + TXT_BeerTicket = " Beer Ticket,"; TXT_NoPatch = " Keine Patches,"; sprintf(TXT_ReportDate, "Bericht wurde am %2.2d.%2.2d.%4.4d generiert.", today.tm_mday, today.tm_mon + 1, today.tm_year + 1900); BUT_HBC = "Homebrew Channel"; @@ -154,6 +155,7 @@ int initLanguages(struct tm today) TXT_Boot2 = " Acces Boot2,"; TXT_USB = " USB 2.0,"; TXT_VersionP = " ES_Version,"; + TXT_BeerTicket = " Beer Ticket,"; TXT_NoPatch = " Pas de patches,"; sprintf(TXT_ReportDate, "Rapport genere le %4.4d/%2.2d/%2.2d.", today.tm_year + 1900, today.tm_mon + 1, today.tm_mday); BUT_HBC = "Homebrew Channel"; @@ -231,6 +233,7 @@ int initLanguages(struct tm today) TXT_Boot2 = " Accesso Boot2,"; TXT_USB = " USB 2.0,"; TXT_VersionP = " ES_Version,"; + TXT_BeerTicket = " Beer Ticket,"; TXT_NoPatch = " Non patchato,"; sprintf(TXT_ReportDate, "Rapporto generato il %2.2d.%2.2d.%4.4d.", today.tm_mday, today.tm_mon + 1, today.tm_year + 1900); BUT_HBC = "Canale Homebrew"; @@ -308,6 +311,7 @@ int initLanguages(struct tm today) TXT_Boot2 = " Acceso Boot2,"; TXT_USB = " USB 2.0,"; TXT_VersionP = " ES_Version,"; + TXT_BeerTicket = " Beer Ticket,"; TXT_NoPatch = " Sin Parches,"; sprintf(TXT_ReportDate, "Reporte generado el %2.2d/%2.2d/%4.4d.", today.tm_mday, today.tm_mon + 1, today.tm_year + 1900); BUT_HBC = "Canal Homebrew"; @@ -385,6 +389,7 @@ int initLanguages(struct tm today) TXT_Boot2 = " Boot2 Access,"; TXT_USB = " USB 2.0,"; TXT_VersionP = " ES_Version,"; + TXT_BeerTicket = " Beer Ticket,"; TXT_NoPatch = " No Patches,"; sprintf(TXT_ReportDate, "Report generated on %2.2d/%2.2d/%4.4d.", today.tm_mon + 1, today.tm_mday, today.tm_year + 1900); BUT_HBC = "Homebrew Channel"; diff --git a/source/ssl.c b/source/ssl.c new file mode 100644 index 0000000..cfe1508 --- /dev/null +++ b/source/ssl.c @@ -0,0 +1,302 @@ +/* Code taken from http://wiibrew.org/wiki//dev/net/ssl/code */ + +#include //needed for patches -FIX94 +#include +#include +#include "ssl.h" + +#define ISALIGNED(x) ((((u32)x)&0x1F)==0) + +static char __ssl_fs[] ATTRIBUTE_ALIGN(32) = "/dev/net/ssl"; + +static s32 __ssl_fd = -1; +static s32 __ssl_hid = -1; + +u32 ssl_init(void) +{ + if(__ssl_hid < 0 ) { + __ssl_hid = iosCreateHeap(SSL_HEAP_SIZE); + if(__ssl_hid < 0){ + return __ssl_hid; + } + //some very dirty ssl patches for ios58 only -FIX94 + write16(0xD8B420A, 0); + + //ssl error -9 patch (wrong host) + DCInvalidateRange( (void*)0x93CC1AC0, 0x20 ); + write32(0x93CC1AC0, 0xE328F102); //set "negative" flag + DCFlushRange( (void*)0x93CC1AC0, 0x20 ); + + //ssl error -10 patch (wrong root cert) + DCInvalidateRange( (void*)0x93CC1B40, 0x20 ); + write32(0x93CC1B50, 0xEA000009); //beq->b + DCFlushRange( (void*)0x93CC1B40, 0x20 ); + + DCInvalidateRange( (void*)0x93CC1B80, 0x20 ); + write32(0x93CC1B94, 0xEA000008); //bne->b + DCFlushRange( (void*)0x93CC1B80, 0x20 ); + + //ssl error -11 patch (wrong client cert?) + DCInvalidateRange( (void*)0x93CC1BE0, 0x20 ); + write32(0x93CC1BF8, 0xEA000016); //ble->b + DCFlushRange( (void*)0x93CC1BE0, 0x20 ); + } + + return 0; +} + +u32 ssl_open(void) +{ + s32 ret; + + if (__ssl_fd < 0) { + ret = IOS_Open(__ssl_fs,0); + if(ret<0){ + return ret; + } + __ssl_fd = ret; + } + + return 0; +} + +u32 ssl_close(void) +{ + s32 ret; + + if(__ssl_fd < 0){ + return 0; + } + + ret = IOS_Close(__ssl_fd); + + __ssl_fd = -1; + + if(ret<0){ + return ret; + } + + return 0; +} + +s32 ssl_new(u8 * CN, u32 ssl_verify_options) +{ + s32 ret; + s32 aContext[8] ATTRIBUTE_ALIGN(32); + u32 aVerify_options[8] ATTRIBUTE_ALIGN(32); + + ret = ssl_open(); + if(ret){ + return ret; + } + + aVerify_options[0] = ssl_verify_options; + + if(ISALIGNED(CN)){ //Avoid alignment if the input is aligned + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_NEW, "d:dd", aContext, 0x20, aVerify_options, 0x20, CN, 0x100); + }else{ + u8 *aCN = NULL; + + aCN = iosAlloc(__ssl_hid, 0x100); + if (!aCN) { + return IPC_ENOMEM; + } + + memcpy(aCN, CN, 0x100); + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_NEW, "d:dd", aContext, 0x20, aVerify_options, 0x20, aCN, 0x100); + + if(aCN){ + iosFree(__ssl_hid, aCN); + } + } + + ssl_close(); + + return (ret ? ret : aContext[0]); +} + +s32 ssl_setbuiltinclientcert(s32 ssl_context, s32 index) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aIndex[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + aSsl_context[0] = ssl_context; + aIndex[0] = index; + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_SETBUILTINCLIENTCERT, "d:dd", aResponse, 32, aSsl_context, 32, aIndex, 32); + ssl_close(); + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_setrootca(s32 ssl_context, const void *root, u32 length) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + aSsl_context[0] = ssl_context; + + if(ISALIGNED(root)){ //Avoid alignment if the input is aligned + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_SETROOTCA, "d:dd", aResponse, 0x20, aSsl_context, 0x20, root, length); + }else{ + u8 *aRoot = NULL; + + aRoot = iosAlloc(__ssl_hid, length); + if (!aRoot) { + return IPC_ENOMEM; + } + + memcpy(aRoot, root, length); + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_SETROOTCA, "d:dd", aResponse, 0x20, aSsl_context, 0x20, aRoot, length); + + if(aRoot){ + iosFree(__ssl_hid, aRoot); + } + } + + ssl_close(); + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_connect(s32 ssl_context, s32 socket) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aSocket[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + aSsl_context[0] = ssl_context; + aSocket[0] = socket; + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_CONNECT, "d:dd", aResponse, 0x20, aSsl_context, 0x20, aSocket, 0x20); + ssl_close(); + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_handshake(s32 ssl_context) +{ + + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + aSsl_context[0] = ssl_context; + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_HANDSHAKE, "d:d", aResponse, 0x20, aSsl_context, 0x20); + ssl_close(); + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_read(s32 ssl_context, void* buffer, u32 length) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + if(!buffer){ + return IPC_EINVAL; + } + + u8 *aBuffer = NULL; + aBuffer = iosAlloc(__ssl_hid, length); + if (!aBuffer) { + return IPC_ENOMEM; + } + + aSsl_context[0] = ssl_context; + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_READ, "dd:d", aResponse, 0x20, aBuffer, length, aSsl_context, 0x20); + ssl_close(); + + if(ret == IPC_OK){ + memcpy(buffer, aBuffer, aResponse[0]); + } + + if(aBuffer){ + iosFree(__ssl_hid, aBuffer); + } + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_write(s32 ssl_context, const void *buffer, u32 length) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + if(!buffer){ + return IPC_EINVAL; + } + + aSsl_context[0] = ssl_context; + + if(ISALIGNED(buffer)){ //Avoid alignment if the input is aligned + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_WRITE, "d:dd", aResponse, 0x20, aSsl_context, 0x20, buffer, length); + }else{ + u8 *aBuffer = NULL; + aBuffer = iosAlloc(__ssl_hid, length); + if (!aBuffer) { + return IPC_ENOMEM; + } + + memcpy(aBuffer, buffer, length); + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_WRITE, "d:dd", aResponse, 0x20, aSsl_context, 0x20, aBuffer, length); + } + + ssl_close(); + + return (ret ? ret : aResponse[0]); +} + +s32 ssl_shutdown(s32 ssl_context) +{ + s32 aSsl_context[8] ATTRIBUTE_ALIGN(32); + s32 aResponse[8] ATTRIBUTE_ALIGN(32); + s32 ret; + + ret = ssl_open(); + if(ret){ + return ret; + } + + aSsl_context[0] = ssl_context; + + ret = IOS_IoctlvFormat(__ssl_hid, __ssl_fd, IOCTLV_SSL_SHUTDOWN, "d:d", aResponse, 0x20, aSsl_context, 0x20); + + ssl_close(); + + return (ret ? ret : aResponse[0]); +} diff --git a/source/sys.c b/source/sys.c index 59cc0e2..a7215aa 100644 --- a/source/sys.c +++ b/source/sys.c @@ -105,7 +105,7 @@ bool getInfoFromContent(IOS_t *ios) { { sprintf(ios->info, " cBoot252"); gprintf("is cBoot252\n"); - logfile("is cBoot252\r\n"); + gprintf("is cBoot252\r\n"); retValue = true; ios->isStub = true; break; @@ -121,7 +121,7 @@ bool getInfoFromContent(IOS_t *ios) { else snprintf(ios->info, MAX_ELEMENTS(ios->info), "%s-v%u%s", iosinfo->name, iosinfo->version, iosinfo->versionstring); gprintf("is %s\n", ios->info); - logfile("is %s\r\n", ios->info); + gprintf("is %s\r\n", ios->info); retValue = true; if (buffer != NULL) free(buffer); } @@ -129,6 +129,71 @@ bool getInfoFromContent(IOS_t *ios) { return retValue; } +s32 read_isfs(char *path, u8 **out, u32 *size) +{ + s32 ret, fd; + static fstats status ATTRIBUTE_ALIGN(32); + + fd = ISFS_Open(path, ISFS_OPEN_READ); + if (fd < 0) + { + gprintf("ISFS_Open for '%s' returned %d.\r\n", path, fd); + return -1; + } + + ret = ISFS_GetFileStats(fd, &status); + if (ret < 0) + { + gprintf("ISFS_GetFileStats(fd) returned %d.\r\n", ret); + ISFS_Close(fd); + return -1; + } + + if (status.file_length == 0) + { + ISFS_Close(fd); + return -1; + } + + *size = status.file_length; + gprintf("Size = %u bytes.\r\n", *size); + + *out = allocate_memory(*size); + if (*out == NULL) + { + gprintf("\r\nError allocating memory for out.\r\n"); + ISFS_Close(fd); + return -2; + } + + u32 blksize, writeindex = 0, restsize = *size; + + while (restsize > 0) + { + if (restsize >= 0x4000) + { + blksize = 0x4000; + } else { + blksize = restsize; + } + + ret = ISFS_Read(fd, *out + writeindex, blksize); + if (ret < 0) + { + gprintf("\r\nISFS_Read(%d, %d) returned %d.\r\n", fd, blksize, ret); + free(*out); + ISFS_Close(fd); + return -1; + } + + writeindex += blksize; + restsize -= blksize; + } + + ISFS_Close(fd); + return 0; +} + s32 brute_tmd(tmd *p_tmd) { u16 fill; @@ -324,6 +389,32 @@ inline s32 RemoveBogusTMD(void) return ES_DeleteTitle(0x100000000LL); } +/* Probably doesn't work */ +inline bool CheckBeerTicket(u32 titleID) { + char filepath[ISFS_MAXPATH] ATTRIBUTE_ALIGN(0x20); + u8 *buffer = NULL; + u32 tik_size = 0; + //tik *ticket; + + sprintf(filepath, "/ticket/00000001/%08x.tik", titleID); + if (read_isfs(filepath, &buffer, &tik_size)) { + gprintf("Failed to read IOS%u ticket\n", titleID); + return false; + } + //ticket = (tik*)(buffer); + //gprintf("Key in IOS%08x ticket is %s.\n", titleID, ticket->cipher_title_key); + int i; + for (i = 0; i < tik_size - sizeof("GottaGetSomeBeer")-1; i++) + { + if (!strncmp((char*)buffer + i, "GottaGetSomeBeer", sizeof("GottaGetSomeBeer")-1)) { + free(buffer); + return true; + } + } + free(buffer); + return false; + //return !strcmp((char*)ticket->cipher_title_key, "GottaGetSomeBeer"); +} inline bool CheckIOSType(void) { //if (AHB_ACCESS == false) return false; diff --git a/source/sysCheck.c b/source/sysCheck.c index 5f2fa12..11a7a83 100644 --- a/source/sysCheck.c +++ b/source/sysCheck.c @@ -357,6 +357,7 @@ int main(int argc, char **argv) deinitGUI(); exit(1); } + ios[i].infoBeerTicket = CheckBeerTicket(ios[i].titleID); iosTMDBuffer = (signed_blob*)memalign(32, (tmdSize+31)&(~31)); memset(iosTMDBuffer, 0, tmdSize); @@ -902,7 +903,6 @@ int main(int argc, char **argv) for (i = 0; i < nbTitles; i++) { lineOffset = i + LAST; - // TODO: Fix hiding the next IOS if (arguments.skipIOScnt > 0) { for(j = 0; j < arguments.skipIOScnt; j++) { if (arguments.skipIOSlist[j] > lastIOS && arguments.skipIOSlist[j] < ios[i].titleID) { @@ -966,7 +966,8 @@ int main(int argc, char **argv) if(ios[i].infoVersionPatch) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_VersionP); if(ios[i].infoBoot2Access) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_Boot2); if(ios[i].infoUSB2) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_USB); - if(!ios[i].infoFakeSignature && !ios[i].infoESIdentify && !ios[i].infoFlashAccess && !ios[i].infoNANDAccess && !ios[i].infoUSB2 && !ios[i].infoVersionPatch) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_NoPatch); + if(ios[i].infoBeerTicket) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_BeerTicket); + if(!ios[i].infoFakeSignature && !ios[i].infoESIdentify && !ios[i].infoFlashAccess && !ios[i].infoNANDAccess && !ios[i].infoUSB2 && !ios[i].infoVersionPatch && !ios[i].infoBeerTicket) strcat(ReportBuffer[skippedOffset + lineOffset], TXT_NoPatch); ReportBuffer[skippedOffset + lineOffset][strlen(ReportBuffer[skippedOffset + lineOffset])-1]='\0'; } @@ -984,8 +985,8 @@ int main(int argc, char **argv) //if(arguments.USB) // MountUSB(); //else - // MountSD(); - fatInitDefault(); + MountSD(); + //fatInitDefault(); CheckTime(); // Initialise the FAT file system @@ -1053,7 +1054,7 @@ int main(int argc, char **argv) // Return to the loader if (wpressed & WPAD_BUTTON_HOME) { // Unmount the SD Card - //UnmountSD(); + UnmountSD(); //UnmountUSB(); deinitGUI(); exit(0); @@ -1062,7 +1063,7 @@ int main(int argc, char **argv) // Return to System Menu if (wpressed & WPAD_BUTTON_PLUS) { // Unmount the SD Card - //UnmountSD(); + UnmountSD(); //UnmountUSB(); deinitGUI(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); @@ -1071,7 +1072,7 @@ int main(int argc, char **argv) // Shutdown Wii if (wpressed & WPAD_BUTTON_MINUS) { // Unmount the SD Card - //UnmountSD(); + UnmountSD(); //UnmountUSB(); deinitGUI(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); diff --git a/source/update.c b/source/update.c index 1aeded1..38d7fd7 100644 --- a/source/update.c +++ b/source/update.c @@ -10,6 +10,7 @@ #include "update.h" #include "gecko.h" #include "http.h" +#include "ssl.h" #include "tools.h" s32 downloadSyscheckFile(const char* update_dir, const char* fileName) { @@ -18,8 +19,8 @@ s32 downloadSyscheckFile(const char* update_dir, const char* fileName) { u32 http_status; u8* outbuf; u32 length; - - snprintf(buf, sizeof(buf), "http://sourceforge.net/p/syscheck-hde/code/HEAD/tree/trunk/SysCheckHDE/%s?format=raw", fileName); + + snprintf(buf, sizeof(buf), "https://sourceforge.net/p/syscheck-hde/code/HEAD/tree/trunk/SysCheckHDE/%s?format=raw", fileName); ret = http_request(buf, 1 << 31); if (!ret) @@ -60,10 +61,11 @@ s32 downloadSyscheckFile(const char* update_dir, const char* fileName) { s32 updateApp(void) { int ret = net_init(); - + ssl_init(); char update_dir[21]; sprintf(update_dir, "%s:/apps/SysCheckHDE", arguments.USB ? "usb" : "sd"); - mkdir(update_dir,S_IWRITE|S_IREAD); // attempt to make dir + mkdir("/apps",S_IWRITE|S_IREAD); // attempt to make dir + mkdir("/apps/SysCheckHDE",S_IWRITE|S_IREAD); // attempt to make dir chdir(update_dir); if (ret < 0) { @@ -74,7 +76,7 @@ s32 updateApp(void) { u8* outbuf; u32 length; - ret = http_request("http://sourceforge.net/p/syscheck-hde/code/HEAD/tree/trunk/Version.txt?format=raw", 1 << 31); + ret = http_request("https://sourceforge.net/p/syscheck-hde/code/HEAD/tree/trunk/Version.txt?format=raw", 1 << 31); if (!ret) { gprintf("Error making http request\n"); @@ -106,7 +108,7 @@ s32 updateApp(void) { } } else { net_deinit(); - return -2; + return 2; } } else {