Skip to content

Mandarine - RetroBIOS

Type standalone
Classification Community forks
Source https://github.com/ptyfyre/mandarine-neo
Version 1.3.0
Profiled 2026-08-08
Cores mandarine, mandarine-qt
Systems nintendo-3ds
Technical notes

Citra fork, renamed Mandarine-Neo at release 1.3.0. External files live in sysdata/ and nand/ under the user directory: user/ next to the executable when that directory exists, otherwise Mandarine on Windows and macOS and mandarine-emu on Linux, with Citra and citra-emu kept as legacy locations. ref: src/common/common_paths.h:16-70, src/common/file_util.cpp:770-839

InitKeys reads boot9.bin then aes_keys.txt. Encrypted content needs one of the two; a ROM without crypto reads neither. ref: src/core/hw/aes/key.cpp:315-324, src/core/file_sys/ncch_container.cpp:200-210

Failure to derive a key or to find a seed marks the content undecryptable and loading stops with ErrorEncrypted. ref: src/core/file_sys/ncch_container.cpp:219-223, src/core/file_sys/ncch_container.cpp:236-280, src/core/file_sys/ncch_container.cpp:347-349

System archives resolve to the NAND title tree. Shared font, Mii data, country list and bad word list fall back to open-source replacements built into the binary when the title is absent. ref: src/core/file_sys/archive_ncch.cpp:126-179, externals/open_source_archives/Readme.md

The embedded shared font only answers title low ID 0x00014002. CHN, KOR and TWN resolve to 0x00014102, 0x00014202 and 0x00014302, which fall through to shared_font.bin and then to ErrorSystemFiles, reported as recoverable. ref: src/core/hle/service/apt/apt.cpp:195-213, src/core/hle/service/apt/apt.cpp:276-291, src/mandarine_qt/main.cpp:3209-3215

ClCertA is read from NAND title 0x0004001B00010002 and its ctr-common-1-cert.bin and ctr-common-1-key.bin members are decrypted with the KeySlot 0x0D normal key. Both the title and the key slot are needed for authenticated HTTPS. ref: src/core/hle/service/http/http_c.cpp:1963-2036

System titles are downloaded and installed in-app from the Nintendo CDN, so the NAND title tree is not user-supplied. ref: src/mandarine_qt/configuration/configure_system.cpp:672-678, src/core/hle/service/am/am.cpp:536, src/core/nus_download.cpp:12-13

DumpKeys.gm9, a GodMode9 script producing aes_keys.txt and seeddb.bin, ships in the tree and documents sysdata/ as their destination. ref: dist/dumpkeys/README.md, dist/dumpkeys/DumpKeys.gm9

