Homebrew [Release] FirmwareDownloader

machinamentum

Well-Known Member
OP
Member
Joined
Jul 5, 2015
Messages
163
Trophies
0
XP
549
Country
United States
This is a small app i've been working on as a side project. It downloads firmware files from NUS and packages them as CIAs for ease of upgrading/downgrading.

NOTE: since many factory installed titles (and some older titles) aren't available on NUS anymore, this cannot download all titles needed for a complete downgrade or a complete region change.

Attempts to download all available titles for chosen firmware. 404s are skipped. Firmwares are downloaded to /3ds/FirmwareDownloader/updates/<system>_<region>/<firmware_version>.
ctr = Old3DS, ktr = New3DS.

Controls: LEFT/RIGHT move cursor. UP/DOWN change value. START exit from menu.
When downloading, the app doesn't check input again until all titles have been downloaded, so the only way to exit is L+R+DOWN+B (on hax versions that support this).

Releases: https://github.com/machinamentum/FirmwareDownloader/releases
Source: https://github.com/machinamentum/FirmwareDownloader

License: GPL to comply with the usage of code from make_cdn_cia.

Credits:
yellows8 - nintendo update reports
Based on code from 3DNUS & UpdateCDN (ground & cearp), sslc and httpc examples, and make_cdn_cia (3DSGuy)
 
Last edited by machinamentum,

machinamentum

Well-Known Member
OP
Member
Joined
Jul 5, 2015
Messages
163
Trophies
0
XP
549
Country
United States
Has this been thoroughly tested to be confirmed safe? Do they download all the all the CIAs properly and MD5s check out every time? This would be pretty handy if so.
As far as the integrity of the CIA files go, the app uses the same code as make_cdn_cia, so they'll be as safe as any CIA generated with that tool. If there's any discrepancies detected by the make_cdn_cia code, they'll be printed to the screen. I've installed several CIAs downloaded with this tool without problem.
 

cearp

瓜老外
Developer
Joined
May 26, 2008
Messages
8,728
Trophies
2
XP
8,520
Country
Tuvalu
nice work! it would be nice if you implemented some FunkyCIA stuff, like grabbing the ticket.db - then we could make our own cias from store bought stuff :)
although i personally like it on the computer because i can automate it.

Has this been thoroughly tested to be confirmed safe? Do they download all the all the CIAs properly and MD5s check out every time? This would be pretty handy if so.
plus, tickets can be updated while the contents will still work the same, giving a different hash... so not truly reliable.
have there really been any cias out there that are corrupt but still install, bricking your system? i think it's just people being paranoid - or the installers fault if there are any problems... no?
 
  • Like
Reactions: Progamer444

cearp

瓜老外
Developer
Joined
May 26, 2008
Messages
8,728
Trophies
2
XP
8,520
Country
Tuvalu
hi, i'm not sure what i am doing wrong - i tried to compile this both on my mac and then linux (that i just set up right a few hours ago)
i have compiled other homebrews in the past before, so, i'm not sure what the problem with this one is.

