nitro-patcher 0.2.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +25 -2
- package/dist/browser.js +10507 -78
- package/dist/browser.js.LEGAL.txt +460 -0
- package/dist/browser.js.map +4 -4
- package/dist/{chunk-IGURDH5L.js → chunk-B7NTPBDX.js} +70 -8
- package/dist/chunk-B7NTPBDX.js.map +1 -0
- package/dist/chunk-LK3JXA24.js +2067 -0
- package/dist/chunk-LK3JXA24.js.map +1 -0
- package/dist/cli.js +109 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/nitro-helper.d.ts +43 -134
- package/dist/nitro-helper.js +3 -1
- package/dist/nitro-patch-helper.d.ts +4 -0
- package/dist/nitro-patch-helper.js +2 -2
- package/dist/twl-complete-B2is30H0.d.ts +201 -0
- package/package.json +8 -2
- package/src/browser/buffer.ts +1 -0
- package/src/browser.ts +23 -2
- package/src/cli.ts +118 -18
- package/src/nitro/blz.ts +13 -4
- package/src/nitro/crypto.ts +29 -11
- package/src/nitro/filesystem.ts +88 -5
- package/src/nitro/header.ts +4 -0
- package/src/nitro/nds-file.ts +378 -30
- package/src/nitro/twl-complete.ts +665 -0
- package/src/nitro/twl.ts +53 -19
- package/src/nitro-helper.ts +2 -1
- package/src/nitro-patch-helper.ts +64 -3
- package/src/patch/zip.ts +14 -4
- package/src/runtime/browser.ts +2 -2
- package/src/runtime/node.ts +2 -15
- package/src/runtime/rsa.ts +14 -0
- package/dist/chunk-GLK3K2HY.js +0 -1120
- package/dist/chunk-GLK3K2HY.js.map +0 -1
- package/dist/chunk-IGURDH5L.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/node.ts","../src/runtime/rsa.ts","../src/nitro/binary.ts","../src/nitro/crc.ts","../src/nitro/banner.ts","../src/nitro/crypto.ts","../src/nitro/filesystem.ts","../src/nitro/header.ts","../src/nitro/blz.ts","../src/nitro/twl-complete.ts","../src/nitro/twl.ts","../src/nitro/nds-file.ts"],"sourcesContent":["import { createCipheriv, createHash, createHmac } from \"node:crypto\";\nexport { verifyDsiSignature as verifyRsaSha1 } from \"./rsa\";\nexport { readFile, writeFile } from \"node:fs/promises\";\nexport { readFileSync } from \"node:fs\";\nexport { inflateRawSync } from \"node:zlib\";\n\nexport const hashDigest = (algorithm: \"md5\" | \"sha1\", data: Uint8Array): Buffer =>\n createHash(algorithm).update(data).digest();\nexport const hmacSha1 = (key: Uint8Array, data: Uint8Array): Buffer => createHmac(\"sha1\", key).update(data).digest();\nexport const createAesBlockCipher = (key: Uint8Array): ((block: Uint8Array) => Buffer) => {\n const cipher = createCipheriv(\"aes-128-ecb\", key, null);\n cipher.setAutoPadding(false);\n return (block) => cipher.update(block);\n};\n","import forge from \"node-forge\";\n\nimport { hashDigest } from \"#nitro-runtime\";\n\nconst publicKey = forge.pki.rsa.setPublicKey(\n new forge.jsbn.BigInteger(\n \"956F790DF08BB85A76AAEFA27FE874758BED9EDF9E9A670CD818BEB9B2885203B3FA11AEAA186513B5D6BB85A384D0D0EFB366CBC6051AAA86827AB74311F59C9BFC6C7079D5F17BD0819F522056738C721F40CF2361932590A3C5DC94CFD17A8CBC954A918AA858F4D804BAF7D3C1C4D7B8F077012FA170260B2C049056F3A5\",\n 16,\n ),\n new forge.jsbn.BigInteger(\"10001\", 16),\n);\n\nexport const verifyDsiSignature = (data: Uint8Array, signature: Uint8Array): boolean =>\n publicKey.verify(hashDigest(\"sha1\", data).toString(\"latin1\"), Buffer.from(signature).toString(\"latin1\"), \"NONE\");\n","export const DEFAULT_MAX_SIZE = 0x40000000;\n\nexport const bytes = (value: Uint8Array, name = \"input\"): Buffer => {\n if (!(value instanceof Uint8Array)) throw new TypeError(`${name} must be a Buffer or Uint8Array`);\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n};\n\nexport const range = (buffer: Buffer, offset: number, size: number, name = \"binary data\"): Buffer => {\n if (\n !Number.isSafeInteger(offset) ||\n !Number.isSafeInteger(size) ||\n offset < 0 ||\n size < 0 ||\n offset + size > buffer.length\n ) {\n throw new RangeError(`Invalid ${name} range: offset=${offset}, size=${size}, available=${buffer.length}`);\n }\n return buffer.subarray(offset, offset + size);\n};\n\nexport const align = (value: number, alignment = 0x200): number => Math.ceil(value / alignment) * alignment;\n\n/** Seekable, bounded in-memory writer; unwritten gaps have MemoryStream's zero fill. */\nexport class BinaryWriter {\n readonly maxSize: number;\n buffer: Buffer;\n position: number;\n length: number;\n constructor(initialSize = 65536, maxSize = DEFAULT_MAX_SIZE) {\n if (!Number.isSafeInteger(maxSize) || maxSize < 1 || maxSize > 0xffffffff)\n throw new RangeError(\"Invalid output size limit\");\n this.maxSize = maxSize;\n this.buffer = Buffer.alloc(Math.min(initialSize, maxSize));\n this.position = 0;\n this.length = 0;\n }\n\n ensure(end: number) {\n if (!Number.isSafeInteger(end) || end < 0 || end > this.maxSize)\n throw new RangeError(`Output exceeds size limit (${this.maxSize} bytes)`);\n if (end <= this.buffer.length) return;\n const next = Buffer.alloc(Math.min(this.maxSize, Math.max(end, this.buffer.length * 2, 1024)));\n this.buffer.copy(next, 0, 0, this.length);\n this.buffer = next;\n }\n\n write(data: Uint8Array) {\n data = bytes(data);\n if (!Number.isSafeInteger(this.position) || this.position < 0) throw new RangeError(\"Invalid writer position\");\n this.ensure(this.position + data.length);\n bytes(data).copy(this.buffer, this.position);\n this.position += data.length;\n this.length = Math.max(this.length, this.position);\n }\n\n fillTo(end: number, fill = 0xff) {\n this.ensure(end);\n if (end <= this.position) return;\n this.buffer.fill(fill, this.position, end);\n this.position = end;\n this.length = Math.max(this.length, end);\n }\n\n pad(alignment: number, fill = 0xff) {\n this.fillTo(align(this.position, alignment), fill);\n }\n toBuffer() {\n return this.buffer.subarray(0, this.length);\n }\n}\n","// CRCs used by the Nintendo DS header and banner (NitroHelper, GPL-3.0).\nconst table16 = new Uint16Array(256);\nconst table32 = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n let a = i,\n b = i;\n for (let bit = 0; bit < 8; bit++) {\n a = (a >>> 1) ^ (a & 1 ? 0xa001 : 0);\n b = (b >>> 1) ^ (b & 1 ? 0xedb88320 : 0);\n }\n table16[i] = a;\n table32[i] = b;\n}\nexport const crc16 = (data: Uint8Array, initial = 0xffff) => {\n let crc = initial;\n for (const byte of data) crc = (crc >>> 8) ^ table16[(crc ^ byte) & 0xff];\n return crc;\n};\nexport const crc32 = (data: Uint8Array) => {\n let crc = 0xffffffff;\n for (const byte of data) crc = (crc >>> 8) ^ table32[(crc ^ byte) & 0xff];\n return (crc ^ 0xffffffff) >>> 0;\n};\n","// Port of NitroHelper/Banner.cs. Copyright Xzonn and upstream contributors, GPL-3.0.\nimport { bytes, range } from \"./binary\";\nimport { crc16 } from \"./crc\";\n\nconst titles = [\n \"japaneseTitle\",\n \"englishTitle\",\n \"frenchTitle\",\n \"germanTitle\",\n \"italianTitle\",\n \"spanishTitle\",\n \"chineseTitle\",\n \"koreanTitle\",\n] as const;\nexport class Banner {\n version: number;\n raw: Buffer;\n bannerCRC: boolean;\n tileData: Buffer;\n palette: Buffer;\n japaneseTitle = \"\";\n englishTitle = \"\";\n frenchTitle = \"\";\n germanTitle = \"\";\n italianTitle = \"\";\n spanishTitle = \"\";\n chineseTitle = \"\";\n koreanTitle = \"\";\n constructor(input: Uint8Array, offset = 0, hardSize = 0) {\n const data = bytes(input, \"banner\");\n this.version = range(data, offset, 2, \"banner\").readUInt16LE();\n let size = this.getDefSize(hardSize);\n if (this.version >>> 8 === 1) size = hardSize > 0 && hardSize !== 0xffffffff ? Math.min(hardSize, 0x23c0) : 0x23c0;\n this.raw = Buffer.from(range(data, offset, size, \"banner\"));\n this.bannerCRC = crc16(this.raw.subarray(0x20, 0x840)) === this.raw.readUInt16LE(2);\n this.tileData = Buffer.from(this.raw.subarray(0x20, 0x220));\n this.palette = Buffer.from(this.raw.subarray(0x220, 0x240));\n for (const [i, title] of titles.entries())\n this[title] =\n i < this.titleCount\n ? this.raw\n .subarray(0x240 + i * 0x100, 0x340 + i * 0x100)\n .toString(\"utf16le\")\n .split(\"\\0\")[0]\n : \"\";\n }\n get titleCount() {\n return this.version >= 3 ? 8 : this.version >= 2 ? 7 : 6;\n }\n getDefSize(hardSize = 0) {\n if (this.version === 2) return 0x940;\n if (this.version === 3) return 0xa40;\n if (this.version === 0x103) return hardSize > 0 && hardSize !== 0xffffffff ? hardSize : 0x23c0;\n return 0x840;\n }\n toBuffer() {\n const output = Buffer.from(this.raw);\n output.writeUInt16LE(this.version);\n if (this.tileData.length !== 512 || this.palette.length !== 32) throw new RangeError(\"Invalid banner icon size\");\n this.tileData.copy(output, 0x20);\n this.palette.copy(output, 0x220);\n for (let i = 0; i < this.titleCount; i++) {\n const text = Buffer.from(this[titles[i]], \"utf16le\");\n if (text.length > 256) throw new RangeError(`Banner ${titles[i]} exceeds 128 UTF-16 code units`);\n output.fill(0, 0x240 + i * 256, 0x340 + i * 256);\n text.copy(output, 0x240 + i * 256);\n }\n output.writeUInt16LE(crc16(output.subarray(0x20, 0x840)), 2);\n if (this.version >= 2) output.writeUInt16LE(crc16(output.subarray(0x20, 0x940)), 4);\n if (this.version >= 3) output.writeUInt16LE(crc16(output.subarray(0x20, 0xa40)), 6);\n if (this.version >>> 8 >= 1) output.writeUInt16LE(crc16(output.subarray(0x1240, 0x23c0)), 8);\n return output;\n }\n}\n","import { createAesBlockCipher } from \"#nitro-runtime\";\n\nimport { crc16 } from \"./crc\";\n\nexport interface ModcryptHeader {\n gameCode: string;\n gameTitle: string;\n twlInternalFlags: number;\n appflags?: Buffer;\n hmac_arm9i?: Buffer;\n}\n\n// KEY1 table carried forward from NitroHelper/Arm9Encryptor.cs (Dirbaio/ndstool).\nconst KEY1 = Buffer.from(\n \"99D5205F5744F5B96E19A4D99E6A5A94D8AEF1EB4175E23A9382D03233EE31D5CC57619A3706A21B793972F555AEF6BE5F1B69FBE59DF1E9CE2CD9A15E3205E6\" +\n \"FED3FECFD462040D8BF5ECB72B6079BB1295310D6E3FDA2B8884F0F13D127E254522F1BB24061A0611ADDF288B6481342BEB332999AAF2BD9C14959D9FF7F58C\" +\n \"7297A1299DD15FCF664D071ADED34A4B85C9A7A31795053A3D490ABF0A898BA24A8249DD2790F10BE9EB1C6A83764505BA817061173F4BDEAECFAB3957F23A56\" +\n \"4811AD8A40E1453FFA9B0254CAA693FBEF4DFE6FA3D8879C08BAD5486A8D2DFD6E15F874BDBE528B18228A9EFB7437071B366C4A19BA4262B97991107B676596\" +\n \"FE0223E8EE998C773E5C86644D6D7886A54F65E21EB2DF5A0AD07E0814B071ACBDDB831CB9D7A162CDC6637C5269C3E6BF75CE12445D2104FAFBD33C381163D4\" +\n \"958541494609F2084311DC1F76C0156D1F3C6370EA87806CC3BD638BC2372137DCEE09232E376A4D7390F75030AC1C92041023914FD207AA683E4F9AC964606A\" +\n \"C81421F3D62241124424CFE68A56DD0D534DE1851E8C525A9C1984C20357F16FE300BE58F64CEDD521649C1FBE55033C4ADCFFAAC9DAE05D5EBFE6DEF5D8B1F8\" +\n \"FF36B3B9626795DB315F37ED4C70679990B518316C3D9999E442DAD3254213A0AED7706CB155CFC7D746D54361173D4428E93385D5D0A293AA25121FFBC50B46\" +\n \"F597765645A6BE87B1946BE8B1FE3399AE1F3E6C39711D09009037E4103E7574FF8C833BB0F1B0F90105474295F1D6AC7E38E69E9574263FB4685018D04330B4\" +\n \"4C4BE368BFE54DB6958B0AA074253277CFA1F72CD871135AABEAC951E80DEEEFE9937E19A71E433881162CA148E373CC29216CD35DCEA0D9617143A01513B564\" +\n \"92CF2A19DCADB7A59F8665F81A9FE7FBF7FDB8136C27DB6FDF351CF78D2C5B9B12AB386406CCDE31E84E751164E3FAEAEB3454C2AD3F34EB932C7D26369D56F3\" +\n \"5AE1F6B398634A9E3283E49A84607D902E130EEE934B36A285EC1638E8880602BFF0A03AEDD76A9A73E157CFF844B8DC2E2359D1DF9552719961A04BD57F6E78\" +\n \"BAA9C530D34086329D320C9C37B7022FBA5498A9C41304C98DBEC8E75D97502E93D622590C27BC2292E0A7200F936F7F4C9FD3B5A62A0B7467497D1026CBD1C5\" +\n \"8671E78CA09CE95BB21AF601EE8C9E5E83F21ADBE6E5EA845976D27CF68DA5493648C21652BB83A374B9070C3BFF6128E161E9E4EF6E15AA4EBAE85D0596BB32\" +\n \"56B0FB72520F0EC84225657689AFF2DE1027F0014B74A79707D5265454091F820A867D30390EB3269B0B57BB360631AFFD79FCD930102B0CB3E19BD77BDC5FEF\" +\n \"D2F813454D4775BD46963C7E75F33EB567C59A3BB05B296BDE805BC81505B131B6CE49DDAD84B5AE60DC67313430FE4EBD802FA6BF63392186D9357F16682205\" +\n \"54E990268C076C51A43155D70907A83E2E5366C1F8F27BC4F258CFF187C5A2E7278F308758A064622318B9887CFACEC498AEAD17CC4A5BF3E948D556D30DF2C8\" +\n \"92738CDBD72F56AC81F992694DC632F6E6C08D21E276806111BCDC6C93AF19699BD0BFB9319F0267A351EE8306227B0CAB494240B8D5017DCE5EF7555339C599\" +\n \"46D8879FBAF764B4E39AFAA16D90681030CA8A54A79F60C319F56B0D7A5198E6984351B4D635E94FC3DF0F7BD62F5CBD3A156119F14BCBAADC6D64C9D3C61E56\" +\n \"EF384C50718675CC0D0D4EE928F6065D701BAAD345CFA839AC95A62EB4E422D474A8375F487A04CCA54C40D828B428080D1C725241F07D47193A534E5884626B\" +\n \"93B58A81214E0DDCB43FA2C6FCC92B40DA3804E95E5A866B0C22258568118D7C921D95554DAB8EBBDAA6E6B751B6325A0541DD052A0A5650911747CCC9E67EB5\" +\n \"614ADB736751C833F5DA6E742E54C3370D6DAF08E8158A5FE25921CDA8DE0C065A776B5FDB18653EC850DE78E0B882B35D4E7232074FC13423BA96B7674EA428\" +\n \"1E3462EB2D6A70E92F42C4704E5A319CF95B4728AADA716F381FB378C4926B1C9EF6359AB74D0EBFCC1829410348355D55D02BC629AF5C6074698E5E9B7CD4BD\" +\n \"7B44647D3F925D69B61F004BD48335CF7E644E17AE8DD52E9A28124E2E2B49085CAEC64685AE41611E6F82D25137161F0BF659A49ACA5AAF0DD4338B2063F184\" +\n \"805CCBCF08B4B9D31605BD6283319B5651989FBAB25BAAB2226B2CB5D448FA632B5F58FA61FA6409BB38E0B89D9260A80D676F0E37F50D019FC277D4FEECF173\" +\n \"3039E07DF56198E42C2855045655DB2F6BECE55806B664806A2A1A4E5B0FD8C40A2E5219D962F53048BE8C7B4F389BA2C3AFC9D3C7C1624186B96121576F994F\" +\n \"C1BACE7BB53B4D5E8A8B44575F135F706D5B2947DC38E2EC045565122AE81743E18EDD2AB3E294F7096E5CE6EB8AF86D89495448F52FADBFEA944BCAFC398782\" +\n \"5F8A01F275F2E671D6D842DEF12D1D28A6887EA3A0471D30D9A371DF491CCB01F836B1F2F022585D456BBDA0BBB28842C78C28CE93E8906308907C893CF57DB7\" +\n \"042D4F555116FD7E79E8BEC1F212D4F8B4840523A0CCD22BFDE1ABAD0DD1556C2341944D77374F05280CBF17B312676C8CC35AF741842A6DD09412272CB4ED9C\" +\n \"4DEC478297D567B91B9DC055077EE58EE2A8E73E12E40E3A2A455534A2F92D5A1BAB527C83105F55D2F15A432BC6A7A4891595E8B44B9DF875E39F60785BD6E6\" +\n \"0D44E62106BD472253A400AD8D43138539F7AAFC38AF7BEDFCE42B5450984CFC8580F7DF3C8022E194DADE24C6B07A3938DC0FA1A7F4F96F6318578B84412A2E\" +\n \"D453F2D9000FD0DD996E19A60AD0EC5B5824ABC0CB0665EC1A1338940A67032F3FF7E377447733C61439D0E3C0A20879BB409957410B0190CDE1CC4867DBB3AF\" +\n \"8874F34C828F72B1B52329C4126C19FC8E46A49CC4256587D36DBE8A93110338ED832BF346A493EA3B53851DCED4F1088327EDFC9B1A18BCF98BAEDC24AB5038\" +\n \"E9724B1022177B465DAB5964F340AEF8BBE5C8F926034E557DEBEBFEF739E6E00A11BE2E28FF98EDC0C9425642C3FD00F6AF87A25B013F329247959A72A5323D\" +\n \"AE6BD09B07D24992E3784AFAA1067DF241CF77740414B20C86846416D5BB51A1E56FF1D1F2E2F75F58204DB857C7CFDDC5D8BE763DF65F7EE72A8B88241B383F\" +\n \"0E412377F5F04BD40C1FFAA40B805FCF45F6E0DA2F345953FB203C52625E35B562FE8B6063E3865A151A6ED14745BC32B4EB6738ABE46E333AB5EDA3AD67E04E\" +\n \"4195EE626271261D31EF6230AFD782ACC2DC0504F59707BF11592307C06402E897E53EAF18AC59A68B4A33901C6E7C9C207E4C3C3E6164BBC56B7C7E3E9FC54C\" +\n \"9FEA73F5D789C04CF4FBF42DEC141B51D5C112C810DF0B4A8B9CBC93456A3E3E7DC1A9BACDC1B407E4E1688643B26D38F3FB0C5C663771DE56EF6EA0104065A7\" +\n \"98F7D0BE0EC83736EC10CA7C9CAB841E051776021C4F52AA5FC1C6A056B9D80484444DA759D8DE60E6380E058F03E13B6D8104336F300BCE69052133FB26BB89\" +\n \"7DB6AE877E5107E0ACF7960A6BF9C45C1DE44447B85EFAE3788455424B485EF77D4735861D2B430503EC8AB81E063C760C481A43A7B78AED1E13C643EE10EFDB\" +\n \"ECFB3C83B29544EFD854514E2D11441DFB36591E7A34C1C3CA570061EA67A5169B55D055E17FD936D24076AEDC01CEB07A83D5CB2098EC6BC1729234F3825737\" +\n \"628A32360C9043AEAE5C9B788E136502FD6871C1FEB031A02482B0C3B17969A7F5D2EBD082C032DC9EC7263C6D8D98C1BB22D4D00F33EC3EB9CCE1DC6A4C7736\" +\n \"141CF9BF819F285F71853229907548C4B34ACED8448F142FFD4057EFAA0875D946D1D66E32551FC318FE841FFC84D5FF715E1B48C386950E280827D33883717B\" +\n \"4C8063549A56B0ACCF80CA3109EFFEF3BEAF247EA6FE533FC28D4A3368D122A666AD7BEADEB643B0A1259500A33F7546141144ECD795BC92F04FA91653629760\" +\n \"2A0F41F17124BEEE947F08CD6093B3855B07003FD80F28839AD1699FD1DA2EC39001A2B96B4E2A669DDAAEA6EA2AD3682F0C0C9CD28C4AEDE29E57659D0987A3\" +\n \"B4C4325DC9D4322BB1E0711E644DE69071E31E40ED7DF3840EEDC87876AEC0712772BB05EA0264FBF3486BB542933FED9F1353D2F7FE2AEC1D4725DB3C9186C6\" +\n \"8EF011FD237436F7A4F59E7A7E535044D447CAD3EB386DE6D971947F4AC6694B11F452EA22FE8AB036678B59E8E6802AEB650413EEECDC9E5FB1EC056A59E69F\" +\n \"5E596B89BFF71ACA44F95B6A718503E42962E0706F41C4CFB2B1CCE37EA607A887E77F8493DB524B6CEC7EDDD4244810699F046074E64818F3E42CB94F2E507A\" +\n \"DFD454692B8BA7F3CEFF1FF33E26013917958489B0F04C4B82919FC44BAC9DA574AF1725C9CA32D3BC898A8489CC0DAE7CA2DB9C6A7891EEEA765D4E8760F569\" +\n \"1567D402CFAF483607EABF6F662D068FC49AFEF9F6908775B8F7AD0F76105A3D59B02EB3C7352CCC70562BCBE33796C52F461B8A2246C788A726329861DF8622\" +\n \"8AF41C2F87A109AACCA9AED3BD00451C9A5487865287EFFF1E8FA18FC1895C351BDA2D3A2C16B2C2F156E278C16B6397C5568FC9327F2CAAAFA6A8AC20912288\" +\n \"DEE4608BF94B42251AE37F9C2C19893A7E05D436CC6958C2C1328B2F9085EB7A3950A5A12792C566B0204F587E5583432B45E29CE4D812902C168356167903B3\" +\n \"AD2D61181A131F37E2E19C737B80D5FD2D5187FC7BAAD71F2C7A8EAFF48DBBCD95117C720BEE6FE2B9AFDE3783DE8C8D620567B796C68D56B60DD762BAD64636\" +\n \"BD8EC8E6EA2A6C1014FF6B5BFA823C46B1304346518A7D9B923E83795B555DB26C5ECE90628E5398C90D6DE52D57CDC58157BAE1E8B88F72E54F13DCEA9D7115\" +\n \"10B21188D509D47F5B657F2C3B384C1168508DFB9EB059BF9480894AC51A18128953D14A1029E88C1CECB6EA46C7178B251531A8A26B43B19DE2DB0B879BB011\" +\n \"040E71D2297789820A66417F1D0B48FF72BB24FDC248A19BFE7B7FCE88DB86D9853B1CB0DCA83307BF512EE30E9A00971E06C097439DD8B645C486675F00F888\" +\n \"9AA4529EC7AA8A8375ECC518AECEC32F1A2BF918FFAE1AF5530BB53351A7FDE8A8E1A264B622174380CC0AD8AE3BBA40D7D9924A89DF0410EE9B182B6A77698A\" +\n \"68F4F9B9A221156EE61E3B0362309B60417E259B9E8FC5521008F8C269A1211188375E793566FF1042186EED97B66B1C4E36E56D7DB4E4BF20B9E0053A69D5B8\" +\n \"E3D5DCE0B9AC533E07A457AD77FF4818762AAC492A8E47756D9F676330358C390539D56F643A5BADCA0BBB82529945B193363699AF13204436D8024409399285\" +\n \"FF4A4A9787A663D7C7B5B524ED0FB46F0C585214D9A67BD379BC3858A1BD3B8406D81A06FD6BA8EA4B69280437AD8299FB0E1B85BDA85D73CDDC58750ABE636C\" +\n \"48E74CE4302B0460B915D8DA8681758F96D48D1C5D70857C1C677BD50867A6CE4B0A6670B7E563D45B8A82EA1067CAE2F4EF17852F2A5F8A9782F86AD63410EA\" +\n \"EBC95C3CE149F846EBDEBDF6A992F1AAA6A018B03AD30F1FF36FFF31454344D3509AF7880996C1CE76CCF22C2CBAAD82778F1884C0D2079C3690834E0BA54F43\" +\n \"3E04AB784FD6FB09012490DA6F3C3A610D7F694AEB2B3002B4DBE084A9ECD735BF377D8558CEA94EE480C7A8D3306748EB29AF2F746AB4A73F0F3F92AFF3CAAC\" +\n \"AF4BD994C043CA810D2F48A1B027D5D2EF4B0585A3DE4D93303CF0BB4A8F30274CEBE33E64ED9A2F3BF182F0BAF4CF7F40CBB0E17FBCAA57D3C974F2FA430D22\" +\n \"D0F4774E93D785701F99BFB6DE35F130A75E71F06B012D7B64F033530A3988F36B3AA66B35D22F43CD02FDB5E9BC5BAAD8A4197E0E5D94819E6F77ADD60E7493\" +\n \"96E7C4185FADF519\",\n \"hex\",\n);\n\nexport const aes128CtrCrypt = (key: Buffer, counter: Buffer, data: Buffer): Buffer => {\n if (key.length !== 16 || counter.length !== 16) throw new RangeError(\"AES key and counter must have 16 bytes\");\n const ctr = Buffer.from(counter).reverse();\n const aes = createAesBlockCipher(Buffer.from(key).reverse());\n const output = Buffer.alloc(data.length);\n for (let p = 0; p < data.length; p += 16) {\n const mask = aes(ctr);\n for (let j = 0; j < 16 && p + j < data.length; j++) output[p + j] = data[p + j] ^ mask[15 - j];\n for (let j = 15; j >= 0; j--) {\n ctr[j] = (ctr[j] + 1) & 255;\n if (ctr[j]) break;\n }\n }\n return output;\n};\n\nexport const modcryptKey = (header: ModcryptHeader): Buffer => {\n if (typeof header.gameCode !== \"string\" || header.gameCode.length !== 4)\n throw new Error(\"Expected four-character game code\");\n if (header.twlInternalFlags & 4 || (header.appflags?.[3] ?? 0) & 0x80) {\n const key = Buffer.alloc(16);\n key.write(header.gameTitle, 0, 12, \"ascii\");\n key.write(header.gameCode, 12, 4, \"ascii\");\n return key;\n }\n if (!header.hmac_arm9i || header.hmac_arm9i.length < 16) throw new Error(\"Missing ARM9i HMAC for modcrypt key\");\n const x = Buffer.from(`Nintendo${header.gameCode}${[...header.gameCode].reverse().join(\"\")}`, \"ascii\");\n for (let i = 0; i < 16; i++) x[i] ^= header.hmac_arm9i[i];\n const mask = (1n << 128n) - 1n;\n let v = x.readBigUInt64LE(0) | (x.readBigUInt64LE(8) << 64n);\n v = (v + 0xfffefb4e295902582a680f5f1a4f3e79n) & mask;\n v = ((v << 42n) | (v >> 86n)) & mask;\n const out = Buffer.alloc(16);\n out.writeBigUInt64LE(v & ((1n << 64n) - 1n));\n out.writeBigUInt64LE(v >> 64n, 8);\n return out;\n};\n\nexport const encryptSecureArea = (gameCode: string, input: Buffer, refreshCrc = false): Buffer =>\n secureAreaCrypt(gameCode, input, false, refreshCrc);\nexport const decryptSecureArea = (gameCode: string, input: Buffer): Buffer => secureAreaCrypt(gameCode, input, true);\n\nconst secureAreaCrypt = (gameCode: string, input: Buffer, decrypting: boolean, refreshCrc = false): Buffer => {\n if (typeof gameCode !== \"string\" || gameCode.length !== 4) throw new Error(\"Expected four-character game code\");\n if (input.length < 0x800) throw new RangeError(\"Secure area must contain at least 0x800 bytes\");\n const output = Buffer.from(input);\n if (refreshCrc) output.writeUInt16LE(crc16(output.subarray(0x10, 0x800)), 0xe);\n let magic = new Uint32Array(0x412);\n let args: [number, number, number] = [0, 0, 0];\n function crypt(a: number, b: number, reverse = false): [number, number] {\n for (let i = 0; i < 16; i++) {\n const c = (magic[reverse ? 17 - i : i] ^ a) >>> 0;\n const sum = (magic[18 + (c >>> 24)] + magic[274 + ((c >>> 16) & 255)]) >>> 0;\n const f = (magic[786 + (c & 255)] + (magic[530 + ((c >>> 8) & 255)] ^ sum)) >>> 0;\n a = (b ^ f) >>> 0;\n b = c;\n }\n return [(b ^ magic[reverse ? 0 : 17]) >>> 0, (a ^ magic[reverse ? 1 : 16]) >>> 0];\n }\n function init2() {\n [args[2], args[1]] = crypt(args[2], args[1]);\n [args[1], args[0]] = crypt(args[1], args[0]);\n const key = Buffer.alloc(12);\n args.forEach((v, i) => key.writeUInt32LE(v, i * 4));\n for (let j = 0; j < 18; j++) magic[j] ^= key.readUInt32BE((j * 4) & 7);\n let a = 0,\n b = 0;\n for (let i = 0; i < 0x412; i += 2) {\n [a, b] = crypt(a, b);\n magic[i] = a;\n magic[i + 1] = b;\n }\n }\n function init1() {\n magic = Uint32Array.from({ length: 0x412 }, (_, i) => KEY1.readUInt32LE(i * 4));\n const code = Buffer.from(gameCode, \"ascii\").readUInt32LE();\n args = [code, code >>> 1, (code << 1) >>> 0];\n init2();\n init2();\n }\n init1();\n if (decrypting) {\n const [b, a] = crypt(output.readUInt32LE(4), output.readUInt32LE(0), true);\n output.writeUInt32LE(a, 0);\n output.writeUInt32LE(b, 4);\n }\n args[1] = (args[1] << 1) >>> 0;\n args[2] >>>= 1;\n init2();\n for (let p = decrypting ? 0 : 8; p < 0x800; p += 8) {\n const [b, a] = crypt(output.readUInt32LE(p + 4), output.readUInt32LE(p), decrypting);\n output.writeUInt32LE(a, p);\n output.writeUInt32LE(b, p + 4);\n }\n if (decrypting) {\n if (output.readUInt32LE(0) !== 0x72636e65 || output.readUInt32LE(4) !== 0x6a624f79)\n throw new Error(\"Invalid KEY1 secure-area marker\");\n output.writeBigUInt64LE(0xe7ffdeffe7ffdeffn);\n return output;\n }\n let [b, a] = crypt(0x6a624f79, 0x72636e65);\n init1();\n [b, a] = crypt(b, a);\n output.writeUInt32LE(a, 0);\n output.writeUInt32LE(b, 4);\n return output;\n};\n","// Based on NitroHelper FNT/FAT/OverlayTable, GPL-3.0.\nimport iconv from \"iconv-lite\";\n\nimport { BinaryWriter, bytes, range } from \"./binary\";\n\n/** Original IDs/offsets describe the input ROM; newly added files use -1 until serialized and reopened. */\nexport interface NitroFile {\n name: string;\n nameBytes?: Buffer;\n id: number;\n offset: number;\n size: number;\n replacement?: Buffer;\n}\n\nexport interface NitroFolder {\n name: string;\n nameBytes?: Buffer;\n id: number;\n files: NitroFile[];\n folders: NitroFolder[];\n}\n\nexport const encodeName = (name: string): Buffer => {\n const encoded = iconv.encode(name, \"shift_jis\");\n if (new TextDecoder(\"shift_jis\").decode(encoded) !== name)\n throw new Error(`FNT name cannot be represented in Shift_JIS: ${name}`);\n if (!encoded.length || encoded.length > 127) throw new Error(\"FNT name must contain 1 to 127 encoded bytes\");\n return encoded;\n};\n\nexport interface FileSystemLayout {\n fnt: Buffer;\n files: NitroFile[];\n ids: Map<NitroFile, number>;\n sourceIds: Map<number, number>;\n}\n\nexport interface FatEntry {\n id: number;\n offset: number;\n size: number;\n}\n\nexport class FileAllocationTable {\n readonly entries: FatEntry[];\n readonly sortedIDs: number[];\n\n constructor(input: Uint8Array, offset: number, size: number) {\n const data = bytes(input);\n const table = range(data, offset, size, \"FAT\");\n if (size % 8 || size / 8 > 65535) throw new Error(\"Invalid FAT entry count\");\n this.entries = [];\n for (let p = 0; p < size; p += 8) {\n const start = table.readUInt32LE(p),\n end = table.readUInt32LE(p + 4);\n range(data, start, end - start, `FAT entry ${p / 8}`);\n this.entries.push({ id: p / 8, offset: start, size: end - start });\n }\n this.sortedIDs = [...this.entries].sort((a, b) => a.offset - b.offset || a.id - b.id).map((entry) => entry.id);\n }\n}\n\nexport class FileNameTable {\n readonly root: NitroFolder;\n\n constructor(fat: FileAllocationTable, input: Uint8Array, offset: number, size: number) {\n const table = range(bytes(input), offset, size, \"FNT\");\n range(table, 0, 8, \"FNT root directory\");\n const count = table.readUInt16LE(6);\n if (count < 1 || count > 4096) throw new Error(\"Invalid FNT directory count\");\n range(table, 0, count * 8, \"FNT directory table\");\n const decoder = new TextDecoder(\"shift_jis\");\n const visited = new Set<number>();\n const fileIds = new Set<number>();\n const parse = (index: number, name: string, depth: number): NitroFolder => {\n if (depth > 256 || index >= count || visited.has(index)) throw new Error(\"Invalid FNT directory tree or cycle\");\n visited.add(index);\n let cursor = table.readUInt32LE(index * 8);\n let fileId = table.readUInt16LE(index * 8 + 4);\n if (cursor < count * 8) throw new Error(\"FNT directory names overlap directory table\");\n const folder: NitroFolder = {\n name,\n id: index === 0 ? 0xffff : 0xf000 + index,\n files: [],\n folders: [],\n };\n const names = new Set<string>();\n while (true) {\n const tag = range(table, cursor++, 1, \"FNT name\")[0];\n if (!tag) break;\n const length = tag & 0x7f;\n if (!length) throw new Error(\"Empty FNT directory name\");\n const nameBytes = Buffer.from(range(table, cursor, length, \"FNT filename\"));\n const filename = decoder.decode(nameBytes);\n cursor += length;\n if (\n filename.includes(\"/\") ||\n filename.includes(\"\\\\\") ||\n filename.includes(\"\\0\") ||\n filename === \".\" ||\n filename === \"..\"\n )\n throw new Error(\"Invalid FNT path component\");\n const normalized = filename.toLowerCase();\n if (names.has(normalized)) throw new Error(`Duplicate FNT path: ${filename}`);\n names.add(normalized);\n if (tag & 0x80) {\n const id = range(table, cursor, 2, \"FNT directory id\").readUInt16LE();\n cursor += 2;\n if (id < 0xf000) throw new Error(\"Invalid FNT directory id\");\n const child = parse(id & 0xfff, filename, depth + 1);\n child.nameBytes = nameBytes;\n folder.folders.push(child);\n } else {\n const entry = fat.entries[fileId++];\n if (!entry) throw new Error(\"FNT file id is outside FAT\");\n if (fileIds.has(entry.id)) throw new Error(`Duplicate FNT file id: ${entry.id}`);\n fileIds.add(entry.id);\n folder.files.push({ name: filename, nameBytes, ...entry });\n }\n }\n return folder;\n };\n this.root = { name: \"root\", id: 0xffff, files: [], folders: [parse(0, \"data\", 0)] };\n }\n\n serialize(fat: FileAllocationTable, overlays: NitroFile[]): FileSystemLayout {\n const directories: { folder: NitroFolder; parent: number; firstId: number }[] = [];\n const named: NitroFile[] = [];\n const sort = <T extends NitroFile | NitroFolder>(items: T[]): T[] =>\n [...items].sort((a, b) => Buffer.compare(a.nameBytes ?? encodeName(a.name), b.nameBytes ?? encodeName(b.name)));\n const visit = (folder: NitroFolder, parent: number): void => {\n const index = directories.length;\n directories.push({ folder, parent, firstId: named.length });\n if (directories.length > 4096) throw new Error(\"FNT directory count exceeds 4096\");\n named.push(...sort(folder.files));\n for (const child of sort(folder.folders)) visit(child, 0xf000 + index);\n };\n visit(this.root.folders[0], 0xf000);\n const namedIds = new Set(named.filter((file) => file.id >= 0).map((file) => file.id));\n const overlayIds = new Set(overlays.map((file) => file.id));\n const unnamed = fat.entries\n .filter((entry) => !namedIds.has(entry.id))\n .map((entry) => ({ ...entry, name: `FAT entry ${entry.id}` }));\n const files: NitroFile[] = [\n ...unnamed.filter((entry) => overlayIds.has(entry.id)),\n ...overlays\n .filter((file) => file.id < 0)\n .sort(\n (a, b) =>\n Number(a.name.startsWith(\"overlay7_\")) - Number(b.name.startsWith(\"overlay7_\")) ||\n Number(a.name.slice(a.name.indexOf(\"_\") + 1, -4)) - Number(b.name.slice(b.name.indexOf(\"_\") + 1, -4)),\n ),\n ...unnamed.filter((entry) => !overlayIds.has(entry.id)),\n ];\n const firstNamed = files.length;\n files.push(...named);\n if (files.length > 0xf000) throw new Error(\"Filesystem file IDs exceed 0xEFFF\");\n const ids = new Map(files.map((file, id) => [file, id]));\n const sourceIds = new Map(files.filter((file) => file.id >= 0).map((file) => [file.id, ids.get(file)!]));\n const directoryIds = new Map(directories.map(({ folder }, index) => [folder, 0xf000 + index]));\n const writer = new BinaryWriter();\n writer.write(Buffer.alloc(directories.length * 8));\n for (const [index, { folder, parent, firstId }] of directories.entries()) {\n const record = Buffer.alloc(8);\n record.writeUInt32LE(writer.position);\n record.writeUInt16LE(firstNamed + firstId, 4);\n record.writeUInt16LE(index === 0 ? directories.length : parent, 6);\n record.copy(writer.buffer, index * 8);\n for (const file of sort(folder.files)) {\n const name = file.nameBytes ?? encodeName(file.name);\n writer.write(Buffer.from([name.length]));\n writer.write(name);\n }\n for (const child of sort(folder.folders)) {\n const name = child.nameBytes ?? encodeName(child.name);\n writer.write(Buffer.from([0x80 | name.length]));\n writer.write(name);\n const id = Buffer.alloc(2);\n id.writeUInt16LE(directoryIds.get(child)!);\n writer.write(id);\n }\n writer.write(Buffer.from([0]));\n }\n return { fnt: writer.toBuffer(), files, ids, sourceIds };\n }\n\n static findFile(id: number, folder: NitroFolder): NitroFile | undefined {\n for (const file of folder.files) if (file.id === id) return file;\n for (const subfolder of folder.folders) {\n const file = FileNameTable.findFile(id, subfolder);\n if (file) return file;\n }\n return undefined;\n }\n}\n\nexport interface OverlayItem {\n overlayId: number;\n ramAddress: number;\n ramSize: number;\n bssSize: number;\n staticInitialiserStartAddress: number;\n staticInitialiserEndAddress: number;\n fileId: number;\n reserved: number;\n}\n\nconst overlayFields = [\n \"overlayId\",\n \"ramAddress\",\n \"ramSize\",\n \"bssSize\",\n \"staticInitialiserStartAddress\",\n \"staticInitialiserEndAddress\",\n \"fileId\",\n \"reserved\",\n] as const;\n\nexport class OverlayTable {\n readonly entries: OverlayItem[] = [];\n constructor(\n input: Uint8Array,\n offset: number,\n size: number,\n readonly isArm9: boolean,\n ) {\n if (!size) return;\n const table = range(bytes(input), offset, size, \"overlay table\");\n if (size % 32) throw new Error(\"Invalid overlay table size\");\n for (let p = 0; p < size; p += 32) {\n if (table.readUInt32LE(p) === 0xffffffff) break;\n this.entries.push({\n overlayId: table.readUInt32LE(p),\n ramAddress: table.readUInt32LE(p + 4),\n ramSize: table.readUInt32LE(p + 8),\n bssSize: table.readUInt32LE(p + 12),\n staticInitialiserStartAddress: table.readUInt32LE(p + 16),\n staticInitialiserEndAddress: table.readUInt32LE(p + 20),\n fileId: table.readUInt32LE(p + 24),\n reserved: table.readUInt32LE(p + 28),\n });\n }\n }\n readBasicOverlays(fat: FileAllocationTable): NitroFile[] {\n return this.entries.map((item) => {\n const file = fat.entries[item.fileId];\n if (!file) throw new Error(\"Overlay file id is outside FAT\");\n return {\n ...file,\n name: `overlay${this.isArm9 ? \"\" : \"7\"}_${String(item.overlayId).padStart(4, \"0\")}.bin`,\n };\n });\n }\n toBuffer(): Buffer {\n const data = Buffer.alloc(this.entries.length * 32);\n this.entries.forEach((entry, i) =>\n overlayFields.forEach((field, j) => data.writeUInt32LE(entry[field], i * 32 + j * 4)),\n );\n return data;\n }\n}\n","// Port of NitroHelper/Header.cs. Copyright Xzonn and upstream contributors, GPL-3.0.\nimport { bytes, range } from \"./binary\";\nimport { crc16 } from \"./crc\";\nimport { encryptSecureArea } from \"./crypto\";\n\nexport const UnitCode = Object.freeze({ NDS: 0, NDS_DSi: 2, DSi: 3 });\n\nexport class Header {\n raw: Buffer;\n trimmedRom: boolean;\n doublePadding: boolean;\n nitrocode: boolean;\n decrypted: boolean;\n headerCRC: boolean;\n logoCRC: boolean;\n secureCRC: boolean;\n dlp_signature: Buffer;\n declare ARM9romOffset: number;\n declare ARM9entryAddress: number;\n declare ARM9ramAddress: number;\n declare ARM9size: number;\n declare ARM7romOffset: number;\n declare ARM7entryAddress: number;\n declare ARM7ramAddress: number;\n declare ARM7size: number;\n declare FNToffset: number;\n declare FNTsize: number;\n declare FAToffset: number;\n declare FATsize: number;\n declare ARM9overlayOffset: number;\n declare ARM9overlaySize: number;\n declare ARM7overlayOffset: number;\n declare ARM7overlaySize: number;\n declare flagsRead: number;\n declare flagsInit: number;\n declare bannerOffset: number;\n declare dsi9_rom_offset: number;\n declare offset_0x1C4: number;\n declare dsi9_ram_address: number;\n declare dsi9_size: number;\n declare dsi7_rom_offset: number;\n declare offset_0x1D4: number;\n declare dsi7_ram_address: number;\n declare dsi7_size: number;\n declare digest_ntr_start: number;\n declare digest_ntr_size: number;\n declare digest_twl_start: number;\n declare digest_twl_size: number;\n declare sector_hashtable_start: number;\n declare sector_hashtable_size: number;\n declare block_hashtable_start: number;\n declare block_hashtable_size: number;\n declare digest_sector_size: number;\n declare digest_block_sectorcount: number;\n declare banner_size: number;\n declare offset_0x20C: number;\n declare total_rom_size: number;\n declare offset_0x214: number;\n declare offset_0x218: number;\n declare offset_0x21C: number;\n declare modcrypt1_start: number;\n declare modcrypt1_size: number;\n declare modcrypt2_start: number;\n declare modcrypt2_size: number;\n declare tid_low: number;\n declare tid_high: number;\n declare public_sav_size: number;\n declare private_sav_size: number;\n declare unitCode: number;\n declare encryptionSeed: number;\n declare twlInternalFlags: number;\n declare permitsFlags: number;\n declare ROMversion: number;\n declare internalFlags: number;\n declare secureCRC16: number;\n declare ROMtimeout: number;\n declare ARM9autoload: number;\n declare ARM7autoload: number;\n declare ROMsize: number;\n declare ntr_region_end: number;\n declare twl_region_start: number;\n declare headerSize: number;\n declare logoCRC16: number;\n declare headerCRC16: number;\n declare debug_romOffset: number;\n declare debug_size: number;\n declare debug_ramAddress: number;\n declare reserved3: number;\n declare mbk9_wramcnt_setting: number;\n declare region_flags: number;\n declare access_control: number;\n declare scfg_ext_mask: number;\n declare gameTitle: string;\n declare gameCode: string;\n declare makerCode: string;\n declare reserved: Buffer;\n declare reserved2: Buffer;\n declare logo: Buffer;\n declare appflags: Buffer;\n declare hmac_arm9: Buffer;\n declare hmac_arm7: Buffer;\n declare hmac_digest_master: Buffer;\n declare hmac_icon_title: Buffer;\n declare hmac_arm9i: Buffer;\n declare hmac_arm7i: Buffer;\n declare hmac_arm9_no_secure: Buffer;\n declare rsa_signature: Buffer;\n declare secureDisable: bigint;\n\n constructor(input: Uint8Array) {\n const data = bytes(input, \"header\");\n range(data, 0, 0x170, \"header\");\n const size = data.readUInt32LE(0x84);\n if (size < 0x170 || size > data.length) throw new RangeError(`Invalid header size: ${size}`);\n this.raw = Buffer.from(data.subarray(0, size));\n if (this.unitCode & 2 && size > 0x200) range(this.raw, 0, 0x1000, \"DSi header\");\n this.trimmedRom = this.total_rom_size ? this.total_rom_size >= data.length : data.length !== this.size;\n this.doublePadding =\n (this.ARM9size % 0x400 < 0x200 && this.ARM7romOffset % 0x400 === 0 && this.ARM9overlayOffset % 0x400 === 0) ||\n (this.ARM7size % 0x400 < 0x200 && this.FNToffset % 0x400 === 0 && this.ARM7overlayOffset % 0x400 === 0) ||\n (this.FNTsize % 0x400 < 0x200 && this.FAToffset % 0x400 === 0) ||\n (this.FATsize % 0x400 < 0x200 && this.bannerOffset % 0x400 === 0);\n const nitroOffset = this.ARM9romOffset + this.ARM9size;\n this.nitrocode =\n nitroOffset >= size && nitroOffset + 4 <= data.length && data.readUInt32LE(nitroOffset) === 0xdec00621;\n this.decrypted = data.length >= 0x4008 && data.readBigUInt64LE(0x4000) === 0xe7ffdeffe7ffdeffn;\n this.headerCRC = crc16(this.raw.subarray(0, 0x15e)) === this.headerCRC16;\n this.logoCRC = crc16(this.logo) === this.logoCRC16;\n const secure = data.subarray(0x4000, 0x8000);\n this.secureCRC =\n secure.length > 0 &&\n crc16(this.decrypted ? encryptSecureArea(this.gameCode, secure) : secure) === this.secureCRC16;\n this.dlp_signature = Buffer.alloc(0);\n if (this.ROMsize >= size && this.ROMsize + 0x88 <= data.length && data.readUInt32LE(this.ROMsize) === 0x00016361) {\n this.dlp_signature = Buffer.from(data.subarray(this.ROMsize, this.ROMsize + 0x88));\n }\n }\n\n get size() {\n return 2 ** (17 + this.raw[0x14]);\n }\n set size(value: number) {\n const power = Math.log2(value);\n if (!Number.isInteger(power) || power < 17 || power > 32)\n throw new RangeError(\"ROM capacity must be a power of two from 128 KiB to 4 GiB\");\n this.raw[0x14] = power - 17;\n }\n toBuffer() {\n const data = Buffer.from(this.raw);\n data.writeUInt16LE(crc16(data.subarray(0xc0, 0x15c)), 0x15c);\n data.writeUInt16LE(crc16(data.subarray(0, 0x15e)), 0x15e);\n return data;\n }\n toString() {\n return `NDS header: ${this.gameTitle.replace(/\\0+$/, \"\")} (${this.gameCode})`;\n }\n}\n\nfunction field(\n name: string,\n offset: number,\n length: number,\n type: \"buffer\" | \"string\" | \"number\" = \"buffer\",\n dsi = false,\n) {\n Object.defineProperty(Header.prototype, name, {\n enumerable: true,\n get(this: Header) {\n if (dsi && (!(this.unitCode & 2) || this.raw.length <= 0x200))\n return type === \"buffer\" ? Buffer.alloc(length) : 0;\n const data = range(this.raw, offset, length, `header ${name}`);\n if (type === \"string\") return data.toString(\"latin1\");\n if (type === \"buffer\") return data;\n return length === 8 ? data.readBigUInt64LE() : data.readUIntLE(0, length);\n },\n set(this: Header, value: string | number | bigint | Uint8Array) {\n const target = range(this.raw, offset, length, `header ${name}`);\n if (type === \"string\") {\n if (typeof value !== \"string\" || Buffer.byteLength(value, \"latin1\") > length)\n throw new TypeError(`Invalid ${name}`);\n target.fill(0);\n target.write(value, \"latin1\");\n } else if (type === \"buffer\") {\n if (!(value instanceof Uint8Array)) throw new TypeError(`Invalid ${name}`);\n const source = bytes(value, name);\n if (source.length !== length) throw new RangeError(`${name} must contain ${length} bytes`);\n source.copy(target);\n } else if (length === 8) {\n if (typeof value !== \"bigint\") throw new TypeError(`Invalid ${name}`);\n target.writeBigUInt64LE(value);\n } else {\n if (typeof value !== \"number\") throw new TypeError(`Invalid ${name}`);\n target.writeUIntLE(value, 0, length);\n }\n },\n });\n}\nfield(\"gameTitle\", 0, 12, \"string\");\nfield(\"gameCode\", 12, 4, \"string\");\nfield(\"makerCode\", 16, 2, \"string\");\nfor (const [name, offset] of Object.entries({\n unitCode: 0x12,\n encryptionSeed: 0x13,\n twlInternalFlags: 0x1c,\n permitsFlags: 0x1d,\n ROMversion: 0x1e,\n internalFlags: 0x1f,\n}))\n field(name, offset, 1, \"number\");\nfield(\"reserved\", 0x15, 7);\nconst ntr32 =\n \"ARM9romOffset ARM9entryAddress ARM9ramAddress ARM9size ARM7romOffset ARM7entryAddress ARM7ramAddress ARM7size FNToffset FNTsize FAToffset FATsize ARM9overlayOffset ARM9overlaySize ARM7overlayOffset ARM7overlaySize flagsRead flagsInit bannerOffset\".split(\n \" \",\n );\nntr32.forEach((name, i) => field(name, 0x20 + i * 4, 4, \"number\"));\nfield(\"secureCRC16\", 0x6c, 2, \"number\");\nfield(\"ROMtimeout\", 0x6e, 2, \"number\");\nfield(\"ARM9autoload\", 0x70, 4, \"number\");\nfield(\"ARM7autoload\", 0x74, 4, \"number\");\nfield(\"secureDisable\", 0x78, 8, \"number\");\nfield(\"ROMsize\", 0x80, 4, \"number\");\nfield(\"headerSize\", 0x84, 4, \"number\");\nfield(\"reserved2\", 0x88, 56);\nfield(\"ntr_region_end\", 0x90, 2, \"number\");\nfield(\"twl_region_start\", 0x92, 2, \"number\");\nfield(\"logo\", 0xc0, 156);\nfield(\"logoCRC16\", 0x15c, 2, \"number\");\nfield(\"headerCRC16\", 0x15e, 2, \"number\");\n\"debug_romOffset debug_size debug_ramAddress reserved3\"\n .split(\" \")\n .forEach((name, i) => field(name, 0x160 + i * 4, 4, \"number\"));\nfield(\"appflags\", 0x1bc, 4, \"buffer\", true);\n\"mbk9_wramcnt_setting region_flags access_control scfg_ext_mask\"\n .split(\" \")\n .forEach((name, i) => field(name, 0x1ac + i * 4, 4, \"number\", true));\nconst twl32 =\n \"dsi9_rom_offset offset_0x1C4 dsi9_ram_address dsi9_size dsi7_rom_offset offset_0x1D4 dsi7_ram_address dsi7_size digest_ntr_start digest_ntr_size digest_twl_start digest_twl_size sector_hashtable_start sector_hashtable_size block_hashtable_start block_hashtable_size digest_sector_size digest_block_sectorcount banner_size offset_0x20C total_rom_size offset_0x214 offset_0x218 offset_0x21C modcrypt1_start modcrypt1_size modcrypt2_start modcrypt2_size tid_low tid_high public_sav_size private_sav_size\".split(\n \" \",\n );\ntwl32.forEach((name, i) => field(name, 0x1c0 + i * 4, 4, \"number\", true));\n\"hmac_arm9 hmac_arm7 hmac_digest_master hmac_icon_title hmac_arm9i hmac_arm7i\"\n .split(\" \")\n .forEach((name, i) => field(name, 0x300 + i * 20, 20, \"buffer\", true));\nfield(\"hmac_arm9_no_secure\", 0x3a0, 20, \"buffer\", true);\nfield(\"rsa_signature\", 0xf80, 0x80, \"buffer\", true);\n","export interface Arm9Header {\n nitrocode?: boolean;\n reserved2: Buffer;\n ARM9ramAddress: number;\n ARM9size: number;\n}\n\n// Native port of Xzonn/BlzHelper BLZ.cs (MIT), including overwrite-safe prefix.\n// Compression returns an empty Buffer when no smaller representation exists.\nexport const decompressBLZ = (input: Buffer, maxSize = 0x10000000): Buffer => {\n if (input.length < 8) throw new Error(\"BLZ footer is truncated\");\n const diff = input.readUInt32LE(input.length - 4);\n const packed = input.readUInt32LE(input.length - 8),\n header = packed >>> 24,\n length = packed & 0xffffff;\n const size = input.length + diff,\n prefix = input.length - length;\n if (header < 8 || header > length || length > input.length || size > maxSize)\n throw new Error(\"Invalid BLZ size or footer\");\n const out = Buffer.alloc(size);\n input.copy(out, 0, 0, prefix);\n let src = input.length - header,\n dst = size;\n while (src > prefix) {\n const flags = input[--src];\n for (let bit = 128; bit && src > prefix; bit >>= 1) {\n if (!(flags & bit)) {\n if (dst <= prefix) throw new Error(\"BLZ output overflow\");\n out[--dst] = input[--src];\n } else {\n if (src - 2 < prefix) throw new Error(\"Truncated BLZ reference\");\n const high = input[--src],\n low = input[--src];\n const count = (high >>> 4) + 3,\n offset = (((high & 15) << 8) | low) + 3;\n if (dst - count < prefix || dst - 1 + offset >= size) throw new Error(\"Invalid BLZ reference\");\n for (let j = 0; j < count; j++) {\n --dst;\n out[dst] = out[dst + offset];\n }\n }\n }\n }\n if (dst !== prefix) throw new Error(\"BLZ decompressed size mismatch\");\n return out;\n};\n\nexport const compressBLZ = (input: Buffer): Buffer => {\n if (input.length > 0xffffff) throw new Error(\"BLZ input exceeds 24-bit format limit\");\n const temp = Buffer.alloc(input.length);\n let src = input.length,\n dst = input.length;\n // Linked candidate lists retain upstream nearest-match tie breaking without\n // scanning every byte of the 4 KiB search window for each literal.\n const heads = new Int32Array(256).fill(-1);\n const next = new Int32Array(input.length);\n let indexedFrom = input.length;\n while (src > 0) {\n if (dst < 1) return Buffer.alloc(0);\n const flagPos = --dst;\n let flags = 0;\n for (let bit = 0; bit < 8; bit++) {\n flags <<= 1;\n if (!src) continue;\n while (indexedFrom > src) {\n const p = --indexedFrom;\n next[p] = heads[input[p]];\n heads[input[p]] = p;\n }\n const maxCount = Math.min(src, 18);\n let best = 0,\n offset = 0;\n for (let p = heads[input[src - 1]]; p >= 0; p = next[p]) {\n const d = p - src + 1;\n if (d > 0x1002) break;\n let n = 0;\n const limit = Math.min(d, maxCount);\n while (n < limit && input[src - 1 - n] === input[src + d - 1 - n]) n++;\n if (n > best) {\n best = n;\n offset = d;\n if (best === maxCount) break;\n }\n }\n if (best < 3) {\n if (dst < 1) return Buffer.alloc(0);\n temp[--dst] = input[--src];\n } else {\n if (dst < 2) return Buffer.alloc(0);\n src -= best;\n dst -= 2;\n temp[dst] = (offset - 3) & 255;\n temp[dst + 1] = ((best - 3) << 4) | ((offset - 3) >>> 8);\n flags |= 1;\n }\n }\n temp[flagPos] = flags;\n }\n let packed = temp.subarray(dst),\n sourcePos = input.length,\n compressedPos = packed.length,\n prefix = 0,\n skip = 0;\n outer: while (sourcePos > 0) {\n const flags = packed[--compressedPos];\n for (let bit = 128; bit && sourcePos > 0; bit >>= 1) {\n if (!(flags & bit)) {\n compressedPos--;\n sourcePos--;\n } else {\n sourcePos -= (packed[compressedPos - 1] >>> 4) + 3;\n compressedPos -= 2;\n if (sourcePos < compressedPos) {\n prefix = sourcePos;\n skip = compressedPos;\n break outer;\n }\n }\n }\n }\n packed = Buffer.concat([input.subarray(0, prefix), packed.subarray(skip)]);\n const aligned = Math.ceil(packed.length / 4) * 4,\n finalSize = aligned + 8;\n if (finalSize >= input.length) return Buffer.alloc(0);\n const out = Buffer.alloc(finalSize, 255);\n packed.copy(out);\n const header = finalSize - packed.length,\n length = packed.length - prefix + header;\n out.writeUInt32LE(((header << 24) | length) >>> 0, finalSize - 8);\n out.writeUInt32LE(input.length - finalSize, finalSize - 4);\n return out;\n};\n\nexport const decompressArm9 = (\n data: Buffer,\n header: Arm9Header,\n maxSize = 0x10000000,\n): { compressed: boolean; data: Buffer } => {\n if (data.length < 0x18) throw new Error(\"ARM9 data too short\");\n if (data.length > maxSize) throw new RangeError(\"ARM9 exceeds output size limit\");\n const nitro = (header.nitrocode ?? data.readUInt32LE(0xc) === 0xdec00621) ? 12 : 0;\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n const ptr = init ? data.readUInt32LE(init + 0x14) : header.ARM9ramAddress + header.ARM9size;\n const compressed = ptr > header.ARM9ramAddress && ptr + nitro >= header.ARM9ramAddress + data.length;\n return {\n compressed,\n data: compressed\n ? Buffer.concat([\n decompressBLZ(data.subarray(0, data.length - nitro), maxSize - nitro),\n data.subarray(data.length - nitro),\n ])\n : Buffer.from(data),\n };\n};\nexport const compressArm9 = (data: Buffer, header: Arm9Header, postSize = 0): Buffer => {\n if (data.length < 0x4000) throw new Error(\"ARM9 secure area is truncated\");\n const nitro = (header.nitrocode ?? data.readUInt32LE(0xc) === 0xdec00621) ? 12 : 0;\n const packed = compressBLZ(data.subarray(0x4000, data.length - nitro));\n if (!packed.length) throw new Error(\"ARM9 BLZ compression produced no smaller representation\");\n const out = Buffer.concat([data.subarray(0, 0x4000), packed, data.subarray(data.length - nitro)]);\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n if (init) out.writeUInt32LE(out.length - postSize + header.ARM9ramAddress, init + 0x14);\n return out;\n};\n","import { hmacSha1, readFileSync, verifyRsaSha1 } from \"#nitro-runtime\";\n\nimport { BinaryWriter, align, range } from \"./binary\";\nimport { compressArm9, decompressArm9 } from \"./blz\";\nimport type { Arm9Header } from \"./blz\";\nimport { crc16 } from \"./crc\";\nimport { aes128CtrCrypt, encryptSecureArea, modcryptKey } from \"./crypto\";\nimport { Header } from \"./header\";\nimport { HMAC_SHA1_KEY } from \"./twl\";\n\nexport interface DsiCheck {\n status: \"valid\" | \"invalid\" | \"not-applicable\";\n reason?: string;\n}\nexport interface DsiVerification {\n arm9: DsiCheck;\n arm7: DsiCheck;\n arm9i: DsiCheck;\n arm7i: DsiCheck;\n arm9NoSecure: DsiCheck;\n banner: DsiCheck;\n sectors: DsiCheck;\n blocks: DsiCheck;\n master: DsiCheck;\n signature: DsiCheck;\n}\n\ntype ProgramName = \"arm9\" | \"arm7\" | \"arm9i\" | \"arm7i\";\ninterface Program {\n name: ProgramName;\n start: number;\n length: number;\n data: Buffer;\n original: Buffer;\n replaced: boolean;\n}\ninterface CryptRegion {\n id: 1 | 2;\n program: ProgramName;\n offset: number;\n length: number;\n kind: \"whole\" | \"secure\" | \"fixed\";\n}\nexport interface DsiSection {\n label: string;\n start: number;\n originalSize: number;\n data: Buffer;\n place: (start: number) => void;\n}\n\nconst hash = (data: Buffer): Buffer => hmacSha1(HMAC_SHA1_KEY, data);\nconst check = (valid: boolean): DsiCheck => ({ status: valid ? \"valid\" : \"invalid\" });\nconst absent = (reason: string): DsiCheck => ({ status: \"not-applicable\", reason });\nconst fields = {\n arm9: [\"ARM9romOffset\", \"ARM9size\", \"hmac_arm9\"],\n arm7: [\"ARM7romOffset\", \"ARM7size\", \"hmac_arm7\"],\n arm9i: [\"dsi9_rom_offset\", \"dsi9_size\", \"hmac_arm9i\"],\n arm7i: [\"dsi7_rom_offset\", \"dsi7_size\", \"hmac_arm7i\"],\n} as const;\nconst digestFields = [\n \"digest_ntr_start\",\n \"digest_ntr_size\",\n \"digest_twl_start\",\n \"digest_twl_size\",\n \"sector_hashtable_start\",\n \"sector_hashtable_size\",\n \"block_hashtable_start\",\n \"block_hashtable_size\",\n \"digest_sector_size\",\n \"digest_block_sectorcount\",\n] as const;\n\nexport const noDsiVerification = (): DsiVerification =>\n Object.fromEntries(\n [\"arm9\", \"arm7\", \"arm9i\", \"arm7i\", \"arm9NoSecure\", \"banner\", \"sectors\", \"blocks\", \"master\", \"signature\"].map(\n (name) => [name, absent(\"Not a DSi-enhanced cartridge\")],\n ),\n ) as unknown as DsiVerification;\n\n/** Complete cartridge processing; legacy TWL serialization stays independent. */\nexport class CompleteTWL {\n readonly header: Header;\n readonly programs: Map<ProgramName, Program>;\n readonly regions: CryptRegion[];\n readonly hasDigests: boolean;\n readonly Hashtable1Data: Buffer;\n readonly Hashtable2Data: Buffer;\n readonly Header2Data: Buffer[];\n readonly Overlays9Sha1Hmac: Buffer[];\n readonly twlEncrypted: boolean;\n readonly firstDSiHashOffset: number;\n readonly dsiHashSize: number;\n private readonly original: Buffer;\n private readonly limit: number;\n\n constructor(header: Header, overlays: readonly Buffer[], original: Buffer, limit: number) {\n if (header.unitCode !== 2) throw new Error(\"Complete DSi processing requires a DSi-enhanced cartridge\");\n if (header.tid_high && header.tid_high !== 0x30000)\n throw new Error(\"DSiWare and non-cartridge titles are unsupported\");\n this.header = new Header(header.raw);\n this.header.decrypted = header.decrypted;\n this.header.nitrocode = header.nitrocode;\n this.original = original;\n this.limit = limit;\n this.hasDigests = digestFields.some((name) => header[name] !== 0);\n this.validateDigests(header, original);\n if (header.sector_hashtable_size > limit || header.block_hashtable_size > limit)\n throw new RangeError(\"DSi digest table exceeds output size limit\");\n for (const name of [\"dsi9_ram_address\", \"dsi7_ram_address\"] as const)\n if (!header[name] || header[name] === 0xffffffff) throw new Error(`Missing DSi program load address: ${name}`);\n this.Hashtable1Data = Buffer.from(\n range(original, header.sector_hashtable_start, header.sector_hashtable_size, \"DSi sector table\"),\n );\n this.Hashtable2Data = Buffer.from(\n range(original, header.block_hashtable_start, header.block_hashtable_size, \"DSi block table\"),\n );\n this.firstDSiHashOffset = this.hasDigests ? (header.digest_ntr_size / header.digest_sector_size) * 20 : 0;\n this.dsiHashSize = this.hasDigests ? (header.digest_twl_size / header.digest_sector_size) * 20 : 0;\n this.programs = new Map(\n Object.entries(fields).map(([name, [offset, size]]) => {\n const start = header[offset];\n const length = header[size];\n if (length && !start) throw new Error(`Missing ${name} ROM offset`);\n if (align(length, 16) > limit) throw new RangeError(`${name} exceeds output size limit`);\n const data = Buffer.from(range(original, start, length ? align(length, 16) : 0, name));\n return [\n name as ProgramName,\n { name: name as ProgramName, start, length, data, original: data, replaced: false },\n ];\n }),\n );\n const ordered = [...this.programs.values()].filter((program) => program.length).sort((a, b) => a.start - b.start);\n for (let index = 1; index < ordered.length; index++)\n if (ordered[index - 1].start + ordered[index - 1].data.length > ordered[index].start)\n throw new Error(\"DSi program regions overlap\");\n this.regions = [];\n for (const id of [1, 2] as const) {\n const start = header[`modcrypt${id}_start`];\n const length = header[`modcrypt${id}_size`];\n if (!start && !length) continue;\n if (!start || !length || length % 16) throw new Error(`Invalid Modcrypt region ${id}`);\n const candidates = ordered.filter(\n (program) => start >= program.start && start + length <= program.start + program.data.length,\n );\n if (candidates.length !== 1)\n throw new Error(`Modcrypt region ${id} conflicts with program ranges: ${start}..${start + length}`);\n const program = candidates[0];\n if (program.name === \"arm9\" || program.name === \"arm7\")\n throw new Error(`Modcrypt region ${id} targets ${program.name}; dual-mode cartridge startup is unsupported`);\n const offset = start - program.start;\n this.regions.push({\n id,\n program: program.name,\n offset,\n length,\n kind:\n offset === 0 && length === program.data.length\n ? \"whole\"\n : offset === 0 && program.name === \"arm9i\" && length === Math.min(0x4000, program.data.length)\n ? \"secure\"\n : \"fixed\",\n });\n }\n this.twlEncrypted = !!(header.twlInternalFlags & 2);\n this.decryptPrograms();\n for (const program of this.programs.values()) program.original = Buffer.from(program.data);\n const boundary = header.twl_region_start * 0x80000;\n const first = Math.min(...ordered.filter((program) => program.name.endsWith(\"i\")).map((program) => program.start));\n const prefixEnd = boundary + 0x3000;\n this.Header2Data =\n boundary &&\n prefixEnd <= original.length &&\n ((Number.isFinite(first) && first >= prefixEnd) ||\n (header.digest_twl_size && header.digest_twl_start >= prefixEnd) ||\n header.total_rom_size >= prefixEnd)\n ? Array.from({ length: 3 }, (_, index) =>\n Buffer.from(range(original, boundary + index * 0x1000, 0x1000, \"TWL unreadable region\")),\n )\n : [];\n this.Overlays9Sha1Hmac = overlays.map(hash);\n }\n\n private validateDigests(h: Header, original: Buffer): void {\n if (!this.hasDigests) return;\n const s = h.digest_sector_size;\n const b = h.digest_block_sectorcount;\n if (!Number.isSafeInteger(s) || s <= 0 || s > 0x4000 || 0x4000 % s)\n throw new Error(\"Invalid DSi digest sector size\");\n if (!b || b > 0x100000) throw new Error(\"Invalid DSi digest block sector count\");\n if (\n !h.digest_ntr_start ||\n h.digest_ntr_size < 0x4000 ||\n h.digest_ntr_size % s ||\n h.digest_twl_size % s ||\n (h.digest_twl_size && !h.digest_twl_start)\n )\n throw new Error(\"Incomplete DSi digest regions\");\n const count = (h.digest_ntr_size + h.digest_twl_size) / s;\n if (\n !h.sector_hashtable_start ||\n !h.block_hashtable_start ||\n !h.sector_hashtable_size ||\n h.sector_hashtable_size % (b * 20) ||\n h.sector_hashtable_size < count * 20 ||\n h.block_hashtable_size !== h.sector_hashtable_size / b\n )\n throw new Error(\"Incomplete or invalid DSi digest tables\");\n for (const [start, size, label] of [\n [h.digest_ntr_start, h.digest_ntr_size, \"NTR digest region\"],\n [h.digest_twl_start, h.digest_twl_size, \"TWL digest region\"],\n [h.sector_hashtable_start, h.sector_hashtable_size, \"DSi sector table\"],\n [h.block_hashtable_start, h.block_hashtable_size, \"DSi block table\"],\n ] as const)\n range(original, start, size, label);\n if (\n h.digest_ntr_start + h.digest_ntr_size > h.sector_hashtable_start ||\n h.sector_hashtable_start + h.sector_hashtable_size > h.block_hashtable_start ||\n (h.digest_twl_size && h.block_hashtable_start + h.block_hashtable_size > h.digest_twl_start)\n )\n throw new Error(\"DSi digest regions overlap\");\n }\n\n private decryptPrograms(): void {\n if (!this.regions.length) return;\n const h = this.header;\n const key = modcryptKey(h);\n const solutions: Buffer[][] = [];\n const programs = [...this.programs.values()];\n for (let mask = 0; mask < 2 ** this.regions.length; mask++) {\n const views = programs.map((program) => Buffer.from(program.data));\n for (let index = this.regions.length - 1; index >= 0; index--) {\n if (!(mask & (1 << index))) continue;\n const region = this.regions[index];\n const data = views[programs.findIndex((program) => program.name === region.program)];\n aes128CtrCrypt(\n key,\n (region.id === 1 ? h.hmac_arm9 : h.hmac_arm7).subarray(0, 16),\n data.subarray(region.offset, region.offset + region.length),\n ).copy(data, region.offset);\n }\n const accepted = [...new Set(this.regions.map((region) => region.program))].every((name) => {\n const index = programs.findIndex((program) => program.name === name);\n const program = programs[index];\n if (hash(views[index].subarray(0, program.length)).equals(h[fields[name][2]])) return true;\n if (!this.hasDigests) return false;\n const relevant = this.regions.filter((region) => region.program === name);\n return relevant.every((region) => {\n const address = program.start + region.offset;\n const base =\n address >= h.digest_twl_start && address < h.digest_twl_start + h.digest_twl_size\n ? h.digest_twl_start\n : h.digest_ntr_start;\n const length = base === h.digest_twl_start ? h.digest_twl_size : h.digest_ntr_size;\n if (address < base || address >= base + length) return false;\n const first = base + Math.floor((address - base) / h.digest_sector_size) * h.digest_sector_size;\n const last = Math.min(base + length, align(address + region.length, h.digest_sector_size));\n for (let sector = first; sector < last; sector += h.digest_sector_size) {\n const bytes = Buffer.from(range(this.original, sector, h.digest_sector_size, \"Modcrypt evidence sector\"));\n for (const [p, view] of programs.map((program, i) => [program, views[i]] as const)) {\n const start = Math.max(sector, p.start),\n end = Math.min(sector + bytes.length, p.start + view.length);\n if (end > start) view.copy(bytes, start - sector, start - p.start, end - p.start);\n }\n const digest =\n (((base === h.digest_twl_start ? h.digest_ntr_size : 0) + sector - base) / h.digest_sector_size) * 20;\n if (hash(bytes).equals(range(this.Hashtable1Data, digest, 20, \"Modcrypt evidence hash\"))) return true;\n }\n return false;\n });\n });\n if (accepted && !solutions.some((solution) => solution.every((data, index) => data.equals(views[index]))))\n solutions.push(views);\n }\n if (solutions.length !== 1)\n throw new Error(\n `Cannot determine Modcrypt state for regions ${this.regions.map((region) => region.id).join(\", \")}`,\n );\n programs.forEach((program, index) => {\n program.data = solutions[0][index];\n });\n }\n\n get DSi9Data(): Buffer {\n return this.getProgram(\"arm9i\");\n }\n set DSi9Data(data: Buffer) {\n this.setProgram(\"arm9i\", data);\n }\n get DSi7Data(): Buffer {\n return this.getProgram(\"arm7i\");\n }\n set DSi7Data(data: Buffer) {\n this.setProgram(\"arm7i\", data);\n }\n getProgram(name: ProgramName): Buffer {\n const program = this.programs.get(name)!;\n return program.data.subarray(0, program.length);\n }\n setProgram(name: ProgramName, data: Buffer): void {\n if (align(data.length, 16) > this.limit) throw new RangeError(`${name} exceeds output size limit`);\n const program = this.programs.get(name)!;\n const stored = Buffer.alloc(align(data.length, 16), 255);\n if (program.length === data.length) program.data.copy(stored);\n data.copy(stored);\n program.data = stored;\n program.length = data.length;\n program.replaced = true;\n }\n importArm9iData(data: Buffer | string, offset = 0, size?: number): void {\n const input = typeof data === \"string\" ? readFileSync(data) : data;\n this.setProgram(\"arm9i\", range(input, offset, size ?? input.length - offset, \"ARM9i import\"));\n }\n importArm7iData(data: Buffer | string, offset = 0, size?: number): void {\n const input = typeof data === \"string\" ? readFileSync(data) : data;\n this.setProgram(\"arm7i\", range(input, offset, size ?? input.length - offset, \"ARM7i import\"));\n }\n unchanged(): boolean {\n return [...this.programs.values()].every(\n (program) =>\n !(program.replaced && !program.length) &&\n program.length === this.header[fields[program.name][1]] &&\n program.data.equals(program.original),\n );\n }\n\n updateOverlays9Sha1Hmac(arm9: Buffer, h: Arm9Header, overlays: readonly Buffer[]): Buffer {\n if (overlays.length !== this.Overlays9Sha1Hmac.length)\n throw new Error(\"Changing signed ARM9 overlay count is unsupported\");\n const hashes = overlays.map(hash);\n if (hashes.every((value, index) => value.equals(this.Overlays9Sha1Hmac[index]))) return arm9;\n const unpacked = decompressArm9(arm9, h, this.limit);\n const oldSequence = Buffer.concat(this.Overlays9Sha1Hmac);\n const newSequence = Buffer.concat(hashes);\n const matches: { position: number; current: boolean }[] = [];\n for (const [sequence, current] of [\n [oldSequence, false],\n [newSequence, true],\n ] as const)\n for (\n let position = unpacked.data.indexOf(sequence, 0x4000);\n position >= 0;\n position = unpacked.data.indexOf(sequence, position + 1)\n )\n matches.push({ position, current });\n if (matches.length !== 1) throw new Error(\"ARM9 overlay HMAC table cannot be uniquely located\");\n if (matches[0].current) return arm9;\n newSequence.copy(unpacked.data, matches[0].position);\n if (!unpacked.compressed) return unpacked.data;\n const init = h.reserved2.readUInt32LE(0) & 0x3fff;\n const end = init ? arm9.readUInt32LE(init + 0x14) - h.ARM9ramAddress : arm9.length;\n return compressArm9(unpacked.data, h, arm9.length - end);\n }\n\n private view(data: Buffer, h: Header, start: number, length: number, programs = this.programs): Buffer {\n const output = Buffer.from(range(data, start, length, \"DSi digest input\"));\n for (const program of programs.values()) {\n const [offset, size] = fields[program.name];\n const address = h[offset];\n const limit = program.name === \"arm9\" ? h[size] : align(h[size], 16);\n const from = Math.max(start, address),\n to = Math.min(start + length, address + limit);\n if (to <= from) continue;\n let source = program.data;\n if (program.name === \"arm9\" && h.decrypted) source = encryptSecureArea(h.gameCode, source, true);\n source.copy(output, from - start, from - address, to - address);\n }\n return output;\n }\n\n verify(data = this.original, h = this.header): DsiVerification {\n const programCheck = (name: ProgramName): DsiCheck => {\n const program = this.programs.get(name)!;\n if (!program.length) return absent(\"Program has zero logical length\");\n const input = name === \"arm9\" && h.decrypted ? encryptSecureArea(h.gameCode, program.data, true) : program.data;\n return check(hash(input.subarray(0, program.length)).equals(h[fields[name][2]]));\n };\n const result: DsiVerification = {\n arm9: programCheck(\"arm9\"),\n arm7: programCheck(\"arm7\"),\n arm9i: programCheck(\"arm9i\"),\n arm7i: programCheck(\"arm7i\"),\n arm9NoSecure:\n h.ARM9size >= 0x4000\n ? check(hash(this.getProgram(\"arm9\").subarray(0x4000)).equals(h.hmac_arm9_no_secure))\n : absent(\"ARM9 has no complete secure area\"),\n banner: check(hash(range(data, h.bannerOffset, h.banner_size, \"DSi banner\")).equals(h.hmac_icon_title)),\n sectors: absent(\"Digest tables omitted\"),\n blocks: absent(\"Digest tables omitted\"),\n master: absent(\"Digest tables omitted\"),\n signature: h.rsa_signature.every((value) => value === 0)\n ? absent(\"Signature omitted\")\n : check(verifyRsaSha1(range(data, 0, 0xe00, \"Signed DSi header\"), h.rsa_signature)),\n };\n if (this.hasDigests) {\n let valid = true,\n index = 0;\n for (const [start, size] of [\n [h.digest_ntr_start, h.digest_ntr_size],\n [h.digest_twl_start, h.digest_twl_size],\n ])\n for (let position = start; position < start + size; position += h.digest_sector_size)\n valid =\n hash(this.view(data, h, position, h.digest_sector_size)).equals(\n range(data, h.sector_hashtable_start + index++ * 20, 20, \"DSi sector digest\"),\n ) && valid;\n result.sectors = check(valid);\n valid = true;\n for (let offset = 0; offset < h.sector_hashtable_size; offset += h.digest_block_sectorcount * 20)\n valid =\n hash(\n range(data, h.sector_hashtable_start + offset, h.digest_block_sectorcount * 20, \"DSi sector block\"),\n ).equals(\n range(data, h.block_hashtable_start + offset / h.digest_block_sectorcount, 20, \"DSi block digest\"),\n ) && valid;\n result.blocks = check(valid);\n result.master = check(\n hash(range(data, h.block_hashtable_start, h.block_hashtable_size, \"DSi master input\")).equals(\n h.hmac_digest_master,\n ),\n );\n }\n return result;\n }\n\n serialize(h: Header, sections: DsiSection[], forceLayout: boolean): Buffer {\n const originalHeader = this.header;\n const dsiPrograms = [this.programs.get(\"arm9i\")!, this.programs.get(\"arm7i\")!];\n const originalEnd = Math.max(\n originalHeader.ROMsize,\n originalHeader.total_rom_size,\n originalHeader.dsi9_rom_offset + align(originalHeader.dsi9_size, 16),\n originalHeader.dsi7_rom_offset + align(originalHeader.dsi7_size, 16),\n originalHeader.digest_twl_start + originalHeader.digest_twl_size,\n );\n const ntrLimit = this.hasDigests\n ? originalHeader.digest_ntr_start + originalHeader.digest_ntr_size\n : originalHeader.twl_region_start * 0x80000 ||\n Math.min(...dsiPrograms.filter((program) => program.length).map((program) => program.start));\n const ordered = sections\n .filter((section) => section.originalSize || section.data.length)\n .sort((a, b) => a.start - b.start);\n let preserve =\n !forceLayout &&\n ordered.every((section, index) => {\n const next = ordered[index + 1]?.start ?? ntrLimit;\n if (\n section.start < h.headerSize ||\n section.start + section.originalSize > next ||\n section.start + section.data.length > next\n )\n return false;\n const extra = this.original.subarray(section.start + section.originalSize, section.start + section.data.length);\n return extra.every((value) => value === 0) || extra.every((value) => value === 255);\n });\n const originalDsi = [...dsiPrograms]\n .filter((program) => originalHeader[fields[program.name][1]])\n .sort((a, b) => a.start - b.start);\n for (const [index, program] of originalDsi.entries()) {\n const next = originalDsi[index + 1]?.start ?? originalEnd;\n if (program.start + program.data.length > next) preserve = false;\n const extra = this.original.subarray(\n program.start + align(originalHeader[fields[program.name][1]], 16),\n program.start + program.data.length,\n );\n if (!(extra.every((value) => value === 0) || extra.every((value) => value === 255))) preserve = false;\n }\n if (dsiPrograms.some((program) => program.length && !originalHeader[fields[program.name][1]])) preserve = false;\n let ntrEnd: number;\n let end: number;\n let boundary = originalHeader.twl_region_start * 0x80000;\n if (preserve) {\n for (const section of sections) section.place(section.start);\n ntrEnd = originalHeader.ROMsize;\n end = originalEnd;\n } else {\n this.checkMovableTwl(boundary, originalDsi, originalEnd);\n let position = Math.max(h.headerSize, 0x4000);\n for (const section of sections) {\n section.start = position;\n section.place(position);\n position = align(position + section.data.length, 0x200);\n }\n const ntrDataEnd = position;\n if (this.hasDigests) {\n const s = h.digest_sector_size;\n h.digest_ntr_start = h.ARM9romOffset;\n h.digest_ntr_size = align(ntrDataEnd - h.digest_ntr_start, s);\n h.sector_hashtable_start = align(h.digest_ntr_start + h.digest_ntr_size, 0x200);\n }\n let twlLength = 0;\n for (const program of dsiPrograms) if (program.length) twlLength = align(twlLength, 0x400) + program.data.length;\n if (this.hasDigests) {\n h.digest_twl_size = twlLength ? align(twlLength, h.digest_sector_size) : 0;\n const count = (h.digest_ntr_size + h.digest_twl_size) / h.digest_sector_size;\n h.sector_hashtable_size = align(count * 20, h.digest_block_sectorcount * 20);\n h.block_hashtable_start = align(h.sector_hashtable_start + h.sector_hashtable_size, 0x200);\n h.block_hashtable_size = h.sector_hashtable_size / h.digest_block_sectorcount;\n ntrEnd = h.block_hashtable_start + h.block_hashtable_size;\n } else ntrEnd = ntrDataEnd;\n const originalBoundary = originalHeader.twl_region_start * 0x80000;\n const boundaryAlignment = originalBoundary ? Math.max(0x80000, originalBoundary & -originalBoundary) : 0x80000;\n boundary = align(ntrEnd, boundaryAlignment);\n position = boundary + 0x3000;\n let first = 0;\n for (const program of dsiPrograms) {\n const [offset] = fields[program.name];\n if (!program.length) {\n h[offset] = 0;\n continue;\n }\n position = align(position, 0x400);\n h[offset] = position;\n first ||= position;\n position += program.data.length;\n }\n if (this.hasDigests) h.digest_twl_start = first;\n end = this.hasDigests && first ? first + h.digest_twl_size : position;\n }\n h.size = Math.max(originalHeader.size, 2 ** Math.ceil(Math.log2(Math.max(end, 0x20000))));\n if (h.size > this.limit) throw new RangeError(\"Output exceeds size limit\");\n const writer = new BinaryWriter(h.size, this.limit);\n writer.fillTo(h.size);\n if (preserve) this.original.copy(writer.buffer);\n else {\n range(this.original, 0, Math.max(h.headerSize, 0x4000), \"DSi original header area\").copy(writer.buffer);\n if (this.hasDigests) {\n const originalGap = this.original.subarray(\n originalHeader.sector_hashtable_start + originalHeader.sector_hashtable_size,\n originalHeader.block_hashtable_start,\n );\n if (originalGap.length && originalGap.every((value) => value === 0))\n writer.buffer.fill(0, h.sector_hashtable_start + h.sector_hashtable_size, h.block_hashtable_start);\n }\n }\n // FAT contents depend on the final placement of every file.\n for (const section of sections) {\n writer.position = section.start;\n writer.write(section.data);\n if (preserve && section.data.length < section.originalSize) {\n writer.fillTo(section.start + section.originalSize);\n }\n }\n for (const program of dsiPrograms) {\n const [offset, size, mac] = fields[program.name];\n h[size] = program.length;\n if (!program.length && program.replaced) {\n h[offset] = 0;\n h[mac] = Buffer.alloc(20);\n if (preserve && originalHeader[size]) {\n writer.position = originalHeader[offset];\n writer.fillTo(originalHeader[offset] + align(originalHeader[size], 16));\n }\n }\n if (program.length) {\n writer.position = h[offset];\n writer.write(program.data);\n const oldSize = originalHeader[size];\n if (preserve && align(oldSize, 16) > program.data.length) writer.fillTo(h[offset] + align(oldSize, 16));\n }\n }\n const outputPrograms = new Map([...this.programs].map(([name, program]) => [name, { ...program }]));\n for (const name of [\"arm9\", \"arm7\"] as const) {\n const program = outputPrograms.get(name)!;\n const [offset, size] = fields[name];\n program.data = Buffer.from(range(writer.buffer, h[offset], h[size], name));\n program.length = h[size];\n }\n for (const program of outputPrograms.values()) {\n if (!program.length) continue;\n const data =\n program.name === \"arm9\" && h.decrypted ? encryptSecureArea(h.gameCode, program.data, true) : program.data;\n h[fields[program.name][2]] = hash(data.subarray(0, program.length));\n }\n h.hmac_arm9_no_secure = hash(outputPrograms.get(\"arm9\")!.data.subarray(0x4000));\n h.hmac_icon_title = hash(range(writer.buffer, h.bannerOffset, h.banner_size, \"DSi output banner\"));\n if (this.hasDigests) {\n range(writer.buffer, h.sector_hashtable_start, h.sector_hashtable_size, \"DSi output sector table\").fill(0);\n range(writer.buffer, h.block_hashtable_start, h.block_hashtable_size, \"DSi output block table\").fill(0);\n let index = 0;\n for (const [start, size] of [\n [h.digest_ntr_start, h.digest_ntr_size],\n [h.digest_twl_start, h.digest_twl_size],\n ])\n for (let position = start; position < start + size; position += h.digest_sector_size)\n hash(this.view(writer.buffer, h, position, h.digest_sector_size, outputPrograms)).copy(\n writer.buffer,\n h.sector_hashtable_start + index++ * 20,\n );\n for (let offset = 0; offset < h.sector_hashtable_size; offset += h.digest_block_sectorcount * 20)\n hash(\n range(\n writer.buffer,\n h.sector_hashtable_start + offset,\n h.digest_block_sectorcount * 20,\n \"DSi output sector block\",\n ),\n ).copy(writer.buffer, h.block_hashtable_start + offset / h.digest_block_sectorcount);\n h.hmac_digest_master = hash(\n range(writer.buffer, h.block_hashtable_start, h.block_hashtable_size, \"DSi output master input\"),\n );\n }\n const key = this.regions.length ? modcryptKey(h) : Buffer.alloc(0);\n for (const region of this.regions) {\n const program = this.programs.get(region.program)!;\n const size = !program.length\n ? 0\n : region.kind === \"whole\"\n ? program.data.length\n : region.kind === \"secure\"\n ? Math.min(0x4000, program.data.length)\n : region.length;\n if (size && region.offset + size > program.data.length)\n throw new Error(`Modcrypt region ${region.id} exceeds ${program.name} after replacement`);\n const start = size ? h[fields[program.name][0]] + region.offset : 0;\n h[`modcrypt${region.id}_start`] = start;\n h[`modcrypt${region.id}_size`] = size;\n if (size && h.twlInternalFlags & 2) {\n const input = range(writer.buffer, start, size, `Output Modcrypt region ${region.id}`);\n aes128CtrCrypt(key, (region.id === 1 ? h.hmac_arm9 : h.hmac_arm7).subarray(0, 16), input).copy(\n writer.buffer,\n start,\n );\n }\n }\n h.ROMsize = ntrEnd;\n h.total_rom_size = end;\n h.ntr_region_end = boundary / 0x80000;\n h.twl_region_start = boundary / 0x80000;\n h.size = Math.max(originalHeader.size, 2 ** Math.ceil(Math.log2(Math.max(end, 0x20000))));\n const secure = range(writer.buffer, h.ARM9romOffset, 0x4000, \"DSi secure area\");\n h.secureCRC16 = crc16(h.decrypted ? encryptSecureArea(h.gameCode, secure, true) : secure);\n h.rsa_signature = originalHeader.rsa_signature;\n writer.position = 0;\n writer.write(h.toBuffer());\n const originalMirror = range(this.original, 0x8000, 0x1000, \"Original cartridge mirror\");\n for (let start = 0x1000; start < 0x4000; start += 0x1000)\n if (range(this.original, start, 0x1000, \"NTR unreadable region\").equals(originalMirror))\n range(writer.buffer, 0x8000, 0x1000, \"Updated cartridge mirror\").copy(writer.buffer, start);\n if (this.Header2Data.length) {\n for (const [index, data] of this.Header2Data.entries()) {\n writer.position = boundary + index * 0x1000;\n writer.write(\n data.equals(originalMirror) ? range(writer.buffer, 0x8000, 0x1000, \"Updated cartridge mirror\") : data,\n );\n }\n }\n return writer.toBuffer();\n }\n\n private checkMovableTwl(boundary: number, programs: Program[], end: number): void {\n let position = boundary + this.Header2Data.length * 0x1000;\n for (const program of programs) {\n if (program.start < position) throw new Error(\"TWL input regions overlap\");\n const gap = range(this.original, position, program.start - position, \"TWL preserved bytes\");\n const padding = gap;\n if (padding.length && !(padding.every((value) => value === 0) || padding.every((value) => value === 255)))\n throw new Error(\"TWL contains unrecognized bytes whose relocation is unsupported\");\n position = program.start + align(this.header[fields[program.name][1]], 16);\n }\n const tail = range(this.original, position, end - position, \"TWL preserved tail\");\n if (tail.length && !(tail.every((value) => value === 0) || tail.every((value) => value === 255)))\n throw new Error(\"TWL contains unrecognized trailing data whose relocation is unsupported\");\n }\n}\n","import { hmacSha1, readFileSync, verifyRsaSha1 } from \"#nitro-runtime\";\n\nimport type { BinaryWriter } from \"./binary\";\nimport { DEFAULT_MAX_SIZE } from \"./binary\";\nimport type { Arm9Header } from \"./blz\";\nimport { compressArm9, decompressArm9 } from \"./blz\";\nimport type { ModcryptHeader } from \"./crypto\";\nimport { aes128CtrCrypt, encryptSecureArea, modcryptKey } from \"./crypto\";\nimport { Header } from \"./header\";\nimport { CompleteTWL } from \"./twl-complete\";\n\nexport interface TwlHeader extends ModcryptHeader {\n digest_sector_size: number;\n digest_block_sectorcount: number;\n digest_ntr_start: number;\n digest_ntr_size: number;\n digest_twl_start: number;\n digest_twl_size: number;\n sector_hashtable_start: number;\n sector_hashtable_size: number;\n block_hashtable_start: number;\n block_hashtable_size: number;\n dsi9_rom_offset: number;\n dsi9_size: number;\n dsi7_rom_offset: number;\n dsi7_size: number;\n modcrypt1_start: number;\n modcrypt1_size: number;\n modcrypt2_start: number;\n modcrypt2_size: number;\n total_rom_size: number;\n trimmedRom: boolean;\n decrypted: boolean;\n hmac_arm9: Buffer;\n hmac_arm7: Buffer;\n hmac_digest_master: Buffer;\n}\n\nexport interface SignedTwlHeader {\n hmac_digest_master: Buffer;\n rsa_signature: Buffer;\n}\n\nexport interface OverlayRange {\n offset: number;\n size: number;\n}\n\nexport const HMAC_SHA1_KEY = Buffer.from(\n \"2106c0deba98ce3fa692e39d46f2ed0176e3cc08562363facad4ecdf9a6278348f6d633cfe22ca9220889723d2cfaec232678dfeca836498acfd3e3787465824\",\n \"hex\",\n);\nconst hash = (data: Buffer): Buffer => hmacSha1(HMAC_SHA1_KEY, data);\nfunction slice(data: Buffer, start: number, size: number, label: string): Buffer {\n if (\n !Number.isSafeInteger(start) ||\n !Number.isSafeInteger(size) ||\n start < 0 ||\n size < 0 ||\n start + size > data.length\n )\n throw new RangeError(`${label} outside data range`);\n return data.subarray(start, start + size);\n}\nfunction validate(h: TwlHeader): void {\n for (const field of [\n \"digest_ntr_start\",\n \"digest_ntr_size\",\n \"digest_twl_start\",\n \"digest_twl_size\",\n \"sector_hashtable_start\",\n \"sector_hashtable_size\",\n \"block_hashtable_start\",\n \"block_hashtable_size\",\n \"dsi9_rom_offset\",\n \"dsi9_size\",\n \"dsi7_rom_offset\",\n \"dsi7_size\",\n \"modcrypt1_start\",\n \"modcrypt1_size\",\n \"modcrypt2_start\",\n \"modcrypt2_size\",\n \"total_rom_size\",\n ] as const) {\n if (!Number.isSafeInteger(h[field]) || h[field] < 0 || h[field] > 0xffffffff) {\n throw new Error(`Invalid TWL ${field}`);\n }\n }\n const s = h.digest_sector_size;\n if (!Number.isSafeInteger(s) || s <= 0 || s > 0x4000 || 0x4000 % s) throw new Error(\"Invalid TWL digest sector size\");\n if (\n !Number.isSafeInteger(h.digest_block_sectorcount) ||\n h.digest_block_sectorcount <= 0 ||\n h.digest_block_sectorcount > 0x100000\n )\n throw new Error(\"Invalid TWL digest block sector count\");\n if (h.digest_ntr_size < 0x4000 || h.digest_ntr_size % s || h.digest_twl_size % s)\n throw new Error(\"Invalid TWL digest region size\");\n const hashes = (h.digest_ntr_size + h.digest_twl_size) / s;\n if (\n hashes * 20 > h.sector_hashtable_size ||\n Math.ceil(h.sector_hashtable_size / (h.digest_block_sectorcount * 20)) * 20 > h.block_hashtable_size\n )\n throw new Error(\"TWL hash tables are too small\");\n}\nexport class TWL {\n readonly firstDSiHashOffset: number;\n readonly dsiHashSize: number;\n readonly Hashtable1Data: Buffer;\n readonly Hashtable2Data: Buffer;\n readonly Header2Data: Buffer[] | null;\n readonly Overlays9Sha1Hmac: Buffer[];\n readonly twlEncrypted: boolean;\n readonly complete: CompleteTWL | undefined;\n private dsi9Data: Buffer = Buffer.alloc(0);\n private dsi7Data: Buffer = Buffer.alloc(0);\n get DSi9Data(): Buffer {\n return this.complete?.DSi9Data ?? this.dsi9Data;\n }\n set DSi9Data(data: Buffer) {\n if (this.complete) this.complete.DSi9Data = data;\n else this.dsi9Data = data;\n }\n get DSi7Data(): Buffer {\n return this.complete?.DSi7Data ?? this.dsi7Data;\n }\n set DSi7Data(data: Buffer) {\n if (this.complete) this.complete.DSi7Data = data;\n else this.dsi7Data = data;\n }\n constructor(\n header: TwlHeader,\n overlays: readonly OverlayRange[],\n original: Buffer,\n options: { dsiMode?: \"legacy\" | \"complete\"; maxOutputSize?: number } = {},\n ) {\n if (options.dsiMode === \"complete\") {\n if (!(header instanceof Header)) throw new TypeError(\"Complete DSi handling requires a parsed Header\");\n this.complete = new CompleteTWL(\n header,\n overlays.map((overlay) => slice(original, overlay.offset, overlay.size, \"Signed ARM9 overlay\")),\n original,\n options.maxOutputSize ?? DEFAULT_MAX_SIZE,\n );\n this.firstDSiHashOffset = this.complete.firstDSiHashOffset;\n this.dsiHashSize = this.complete.dsiHashSize;\n this.Hashtable1Data = this.complete.Hashtable1Data;\n this.Hashtable2Data = this.complete.Hashtable2Data;\n this.Header2Data = this.complete.Header2Data;\n this.Overlays9Sha1Hmac = this.complete.Overlays9Sha1Hmac;\n this.twlEncrypted = this.complete.twlEncrypted;\n return;\n }\n validate(header);\n const h = header;\n this.firstDSiHashOffset = (h.digest_ntr_size / h.digest_sector_size) * 20;\n this.dsiHashSize = (h.digest_twl_size / h.digest_sector_size) * 20;\n this.Hashtable1Data = Buffer.from(\n slice(original, h.sector_hashtable_start, h.sector_hashtable_size, \"Sector hash table\"),\n );\n this.Hashtable2Data = Buffer.from(\n slice(original, h.block_hashtable_start, h.block_hashtable_size, \"Block hash table\"),\n );\n this.DSi9Data = Buffer.from(slice(original, h.dsi9_rom_offset, Math.max(h.modcrypt1_size, h.dsi9_size), \"ARM9i\"));\n this.DSi7Data = Buffer.from(slice(original, h.dsi7_rom_offset, Math.max(h.modcrypt2_size, h.dsi7_size), \"ARM7i\"));\n this.Header2Data = h.trimmedRom\n ? null\n : Array.from({ length: 3 }, (_, i) =>\n Buffer.from(slice(original, h.digest_twl_start - 0x3000 + 0x1000 * i, 0x1000, \"Secondary header\")),\n );\n this.Overlays9Sha1Hmac = overlays.map((o) => hash(slice(original, o.offset, o.size, \"ARM9 overlay\")));\n let encrypted = false;\n const modcryptStart = [\n { start: h.modcrypt1_start, size: h.modcrypt1_size },\n { start: h.modcrypt2_start, size: h.modcrypt2_size },\n ].find(({ start, size }) => size > 0 && start >= h.digest_twl_start && start < 0xffffffff)?.start;\n if (modcryptStart !== undefined) {\n const index = Math.floor((modcryptStart - h.digest_twl_start) / h.digest_sector_size);\n const actual = hash(\n slice(original, h.digest_twl_start + index * h.digest_sector_size, h.digest_sector_size, \"Modcrypt sector\"),\n );\n encrypted = !actual.equals(\n slice(this.Hashtable1Data, this.firstDSiHashOffset + index * 20, 20, \"Modcrypt sector hash\"),\n );\n }\n if (encrypted) this.cryptSections(h);\n this.twlEncrypted = !!(h.twlInternalFlags & 2);\n }\n private cryptSections(h: TwlHeader, writer?: BinaryWriter): void {\n const key = modcryptKey(h);\n for (const [id, data, start, counter] of [\n [1, this.DSi9Data, h.dsi9_rom_offset, h.hmac_arm9],\n [2, this.DSi7Data, h.dsi7_rom_offset, h.hmac_arm7],\n ] as const) {\n const size = h[`modcrypt${id}_size`];\n if (!size) continue;\n const off = h[`modcrypt${id}_start`] - start;\n const result = aes128CtrCrypt(\n key,\n slice(counter, 0, 16, \"Modcrypt counter\"),\n slice(data, off, size, \"Modcrypt payload\"),\n );\n if (writer) {\n writer.position = start + off;\n writer.write(result);\n } else result.copy(data, off);\n }\n }\n importArm9iData(data: Buffer | string, offset = 0, size?: number): void {\n if (this.complete) return this.complete.importArm9iData(data, offset, size);\n this.DSi9Data = this.importData(data, offset, size);\n }\n importArm7iData(data: Buffer | string, offset = 0, size?: number): void {\n if (this.complete) return this.complete.importArm7iData(data, offset, size);\n this.DSi7Data = this.importData(data, offset, size);\n }\n private importData(data: Buffer | string, offset: number, size?: number): Buffer {\n if (typeof data === \"string\") data = readFileSync(data);\n size ??= data.length - offset;\n const src = slice(data, offset, size, \"DSi import\");\n const out = Buffer.alloc(Math.ceil(size / 16) * 16, 255);\n src.copy(out);\n return out;\n }\n updateOverlays9Sha1Hmac(arm9Data: Buffer, header: Arm9Header, overlays: readonly Buffer[]): Buffer {\n if (this.complete) return this.complete.updateOverlays9Sha1Hmac(arm9Data, header, overlays);\n if (overlays.length !== this.Overlays9Sha1Hmac.length)\n throw new Error(\"Changing ARM9 overlay count is unsupported\");\n const hashes = overlays.map(hash);\n if (hashes.every((h, i) => h.equals(this.Overlays9Sha1Hmac[i]))) return Buffer.from(arm9Data);\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n const hdrptr = arm9Data.readUInt32LE(init + 0x14) - header.ARM9ramAddress;\n const unpacked = decompressArm9(arm9Data, header);\n const end = unpacked.data.readUInt32LE(init + 8) - header.ARM9ramAddress;\n let found = -1;\n for (let p = Math.min(end - hashes.length * 20, unpacked.data.length - hashes.length * 20); p >= 0; p--) {\n if (unpacked.data.subarray(p, p + 20).equals(this.Overlays9Sha1Hmac[0])) {\n found = p;\n break;\n }\n }\n if (found < 0) throw new Error(\"ARM9 overlay hashes changed but original hash table was not found\");\n hashes.forEach((h, i) => h.copy(unpacked.data, found + i * 20));\n // Original C# inverted this check and tried to compress uncompressed data.\n // Preserve the original storage format: recompress only a compressed ARM9.\n return unpacked.compressed ? compressArm9(unpacked.data, header, arm9Data.length - hdrptr) : unpacked.data;\n }\n writeTo(writer: BinaryWriter, h: TwlHeader): Buffer {\n if (this.complete) throw new Error(\"Complete DSi serialization requires NDSFile.toBuffer()\");\n validate(h);\n // Fixed DSi regions cannot be shifted safely without rewriting the header.\n if (writer.position > h.sector_hashtable_start) {\n throw new Error(\"NTR output overlaps the fixed DSi sector hash table\");\n }\n if (\n h.sector_hashtable_start + h.sector_hashtable_size > h.block_hashtable_start ||\n h.block_hashtable_start + h.block_hashtable_size > h.dsi9_rom_offset ||\n h.dsi9_rom_offset + this.DSi9Data.length > h.dsi7_rom_offset ||\n h.dsi7_rom_offset + this.DSi7Data.length > h.total_rom_size\n ) {\n throw new Error(\"DSi sections overlap or exceed the ROM size\");\n }\n const fill = (end: number): void => {\n if (writer.position < end) writer.fillTo(end, 255);\n };\n fill(h.sector_hashtable_start);\n writer.position = h.sector_hashtable_start + h.sector_hashtable_size;\n fill(h.block_hashtable_start);\n writer.position = h.block_hashtable_start + h.block_hashtable_size;\n fill(h.dsi9_rom_offset);\n if (this.Header2Data && !h.trimmedRom) {\n writer.position = h.digest_twl_start - 0x3000;\n this.Header2Data.forEach((b) => writer.write(b));\n }\n writer.position = h.dsi9_rom_offset;\n writer.write(this.DSi9Data);\n fill(h.dsi7_rom_offset);\n writer.position = h.dsi7_rom_offset;\n writer.write(this.DSi7Data);\n fill(h.total_rom_size);\n const finalPosition = writer.position;\n const read = (p: number, n: number): Buffer =>\n slice(writer.buffer.subarray(0, writer.length), p, n, \"TWL output digest\");\n let secure: Buffer = Buffer.from(read(h.digest_ntr_start, 0x4000));\n if (h.decrypted) secure = encryptSecureArea(h.gameCode, secure);\n let index = 0;\n const put = (b: Buffer): void => {\n writer.position = h.sector_hashtable_start + index++ * 20;\n writer.write(hash(b));\n };\n for (let p = 0; p < 0x4000; p += h.digest_sector_size) put(secure.subarray(p, p + h.digest_sector_size));\n for (let p = h.digest_ntr_start + 0x4000; p < h.digest_ntr_start + h.digest_ntr_size; p += h.digest_sector_size)\n put(read(p, h.digest_sector_size));\n for (let p = h.digest_twl_start; p < h.digest_twl_start + h.digest_twl_size; p += h.digest_sector_size)\n put(read(p, h.digest_sector_size));\n index = 0;\n for (\n let p = h.sector_hashtable_start;\n p < h.sector_hashtable_start + h.sector_hashtable_size;\n p += h.digest_block_sectorcount * 20\n ) {\n const digest = hash(read(p, h.digest_block_sectorcount * 20));\n writer.position = h.block_hashtable_start + index++ * 20;\n writer.write(digest);\n }\n h.hmac_digest_master = hash(read(h.block_hashtable_start, h.block_hashtable_size));\n if (this.twlEncrypted) this.cryptSections(h, writer);\n writer.position = finalPosition;\n return h.hmac_digest_master;\n }\n}\n\n/** Refresh the master digest while preserving the cartridge signature. */\nexport const updateHeaderSignatures = (\n writer: BinaryWriter,\n header: SignedTwlHeader,\n originalHeader: Buffer,\n _keepOriginal = true,\n): void => {\n const signedData = Buffer.from(slice(originalHeader, 0, 0xe00, \"Signed header\"));\n const digest = slice(header.hmac_digest_master, 0, 20, \"Master digest\");\n const signature = slice(header.rsa_signature, 0, 128, \"RSA signature\");\n digest.copy(signedData, 0x328);\n verifyRsaSha1(signedData, signature);\n const position = writer.position;\n writer.position = 0x328;\n writer.write(digest);\n writer.position = 0xf80;\n writer.write(signature);\n writer.position = position;\n};\n","// Native TypeScript port of NitroHelper/NDSFile.cs, GPL-3.0.\nimport { readFile, writeFile } from \"#nitro-runtime\";\n\nimport { Banner } from \"./banner\";\nimport { BinaryWriter, DEFAULT_MAX_SIZE, bytes, range } from \"./binary\";\nimport { crc16 } from \"./crc\";\nimport { decryptSecureArea, encryptSecureArea } from \"./crypto\";\nimport { FileAllocationTable, FileNameTable, OverlayTable, encodeName } from \"./filesystem\";\nimport type { NitroFile, NitroFolder, OverlayItem } from \"./filesystem\";\nimport { Header } from \"./header\";\nimport { TWL } from \"./twl\";\nimport { noDsiVerification } from \"./twl-complete\";\nimport type { DsiSection, DsiVerification } from \"./twl-complete\";\n\nexport interface RomOptions {\n /** Maximum generated ROM size in bytes. Defaults to 1 GiB. */\n maxOutputSize?: number;\n /** Complete DSi cartridge handling is opt-in for direct API calls. */\n dsiMode?: \"legacy\" | \"complete\";\n}\n\nexport interface RomFileInfo {\n /** ROM-relative path, including data/, overlay/, or a system filename. */\n path: string;\n /** Input ROM identity and position; both are -1 for an added file until the output is reopened. */\n id: number;\n offset: number;\n size: number;\n}\n\nconst key = (path: string): string => path.replaceAll(\"\\\\\", \"/\").toLowerCase();\n\n/** Parsed Nintendo DS ROM. Replacements do not change the input buffer. */\nexport class NDSFile {\n readonly original: Buffer;\n readonly header: Header;\n readonly banner: Banner;\n readonly fatTable: FileAllocationTable;\n readonly fntTable: FileNameTable;\n readonly overlay9Table: OverlayTable;\n readonly overlay7Table: OverlayTable;\n readonly root: NitroFolder;\n readonly twl: TWL | undefined;\n readonly warnings: string[] = [];\n private readonly paths = new Map<string, { path: string; file: NitroFile }>();\n private readonly maxOutputSize: number;\n private readonly addedOverlays = new Map<string, { arm9: boolean; entry: OverlayItem }>();\n private structureChanged = false;\n\n constructor(input: Uint8Array, options: RomOptions = {}) {\n this.original = bytes(input, \"ROM\");\n this.maxOutputSize = options.maxOutputSize ?? DEFAULT_MAX_SIZE;\n if (!Number.isSafeInteger(this.maxOutputSize) || this.maxOutputSize < 1 || this.maxOutputSize > 0xffffffff)\n throw new RangeError(\"Invalid output size limit\");\n this.header = new Header(this.original);\n const h = this.header;\n if (options.dsiMode === \"complete\" && h.unitCode === 3)\n throw new Error(\"DSi-exclusive cartridges and DSiWare are unsupported\");\n range(this.original, h.ARM9romOffset, h.ARM9size + (h.nitrocode ? 12 : 0), \"ARM9\");\n range(this.original, h.ARM7romOffset, h.ARM7size, \"ARM7\");\n this.banner = new Banner(this.original, h.bannerOffset, h.banner_size);\n this.fatTable = new FileAllocationTable(this.original, h.FAToffset, h.FATsize);\n this.fntTable = new FileNameTable(this.fatTable, this.original, h.FNToffset, h.FNTsize);\n this.root = this.fntTable.root;\n this.overlay9Table = new OverlayTable(this.original, h.ARM9overlayOffset, h.ARM9overlaySize, true);\n this.overlay7Table = new OverlayTable(this.original, h.ARM7overlayOffset, h.ARM7overlaySize, false);\n const arm9Overlays = this.overlay9Table.readBasicOverlays(this.fatTable);\n this.root.folders.push({\n name: \"overlay\",\n id: 0xffff,\n files: [...arm9Overlays, ...this.overlay7Table.readBasicOverlays(this.fatTable)],\n folders: [],\n });\n const system = (name: string, offset: number, size: number): void => {\n range(this.original, offset, size, name);\n this.root.files.push({ name, id: 0xffff, offset, size });\n };\n system(\"header.bin\", 0, h.headerSize);\n system(\"banner.bin\", h.bannerOffset, this.banner.raw.length);\n system(\"fnt.bin\", h.FNToffset, h.FNTsize);\n system(\"fat.bin\", h.FAToffset, h.FATsize);\n system(\"arm9.bin\", h.ARM9romOffset, h.ARM9size + (h.nitrocode ? 12 : 0));\n system(\"arm7.bin\", h.ARM7romOffset, h.ARM7size);\n if (h.ARM9overlaySize) system(\"overarm9.bin\", h.ARM9overlayOffset, h.ARM9overlaySize);\n if (h.ARM7overlaySize) system(\"overarm7.bin\", h.ARM7overlayOffset, h.ARM7overlaySize);\n const visit = (folder: NitroFolder, prefix: string): void => {\n for (const file of folder.files) {\n const path = prefix + file.name;\n if (this.paths.has(key(path))) throw new Error(`Duplicate ROM path: ${path}`);\n this.paths.set(key(path), { path, file });\n }\n for (const child of folder.folders) visit(child, `${prefix + child.name}/`);\n };\n visit(this.root, \"\");\n if (options.dsiMode === \"complete\" && h.unitCode & 2) {\n const regions: { start: number; size: number; name: string; payload?: boolean }[] = [\n ...this.root.files.map((file) => ({ start: file.offset, size: file.size, name: file.name })),\n ...this.fatTable.entries.map((file) => ({\n start: file.offset,\n size: file.size,\n name: `FAT ${file.id}`,\n payload: true,\n })),\n { start: h.dsi9_rom_offset, size: h.dsi9_size, name: \"ARM9i\" },\n { start: h.dsi7_rom_offset, size: h.dsi7_size, name: \"ARM7i\" },\n { start: h.sector_hashtable_start, size: h.sector_hashtable_size, name: \"DSi sector table\" },\n { start: h.block_hashtable_start, size: h.block_hashtable_size, name: \"DSi block table\" },\n ]\n .filter((region) => region.size)\n .sort((a, b) => a.start - b.start);\n let systemEnd: (typeof regions)[number] | undefined;\n let payloadEnd: (typeof regions)[number] | undefined;\n for (const region of regions) {\n range(this.original, region.start, region.size, region.name);\n for (const previous of [systemEnd, region.payload ? undefined : payloadEnd])\n if (previous && previous.start + previous.size > region.start)\n throw new Error(`DSi ROM regions overlap: ${previous.name} and ${region.name}`);\n if (region.payload) {\n if (!payloadEnd || region.start + region.size > payloadEnd.start + payloadEnd.size) payloadEnd = region;\n } else systemEnd = region;\n }\n this.twl = new TWL(\n h,\n this.overlay9Table.entries\n .filter((entry) => entry.reserved & 0x2000000)\n .map((entry) => {\n const file = this.fatTable.entries[entry.fileId];\n return { offset: file.offset, size: file.size };\n }),\n this.original,\n { dsiMode: \"complete\", maxOutputSize: this.maxOutputSize },\n );\n for (const [name, offset, size] of [\n [\"arm9i.bin\", h.dsi9_rom_offset, h.dsi9_size],\n [\"arm7i.bin\", h.dsi7_rom_offset, h.dsi7_size],\n ] as const) {\n const file: NitroFile = { name, id: 0xffff, offset, size };\n this.root.files.push(file);\n this.paths.set(name, { path: name, file });\n }\n } else if (h.unitCode & 2 && h.twlInternalFlags & 1 && h.tid_high && h.tid_high !== 0xffffffff) {\n // Upstream silently discarded malformed TWL regions. Preserve valid DSi data,\n // and reject malformed data instead of emitting a ROM with missing sections.\n this.twl = new TWL(h, arm9Overlays, this.original);\n }\n }\n\n static async fromFile(path: string, options: RomOptions = {}): Promise<NDSFile> {\n return new NDSFile(await readFile(path), options);\n }\n get data(): NitroFolder {\n return this.root.folders[0];\n }\n get overlay(): NitroFolder {\n return this.root.folders[1];\n }\n\n listFiles(): RomFileInfo[] {\n return [...this.paths.values()].map(({ path, file }) => ({\n path,\n id: file.id,\n offset: file.offset,\n size:\n this.twl?.complete && (path === \"arm9i.bin\" || path === \"arm7i.bin\")\n ? this.twl.complete.getProgram(path === \"arm9i.bin\" ? \"arm9i\" : \"arm7i\").length\n : this.addedOverlays.size && (path === \"overarm9.bin\" || path === \"overarm7.bin\")\n ? this.readOverlayTable(path === \"overarm9.bin\").entries.length * 32\n : (file.replacement?.length ?? file.size),\n }));\n }\n hasFile(path: string): boolean {\n return this.paths.has(key(path));\n }\n getFile(path: string): Buffer {\n const entry = this.paths.get(key(path));\n if (!entry) throw new Error(`ROM file not found: ${path}`);\n return Buffer.from(this.fileBytes(entry.file));\n }\n /** Replace an existing file. */\n replaceFile(path: string, content: Uint8Array): void {\n let entry = this.paths.get(key(path));\n if (!entry && (key(path) === \"overarm9.bin\" || key(path) === \"overarm7.bin\")) {\n if (content.byteLength > this.maxOutputSize) throw new RangeError(\"Replacement exceeds output size limit\");\n new OverlayTable(content, 0, content.byteLength, key(path) === \"overarm9.bin\");\n const file: NitroFile = { name: key(path), id: 0xffff, offset: 0, size: 0 };\n entry = { path: file.name, file };\n this.root.files.push(file);\n this.paths.set(file.name, entry);\n this.structureChanged = true;\n }\n if (!entry) throw new Error(`ROM file not found: ${path}`);\n if (this.twl?.complete && content.byteLength > this.maxOutputSize)\n throw new RangeError(\"Replacement exceeds output size limit\");\n if (this.twl?.complete && (key(path) === \"arm9i.bin\" || key(path) === \"arm7i.bin\")) {\n this.twl.complete.setProgram(key(path) === \"arm9i.bin\" ? \"arm9i\" : \"arm7i\", bytes(content));\n return;\n }\n entry.file.replacement = Buffer.from(bytes(content));\n }\n /** Add a NitroFS file and any missing parent directories. */\n addFile(path: string, content: Uint8Array): void {\n const components = path.replaceAll(\"\\\\\", \"/\").split(\"/\");\n if (\n components[0]?.toLowerCase() !== \"data\" ||\n components.length < 2 ||\n components.slice(1).some((name) => !name || name === \".\" || name === \"..\" || name.includes(\"\\0\"))\n )\n throw new Error(`Invalid NitroFS path: ${path}`);\n if (components.length > 258) throw new Error(\"FNT directory depth exceeds 256\");\n if (this.hasFile(path)) throw new Error(`ROM file already exists: ${path}`);\n const replacement = Buffer.from(bytes(content));\n const names: { name: string; nameBytes?: Buffer }[] = components.slice(1).map((name) => ({ name }));\n let existing: NitroFolder | undefined = this.data;\n for (const [index, component] of names.entries()) {\n const normalized = component.name.toLowerCase();\n if (existing?.files.some((file) => file.name.toLowerCase() === normalized))\n throw new Error(`ROM path conflicts with a file: ${path}`);\n const child: NitroFolder | undefined = existing?.folders.find((child) => child.name.toLowerCase() === normalized);\n if (index === names.length - 1 && child) throw new Error(`ROM path conflicts with a directory: ${path}`);\n if (!child) component.nameBytes = encodeName(component.name);\n existing = child;\n }\n let folder = this.data;\n let prefix = \"data\";\n for (const [index, component] of names.entries()) {\n const normalized = component.name.toLowerCase();\n const child = folder.folders.find((child) => child.name.toLowerCase() === normalized);\n if (index === names.length - 1) {\n const file: NitroFile = { ...component, id: -1, offset: -1, size: replacement.length, replacement };\n folder.files.push(file);\n const outputPath = `${prefix}/${file.name}`;\n this.paths.set(key(outputPath), { path: outputPath, file });\n } else {\n if (child) folder = child;\n else {\n const created: NitroFolder = { ...component, id: -1, files: [], folders: [] };\n folder.folders.push(created);\n folder = created;\n }\n prefix += `/${folder.name}`;\n }\n }\n this.structureChanged = true;\n }\n /** Add an overlay; file IDs are assigned when the ROM is serialized. */\n addOverlay(arm9: boolean, metadata: Omit<OverlayItem, \"fileId\">, content: Uint8Array): void {\n const path = `overlay/overlay${arm9 ? \"\" : \"7\"}_${String(metadata.overlayId).padStart(4, \"0\")}.bin`;\n if (!Number.isSafeInteger(metadata.overlayId) || metadata.overlayId < 0 || metadata.overlayId >= 0xffffffff)\n throw new RangeError(\"Invalid overlay ID\");\n if (this.hasFile(path)) throw new Error(`ROM file already exists: ${path}`);\n if (content.byteLength > this.maxOutputSize) throw new RangeError(\"Overlay exceeds output size limit\");\n const entry: OverlayItem = { ...metadata, fileId: 0 };\n const table = new OverlayTable(Buffer.alloc(0), 0, 0, arm9);\n table.entries.push(entry);\n table.toBuffer();\n const replacement = Buffer.from(bytes(content));\n const file: NitroFile = { name: path.slice(8), id: -1, offset: -1, size: replacement.length, replacement };\n const tableName = arm9 ? \"overarm9.bin\" : \"overarm7.bin\";\n if (!this.hasFile(tableName)) this.replaceFile(tableName, Buffer.alloc(0));\n this.overlay.files.push(file);\n this.paths.set(path, { path, file });\n this.addedOverlays.set(path, { arm9, entry });\n this.structureChanged = true;\n }\n private readOverlayTable(arm9: boolean): OverlayTable {\n const original = arm9 ? this.overlay9Table : this.overlay7Table;\n const replacement = this.paths.get(arm9 ? \"overarm9.bin\" : \"overarm7.bin\")?.file.replacement;\n const raw = replacement ?? original.toBuffer();\n const table = new OverlayTable(raw, 0, raw.length, arm9);\n for (const { arm9: target, entry } of this.addedOverlays.values()) {\n if (target !== arm9) continue;\n const existing = table.entries.find((item) => item.overlayId === entry.overlayId);\n if (existing) Object.assign(existing, entry);\n else table.entries.push({ ...entry });\n }\n const ids = new Set<number>();\n for (const entry of table.entries) {\n if (ids.has(entry.overlayId)) throw new Error(`Duplicate overlay ID: ${entry.overlayId}`);\n ids.add(entry.overlayId);\n const path = `overlay/overlay${arm9 ? \"\" : \"7\"}_${String(entry.overlayId).padStart(4, \"0\")}.bin`;\n if (!this.hasFile(path)) throw new Error(`Overlay table entry has no payload: ${path}`);\n }\n if (original.entries.some((entry) => !ids.has(entry.overlayId)))\n throw new Error(\"Removing overlays is unsupported\");\n return table;\n }\n private fileBytes(file: NitroFile): Buffer {\n if (this.twl?.complete && (file.name === \"arm9i.bin\" || file.name === \"arm7i.bin\"))\n return this.twl.complete.getProgram(file.name === \"arm9i.bin\" ? \"arm9i\" : \"arm7i\");\n if (this.addedOverlays.size && (file.name === \"overarm9.bin\" || file.name === \"overarm7.bin\"))\n return this.readOverlayTable(file.name === \"overarm9.bin\").toBuffer();\n return file.replacement ?? range(this.original, file.offset, file.size, file.name);\n }\n\n verifyDsi(): DsiVerification {\n if (this.twl?.complete) return this.twl.complete.verify();\n if (this.header.unitCode & 2)\n return new NDSFile(this.original, { dsiMode: \"complete\", maxOutputSize: this.maxOutputSize }).verifyDsi();\n return noDsiVerification();\n }\n\n /** Rebuild offsets, allocation table, CRCs and ROM padding. Safe to call repeatedly. */\n toBuffer(): Buffer {\n if (\n this.twl?.complete &&\n !this.structureChanged &&\n this.twl.complete.unchanged() &&\n this.header.raw.equals(this.original.subarray(0, this.header.raw.length)) &&\n this.banner\n .toBuffer()\n .equals(new Banner(this.original, this.header.bannerOffset, this.header.banner_size).toBuffer()) &&\n [...this.paths.values()].every(\n ({ file }) =>\n !file.replacement || file.replacement.equals(range(this.original, file.offset, file.size, file.name)),\n )\n ) {\n if (this.original.length > this.maxOutputSize) throw new RangeError(\"Output exceeds size limit\");\n return Buffer.from(this.original);\n }\n const fntReplacement = this.root.files.find((file) => file.name === \"fnt.bin\")?.replacement;\n if (this.structureChanged && fntReplacement) throw new Error(\"Adding files conflicts with an fnt.bin replacement\");\n if (fntReplacement) {\n const replacementTree = new FileNameTable(this.fatTable, fntReplacement, 0, fntReplacement.length);\n const collect = (folder: NitroFolder): number[] =>\n [...folder.files.map((file) => file.id), ...folder.folders.flatMap(collect)].sort((a, b) => a - b);\n if (collect(replacementTree.root).join(\",\") !== collect(this.data).join(\",\"))\n throw new Error(\"Replacement FNT must preserve existing file IDs\");\n }\n const layout = this.structureChanged ? this.fntTable.serialize(this.fatTable, this.overlay.files) : undefined;\n if (this.twl?.complete) return this.serializeDsi(layout);\n const overlayFiles = new Map(this.overlay.files.map((file) => [file.id, file]));\n const h = new Header(this.header.toBuffer());\n h.nitrocode = this.header.nitrocode;\n h.decrypted = this.header.decrypted;\n h.trimmedRom = this.header.trimmedRom;\n h.dlp_signature = this.header.dlp_signature;\n const writer = new BinaryWriter(65536, this.maxOutputSize);\n const system = (name: string): NitroFile => {\n const file = this.root.files.find((file) => file.name === name);\n if (!file) throw new Error(`Missing ROM system file: ${name}`);\n return file;\n };\n const replacedHeader = system(\"header.bin\").replacement;\n if (replacedHeader) {\n const replacement = new Header(replacedHeader);\n h.gameTitle = replacement.gameTitle;\n h.gameCode = replacement.gameCode;\n }\n const placements = new Map<number, { start: number; end: number }>();\n const write = (file: NitroFile, padding = true): void => {\n const id = layout ? (file.id >= 0 ? layout.sourceIds.get(file.id) : layout.ids.get(file)) : file.id;\n if (layout && id !== undefined && placements.has(id)) return;\n if (layout && file.id >= 0) file = overlayFiles.get(file.id) ?? file;\n const start = writer.position;\n writer.write(this.fileBytes(file));\n if (id !== undefined && id !== 0xffff) placements.set(id, { start, end: writer.position });\n if (padding) writer.pad(0x200);\n };\n const overlayIds = new Set<number>();\n const writeOverlays = (arm9: boolean): void => {\n const name = arm9 ? \"overarm9.bin\" : \"overarm7.bin\";\n const entry = this.root.files.find((file) => file.name === name);\n if (!entry) return;\n const table = this.readOverlayTable(arm9);\n const files = this.overlay.files\n .filter((file) => file.name.startsWith(arm9 ? \"overlay_\" : \"overlay7_\"))\n .sort((a, b) => (a.id < 0 ? (b.id < 0 ? 0 : 1) : b.id < 0 ? -1 : a.id - b.id));\n for (const file of files) {\n const item = table.entries.find(\n (item) => file.name === `overlay${arm9 ? \"\" : \"7\"}_${String(item.overlayId).padStart(4, \"0\")}.bin`,\n )!;\n const size = this.fileBytes(layout && file.id >= 0 ? overlayFiles.get(file.id)! : file).length;\n if ((item.reserved >>> 24) & 1 || (!arm9 && item.reserved > 0))\n item.reserved = ((item.reserved & 0xff000000) | (size & 0xffffff)) >>> 0;\n item.fileId = layout ? (file.id >= 0 ? layout.sourceIds.get(file.id)! : layout.ids.get(file)!) : file.id;\n overlayIds.add(file.id);\n }\n const encoded = table.toBuffer();\n if (arm9) {\n h.ARM9overlayOffset = writer.position;\n h.ARM9overlaySize = encoded.length;\n } else {\n h.ARM7overlayOffset = writer.position;\n h.ARM7overlaySize = encoded.length;\n }\n writer.write(encoded);\n writer.pad(0x200);\n for (const file of files) write(file);\n };\n writer.position = h.headerSize;\n h.ARM9romOffset = writer.position;\n const arm9 = system(\"arm9.bin\");\n const arm9Bytes = this.fileBytes(arm9);\n if (arm9.replacement) {\n h.nitrocode = arm9Bytes.length >= 12 && arm9Bytes.readUInt32LE(arm9Bytes.length - 12) === 0xdec00621;\n }\n h.ARM9size = arm9Bytes.length - (h.nitrocode ? 12 : 0);\n write(arm9);\n h.ARM9overlayOffset = 0;\n writeOverlays(true);\n h.ARM7romOffset = writer.position;\n h.ARM7size = this.fileBytes(system(\"arm7.bin\")).length;\n write(system(\"arm7.bin\"));\n h.ARM7overlayOffset = 0;\n writeOverlays(false);\n h.FNToffset = writer.position;\n const fnt = layout?.fnt ?? this.fileBytes(system(\"fnt.bin\"));\n h.FNTsize = fnt.length;\n writer.write(fnt);\n writer.pad(0x200);\n h.FAToffset = writer.position;\n h.FATsize = (layout?.files.length ?? this.fatTable.entries.length) * 8;\n writer.write(Buffer.alloc(h.FATsize));\n writer.pad(0x200);\n h.bannerOffset = writer.position;\n const bannerFile = system(\"banner.bin\");\n const banner = bannerFile.replacement\n ? new Banner(bannerFile.replacement, 0, bannerFile.replacement.length)\n : this.banner;\n const bannerBytes = banner.toBuffer();\n // NTR has no banner_size field; DSi stores its actual banner length.\n if (h.unitCode & 2 && h.headerSize > 0x200) h.banner_size = bannerBytes.length;\n writer.write(bannerBytes);\n writer.pad(0x200);\n if (layout) {\n for (const [index, file] of layout.files.entries()) write(file, index < layout.files.length - 1);\n } else\n for (const [index, id] of this.fatTable.sortedIDs.entries()) {\n if (overlayIds.has(id)) continue;\n const file = FileNameTable.findFile(id, this.root);\n if (file) write(file, index < this.fatTable.sortedIDs.length - 1);\n else {\n // Games can address FAT entries directly without a NitroFS filename.\n // Keep their payload and allocation instead of silently zeroing the entry.\n const entry = this.fatTable.entries[id];\n if (entry.size > 0) {\n write({ ...entry, name: `FAT entry ${id}` }, index < this.fatTable.sortedIDs.length - 1);\n }\n }\n }\n const logicalEnd = writer.position;\n const fat = Buffer.alloc(h.FATsize);\n for (const [id, location] of placements) {\n fat.writeUInt32LE(location.start, id * 8);\n fat.writeUInt32LE(location.end, id * 8 + 4);\n }\n writer.position = h.FAToffset;\n writer.write(fat);\n writer.position = logicalEnd;\n // An ARM9 replacement can add or remove the decrypted secure-area marker.\n // Both TWL hashing and the header CRC must use the bytes being serialized.\n h.decrypted = writer.length >= 0x4008 && writer.buffer.readBigUInt64LE(0x4000) === 0xe7ffdeffe7ffdeffn;\n if (this.twl) this.twl.writeTo(writer, h);\n h.ROMsize = writer.position;\n h.size = 2 ** Math.ceil(Math.log2(Math.max(h.ROMsize + h.dlp_signature.length, 0x20000)));\n const secure = writer.toBuffer().subarray(0x4000, 0x8000);\n h.secureCRC16 = crc16(h.decrypted ? encryptSecureArea(h.gameCode, secure) : secure);\n writer.position = 0;\n writer.write(h.toBuffer());\n writer.position = h.ROMsize;\n writer.write(h.dlp_signature);\n writer.fillTo(h.size);\n return writer.toBuffer();\n }\n async saveAs(path: string): Promise<void> {\n await writeFile(path, this.toBuffer());\n }\n\n private serializeDsi(layout: ReturnType<FileNameTable[\"serialize\"]> | undefined): Buffer {\n const twl = this.twl!.complete!;\n const h = new Header(this.header.raw);\n h.nitrocode = this.header.nitrocode;\n const system = (name: string): NitroFile => this.paths.get(name)!.file;\n const replacement = system(\"header.bin\").replacement;\n if (replacement) {\n const source = new Header(replacement);\n if (\n source.unitCode !== 2 ||\n source.tid_high !== h.tid_high ||\n source.tid_low !== h.tid_low ||\n (h.dsi9_size && !source.dsi9_size) ||\n (h.dsi7_size && !source.dsi7_size)\n )\n throw new Error(\"Replacement header changes or clears the DSi cartridge identity or programs\");\n // Preserve semantic and unknown header bytes; physical fields are assigned below.\n source.raw.copy(h.raw);\n for (const [start, end] of [\n [0x20, 0x40],\n [0x40, 0x60],\n [0x68, 0x6e],\n [0x80, 0x88],\n [0x90, 0x94],\n [0x1c0, 0x1c4],\n [0x1cc, 0x1d4],\n [0x1dc, 0x214],\n [0x220, 0x230],\n [0x300, 0x378],\n [0x3a0, 0x3b4],\n [0xf80, 0x1000],\n ])\n this.header.raw.copy(h.raw, start, start, end);\n h.ARM9entryAddress = source.ARM9entryAddress;\n h.ARM9ramAddress = source.ARM9ramAddress;\n h.ARM7entryAddress = source.ARM7entryAddress;\n h.ARM7ramAddress = source.ARM7ramAddress;\n h.dsi7_ram_address = source.dsi7_ram_address;\n h.headerSize = this.header.headerSize;\n }\n const sections: DsiSection[] = [];\n const add = (label: string, file: NitroFile, data: Buffer, place: (start: number) => void): void => {\n sections.push({ label, start: file.offset, originalSize: file.size, data, place });\n };\n const arm9File = system(\"arm9.bin\");\n let arm9 = this.fileBytes(arm9File);\n if (arm9File.replacement) h.nitrocode = arm9.length >= 12 && arm9.readUInt32LE(arm9.length - 12) === 0xdec00621;\n if (h.gameCode !== twl.header.gameCode && arm9.readBigUInt64LE(0) !== 0xe7ffdeffe7ffdeffn)\n arm9 = encryptSecureArea(h.gameCode, decryptSecureArea(twl.header.gameCode, arm9));\n const signedOverlays = this.readOverlayTable(true).entries.filter((entry) => entry.reserved & 0x2000000);\n if (signedOverlays.length !== twl.Overlays9Sha1Hmac.length) {\n if (!arm9File.replacement) throw new Error(\"Changing signed overlay count requires an ARM9 replacement\");\n } else\n arm9 = twl.updateOverlays9Sha1Hmac(\n arm9,\n h,\n signedOverlays.map((entry) => this.getFile(`overlay/overlay_${String(entry.overlayId).padStart(4, \"0\")}.bin`)),\n );\n h.ARM9size = arm9.length - (h.nitrocode ? 12 : 0);\n h.decrypted = arm9.length >= 8 && arm9.readBigUInt64LE(0) === 0xe7ffdeffe7ffdeffn;\n const plainArm9 = h.decrypted ? Buffer.from(arm9) : decryptSecureArea(h.gameCode, arm9);\n plainArm9.writeUInt16LE(crc16(range(plainArm9, 0x10, 0x7f0, \"ARM9 secure-area CRC\")), 0xe);\n arm9 = h.decrypted ? plainArm9 : encryptSecureArea(h.gameCode, plainArm9);\n add(\"ARM9\", arm9File, arm9, (start) => {\n h.ARM9romOffset = start;\n });\n const written = new Set<number>();\n const fileList =\n layout?.files ??\n this.fatTable.entries.map(\n (entry) => FileNameTable.findFile(entry.id, this.root) ?? { ...entry, name: `FAT entry ${entry.id}` },\n );\n const fat = Buffer.alloc(fileList.length * 8);\n const addPayload = (file: NitroFile): void => {\n const id = layout ? (file.id >= 0 ? layout.sourceIds.get(file.id)! : layout.ids.get(file)!) : file.id;\n if (written.has(id)) return;\n written.add(id);\n const overlay = file.id >= 0 ? this.overlay.files.find((overlay) => overlay.id === file.id) : undefined;\n if (overlay) file = overlay;\n const data = this.fileBytes(file);\n add(file.name, file, data, (start) => {\n fat.writeUInt32LE(start, id * 8);\n fat.writeUInt32LE(start + data.length, id * 8 + 4);\n });\n };\n const overlays = (arm9: boolean): void => {\n const name = arm9 ? \"overarm9.bin\" : \"overarm7.bin\";\n if (!this.hasFile(name)) return;\n const file = system(name);\n const table = this.readOverlayTable(arm9);\n for (const entry of table.entries) {\n const payload = this.paths.get(\n `overlay/overlay${arm9 ? \"\" : \"7\"}_${String(entry.overlayId).padStart(4, \"0\")}.bin`,\n )!.file;\n const size = this.fileBytes(payload).length;\n if ((entry.reserved >>> 24) & 1 || (!arm9 && entry.reserved > 0))\n entry.reserved = ((entry.reserved & 0xff000000) | size) >>> 0;\n entry.fileId = layout\n ? payload.id >= 0\n ? layout.sourceIds.get(payload.id)!\n : layout.ids.get(payload)!\n : payload.id;\n }\n add(name, file, table.toBuffer(), (start) => {\n if (arm9) {\n h.ARM9overlayOffset = start;\n h.ARM9overlaySize = table.entries.length * 32;\n } else {\n h.ARM7overlayOffset = start;\n h.ARM7overlaySize = table.entries.length * 32;\n }\n });\n for (const entry of table.entries)\n addPayload(\n this.paths.get(`overlay/overlay${arm9 ? \"\" : \"7\"}_${String(entry.overlayId).padStart(4, \"0\")}.bin`)!.file,\n );\n };\n overlays(true);\n const arm7 = system(\"arm7.bin\");\n h.ARM7size = this.fileBytes(arm7).length;\n add(\"ARM7\", arm7, this.fileBytes(arm7), (start) => {\n h.ARM7romOffset = start;\n });\n overlays(false);\n const fnt = layout?.fnt ?? this.fileBytes(system(\"fnt.bin\"));\n h.FNTsize = fnt.length;\n add(\"FNT\", system(\"fnt.bin\"), fnt, (start) => {\n h.FNToffset = start;\n });\n h.FATsize = fat.length;\n add(\"FAT\", system(\"fat.bin\"), fat, (start) => {\n h.FAToffset = start;\n });\n const bannerFile = system(\"banner.bin\");\n const banner = bannerFile.replacement\n ? new Banner(bannerFile.replacement, 0, bannerFile.replacement.length)\n : this.banner;\n const bannerBytes = banner.toBuffer();\n h.banner_size = bannerBytes.length;\n add(\"Banner\", bannerFile, bannerBytes, (start) => {\n h.bannerOffset = start;\n });\n for (const file of fileList) addPayload(file);\n return twl.serialize(h, sections, !!layout);\n }\n}\n"],"mappings":"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","names":["key","key","a","b","field","program","key","bytes","hash","field","key","child","file","arm9","item","overlay"]}
|