The plugin loader scans sdmc/luma/plugins// for any .3gx file and falls back to sdmc/luma/plugins/default.3gx. Plugins carry no fixed identity. ref: src/core/hle/service/plgldr/plgldr.cpp:112-146</p> <p>mcu.dat holds per-installation MCU state that the emulator writes itself when the file is absent or carries the wrong magic. ref: src/core/hle/service/cfg/cfg.cpp:734-756, src/core/hle/service/cfg/cfg.h:425-439</p> <p>sector0x96.bin is defined but read by no code path. ref: src/common/common_paths.h:70</p> </details> <p><strong>7 files</strong> | 0 required, 7 optional | 7 in repo, 0 missing | 1 with HLE fallback</p> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>boot9.bin</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>sysdata/boot9.bin</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Size: 64.0 KB</li> <li>Validation: size</li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hw/aes/key.cpp#L137-L206"><code>src/core/hw/aes/key.cpp:137-206</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hw/rsa/rsa.cpp#L49-L80"><code>src/core/hw/rsa/rsa.cpp:49-80</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/common/common_paths.h#L69"><code>src/common/common_paths.h:69</code></a></li> <li>AES key section read at offset 55760, RSA modulus and exponent at 0xB3E0 and 0xB4E0</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>aes_keys.txt</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>sysdata/aes_keys.txt</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hw/aes/key.cpp#L208-L311"><code>src/core/hw/aes/key.cpp:208-311</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/common/common_paths.h#L68"><code>src/common/common_paths.h:68</code></a></li> <li>Platforms: <a href="../../platforms/bizhawk/">bizhawk</a>, <a href="../../platforms/emudeck/">emudeck</a>, <a href="../../platforms/retrodeck/">retrodeck</a></li> <li>key slots, common keys, DLP and NFC key Ys and NFC secrets, one per line</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>seeddb.bin</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>sysdata/seeddb.bin</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/file_sys/seed_db.cpp#L12-L58"><code>src/core/file_sys/seed_db.cpp:12-58</code></a></li> <li>Platforms: <a href="../../platforms/bizhawk/">bizhawk</a></li> <li>game seed database for 9.6+ titles; an empty database is written when the file is absent</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>shared_font.bin</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span> <span class="rb-badge rb-badge-info">HLE fallback</span></p> <ul> <li>Path: <code>sysdata/shared_font.bin</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/apt/apt.cpp#L254-L270"><code>src/core/hle/service/apt/apt.cpp:254-270</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/common/common_paths.h#L67"><code>src/common/common_paths.h:67</code></a></li> <li>legacy path, tried after the shared font system archive; decompressed BCFNT with the 0x80 byte APT header</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>CTCert.bin</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>sysdata/CTCert.bin</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Size: 384 B</li> <li>Validation: size</li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/am/am.cpp#L2427-L2454"><code>src/core/hle/service/am/am.cpp:2427-2454</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/am/am.cpp#L83-L93"><code>src/core/hle/service/am/am.cpp:83-93</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/am/am.h#L95"><code>src/core/hle/service/am/am.h:95</code></a></li> <li>console client certificate; signature type must be 0x010005 and the issuer one of the two Nintendo CA G3 strings. The certificate here is assembled from a console OTP: signature and expiry read at 0x44 and 0x20, public key derived from the private key at 0x24 over sect233r1, and the whole body checked against Nintendo's root public key</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>SecureInfo_A</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>nand/rw/sys/SecureInfo_A</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Size: 273 B</li> <li>Validation: size</li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.cpp#L608-L610"><code>src/core/hle/service/cfg/cfg.cpp:608-610</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.cpp#L689-L709"><code>src/core/hle/service/cfg/cfg.cpp:689-709</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.h#L180-L186"><code>src/core/hle/service/cfg/cfg.h:180-186</code></a></li> <li>console region and serial number; loaded on a size check alone, and paired with LocalFriendCodeSeed_B</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>LocalFriendCodeSeed_B</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span></p> <ul> <li>Path: <code>nand/rw/sys/LocalFriendCodeSeed_B</code></li> <li>System: <a href="../../systems/nintendo/#3ds">nintendo-3ds</a></li> <li>Size: 272 B</li> <li>Validation: size</li> <li>Source: <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.cpp#L604-L606"><code>src/core/hle/service/cfg/cfg.cpp:604-606</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.cpp#L711-L732"><code>src/core/hle/service/cfg/cfg.cpp:711-732</code></a>, <a href="https://github.com/ptyfyre/mandarine-neo/blob/7f8ec960b6183be4350bca099d23ddd9fc7bcaa3/src/core/hle/service/cfg/cfg.h#L188-L193"><code>src/core/hle/service/cfg/cfg.h:188-193</code></a></li> <li>friend code generation seed; loaded on a size check alone, and paired with SecureInfo_A</li> </ul> </div> <p><em>Generated on 2026-08-23T16:12:06Z</em></p> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../mame4droid-2024/" class="md-footer__link md-footer__link--prev" aria-label="Previous: MAME4droid 2024"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> MAME4droid 2024 </div> </div> </a> <a href="../mariani/" class="md-footer__link md-footer__link--next" aria-label="Next: Mariani"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> Mariani </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> MIT for the tooling. BIOS and firmware files are third-party system software, preserved for personal backup, archival and interoperability. </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/Abdess/retrobios" target="_blank" rel="noopener" title="RetroBIOS on GitHub" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <div class="md-progress" data-md-component="progress" role="progressbar"></div> <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.top", "navigation.tracking", "navigation.indexes", "navigation.prune", "navigation.footer", "search.suggest", "search.highlight", "search.share", "content.code.copy", "content.tabs.link", "toc.follow"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../../assets/javascripts/bundle.d7400e89.min.js"></script> <script src="../../javascripts/site.js"></script> </body> </html>