the code is straight from the zip that github gave me, i didn't edit anything.
Code:
user@user-VirtualBox ~/Desktop/FirmwareDownloader-master $ make
builtin_rootca.der
main.cpp
arm-none-eabi-g++ -MMD -MP -MF /home/user/Desktop/FirmwareDownloader-master/build/main.d -g -Wall -O2 -mword-relocations -fomit-frame-pointer -ffast-math -march=armv6k -mtune=mpcore -mfloat-abi=hard -I/home/user/Desktop/FirmwareDownloader-master/include -I/opt/devkitpro/libctru/include -I/home/user/Desktop/FirmwareDownloader-master/build -DARM11 -D_3DS -fno-rtti -fno-exceptions -std=c++11 -c /home/user/Desktop/FirmwareDownloader-master/source/main.cpp -o main.o 
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp: In function 'Result DownloadFile(std::__cxx11::string, std::ofstream&)':
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:81:32: error: 'HTTPC_METHOD_GET' was not declared in this scope
     httpcOpenContext(&context, HTTPC_METHOD_GET, (char *)url.c_str(), 1);
                                ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp: In function 'Result network_request(char*, char*, std::ofstream&)':
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:259:21: error: aggregate 'network_request(char*, char*, std::ofstream&)::addrinfo hints' has incomplete type and cannot be defined
     struct addrinfo hints;
                     ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:264:5: error: 'sslcContext' was not declared in this scope
     sslcContext sslc_context;
     ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:274:45: error: invalid application of 'sizeof' to incomplete type 'network_request(char*, char*, std::ofstream&)::addrinfo'
     memset(&hints, 0, sizeof(struct addrinfo));
                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:278:53: error: 'getaddrinfo' was not declared in this scope
     if(getaddrinfo(hostname, "443", &hints, &resaddr)!=0)
                                                     ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:285:76: error: invalid use of incomplete type 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
 r(resaddr_cur = resaddr; resaddr_cur!=NULL; resaddr_cur = resaddr_cur->ai_next)
                                                                      ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:259:12: note: forward declaration of 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
     struct addrinfo hints;
            ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:287:39: error: invalid use of incomplete type 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
         if(connect(sockfd, resaddr_cur->ai_addr, resaddr_cur->ai_addrlen)==0)br
                                       ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:259:12: note: forward declaration of 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
     struct addrinfo hints;
            ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:287:61: error: invalid use of incomplete type 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
         if(connect(sockfd, resaddr_cur->ai_addr, resaddr_cur->ai_addrlen)==0)br
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:259:12: note: forward declaration of 'struct network_request(char*, char*, std::ofstream&)::addrinfo'
     struct addrinfo hints;
            ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:290:25: error: 'freeaddrinfo' was not declared in this scope
     freeaddrinfo(resaddr);
                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:299:63: error: 'sslcCreateRootCertChain' was not declared in this scope
     ret = sslcCreateRootCertChain(&RootCertChain_contexthandle);
                                                               ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:307:115: error: 'sslcAddTrustedRootCA' was not declared in this scope
 rtChain_contexthandle, (u8*)builtin_rootca_der, builtin_rootca_der_size, NULL);
                                                                              ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:312:61: error: 'sslcDestroyRootCertChain' was not declared in this scope
         sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:316:30: error: 'sslc_context' was not declared in this scope
     ret = sslcCreateContext(&sslc_context, sockfd, SSLCOPT_Default, hostname);
                              ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:316:52: error: 'SSLCOPT_Default' was not declared in this scope
     ret = sslcCreateContext(&sslc_context, sockfd, SSLCOPT_Default, hostname);
                                                    ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:316:77: error: 'sslcCreateContext' was not declared in this scope
     ret = sslcCreateContext(&sslc_context, sockfd, SSLCOPT_Default, hostname);
                                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:321:61: error: 'sslcDestroyRootCertChain' was not declared in this scope
         sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:325:81: error: 'sslcContextSetRootCertChain' was not declared in this scope
  ret = sslcContextSetRootCertChain(&sslc_context, RootCertChain_contexthandle);
                                                                              ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:329:41: error: 'sslcDestroyContext' was not declared in this scope
         sslcDestroyContext(&sslc_context);
                                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:330:61: error: 'sslcDestroyRootCertChain' was not declared in this scope
         sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:335:56: error: 'sslcStartConnection' was not declared in this scope
     ret = sslcStartConnection(&sslc_context, NULL, NULL);
                                                        ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:339:41: error: 'sslcDestroyContext' was not declared in this scope
         sslcDestroyContext(&sslc_context);
                                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:340:61: error: 'sslcDestroyRootCertChain' was not declared in this scope
         sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:345:73: error: 'sslcWrite' was not declared in this scope
     ret = sslcWrite(&sslc_context, (u8*)http_netreq, strlen(http_netreq));
                                                                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:349:41: error: 'sslcDestroyContext' was not declared in this scope
         sslcDestroyContext(&sslc_context);
                                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:350:61: error: 'sslcDestroyRootCertChain' was not declared in this scope
         sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:356:48: error: 'sslcRead' was not declared in this scope
     sslcRead(&sslc_context, readbuf, 204, false); // discard HTTP header
                                                ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:363:45: error: 'sslcDestroyContext' was not declared in this scope
             sslcDestroyContext(&sslc_context);
                                             ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:364:65: error: 'sslcDestroyRootCertChain' was not declared in this scope
             sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                                 ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:372:37: error: 'sslcDestroyContext' was not declared in this scope
     sslcDestroyContext(&sslc_context);
                                     ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:373:57: error: 'sslcDestroyRootCertChain' was not declared in this scope
     sslcDestroyRootCertChain(RootCertChain_contexthandle);
                                                         ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp: In function 'int main()':
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:576:16: error: too many arguments to function 'Result httpcInit()'
     httpcInit(0);
                ^
In file included from /opt/devkitpro/libctru/include/3ds.h:42:0,
                 from /home/user/Desktop/FirmwareDownloader-master/source/main.cpp:18:
/opt/devkitpro/libctru/include/3ds/services/httpc.h:23:8: note: declared here
 Result httpcInit(void);
        ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:579:15: error: 'sslcInit' was not declared in this scope
     sslcInit(0);
               ^
/home/user/Desktop/FirmwareDownloader-master/source/main.cpp:728:14: error: 'sslcExit' was not declared in this scope
     sslcExit();
              ^
make[1]: *** [main.o] Error 1
make: *** [build] Error 2

any help? :) thank you
 

machinamentum

Well-Known Member
OP
Member
Joined
Jul 5, 2015
Messages
163
Trophies
0
XP
549
Country
United States
hi, i'm not sure what i am doing wrong - i tried to compile this both on my mac and then linux (that i just set up right a few hours ago)
i have compiled other homebrews in the past before, so, i'm not sure what the problem with this one is.

the code is straight from the zip that github gave me, i didn't edit anything.
-snip-
any help? :) thank you
Install the latest ctrulib from GitHub; yours is outdated.
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • K3Nv2 @ K3Nv2:
    I was playing need for speed remastered and said to myself this is a nice Forza remaster
  • Psionic Roshambo @ Psionic Roshambo:
    https://en.wikipedia.org/wiki/List_of_video_games_developed_by_Rare Not all of them are awesome but man the hits on that list.
  • Psionic Roshambo @ Psionic Roshambo:
    Oh snap Super Offroad was by them too? lol damn
    +1
  • BakerMan @ BakerMan:
    Today I learned that the creators of the Donkey Kong games also made Sea of Thieves
  • BakerMan @ BakerMan:
    why do i feel the sudden urge to start singing pirate's scorn from the donkey kong country cartoon?
  • BigOnYa @ BigOnYa:
    Are you being for real, cause that's hard to believe, DK is Nintendo and made in japan, Sea of thieves was from Microsoft, in America. I'm not calling you a liar, just didn't know.
  • BigOnYa @ BigOnYa:
    Ok yes they were both made by Rare, but DK was from Rare back then, Rare now is owned by MS. So makes since.
    +1
  • Psionic Roshambo @ Psionic Roshambo:
    They even developed a LJN game.... lol
  • K3Nv2 @ K3Nv2:
    It was pretty rare
  • Psionic Roshambo @ Psionic Roshambo:
    I wonder what deal with Satan LJN worked to get Rare to make that one...
  • BigOnYa @ BigOnYa:
    I remember couple years ago, they announced they were working on a Perfect Dark remake, wonder what ever happen with that?
  • K3Nv2 @ K3Nv2:
    It went into the darkness
  • BigOnYa @ BigOnYa:
    Me and buddies used to play the hell out of Perfect Dark on N64, that and Goldeneye, was the first real PvP shooter games I remember
  • BigOnYa @ BigOnYa:
    4-way split screen on a tiny 19" TV, lol
  • K3Nv2 @ K3Nv2:
    Did you share joysticks also
  • BigOnYa @ BigOnYa:
    Nuh we had the 4 controller add on thingy for n64. Duh I just got your joke, lol
  • K3Nv2 @ K3Nv2:
    So you touched ends
  • BigOnYa @ BigOnYa:
    Yea, but being in the boy scouts, they forced us to
  • K3Nv2 @ K3Nv2:
    Chopped down some wood for the scout master
  • BigOnYa @ BigOnYa:
    Big Gay Al was our Scout leader.
  • BigOnYa @ BigOnYa:
    I was actually in the scouts for 1 week, til they assigned me homework, n I was like f this, and quit, I was like 10 yrs old. And no I didn't join the girl Scouts.
  • K3Nv2 @ K3Nv2:
    Was the homework about getting to know the scout leaders
  • BigOnYa @ BigOnYa:
    I had to memorize how to tell 15 different trees species, I think, been awhile. But yea it was about knowing Wood.
  • K3Nv2 @ K3Nv2:
    Could've just wrote down firewood
    K3Nv2 @ K3Nv2: Could've just wrote down firewood