From 26772b49c86b030fc09623dadb14bf1865538f7d Mon Sep 17 00:00:00 2001 From: 3DSGuy <3dsguy.dev@gmail.com> Date: Tue, 1 Apr 2014 14:08:00 +0800 Subject: [PATCH] makerom v0.5 --- Application.rsf | 89 --- Application2.rsf | 297 ---------- Makefile | 4 +- accessdesc_sig.h | 320 ----------- cia.c | 447 ++++++++------- cia.h | 139 +++-- cia_certificates.h | 670 ---------------------- crypto.c | 37 ++ crypto.h | 1 + desc_dev_sigdata.h | 118 ++++ desc_presets.h | 85 +++ desc_prod_sigdata.h | 38 ++ keys_debug.h => dpki.h | 178 ++++-- dpki_legacy.h | 201 +++++++ elf.c | 454 +++++++-------- elf.h | 76 +-- elf_hdr.h | 83 +-- exefs.c | 30 +- exheader.c | 1182 +++++++++++++++++++++------------------ exheader.h | 209 +++---- keys_common.h | 83 --- keyset.c | 467 +++++++++++++--- keyset.h | 85 +-- makerom.c | 72 +-- ncch.c | 811 +++++++++++++-------------- ncch.h | 205 ++++--- ncch_backup.c | 1104 ++++++++++++++++++++++++++++++++++++ ncsd.c | 282 +++++----- ncsd.h | 88 +-- keys_retail.h => ppki.h | 280 ++++++++-- ppki_legacy.h | 20 + romfs.c | 14 +- srl.h | 10 +- tik.c | 67 ++- tik.h | 65 +-- titleid.c | 24 +- tmd.c | 84 +-- tmd.h | 76 +-- tpki.h | 417 ++++++++++++++ usersettings.c | 681 +++++++++++++--------- usersettings.h | 116 ++-- utils.c | 2 +- utils.h | 2 +- yaml_ctr.c | 48 +- yaml_ctr.h | 1 + 45 files changed, 5630 insertions(+), 4132 deletions(-) delete mode 100644 Application.rsf delete mode 100644 Application2.rsf delete mode 100644 accessdesc_sig.h delete mode 100644 cia_certificates.h create mode 100644 desc_dev_sigdata.h create mode 100644 desc_presets.h create mode 100644 desc_prod_sigdata.h rename keys_debug.h => dpki.h (82%) create mode 100644 dpki_legacy.h delete mode 100644 keys_common.h create mode 100644 ncch_backup.c rename keys_retail.h => ppki.h (66%) create mode 100644 ppki_legacy.h create mode 100644 tpki.h diff --git a/Application.rsf b/Application.rsf deleted file mode 100644 index 40c230e..0000000 --- a/Application.rsf +++ /dev/null @@ -1,89 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - #UseOtherVariationSaveData : true - #UseExtSaveData : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - FileSystemAccess: - #- CategorySystemApplication #0x1 - #- CategoryHardwareCheck #0x2 - #- CategoryFileSystemTool #0x4 - - Debug #0x8 - #- TwlCardBackup #0x10 - #- TwlNandData #0x20 - #- Boss #0x40 - - DirectSdmc #0x80 - #- Core #0x100 - #- CtrNandRo #0x200 - #- CtrNandRw #0x400 - #- CtrNandRoWrite #0x800 - #- CategorySystemSettings #0x1000 - #- CardBoard #0x2000 - #- ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - -SystemControlInfo: - RemasterVersion: 5 - StackSize: 0x40000 - #JumpId: 0 \ No newline at end of file diff --git a/Application2.rsf b/Application2.rsf deleted file mode 100644 index 0784ef3..0000000 --- a/Application2.rsf +++ /dev/null @@ -1,297 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - MaxCpu: 0x0 # 0x9E - DisableDebug : true - EnableForceDebug : true - CanWriteSharedPage : true - CanUsePrivilegedPriority : true - CanUseNonAlphabetAndNumber : true - PermitMainFunctionArgument : true - CanShareDeviceMemory : true - #UseOtherVariationSaveData : true - #UseExtSaveData : true - RunnableOnSleep : true - SpecialMemoryArrange : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - IoAccessControl: - - FsMountNand # 0x1 - - FsMountNandRoWrite #0x2 - - FsMountTwln #0x4 - - FsMountWnand # 0x8 - - FsMountCardSpi #0x10 - - UseSdif3 # 0x20 - - CreateSeed # 0x40 - - UseCardSpi # 0x80 - FileSystemAccess: - - CategorySystemApplication #0x1 - - CategoryHardwareCheck #0x2 - - CategoryFileSystemTool #0x4 - - Debug #0x8 - - TwlCardBackup #0x10 - - TwlNandData #0x20 - - Boss #0x40 - - DirectSdmc #0x80 - - Core #0x100 - - CtrNandRo #0x200 - - CtrNandRw #0x400 - - CtrNandRoWrite #0x800 - - CategorySystemSettings #0x1000 - - CardBoard #0x2000 - - ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - InterruptNumbers: - - 0x1 - AffinityMask: 1 - DescVersion: 2 - DisableDebug: false - SystemCallAccess: - ArbitrateAddress: 34 - Break: 60 - CancelTimer: 28 - ClearEvent: 25 - ClearTimer: 29 - CloseHandle: 35 - ConnectToPort: 45 - ControlMemory: 1 - CreateAddressArbiter: 33 - CreateEvent: 23 - CreateMemoryBlock: 30 - CreateMutex: 19 - CreateSemaphore: 21 - CreateThread: 8 - CreateTimer: 26 - DuplicateHandle: 39 - ExitProcess: 3 - ExitThread: 9 - GetCurrentProcessorNumber: 17 - GetHandleInfo: 41 - GetProcessId: 53 - GetProcessIdOfThread: 54 - GetProcessIdealProcessor: 6 - GetProcessInfo: 43 - GetResourceLimit: 56 - GetResourceLimitCurrentValues: 58 - GetResourceLimitLimitValues: 57 - GetSystemInfo: 42 - GetSystemTick: 40 - GetThreadContext: 59 - GetThreadId: 55 - GetThreadIdealProcessor: 15 - GetThreadInfo: 44 - GetThreadPriority: 11 - MapMemoryBlock: 31 - OutputDebugString: 61 - QueryMemory: 2 - ReleaseMutex: 20 - ReleaseSemaphore: 22 - SendSyncRequest1: 46 - SendSyncRequest2: 47 - SendSyncRequest3: 48 - SendSyncRequest4: 49 - SendSyncRequest: 50 - SetThreadPriority: 12 - SetTimer: 27 - SignalEvent: 24 - SleepThread: 10 - UnmapMemoryBlock: 32 - WaitSynchronization1: 36 - WaitSynchronizationN: 37 - HandleTableSize: 512 - IORegisterMapping: - - 1ff50000-1ff57fff - - 1ff70000-1ff77fff - IdealProcessor: 0 - MemoryMapping: - - 1f000000-1f5fffff:r - MemoryType: Application - Priority: 16 - ProgramId: 0x00040000ffffff00L - ReleaseKernelMajor: "02" - ReleaseKernelMinor: "33" - ServiceAccessControl: - - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - - ac:u - - boss:U - - cam:u - - cecd:u - - cfg:u - - dlp:FKCL - - dlp:SRVR - - dsp::DSP - - frd:u - - fs:USER - - gsp::Gpu - - hid:USER - - http:C - - mic:u - - ndm:u - - news:u - - nwm::UDS - - ptm:u - - pxi:dev - - soc:U - - ssl:C - - y2r:u - - ldr:ro - - ir:USER - CoreVersion: 2 - StorageId: - - 0 - -SystemControlInfo: - RemasterVersion: 5 - Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L - StackSize: 0x40000 - -CommonHeaderKey: - D: | - jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt - aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP - g6ylH2l0EikrIVjy2uMlFgl0QJCrG+QGKHftxhaGCifdAwFNmiZuyJ/TmktZ - 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E - nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 - Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== - DP: | - pD8c9uymjXDj6oyhx7EmQcrEDizxsj6hTjJ0x3G/PYNv/v2/DA9gp3X30h35 - uRZ1O+SgonWCGVnOJ7Wfjr4w2cOcSzxpzT3PQsS6Gs9z0RvcDsUHRL5f2EiT - 6A1ZPj6xyzmo9Ts6w9yfxCwaHci0f2hP9bq9FimfFKigCoNcFBE= - DQ: | - y+6Pado7N+SIZJgQ7zEGyQ7/SxGHHEy5uW04HHde9IqHD5HFGG2GegF655mM - iI9ja1eTCh/AFs8xjAg0drQEvB5q80TjPNKtwVUT8ghOlN3xTzpdaLwX0d+c - Twy74VY4KPawcdDeLaGFtXknhFOdGmIbx+BInibz7NZ9eLqGwaE= - Exponent: | - AQAB - InverseQ: | - tc9/lcF837g8AdfyeuCyuLyd36Zm1ZmJ1VSSuH8y3/1ZhBYZkOFXxU7EhMvJ - FyAu4qyCA9otzCXM+cqKxE3ZCkSconsXOu8szZTwuINSkwHlt22FtiTfPt+V - /g5kjtkjoZVOGfSvvfel9Smwy1yrFvKfi/yJsjATeNFjiEquV/w= - Modulus: | - z+yySANtuAnjXGxiLKlJ4fT0DGzD5S+dUKArWgDGcgALowRdlEbnABtIhbVh - LMl0yitDE8F4l1wzLwfHhfDa22CWUA98S3rXF53k5cOrb12leDKtBN2Wbtx1 - /8Iv+qLuRonNrmmSpEi8RkfEjIlj4QpNHNxGL1twinzpIpwJC6iXQMoqfYSh - BEou29fQZEOc0HgRQYgz3TFikC0X8sapK5xwq9zTq13a7j1sDoH/9mdaRPms - Bz0jlHVlkyAMxXYdD2UGPSGi8JaAtwpJUzijXcB0PKTZQDaFH4zRLRX57ySp - fp2yHvigcoEXd3OxVn+tBaLSMFr1068PEEpS2AlHlw== - P: | - 6SdD3AiAybNamgUgGJduyFWO1/LeakmoJm+23IEJADyU4nz+reGjxQnMrR+x - syuB8VPGuf1z0SInfRIu9PEjIfW9/H/fZ59GwckQuJbneODjW7KU1jM3cTVX - +AWvaxWDwlCUmVSYD2OySUJlo3szGmBYh/o/tKAq7kElaaOt+cc= - Q: | - 5EyO8bCyfqgLTfipAG/nNLObQbqMyARdQfudxh4eQqHmzblEM3jareuA8eUZ - K8pIaP+U9UfxwWTeFsOulrpsm04j4gS71WGNx3YwOIRPXXOn7zBkxA3AO9qq - K8lMeV3gNsdt4Fz8Zh2F68HSP4avB+ThO2S18SXMyIkcM7Sbw7E= - Signature: | - 3xyLmORvojVswxgXmPPOVH4ULn8e2G3PvClO/jIuwRGtRprGcOruKFUi4TYF - HASKzg8Mg4/I1t4RjurPrZvPgQ3rcROz066DAkwOEFBZPO5gBvuMf8IgJAFi - VYdgD636cy72ZWLS5RBFaXA5A9E57FDB1CU5spARTpXLGevKD7X6x7Di1+Bx - w+VVM55c3E07URENMXiWytcYWO4A6SjyaHbUV/5lsUtJP/amWErH/MS7YbxY - jVVl5gp5OUG4gGH3BcP+1osJgsJfplb57h0OBj6fP/GTmk+i1ZGHiv7Pw/yK - scR46dEa97HTIMuDvgPVyqVeF6aRENS+I9ZLTwOprg== - Descriptor: | - AP///wAABAACAAAAAAAFGJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIAAAAAAAABBUFQ6VQAAACRo - aW9GSU8AJGhvc3RpbzAkaG9zdGlvMWFjOnUAAAAAYm9zczpVAABjYW06dQAA - AGNlY2Q6dQAAY2ZnOnUAAABkbHA6RktDTGRscDpTUlZSZHNwOjpEU1BmcmQ6 - dQAAAGZzOlVTRVIAZ3NwOjpHcHVoaWQ6VVNFUmh0dHA6QwAAbWljOnUAAABu - ZG06dQAAAG5ld3M6dQAAbndtOjpVRFNwdG06dQAAAHB4aTpkZXYAc29jOlUA - AABzc2w6QwAAAHkycjp1AAAAbGRyOnJvAABpcjpVU0VSAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B - AQD/AAIA/iECAPz///////////////////////////////////////////// - ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAI= \ No newline at end of file diff --git a/Makefile b/Makefile index 26672a5..6c9278b 100644 --- a/Makefile +++ b/Makefile @@ -19,9 +19,9 @@ CFLAGS = --std=c99 -Wall -I. -DMAKEROM_VER_MAJOR=$(VER_MAJOR) -DMAKEROM_VER_MINO CC = gcc # MAKEROM Build Settings -MAKEROM_BUILD_FLAGS = #-DDEBUG #-DELF_DEBUG +MAKEROM_BUILD_FLAGS = #-DDEBUG #-DPUBLIC_BUILD VER_MAJOR = 0 -VER_MINOR = 3 +VER_MINOR = 5 OUTPUT = makerom main: build diff --git a/accessdesc_sig.h b/accessdesc_sig.h deleted file mode 100644 index 8cbe2ee..0000000 --- a/accessdesc_sig.h +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef _ACCESSDESC_SIG_H_ -#define _ACCESSDESC_SIG_H_ - -/* CTR_SDK 1 (1.2.0) */ -// DependencyList -static const unsigned char sdk1_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk1_HdrPubK[0x100] = -{ - 0x9B, 0x82, 0x9C, 0x19, 0x01, 0x73, 0x23, 0x50, 0x89, 0xE3, 0x0B, 0xC8, 0x8F, 0xFB, 0xA5, 0xE4, 0xFD, 0x44, 0xAE, 0x49, 0x32, 0xC7, 0xEF, 0x0A, 0x7E, 0x93, 0x95, 0xBA, 0xA2, 0x48, 0x4D, 0x8E, 0x18, 0x82, 0x34, 0x66, 0xFE, 0xDA, 0x7A, 0x45, 0x4A, 0x7D, 0xD5, 0x3C, 0xC6, 0x5C, 0xE0, 0x71, 0xFC, 0xD0, 0x82, 0xCC, 0xB2, 0xCF, 0x77, 0x0E, 0xAD, 0xCD, 0xD2, 0xAC, 0x1D, 0x66, 0x1B, 0xC1, 0xEA, 0xAC, 0x39, 0x96, 0x2C, 0x52, 0xDE, 0xFF, 0xF2, 0x74, 0xF6, 0xC5, 0xCA, 0x99, 0x31, 0x95, 0x13, 0xBB, 0x3F, 0xED, 0x30, 0xAE, 0x0A, 0xD3, 0x86, 0x0D, 0x0B, 0xF5, 0x56, 0x7D, 0x33, 0xBA, 0xA1, 0x39, 0xA2, 0xF5, 0xB6, 0x47, 0x78, 0x1F, 0xFD, 0x04, 0xA3, 0x49, 0xA9, 0x10, 0xD3, 0x41, 0x2E, 0x92, 0x7D, 0xE1, 0xA4, 0xA8, 0x02, 0x18, 0x01, 0x2C, 0xC2, 0x61, 0xB1, 0xAC, 0xCB, 0xB3, 0x7A, 0x64, 0xB1, 0xC3, 0xE6, 0x3B, 0x50, 0xAD, 0xDD, 0x55, 0xAB, 0x28, 0xDA, 0x59, 0xE7, 0x57, 0x6A, 0x76, 0x4F, 0x6B, 0x08, 0xD1, 0x61, 0x7D, 0x28, 0xD5, 0x88, 0x7B, 0x8E, 0x80, 0x78, 0xF3, 0xFF, 0x50, 0x00, 0xBD, 0x73, 0xFB, 0x62, 0xB3, 0xCA, 0xA8, 0x05, 0x48, 0xE6, 0xE6, 0x71, 0xB5, 0xAC, 0xDA, 0xE9, 0xC6, 0x1F, 0x9B, 0x72, 0x98, 0x2E, 0xFF, 0xB2, 0x9C, 0x36, 0x9F, 0x7E, 0x7D, 0x25, 0x65, 0x6F, 0xB0, 0x60, 0xB1, 0xB5, 0x5F, 0xCF, 0x74, 0x29, 0x91, 0x9D, 0xAB, 0x84, 0x97, 0x1A, 0x27, 0x5D, 0x69, 0x49, 0x16, 0xF8, 0x77, 0x31, 0x26, 0x3E, 0x6F, 0x97, 0x41, 0x4A, 0x26, 0xFD, 0x5B, 0xAB, 0x65, 0x77, 0x45, 0x1C, 0x76, 0x15, 0xDC, 0x1A, 0x63, 0x0F, 0x51, 0x2D, 0xA0, 0x07, 0x6E, 0xE5, 0x29, 0xD3, 0x37, 0x4B, 0xE5, 0x7F, 0xBB, 0x23, 0xD0, 0x2B, 0xB9, 0x76, 0x1F -}; - -static const unsigned char App_sdk1_HdrPrivK[0x100] = -{ - 0x66, 0x9F, 0xB5, 0xC5, 0xA6, 0xB8, 0x45, 0xD8, 0xD3, 0x75, 0xFB, 0x03, 0xBB, 0x48, 0xF5, 0x7C, 0x7D, 0x4B, 0x02, 0xBD, 0x19, 0x7E, 0xE9, 0x98, 0x02, 0x5A, 0x00, 0xD8, 0x6E, 0x59, 0xCA, 0x9C, 0x78, 0x3E, 0x0C, 0xB8, 0xDF, 0x7C, 0x6C, 0x6E, 0x27, 0xAF, 0x8C, 0xB6, 0x13, 0xAD, 0x9D, 0x0C, 0x7C, 0x2B, 0x59, 0xF6, 0x1E, 0x16, 0x5D, 0x5A, 0x59, 0x86, 0x57, 0x7D, 0xEF, 0xD4, 0xBF, 0x82, 0xA4, 0x0C, 0x4D, 0xE0, 0x75, 0x95, 0xA6, 0xC6, 0x3F, 0x49, 0xC2, 0xC4, 0x5A, 0x63, 0xE8, 0x5D, 0x99, 0xEC, 0xDB, 0x4D, 0xFA, 0xEF, 0x10, 0x03, 0xF1, 0x15, 0xD1, 0x0B, 0x71, 0xAD, 0x24, 0x23, 0x08, 0x5C, 0x91, 0xD7, 0x17, 0x18, 0x69, 0x04, 0xAB, 0x23, 0x91, 0x62, 0x7D, 0xE8, 0xB5, 0x90, 0xF1, 0x5C, 0x09, 0x28, 0x8C, 0x51, 0xB7, 0x38, 0x02, 0x26, 0x78, 0x8C, 0xA2, 0x05, 0x07, 0x53, 0x7D, 0x99, 0x46, 0xFD, 0x12, 0x77, 0x32, 0x0E, 0xA8, 0x54, 0xE3, 0x32, 0x0E, 0x93, 0x05, 0x10, 0xFA, 0x59, 0x7A, 0x5D, 0x2E, 0xDE, 0x32, 0xE8, 0xE9, 0xF0, 0x27, 0x4E, 0x08, 0x83, 0x08, 0xD4, 0x92, 0x58, 0x4D, 0x6D, 0x34, 0x9F, 0xD9, 0xAF, 0xA9, 0x01, 0x62, 0xB5, 0x1A, 0x1D, 0x7E, 0x8D, 0xBB, 0x8A, 0x58, 0xBA, 0xFF, 0xB4, 0xD3, 0x75, 0xF3, 0x44, 0xE7, 0x13, 0x05, 0xC6, 0xC5, 0xA4, 0xD2, 0x6B, 0x18, 0x31, 0x9F, 0xBE, 0x42, 0x45, 0x82, 0x2E, 0x47, 0x9B, 0x26, 0x73, 0x28, 0xD7, 0x9A, 0x64, 0xA6, 0x3D, 0x38, 0x9C, 0x11, 0x36, 0x01, 0x5B, 0x82, 0x2F, 0x7E, 0xA8, 0xC4, 0x82, 0x15, 0x6C, 0x0B, 0xBA, 0x1C, 0x58, 0xF5, 0x81, 0xF9, 0x45, 0xA9, 0xC6, 0x05, 0x6A, 0x2C, 0xA6, 0xCF, 0xF5, 0xDF, 0xEB, 0xBB, 0xC0, 0x92, 0xE3, 0xA6, 0x9D, 0x23, 0x09, 0x09, 0x0E, 0x98, 0x39 -}; - -static const unsigned char App_sdk1_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk1_AcexSig[0x100] = -{ - 0x05, 0x90, 0xAF, 0x65, 0x16, 0x9F, 0x18, 0x2C, 0x17, 0x78, 0x9F, 0xDF, 0xB6, 0x37, 0xCF, 0x26, 0x9B, 0x1B, 0x75, 0x51, 0xB8, 0x57, 0xA3, 0x8F, 0xD7, 0x93, 0x19, 0x61, 0x81, 0x0D, 0x3D, 0xBC, 0x36, 0x50, 0x53, 0xDA, 0x7D, 0xA9, 0x7F, 0xAA, 0x3E, 0x51, 0x2C, 0x75, 0xA1, 0xB9, 0xB1, 0x56, 0xEB, 0x2A, 0x46, 0x21, 0xEC, 0x4F, 0xA7, 0x0C, 0xA1, 0xA8, 0xFD, 0xEE, 0xA3, 0x4A, 0xFD, 0x54, 0xB0, 0x3A, 0x49, 0x5C, 0x8F, 0x8D, 0xB2, 0xBC, 0x32, 0x50, 0x7E, 0x2C, 0x50, 0xD2, 0x1A, 0x6B, 0x61, 0xCB, 0x2A, 0xC9, 0x7E, 0x6E, 0x6A, 0xC8, 0xD6, 0x9B, 0x21, 0xE7, 0x3B, 0xB8, 0x39, 0x1C, 0xD7, 0xEB, 0x69, 0x35, 0xF5, 0xBC, 0xB5, 0x23, 0x54, 0x81, 0x4F, 0x73, 0xAB, 0x9C, 0x55, 0xF0, 0x04, 0x0B, 0x4A, 0xEA, 0x54, 0x08, 0xBF, 0x36, 0x28, 0x12, 0x5E, 0x44, 0x41, 0xF5, 0x3D, 0xFE, 0xA7, 0x6B, 0x35, 0xF2, 0x9A, 0xF2, 0x88, 0xCD, 0xD6, 0x2E, 0x7B, 0xF3, 0xF5, 0x0D, 0x06, 0x2E, 0x13, 0x4F, 0x78, 0xEE, 0x27, 0xAB, 0x31, 0x06, 0x62, 0xE9, 0xB2, 0x3E, 0xC6, 0x99, 0xD7, 0xA9, 0xCC, 0x21, 0x70, 0xD7, 0xCD, 0x9F, 0x03, 0x66, 0x91, 0x7E, 0xBD, 0x3E, 0x83, 0xC4, 0xFF, 0xC9, 0xAA, 0x7E, 0x27, 0xAE, 0x5C, 0x37, 0x7D, 0x93, 0x57, 0x60, 0xB9, 0x0B, 0x71, 0x43, 0x8A, 0x2F, 0x43, 0x50, 0x94, 0xF8, 0x0D, 0x40, 0xCC, 0x64, 0x16, 0x09, 0x70, 0xCD, 0x03, 0xCA, 0x95, 0x30, 0x20, 0xE2, 0x85, 0x2F, 0x2A, 0xCF, 0x65, 0xAA, 0xE9, 0xCF, 0x1F, 0x57, 0xC1, 0x8F, 0xD5, 0x46, 0x51, 0x5A, 0x99, 0x60, 0x65, 0x93, 0xA9, 0xBB, 0xEA, 0x5F, 0xA0, 0x47, 0xD7, 0x11, 0x04, 0xC7, 0xB4, 0x82, 0x66, 0x24, 0x17, 0x17, 0x5E, 0x9D, 0xC8, 0x50, 0x80, 0x63, 0x28, 0xB3, 0xF8, 0xE3 -}; - -// DLP -static const unsigned char Dlp_sdk1_HdrPubK[0x100] = -{ - 0xD9, 0xF0, 0xC9, 0x35, 0x1E, 0x55, 0xD8, 0x7E, 0x96, 0x53, 0x33, 0x34, 0xBB, 0x8A, 0xAE, 0x03, 0x92, 0x35, 0xE2, 0x05, 0x58, 0x7C, 0xCC, 0x08, 0xB2, 0xDF, 0x43, 0x41, 0xB7, 0x7A, 0xB5, 0x29, 0xEE, 0x4E, 0xF3, 0xC7, 0x35, 0x3B, 0x7E, 0xC5, 0xEE, 0x74, 0xF0, 0xAA, 0x7E, 0x60, 0xF1, 0x28, 0x35, 0x17, 0xD6, 0xC9, 0x9A, 0xF2, 0x84, 0xFE, 0xC8, 0x93, 0x86, 0xF7, 0xA7, 0x36, 0xA6, 0xB0, 0x28, 0xDC, 0xE8, 0x38, 0x0B, 0x54, 0x42, 0x8D, 0x4E, 0x4B, 0x55, 0x0F, 0x4A, 0x0D, 0x72, 0xA0, 0x23, 0xC9, 0x68, 0x22, 0x37, 0x31, 0x88, 0x2C, 0x05, 0x49, 0x86, 0x80, 0x9A, 0xFC, 0x1D, 0x02, 0xE3, 0x20, 0x15, 0x0C, 0x7E, 0x28, 0x40, 0x57, 0xEF, 0xA7, 0xBC, 0xAA, 0xC5, 0xD6, 0xD7, 0x6F, 0xF9, 0x26, 0x9A, 0x32, 0xB2, 0x9E, 0x10, 0x5F, 0x93, 0xE6, 0xB2, 0xC6, 0xB2, 0x62, 0x34, 0x6A, 0xB0, 0xD9, 0x71, 0x3B, 0x0F, 0x34, 0x6C, 0xB1, 0xFE, 0x3A, 0x39, 0xDE, 0x3D, 0x6A, 0xCB, 0x32, 0x95, 0xFA, 0x18, 0x4F, 0xF4, 0xEB, 0x5F, 0x20, 0xE4, 0xEF, 0x64, 0xC5, 0x06, 0x27, 0xC3, 0x44, 0x2A, 0x39, 0x35, 0xD8, 0x00, 0xDF, 0x00, 0xAD, 0xC4, 0x98, 0x06, 0x52, 0xD8, 0x4A, 0xC5, 0x2A, 0x7F, 0x77, 0x50, 0x62, 0x7E, 0x05, 0x3E, 0x8C, 0x28, 0x0A, 0x26, 0xD2, 0x6C, 0x9B, 0x27, 0x65, 0xE9, 0x77, 0x68, 0xE9, 0xE6, 0xAA, 0xBA, 0xF5, 0x85, 0xFC, 0x75, 0x07, 0x84, 0xB2, 0xCA, 0x35, 0x85, 0x52, 0x10, 0x08, 0xEF, 0x85, 0xD3, 0x70, 0x17, 0x31, 0xE1, 0x44, 0xF6, 0x34, 0xDF, 0x7C, 0x42, 0xF7, 0x74, 0xAA, 0xFC, 0xC3, 0xE4, 0x84, 0x2D, 0xBF, 0x15, 0x1E, 0x84, 0x00, 0xE3, 0x80, 0xD7, 0x89, 0x56, 0xEE, 0x60, 0x09, 0x1F, 0xD3, 0xBF, 0xBF, 0x50, 0x8F, 0xA3, 0x0C, 0x72, 0x3F -}; - -static const unsigned char Dlp_sdk1_HdrPrivK[0x100] = -{ - 0x10, 0x19, 0x3A, 0x33, 0xA3, 0x47, 0x02, 0x13, 0xEF, 0xB4, 0xBB, 0x9E, 0x94, 0x8F, 0xDC, 0xE4, 0xC4, 0xA3, 0x18, 0x4B, 0xFE, 0xCA, 0x51, 0x23, 0xFF, 0x5A, 0x80, 0x94, 0x55, 0x22, 0x4A, 0x49, 0x8B, 0xA1, 0xE7, 0x5D, 0xFA, 0xAF, 0xA7, 0x60, 0xA5, 0x89, 0x9B, 0xD1, 0x6C, 0x3E, 0x6A, 0xF1, 0xE6, 0x62, 0x19, 0x6A, 0x90, 0xF8, 0x83, 0x1C, 0x72, 0xE2, 0x7A, 0xE0, 0xC6, 0x48, 0x42, 0x2D, 0xD7, 0x06, 0xE2, 0x5C, 0x69, 0x71, 0xD2, 0xEC, 0xAF, 0x30, 0xDF, 0x5A, 0x9E, 0xC4, 0xB9, 0x87, 0xDC, 0xBC, 0xDE, 0xE5, 0x50, 0x20, 0x67, 0x87, 0xA0, 0xE8, 0x5A, 0x78, 0x1B, 0x7A, 0xAE, 0x05, 0xED, 0x93, 0x0C, 0x1A, 0xFD, 0x22, 0xAA, 0x06, 0x14, 0xDC, 0xD6, 0x11, 0xE3, 0x45, 0x48, 0x6A, 0xAC, 0x03, 0xCE, 0xF6, 0x19, 0xBD, 0x95, 0x46, 0x0A, 0x1D, 0xCB, 0x6C, 0xE3, 0xF6, 0x5F, 0x1A, 0xB3, 0x81, 0xC7, 0xE2, 0xAB, 0xFE, 0xEF, 0xFB, 0xEC, 0xFE, 0x88, 0x36, 0x26, 0x60, 0x47, 0x43, 0x78, 0x36, 0xA7, 0xC8, 0xC9, 0x40, 0x98, 0x2E, 0xF2, 0x7E, 0xE4, 0x0D, 0x6C, 0x45, 0x88, 0x2A, 0x32, 0x9B, 0xA2, 0x7C, 0x39, 0x20, 0xAA, 0x6B, 0x64, 0x35, 0xC6, 0xA9, 0x20, 0x71, 0x4A, 0x78, 0x6E, 0x55, 0x3C, 0x9B, 0xEA, 0x10, 0x73, 0xBB, 0xA7, 0xD8, 0xFE, 0x69, 0x42, 0xB8, 0xE7, 0xA1, 0xE5, 0xDF, 0x8A, 0xDE, 0x4C, 0x2B, 0x3A, 0x92, 0xB8, 0x3E, 0x5E, 0x2C, 0x29, 0x0D, 0xC1, 0x3D, 0x10, 0x65, 0x1E, 0xF1, 0x95, 0xE5, 0xF6, 0x45, 0x15, 0xBF, 0xE2, 0x30, 0xA6, 0x70, 0x19, 0xA4, 0x11, 0x57, 0x12, 0x1C, 0x81, 0x4B, 0x54, 0x04, 0xBE, 0x67, 0xF5, 0x00, 0x22, 0x06, 0xDA, 0x6B, 0xCE, 0x23, 0x3F, 0x86, 0xE4, 0x70, 0x6A, 0xD1, 0x3E, 0xE5, 0x74, 0x44, 0x86, 0xDA, 0xBE, 0x79 -}; - -static const unsigned char Dlp_sdk1_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk1_AcexSig[0x100] = -{ - 0x13, 0xB2, 0xF4, 0x89, 0xBB, 0xB4, 0xFF, 0x55, 0x7E, 0x3E, 0x9B, 0x90, 0x44, 0x45, 0xC6, 0x8A, 0x17, 0x32, 0x91, 0x77, 0x7D, 0xCB, 0x4A, 0x26, 0x3D, 0xCA, 0xD8, 0x6E, 0x72, 0x27, 0x93, 0x9C, 0xE4, 0x27, 0xFE, 0x54, 0xDC, 0xE7, 0xDC, 0x02, 0x17, 0x9C, 0x82, 0xA8, 0xB0, 0xE8, 0x69, 0x07, 0xE3, 0x34, 0x0E, 0xBF, 0x17, 0x05, 0x58, 0x23, 0x5F, 0x6D, 0xDA, 0xE8, 0xC6, 0xEE, 0x49, 0x29, 0xEF, 0xD7, 0x48, 0x48, 0x41, 0xE2, 0x2A, 0x57, 0x2B, 0x21, 0x13, 0x64, 0xD4, 0x79, 0x5A, 0xE3, 0x84, 0xDA, 0x63, 0x9A, 0x07, 0x39, 0xE2, 0x7E, 0xA7, 0x56, 0x34, 0x1C, 0xE2, 0xAF, 0xCD, 0x65, 0xD1, 0xC0, 0x1B, 0x72, 0xB1, 0x1D, 0xFC, 0xE2, 0x6E, 0x0F, 0xC7, 0xB0, 0xF5, 0x84, 0x0F, 0xA5, 0x2B, 0xDF, 0x3A, 0xCF, 0x43, 0xE8, 0xE4, 0x07, 0x29, 0xC6, 0x41, 0x0E, 0x7B, 0xEE, 0x35, 0xF9, 0xFC, 0xE7, 0x15, 0xF3, 0x8C, 0x3A, 0xB4, 0x77, 0xBD, 0x88, 0x70, 0x83, 0x4A, 0x03, 0x9E, 0x01, 0x9B, 0xBB, 0xD2, 0xE4, 0xA5, 0xBE, 0xF7, 0x80, 0x92, 0x5A, 0x9F, 0x14, 0x9B, 0x49, 0x5D, 0x3D, 0xDC, 0x32, 0x34, 0x7E, 0xC0, 0xD4, 0xAC, 0xDA, 0x8C, 0xF7, 0xA1, 0xE1, 0xCA, 0x29, 0xF5, 0x58, 0x5E, 0xEB, 0x02, 0xB6, 0x67, 0x42, 0x89, 0x46, 0x4C, 0xA6, 0xA8, 0xBD, 0xEB, 0xEB, 0xDD, 0x8F, 0x2E, 0x72, 0x26, 0x49, 0x70, 0x01, 0x7D, 0x5B, 0x03, 0x06, 0x2C, 0x92, 0x1E, 0x55, 0xB2, 0xDA, 0xD7, 0x0D, 0x70, 0x74, 0x42, 0xD5, 0x62, 0x42, 0x3C, 0xC1, 0x70, 0x8E, 0x67, 0xB1, 0xD9, 0xF3, 0x7E, 0xB2, 0xBA, 0x6D, 0x0F, 0x42, 0x65, 0x24, 0x79, 0xE8, 0x8F, 0xB4, 0x4B, 0x32, 0x35, 0xCA, 0x39, 0x70, 0xFE, 0x8E, 0x81, 0x49, 0x73, 0x8D, 0x3C, 0xCD, 0x60, 0xAF, 0xA3, 0x52, 0x45, 0xEE -}; - -/* CTR_SDK 2 (2.3.4) */ -static const unsigned char sdk2_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk2_HdrPubK[0x100] = -{ - 0xE9, 0x45, 0xF0, 0xC6, 0x96, 0xD5, 0x6F, 0x7E, 0xAE, 0x03, 0x92, 0x2E, 0xEA, 0xCB, 0xFD, 0xEA, 0xA4, 0x7A, 0x9F, 0x12, 0xDA, 0x4C, 0x10, 0x0A, 0xBE, 0x08, 0x9D, 0x87, 0xE0, 0x14, 0xAC, 0x7F, 0x39, 0xD2, 0xFE, 0x9D, 0x88, 0xB2, 0x81, 0xF6, 0x1A, 0x9E, 0x15, 0x57, 0xD4, 0xE2, 0x31, 0x08, 0x07, 0xEC, 0x4F, 0x10, 0x00, 0xDE, 0xEF, 0x8B, 0x6F, 0xCF, 0x84, 0xE7, 0x3B, 0x41, 0x08, 0x64, 0x3B, 0x1C, 0x00, 0x7C, 0x73, 0xBB, 0x59, 0x4D, 0xD8, 0xD6, 0xE7, 0x7B, 0xBE, 0xDD, 0x50, 0x98, 0xA1, 0x1A, 0xD5, 0xAA, 0x37, 0x69, 0xB8, 0x25, 0xCB, 0x7B, 0x03, 0x00, 0x90, 0x25, 0xF3, 0x7E, 0x9A, 0x0F, 0xA3, 0xAA, 0xC4, 0xB9, 0x3B, 0x3A, 0x18, 0x2B, 0xBC, 0x9C, 0x11, 0x04, 0x92, 0x16, 0x6E, 0xC3, 0xFA, 0x01, 0xD3, 0x00, 0x02, 0xF3, 0x2E, 0xD5, 0x60, 0xA8, 0xAF, 0xAB, 0xEE, 0x2F, 0x9D, 0x30, 0x3E, 0x0E, 0xDC, 0xB8, 0xEC, 0x87, 0x9E, 0x4A, 0xA9, 0x01, 0x34, 0x69, 0x2C, 0x4C, 0x34, 0xB7, 0x7D, 0xB9, 0x7A, 0x17, 0x74, 0x31, 0xB0, 0x29, 0xC4, 0x7D, 0x27, 0x1F, 0xBA, 0xBA, 0x3F, 0x5B, 0x62, 0xF6, 0x90, 0xB8, 0x37, 0x33, 0xFC, 0x73, 0xD6, 0x19, 0x11, 0xCA, 0x83, 0x2A, 0x58, 0x62, 0x9C, 0xB1, 0x83, 0x43, 0x1D, 0x2C, 0x00, 0xA2, 0xE5, 0x87, 0x97, 0x12, 0x63, 0x31, 0x83, 0x0E, 0xB1, 0x1E, 0x69, 0x99, 0x02, 0xAF, 0xDF, 0xFF, 0x0F, 0xA9, 0x7C, 0x1B, 0x33, 0x9E, 0xFF, 0x9C, 0x14, 0x19, 0xA6, 0xCA, 0xFD, 0xB9, 0x17, 0xE0, 0x22, 0xCF, 0xB5, 0x00, 0x77, 0x2E, 0x31, 0xAD, 0xF7, 0xE5, 0xAD, 0x98, 0x14, 0xDF, 0x19, 0xF0, 0xC9, 0xBE, 0x37, 0xF6, 0xF0, 0x23, 0x66, 0xCF, 0x34, 0xE3, 0xD5, 0x8F, 0xD4, 0x07, 0xBA, 0x06, 0x56, 0x00, 0x66, 0x9A, 0xEB, 0x93 -}; - -static const unsigned char App_sdk2_HdrPrivK[0x100] = -{ - 0xBC, 0x49, 0x29, 0xB9, 0x01, 0x52, 0x31, 0x76, 0x4C, 0xBA, 0xB1, 0x29, 0x91, 0x77, 0x29, 0xF2, 0x54, 0xE4, 0x6C, 0xB5, 0x68, 0xE1, 0xF0, 0x28, 0xDB, 0x8E, 0x54, 0xA8, 0xB1, 0xA3, 0xBE, 0x3F, 0xCA, 0xCA, 0x95, 0x9D, 0x4E, 0x12, 0xD7, 0x77, 0x6F, 0xB0, 0x9D, 0x85, 0x91, 0x5D, 0x29, 0x3A, 0x54, 0x3A, 0xD6, 0xEE, 0x11, 0xE5, 0xDF, 0xEF, 0xEA, 0x45, 0xD3, 0xFE, 0x58, 0x03, 0x7B, 0xE4, 0x7B, 0x19, 0x75, 0x02, 0xFE, 0xDE, 0xFF, 0x8C, 0x28, 0x33, 0xFE, 0x10, 0x11, 0xD4, 0xCD, 0x13, 0x05, 0x26, 0x85, 0xC3, 0xA8, 0x8A, 0x7A, 0x8A, 0x77, 0x1D, 0x49, 0x25, 0x11, 0x34, 0xB0, 0xBF, 0x45, 0x56, 0xCE, 0x42, 0x2E, 0x1B, 0x5C, 0xC4, 0xDD, 0x71, 0xA0, 0x01, 0x50, 0x73, 0x21, 0xFF, 0x5D, 0x54, 0x6D, 0xDD, 0x3F, 0x14, 0x49, 0x4D, 0x44, 0x46, 0x12, 0x88, 0xD5, 0x92, 0xAE, 0xE2, 0xD0, 0xF6, 0x2C, 0x10, 0xD5, 0x67, 0x61, 0x87, 0x7F, 0x2A, 0x17, 0x9D, 0x4F, 0xC6, 0x79, 0xC3, 0xAF, 0x4D, 0x6F, 0xFB, 0x0F, 0x3B, 0x48, 0x5D, 0x46, 0x9A, 0xE8, 0x53, 0xB7, 0xC5, 0x69, 0xEC, 0x31, 0x25, 0xD1, 0xDC, 0x93, 0xAB, 0x2E, 0x53, 0x3B, 0x8E, 0x96, 0x27, 0x59, 0xD4, 0xF7, 0xB3, 0xAB, 0x51, 0x59, 0xAE, 0x6E, 0x26, 0x4F, 0xC2, 0x95, 0xCE, 0x42, 0xC6, 0xAF, 0x46, 0xC6, 0x2E, 0x32, 0x09, 0x7B, 0xAF, 0x67, 0x4E, 0x57, 0xC8, 0x93, 0x5F, 0x8C, 0xD5, 0x66, 0x7B, 0xCC, 0xE9, 0xBE, 0x86, 0xB9, 0xBB, 0xD0, 0xC8, 0xD2, 0xDC, 0x5F, 0x95, 0x83, 0x28, 0x55, 0x21, 0x1E, 0xEE, 0xCF, 0x23, 0xB7, 0x6D, 0xE0, 0x9A, 0x87, 0x99, 0xFB, 0x82, 0x50, 0xD0, 0x2D, 0xC4, 0xFB, 0xA0, 0x11, 0x2F, 0xDD, 0x05, 0x7E, 0x1C, 0xE3, 0xFB, 0x98, 0x69, 0xD4, 0x49, 0x2F, 0x0D, 0xF6, 0x61 -}; - -static const unsigned char App_sdk2_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk2_AcexSig[0x100] = -{ - 0x62, 0xFE, 0xD9, 0x12, 0x3D, 0x99, 0x53, 0xC4, 0x20, 0x25, 0xDE, 0x59, 0xEA, 0x6E, 0xF3, 0x16, 0x5B, 0x36, 0xBA, 0x1C, 0xB3, 0xB5, 0x48, 0x37, 0xD2, 0xA4, 0x04, 0xE5, 0x14, 0xC6, 0xE7, 0x22, 0x14, 0x40, 0x6F, 0x92, 0x6A, 0x9B, 0xDF, 0xDE, 0xFA, 0xCE, 0x3C, 0xBB, 0x4B, 0xC4, 0x66, 0xA8, 0x86, 0x58, 0xAC, 0xEB, 0x2F, 0xB7, 0xA3, 0xEC, 0xEA, 0x31, 0x23, 0x61, 0xF6, 0x72, 0x1E, 0x26, 0x8A, 0x1D, 0x68, 0x2A, 0x2A, 0x21, 0x5A, 0xA2, 0x6A, 0xBD, 0xCE, 0xC0, 0x19, 0x08, 0x61, 0x64, 0xB3, 0xF6, 0x90, 0xB1, 0x34, 0xF8, 0x50, 0x6F, 0x83, 0xB6, 0x8D, 0x35, 0x12, 0x7F, 0x9C, 0x7B, 0x6E, 0x3C, 0x4E, 0xD1, 0xFD, 0xC3, 0x30, 0xD2, 0xE8, 0x7E, 0x15, 0x1F, 0xAD, 0xDB, 0x1D, 0x92, 0xDA, 0x8C, 0x4E, 0xE9, 0x84, 0x83, 0xFF, 0x1A, 0x09, 0x77, 0x05, 0x5A, 0xCF, 0x5C, 0x8B, 0x4F, 0x68, 0x36, 0xC8, 0xDA, 0x5B, 0x1A, 0x5A, 0x49, 0xF9, 0xA1, 0xF2, 0xC8, 0x02, 0xFD, 0x69, 0x1F, 0x1D, 0xB3, 0xE8, 0xF8, 0xE1, 0x6B, 0x15, 0x9A, 0x5E, 0x41, 0x84, 0x06, 0x1F, 0x2A, 0xB3, 0xB2, 0xA1, 0xDC, 0x63, 0x81, 0xB3, 0x6B, 0x4B, 0x21, 0x67, 0x19, 0x82, 0x52, 0xFE, 0x75, 0x96, 0xA1, 0xDF, 0x02, 0xD4, 0x07, 0x1F, 0x1B, 0x88, 0x12, 0x5A, 0x76, 0x54, 0xC4, 0x06, 0x2D, 0xB1, 0xAA, 0x41, 0x3C, 0x9F, 0x43, 0xA2, 0x75, 0x20, 0x39, 0xB6, 0x06, 0xF9, 0x9C, 0xFC, 0x00, 0xC5, 0xBC, 0x84, 0x13, 0x80, 0xE4, 0x10, 0x1A, 0xCD, 0x95, 0xBB, 0xF2, 0xDC, 0x57, 0x7B, 0xBA, 0x87, 0x05, 0x0B, 0x96, 0xC1, 0xCD, 0x60, 0xC7, 0x10, 0x44, 0x78, 0x0E, 0x0F, 0x2F, 0x91, 0x54, 0x6C, 0xDE, 0xB8, 0x14, 0x46, 0xF3, 0x9C, 0xAC, 0x7B, 0xAA, 0xE7, 0x1B, 0x52, 0xD6, 0xBE, 0x71, 0x97, 0x22 -}; - -// DLP -static const unsigned char Dlp_sdk2_HdrPubK[0x100] = -{ - 0xB9, 0xDE, 0x3D, 0xC0, 0x55, 0xB9, 0xCC, 0x3F, 0x55, 0xE0, 0x61, 0x1D, 0x6F, 0xCF, 0x3E, 0x7F, 0xE2, 0xF7, 0xF5, 0xAD, 0x5C, 0x02, 0x7F, 0x17, 0x5B, 0x44, 0x2F, 0x2D, 0xDC, 0xD4, 0xA6, 0x63, 0xD2, 0xA7, 0x82, 0xD3, 0x00, 0x77, 0xC8, 0x0B, 0x28, 0x09, 0x3D, 0x81, 0x86, 0x93, 0xF5, 0xF6, 0xE4, 0x69, 0x3B, 0x60, 0x4C, 0x7F, 0x8D, 0x72, 0xA3, 0x22, 0x42, 0x86, 0x87, 0x06, 0xD8, 0x29, 0x89, 0x8A, 0x9F, 0x5F, 0x6C, 0x06, 0x0C, 0x96, 0x84, 0x00, 0x24, 0x5D, 0x0B, 0xEA, 0x15, 0xEC, 0xAD, 0x90, 0xA4, 0x0C, 0x7B, 0xAE, 0x0E, 0x85, 0x3E, 0xA2, 0x20, 0x04, 0xE8, 0xD9, 0x59, 0x0F, 0x31, 0x0E, 0xD4, 0x5D, 0xC1, 0x18, 0xED, 0x0E, 0xB4, 0xD2, 0x5E, 0x65, 0xA2, 0x78, 0x0C, 0x76, 0x03, 0x3A, 0x71, 0x18, 0xE4, 0x38, 0x44, 0x14, 0xE0, 0x93, 0x84, 0xFE, 0x34, 0x82, 0xCA, 0x0B, 0xB8, 0xF2, 0x41, 0xAB, 0x63, 0xF3, 0xDE, 0xAE, 0xF4, 0x36, 0x81, 0xA4, 0x78, 0x7B, 0xF9, 0xA8, 0xFB, 0xC9, 0xA7, 0x6E, 0xA4, 0xD5, 0xE2, 0xA9, 0xD8, 0xD9, 0xE8, 0x98, 0x1B, 0x25, 0x75, 0x00, 0x11, 0x51, 0x97, 0x62, 0x0D, 0xF0, 0x0C, 0xE9, 0x6B, 0x0C, 0xEE, 0xCE, 0x25, 0x2C, 0x3F, 0xDF, 0xBE, 0x54, 0xD5, 0xD6, 0x5E, 0xEE, 0x1F, 0x73, 0xFC, 0xE8, 0xEC, 0xB3, 0x8A, 0x48, 0x9F, 0x6A, 0xC1, 0x63, 0x85, 0xE4, 0x94, 0x85, 0x8F, 0x3D, 0x9D, 0x43, 0xB4, 0xA7, 0x4C, 0x82, 0xA3, 0x0B, 0x67, 0x43, 0x12, 0x31, 0x77, 0x89, 0xB0, 0xD5, 0x00, 0x1B, 0x52, 0x29, 0xCE, 0x54, 0xC7, 0xC4, 0x7D, 0xB6, 0x69, 0x7B, 0xFE, 0xDC, 0xDB, 0x4E, 0xD8, 0x58, 0x42, 0x14, 0x34, 0x72, 0x64, 0xBC, 0x09, 0x6D, 0xAC, 0xD3, 0xC4, 0x1B, 0x5C, 0x8E, 0xF9, 0xBE, 0x84, 0xCD, 0x9A, 0x86, 0x4B, 0x17 -}; - -static const unsigned char Dlp_sdk2_HdrPrivK[0x100] = -{ - 0xAA, 0x51, 0x62, 0x58, 0x9A, 0xB5, 0x74, 0xDA, 0x1C, 0xC1, 0x4D, 0x7C, 0x81, 0xF6, 0x70, 0x99, 0x13, 0xCC, 0x90, 0x0D, 0xD9, 0xA0, 0x58, 0x01, 0x79, 0x1A, 0x53, 0xF9, 0x3C, 0xC0, 0x87, 0xF0, 0x35, 0x1A, 0x56, 0xA1, 0x2F, 0x6E, 0x93, 0x9A, 0xD5, 0x87, 0x12, 0x1B, 0x5C, 0xCC, 0xBC, 0xB9, 0x0E, 0xB8, 0xF7, 0x35, 0xD9, 0x23, 0x90, 0xE4, 0x19, 0x64, 0xCD, 0x7D, 0x24, 0xC2, 0x3A, 0xD6, 0x65, 0x38, 0xE7, 0xAD, 0xB2, 0xF9, 0x20, 0x13, 0xD4, 0xC5, 0xA4, 0x8C, 0xB6, 0xDC, 0x3C, 0x56, 0xF2, 0xFC, 0xF5, 0xB6, 0x92, 0xA6, 0xFE, 0x9B, 0x4E, 0xB7, 0x95, 0x8B, 0xAA, 0x2B, 0x70, 0x96, 0xA1, 0x27, 0xAB, 0xA6, 0x75, 0xC9, 0x77, 0x80, 0xE0, 0x65, 0x5D, 0x26, 0xD8, 0xE8, 0x14, 0xD3, 0x17, 0x46, 0x38, 0x58, 0xCC, 0xD8, 0x5A, 0x5A, 0x9F, 0x27, 0xCE, 0xD8, 0x7A, 0x19, 0xD7, 0x35, 0xB2, 0x32, 0xAF, 0x47, 0x2E, 0x9F, 0x4B, 0x64, 0xEC, 0x1F, 0xC6, 0x40, 0xD0, 0x2C, 0x47, 0xD1, 0xEA, 0x33, 0xE5, 0x0E, 0x80, 0xFC, 0x68, 0xEC, 0x8C, 0x12, 0x33, 0xCE, 0x34, 0x28, 0x79, 0xFA, 0x05, 0x5D, 0x70, 0x15, 0xDE, 0xB1, 0x22, 0x85, 0x18, 0x63, 0x15, 0x35, 0x57, 0x04, 0x17, 0x64, 0x20, 0xC8, 0x52, 0x44, 0x64, 0x5E, 0x47, 0x4E, 0x5F, 0x80, 0x21, 0x16, 0x94, 0x4B, 0x18, 0x11, 0x36, 0x67, 0x3B, 0x6C, 0x69, 0x19, 0xCF, 0xC9, 0x05, 0x85, 0x9B, 0x3A, 0xDE, 0x12, 0x1E, 0x0A, 0xC6, 0x22, 0xA8, 0xC7, 0x9A, 0x34, 0x14, 0x98, 0xFD, 0xD9, 0x0F, 0xE8, 0x64, 0xE6, 0x89, 0x63, 0x6E, 0x17, 0x76, 0xD7, 0x1B, 0x6F, 0x92, 0x00, 0xD8, 0xBB, 0xF6, 0xA0, 0x65, 0x9D, 0xAA, 0x7A, 0x0E, 0x4B, 0x56, 0xA5, 0x33, 0xDA, 0x3F, 0x5D, 0xFE, 0xD3, 0xAD, 0x6E, 0x0E, 0xB3, 0xD4, 0x41 -}; - -static const unsigned char Dlp_sdk2_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk2_AcexSig[0x100] = -{ - 0x97, 0x84, 0x97, 0xEE, 0x4F, 0x35, 0xCC, 0xBE, 0x08, 0xB4, 0x5D, 0x7E, 0x17, 0xC3, 0x94, 0x2B, 0x4D, 0x3A, 0xA5, 0xB5, 0x01, 0xD4, 0xAE, 0x2A, 0x90, 0x26, 0x21, 0x8F, 0x56, 0x05, 0xB9, 0xA2, 0x5E, 0xCE, 0x73, 0xC7, 0x42, 0xDC, 0x99, 0xD2, 0x7C, 0x08, 0x62, 0xBF, 0x10, 0x7A, 0xC1, 0x5D, 0x22, 0x53, 0x8F, 0x63, 0x2D, 0x73, 0xF3, 0x05, 0xDA, 0x9D, 0x6A, 0xF8, 0xB9, 0x5B, 0x80, 0xB4, 0x30, 0xB3, 0x11, 0xF7, 0x96, 0x8A, 0xCF, 0x70, 0xD7, 0x62, 0x6E, 0x99, 0x32, 0xFD, 0x74, 0x34, 0x16, 0xFD, 0x17, 0x1F, 0xB1, 0xEC, 0xA4, 0x0F, 0x52, 0x13, 0x9F, 0x62, 0x0D, 0xE0, 0x50, 0xA6, 0xA0, 0x7B, 0x69, 0x95, 0xE0, 0xE9, 0xBB, 0x38, 0x0C, 0x62, 0xE0, 0xE3, 0xCE, 0x82, 0xE0, 0xB9, 0xE0, 0xF6, 0x61, 0x50, 0xBF, 0xA8, 0x18, 0x15, 0x38, 0xFE, 0xFA, 0x8C, 0xBA, 0xA5, 0xB9, 0x9C, 0x05, 0xA6, 0x91, 0x5C, 0xA7, 0x13, 0x6F, 0x13, 0x3F, 0xF1, 0xF6, 0x68, 0xAF, 0x40, 0xEC, 0x27, 0xE0, 0x33, 0x6B, 0xCF, 0x26, 0x06, 0xF8, 0x6A, 0x13, 0x6C, 0xBC, 0xDB, 0xAF, 0x6F, 0x78, 0xA0, 0x80, 0x10, 0x8F, 0xB6, 0x91, 0x5A, 0x43, 0x2C, 0x5F, 0x1D, 0xBA, 0xB4, 0x5E, 0xBE, 0xAE, 0x53, 0x09, 0x17, 0x5B, 0x6C, 0xC1, 0x5E, 0x0F, 0x72, 0x6E, 0xD6, 0x10, 0x0B, 0xC3, 0x26, 0xDC, 0xAF, 0xCA, 0x28, 0xAB, 0x00, 0x67, 0x04, 0xE3, 0x54, 0xE8, 0x95, 0xC6, 0x23, 0xB6, 0x79, 0x70, 0xA4, 0x87, 0x6D, 0x12, 0x48, 0xCC, 0x11, 0x86, 0xEC, 0x82, 0xF4, 0x30, 0xC9, 0xB1, 0x6D, 0x08, 0xA7, 0xEA, 0x8C, 0x6A, 0x97, 0xAA, 0x89, 0xD5, 0xC5, 0x07, 0xA9, 0xD5, 0xCF, 0x09, 0x08, 0xBC, 0x56, 0x63, 0x8D, 0x70, 0x2F, 0x64, 0xAF, 0x51, 0x9E, 0x22, 0xA4, 0x88, 0xF0, 0xDC, 0x56, 0x72, 0x28 -}; - - -/* CTR_SDK 4/5 (4.2.8) */ -// DependencyList -static const unsigned char sdk4_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk4_HdrPubK[0x100] = -{ - 0xCF, 0xEC, 0xB2, 0x48, 0x03, 0x6D, 0xB8, 0x09, 0xE3, 0x5C, 0x6C, 0x62, 0x2C, 0xA9, 0x49, 0xE1, 0xF4, 0xF4, 0x0C, 0x6C, 0xC3, 0xE5, 0x2F, 0x9D, 0x50, 0xA0, 0x2B, 0x5A, 0x00, 0xC6, 0x72, 0x00, 0x0B, 0xA3, 0x04, 0x5D, 0x94, 0x46, 0xE7, 0x00, 0x1B, 0x48, 0x85, 0xB5, 0x61, 0x2C, 0xC9, 0x74, 0xCA, 0x2B, 0x43, 0x13, 0xC1, 0x78, 0x97, 0x5C, 0x33, 0x2F, 0x07, 0xC7, 0x85, 0xF0, 0xDA, 0xDB, 0x60, 0x96, 0x50, 0x0F, 0x7C, 0x4B, 0x7A, 0xD7, 0x17, 0x9D, 0xE4, 0xE5, 0xC3, 0xAB, 0x6F, 0x5D, 0xA5, 0x78, 0x32, 0xAD, 0x04, 0xDD, 0x96, 0x6E, 0xDC, 0x75, 0xFF, 0xC2, 0x2F, 0xFA, 0xA2, 0xEE, 0x46, 0x89, 0xCD, 0xAE, 0x69, 0x92, 0xA4, 0x48, 0xBC, 0x46, 0x47, 0xC4, 0x8C, 0x89, 0x63, 0xE1, 0x0A, 0x4D, 0x1C, 0xDC, 0x46, 0x2F, 0x5B, 0x70, 0x8A, 0x7C, 0xE9, 0x22, 0x9C, 0x09, 0x0B, 0xA8, 0x97, 0x40, 0xCA, 0x2A, 0x7D, 0x84, 0xA1, 0x04, 0x4A, 0x2E, 0xDB, 0xD7, 0xD0, 0x64, 0x43, 0x9C, 0xD0, 0x78, 0x11, 0x41, 0x88, 0x33, 0xDD, 0x31, 0x62, 0x90, 0x2D, 0x17, 0xF2, 0xC6, 0xA9, 0x2B, 0x9C, 0x70, 0xAB, 0xDC, 0xD3, 0xAB, 0x5D, 0xDA, 0xEE, 0x3D, 0x6C, 0x0E, 0x81, 0xFF, 0xF6, 0x67, 0x5A, 0x44, 0xF9, 0xAC, 0x07, 0x3D, 0x23, 0x94, 0x75, 0x65, 0x93, 0x20, 0x0C, 0xC5, 0x76, 0x1D, 0x0F, 0x65, 0x06, 0x3D, 0x21, 0xA2, 0xF0, 0x96, 0x80, 0xB7, 0x0A, 0x49, 0x53, 0x38, 0xA3, 0x5D, 0xC0, 0x74, 0x3C, 0xA4, 0xD9, 0x40, 0x36, 0x85, 0x1F, 0x8C, 0xD1, 0x2D, 0x15, 0xF9, 0xEF, 0x24, 0xA9, 0x7E, 0x9D, 0xB2, 0x1E, 0xF8, 0xA0, 0x72, 0x81, 0x17, 0x77, 0x73, 0xB1, 0x56, 0x7F, 0xAD, 0x05, 0xA2, 0xD2, 0x30, 0x5A, 0xF5, 0xD3, 0xAF, 0x0F, 0x10, 0x4A, 0x52, 0xD8, 0x09, 0x47, 0x97 -}; - -static const unsigned char App_sdk4_HdrPrivK[0x100] = -{ - 0x8C, 0xBD, 0xB2, 0x3B, 0xCE, 0x9E, 0x51, 0x09, 0xD8, 0x6D, 0x72, 0x2B, 0xCE, 0x01, 0x55, 0x32, 0x6E, 0xC5, 0x57, 0x37, 0xB4, 0x2E, 0x09, 0x59, 0xD9, 0xFE, 0x60, 0xF9, 0xCE, 0x36, 0x85, 0x6A, 0x04, 0x76, 0x76, 0xF9, 0x04, 0xEA, 0x2D, 0x68, 0xC4, 0x0F, 0x05, 0xFA, 0xAD, 0x69, 0x4C, 0x80, 0x12, 0x6C, 0xD0, 0x3D, 0xAA, 0x22, 0xFF, 0x89, 0x78, 0x57, 0xE8, 0x53, 0x25, 0x15, 0xD0, 0x7E, 0xD8, 0x55, 0x46, 0xA2, 0x04, 0xC7, 0x6E, 0xC1, 0xF3, 0x89, 0x7C, 0x2C, 0x0E, 0x93, 0x97, 0x91, 0x72, 0xF4, 0xF6, 0x90, 0x69, 0x0F, 0xB8, 0xC9, 0x17, 0xCF, 0x83, 0xAC, 0xA5, 0x1F, 0x69, 0x74, 0x12, 0x29, 0x2B, 0x21, 0x58, 0xF2, 0xDA, 0xE3, 0x25, 0x16, 0x09, 0x74, 0x40, 0x90, 0xAB, 0x1B, 0xE4, 0x06, 0x28, 0x77, 0xED, 0xC6, 0x16, 0x86, 0x0A, 0x27, 0xDD, 0x03, 0x01, 0x4D, 0x9A, 0x26, 0x6E, 0xC8, 0x9F, 0xD3, 0x9A, 0x4B, 0x59, 0xD1, 0x10, 0x9B, 0xEB, 0xA9, 0x58, 0x72, 0xBD, 0xA1, 0xFE, 0x9D, 0x86, 0xED, 0x29, 0xE9, 0x29, 0x49, 0x62, 0x4B, 0xD8, 0x7D, 0x2A, 0x7A, 0x66, 0x1B, 0xE5, 0x04, 0x81, 0x56, 0x10, 0x50, 0xAF, 0xB8, 0x48, 0x27, 0xC1, 0xC9, 0x46, 0xBD, 0x3F, 0x16, 0x06, 0xA5, 0x3D, 0x04, 0x9F, 0x0D, 0x54, 0x71, 0x1C, 0xF4, 0x82, 0xC0, 0x66, 0x74, 0xEA, 0x9C, 0x83, 0x3C, 0x27, 0x01, 0xDF, 0x6F, 0x56, 0xA8, 0x1B, 0xE3, 0x68, 0x55, 0x9F, 0xAB, 0x90, 0x67, 0x20, 0x25, 0xFA, 0x3D, 0x51, 0x2A, 0x23, 0x16, 0xCB, 0x06, 0x5A, 0xAD, 0xAC, 0xC8, 0x47, 0xF9, 0x39, 0x2E, 0x6A, 0xF8, 0xFA, 0x0A, 0xE8, 0x8A, 0x64, 0x84, 0x6B, 0xED, 0xDA, 0x8F, 0x2A, 0x08, 0x86, 0x8F, 0x56, 0x69, 0x64, 0xC3, 0x98, 0x55, 0x37, 0x9A, 0x48, 0x40, 0xDA, 0xD5, 0x03, 0x21 -}; - -static const unsigned char App_sdk4_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk4_AcexSig[0x100] = -{ - 0xDF, 0x1C, 0x8B, 0x98, 0xE4, 0x6F, 0xA2, 0x35, 0x6C, 0xC3, 0x18, 0x17, 0x98, 0xF3, 0xCE, 0x54, 0x7E, 0x14, 0x2E, 0x7F, 0x1E, 0xD8, 0x6D, 0xCF, 0xBC, 0x29, 0x4E, 0xFE, 0x32, 0x2E, 0xC1, 0x11, 0xAD, 0x46, 0x9A, 0xC6, 0x70, 0xEA, 0xEE, 0x28, 0x55, 0x22, 0xE1, 0x36, 0x05, 0x1C, 0x04, 0x8A, 0xCE, 0x0F, 0x0C, 0x83, 0x8F, 0xC8, 0xD6, 0xDE, 0x11, 0x8E, 0xEA, 0xCF, 0xAD, 0x9B, 0xCF, 0x81, 0x0D, 0xEB, 0x71, 0x13, 0xB3, 0xD3, 0xAE, 0x83, 0x02, 0x4C, 0x0E, 0x10, 0x50, 0x59, 0x3C, 0xEE, 0x60, 0x06, 0xFB, 0x8C, 0x7F, 0xC2, 0x20, 0x24, 0x01, 0x62, 0x55, 0x87, 0x60, 0x0F, 0xAD, 0xFA, 0x73, 0x2E, 0xF6, 0x65, 0x62, 0xD2, 0xE5, 0x10, 0x45, 0x69, 0x70, 0x39, 0x03, 0xD1, 0x39, 0xEC, 0x50, 0xC1, 0xD4, 0x25, 0x39, 0xB2, 0x90, 0x11, 0x4E, 0x95, 0xCB, 0x19, 0xEB, 0xCA, 0x0F, 0xB5, 0xFA, 0xC7, 0xB0, 0xE2, 0xD7, 0xE0, 0x71, 0xC3, 0xE5, 0x55, 0x33, 0x9E, 0x5C, 0xDC, 0x4D, 0x3B, 0x51, 0x11, 0x0D, 0x31, 0x78, 0x96, 0xCA, 0xD7, 0x18, 0x58, 0xEE, 0x00, 0xE9, 0x28, 0xF2, 0x68, 0x76, 0xD4, 0x57, 0xFE, 0x65, 0xB1, 0x4B, 0x49, 0x3F, 0xF6, 0xA6, 0x58, 0x4A, 0xC7, 0xFC, 0xC4, 0xBB, 0x61, 0xBC, 0x58, 0x8D, 0x55, 0x65, 0xE6, 0x0A, 0x79, 0x39, 0x41, 0xB8, 0x80, 0x61, 0xF7, 0x05, 0xC3, 0xFE, 0xD6, 0x8B, 0x09, 0x82, 0xC2, 0x5F, 0xA6, 0x56, 0xF9, 0xEE, 0x1D, 0x0E, 0x06, 0x3E, 0x9F, 0x3F, 0xF1, 0x93, 0x9A, 0x4F, 0xA2, 0xD5, 0x91, 0x87, 0x8A, 0xFE, 0xCF, 0xC3, 0xFC, 0x8A, 0xB1, 0xC4, 0x78, 0xE9, 0xD1, 0x1A, 0xF7, 0xB1, 0xD3, 0x20, 0xCB, 0x83, 0xBE, 0x03, 0xD5, 0xCA, 0xA5, 0x5E, 0x17, 0xA6, 0x91, 0x10, 0xD4, 0xBE, 0x23, 0xD6, 0x4B, 0x4F, 0x03, 0xA9, 0xAE -}; - -// DEMO -static const unsigned char Demo_sdk4_HdrPubK[0x100] = -{ - 0xB5, 0x11, 0x8D, 0x9E, 0x2D, 0xDB, 0x70, 0x6D, 0x6E, 0xEE, 0xAA, 0x21, 0xE0, 0x4E, 0x80, 0x0A, 0x96, 0x4A, 0x10, 0xD0, 0x9C, 0xD7, 0xD9, 0xD4, 0x94, 0x87, 0x72, 0xA2, 0xAF, 0x02, 0xA0, 0x05, 0x2E, 0xBF, 0x17, 0xEB, 0xFE, 0x5B, 0x9F, 0xB7, 0x0B, 0x1E, 0x3E, 0xF9, 0xAC, 0xBC, 0x7B, 0xB1, 0x56, 0x10, 0x24, 0x5F, 0x57, 0x2C, 0x08, 0xD0, 0x14, 0x79, 0x83, 0x84, 0x6A, 0x45, 0x25, 0xEB, 0xD9, 0xBE, 0x02, 0x21, 0xF7, 0x35, 0xC2, 0x74, 0x57, 0xC5, 0xAC, 0x34, 0x05, 0xC6, 0x9E, 0x82, 0xB8, 0xED, 0x78, 0xC4, 0x3B, 0xFD, 0x23, 0x59, 0x54, 0xD2, 0x0A, 0x0B, 0x5B, 0x25, 0xC0, 0x71, 0xC3, 0x84, 0x3A, 0xA7, 0xF9, 0x99, 0x86, 0xD8, 0xFE, 0x60, 0x10, 0x85, 0x77, 0x57, 0x76, 0x0C, 0x25, 0xE1, 0x18, 0x18, 0x3B, 0x83, 0xFD, 0x36, 0x7C, 0x84, 0x58, 0xC2, 0xC4, 0x68, 0x4F, 0xD1, 0xD7, 0x0A, 0x88, 0xFD, 0xCA, 0x97, 0xA1, 0xE5, 0xCE, 0x72, 0x63, 0xCF, 0x74, 0xD0, 0x20, 0xD9, 0xDE, 0x3F, 0xBB, 0x11, 0xF9, 0x21, 0xAB, 0x3F, 0x54, 0x41, 0xA7, 0xAA, 0xCA, 0xFC, 0xE1, 0x1A, 0x8C, 0x12, 0xC9, 0x39, 0x13, 0x5A, 0x81, 0x29, 0x49, 0xE8, 0xFB, 0x48, 0xC9, 0x4D, 0x50, 0x87, 0xAE, 0x51, 0xFB, 0x94, 0xFC, 0xF0, 0x9C, 0x70, 0x1C, 0xE8, 0x6E, 0x44, 0x53, 0x1E, 0x2F, 0x27, 0x5C, 0xB8, 0xEC, 0xBE, 0xFC, 0xD9, 0x98, 0x6A, 0x08, 0xD0, 0x5C, 0x4D, 0x78, 0x2D, 0x4D, 0x07, 0xAD, 0x5E, 0xB8, 0x51, 0x40, 0xE2, 0x2A, 0x7F, 0xB1, 0x54, 0x47, 0x5C, 0x99, 0x12, 0xC2, 0x6D, 0x5E, 0xED, 0x25, 0x30, 0x6A, 0x99, 0xC5, 0x0D, 0x65, 0x83, 0x68, 0x3A, 0xFD, 0x82, 0x59, 0x0D, 0xCE, 0x0B, 0x49, 0xBE, 0x17, 0x46, 0x51, 0xA9, 0xB6, 0x54, 0xE1, 0x18, 0xBD, 0x49, 0xE6, 0x7F -}; - -static const unsigned char Demo_sdk4_HdrPrivK[0x100] = -{ - 0x1D, 0x7B, 0x79, 0x32, 0xAB, 0x46, 0xD2, 0xBC, 0x8E, 0xD6, 0x7F, 0x8F, 0x3A, 0x85, 0xAD, 0xA5, 0x8B, 0xA9, 0x0D, 0xA9, 0xDA, 0x0F, 0xEF, 0x61, 0x04, 0xBA, 0x35, 0x39, 0x36, 0x03, 0xD8, 0x68, 0x5F, 0x9F, 0x2F, 0xD6, 0xF6, 0x38, 0x96, 0xFD, 0xE7, 0xEA, 0x89, 0xD8, 0x7F, 0x7E, 0xC5, 0x29, 0x2F, 0xD9, 0x3B, 0x02, 0xE7, 0x1F, 0xBD, 0x63, 0x9C, 0x21, 0xD8, 0xFF, 0x43, 0x8A, 0x74, 0xCD, 0x3D, 0x4C, 0x09, 0xEE, 0xDB, 0xE0, 0xBE, 0x03, 0xD1, 0x92, 0xD7, 0x22, 0x35, 0x5A, 0x8C, 0xCE, 0xBE, 0x2B, 0xB4, 0x81, 0x47, 0x3F, 0x45, 0x75, 0x33, 0x31, 0x6B, 0xFF, 0x43, 0x5D, 0x17, 0x43, 0xAE, 0xD1, 0x25, 0xF7, 0xD9, 0xD5, 0x5C, 0xB6, 0x92, 0x5C, 0xB3, 0xF3, 0xF7, 0x65, 0x9F, 0x4C, 0x05, 0x12, 0xEC, 0xA8, 0x6D, 0x70, 0x65, 0x57, 0x6C, 0xD8, 0xE3, 0xD6, 0xFA, 0xC1, 0xFD, 0x54, 0xE8, 0x34, 0x67, 0x4D, 0x0A, 0x14, 0x2F, 0xA3, 0xD4, 0x81, 0x8C, 0xC3, 0xD0, 0x8B, 0x09, 0x08, 0x90, 0x70, 0x68, 0xA0, 0x0E, 0xD1, 0x0B, 0xAA, 0x71, 0xEC, 0x9A, 0x1A, 0x83, 0xFF, 0xA1, 0x70, 0xEB, 0xAC, 0xF2, 0xE9, 0x80, 0xA1, 0xB8, 0x20, 0x31, 0x83, 0xF5, 0x37, 0x01, 0x72, 0x06, 0x50, 0x05, 0x3F, 0x14, 0xF9, 0x29, 0x48, 0x84, 0xA0, 0x0E, 0xF7, 0xB8, 0x1D, 0xA3, 0x36, 0x5A, 0x78, 0x6D, 0x83, 0x90, 0x27, 0xE3, 0x50, 0x49, 0x2F, 0x65, 0xE5, 0x61, 0xED, 0x65, 0xBE, 0xEA, 0x34, 0xA6, 0x6A, 0xEF, 0x49, 0xB4, 0xE0, 0xBC, 0xC2, 0xA5, 0xB8, 0xEB, 0xA9, 0x2F, 0xBA, 0x26, 0x76, 0xB2, 0x5A, 0x3A, 0x3B, 0xFD, 0xAD, 0xFB, 0xE4, 0x79, 0xE2, 0x85, 0x54, 0x5B, 0xAB, 0x1F, 0x0A, 0xE5, 0x8B, 0x77, 0x3A, 0x10, 0x98, 0x26, 0x74, 0xC8, 0xB0, 0x82, 0xB1, 0xF9, 0x8F, 0x68, 0x59 -}; - -static const unsigned char Demo_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Demo_sdk4_AcexSig[0x100] = -{ - 0xD3, 0x7D, 0x42, 0xBA, 0x6A, 0x1E, 0xD8, 0x07, 0x3C, 0x4A, 0xC4, 0xCD, 0x8C, 0x68, 0x3D, 0xCD, 0xCD, 0xBD, 0x9D, 0xCE, 0xB5, 0x2A, 0xF9, 0x63, 0x3D, 0xA9, 0x54, 0x0A, 0x2E, 0x4C, 0xE1, 0x60, 0x4B, 0xD0, 0xC9, 0xEB, 0xEF, 0x31, 0x65, 0x70, 0xB9, 0x0E, 0x06, 0x3B, 0x3D, 0x42, 0x4C, 0x6E, 0x8D, 0x2C, 0xD4, 0x71, 0x29, 0x76, 0xB7, 0xDD, 0x8C, 0xDA, 0xE7, 0xE3, 0x96, 0xA7, 0xAA, 0xF8, 0xCA, 0x05, 0xE8, 0xA7, 0x0A, 0xDD, 0x01, 0x49, 0xBD, 0xF1, 0xA5, 0xE8, 0x16, 0x22, 0xEE, 0x47, 0x1F, 0xEF, 0x28, 0x48, 0x87, 0xA9, 0x2D, 0xFC, 0x4E, 0xD5, 0xA5, 0x98, 0xB1, 0xFE, 0x1B, 0xEB, 0xA9, 0x06, 0x3C, 0x76, 0xD9, 0xAA, 0x0E, 0x9C, 0x60, 0xFC, 0xE9, 0x77, 0x9D, 0x7F, 0x67, 0xAC, 0xF5, 0xC7, 0x49, 0x12, 0xFD, 0x76, 0xAC, 0xD2, 0x54, 0xDB, 0x73, 0x41, 0x10, 0x1F, 0x04, 0x3F, 0xD0, 0x6F, 0xE0, 0x80, 0x24, 0xCC, 0xEE, 0xBF, 0x25, 0x9D, 0x0D, 0x5A, 0x2A, 0x1C, 0xC5, 0xD4, 0xE3, 0x5D, 0x3A, 0xC1, 0x86, 0xD3, 0xD4, 0x52, 0x1C, 0x4C, 0xBF, 0x31, 0xEB, 0x54, 0xCA, 0x4C, 0x06, 0x50, 0x52, 0x87, 0xD4, 0x9D, 0x4A, 0x4B, 0x22, 0xE1, 0x4A, 0xE9, 0x4D, 0x05, 0xA8, 0x57, 0xEC, 0xF8, 0x90, 0xF8, 0x58, 0xC3, 0x8B, 0x3A, 0x0F, 0x88, 0x36, 0xF4, 0xE5, 0x44, 0x10, 0x80, 0x68, 0x86, 0x1D, 0xAE, 0x90, 0x20, 0x03, 0x22, 0x2D, 0x44, 0xBF, 0xAB, 0x2B, 0xA1, 0x14, 0xAD, 0x6B, 0x40, 0x57, 0xDB, 0xBB, 0xDA, 0x09, 0x4C, 0x51, 0x26, 0x9B, 0xE3, 0xD9, 0xF9, 0xE1, 0xBC, 0xF1, 0xF1, 0xCD, 0x30, 0xB4, 0xF5, 0x39, 0xD0, 0xBC, 0xF7, 0x98, 0x05, 0xAF, 0xA8, 0x33, 0x4B, 0xC1, 0x16, 0x0F, 0xF2, 0xC2, 0x79, 0x96, 0xEC, 0xBE, 0xA9, 0xF5, 0x55, 0x7C, 0x82, 0x95, 0x73 -}; - -// DLP -static const unsigned char Dlp_sdk4_HdrPubK[0x100] = -{ - 0xB3, 0x16, 0x68, 0xF1, 0xED, 0x59, 0xC8, 0x7F, 0xC6, 0x50, 0x21, 0xFE, 0x36, 0x7C, 0x55, 0xE7, 0x07, 0xF9, 0x1D, 0x1B, 0xF5, 0xB1, 0x2A, 0x6B, 0x3A, 0xDE, 0x2D, 0x4C, 0x51, 0xCD, 0x4C, 0x9F, 0xEE, 0x1D, 0xE4, 0xE8, 0xF0, 0xFD, 0x09, 0x8E, 0x0F, 0x92, 0x5F, 0xDB, 0x9C, 0x5C, 0x15, 0x55, 0x1A, 0x4D, 0x04, 0x8C, 0xB0, 0xA4, 0x88, 0x97, 0xC4, 0xD5, 0x92, 0x04, 0x42, 0x33, 0x84, 0x81, 0x06, 0xD6, 0xF2, 0x17, 0xDE, 0x83, 0x17, 0x50, 0xD0, 0x47, 0x61, 0x14, 0x0D, 0xB7, 0xC7, 0xA0, 0xC1, 0x8B, 0x82, 0x47, 0x13, 0xEE, 0x76, 0xA2, 0xA3, 0x8D, 0xCE, 0x55, 0xC1, 0xF3, 0x7A, 0xEA, 0x91, 0xE1, 0xB9, 0x2F, 0x8F, 0x9B, 0xC3, 0x7B, 0x51, 0x2F, 0xE7, 0xAD, 0x93, 0x9C, 0xFD, 0xDF, 0x19, 0xC8, 0x6C, 0x24, 0xC2, 0xE2, 0x91, 0x97, 0x1F, 0xEB, 0x4B, 0xD4, 0x46, 0x6C, 0x06, 0x93, 0xAF, 0xF5, 0x5E, 0x8F, 0x77, 0x25, 0xC4, 0x28, 0xC0, 0x82, 0x4A, 0x78, 0xE9, 0x14, 0x08, 0xC3, 0xC3, 0x58, 0x24, 0x44, 0x2D, 0x2B, 0xA7, 0xEE, 0x28, 0xEF, 0x1B, 0x6D, 0xAA, 0x9C, 0xED, 0x7F, 0x35, 0xCE, 0x86, 0x5C, 0x6B, 0x8A, 0x23, 0xD3, 0x9D, 0x05, 0x8F, 0xD2, 0x41, 0x93, 0x1D, 0x1D, 0x7E, 0xB0, 0x46, 0x23, 0x63, 0x07, 0xEA, 0x5F, 0x26, 0xE3, 0x81, 0x27, 0xB3, 0x95, 0xB1, 0x93, 0x59, 0xD4, 0x1A, 0xB8, 0x73, 0xD0, 0x09, 0x95, 0x2B, 0xE8, 0x8B, 0xE2, 0x73, 0x5F, 0x34, 0xB9, 0x98, 0x82, 0xF0, 0x11, 0xC6, 0x8F, 0x12, 0x4D, 0x09, 0x57, 0x10, 0x97, 0x22, 0x0E, 0xC8, 0x7D, 0x40, 0xC1, 0x9D, 0x12, 0x1F, 0x71, 0xFE, 0x1E, 0x1A, 0x8C, 0x3F, 0x56, 0xAC, 0x43, 0xC3, 0x66, 0x0C, 0x81, 0xAE, 0xC1, 0x8F, 0x68, 0xFF, 0x87, 0x07, 0x3C, 0xCD, 0x0A, 0x23, 0xDE, 0xBA, 0x9B -}; - -static const unsigned char Dlp_sdk4_HdrPrivK[0x100] = -{ - 0x77, 0xC2, 0x7A, 0xB7, 0x9E, 0x13, 0xB6, 0x62, 0xCC, 0x09, 0x76, 0x51, 0xFB, 0xB9, 0xB5, 0xF0, 0x63, 0x82, 0x91, 0x96, 0xCA, 0xFC, 0x88, 0xF3, 0x60, 0x50, 0x87, 0x56, 0x4C, 0x35, 0xD0, 0x11, 0xFB, 0x38, 0x7E, 0x85, 0xCF, 0xF2, 0x46, 0xDB, 0x7B, 0x4A, 0x55, 0x54, 0x15, 0x01, 0xF7, 0x3A, 0x0B, 0xF6, 0x89, 0x1E, 0x54, 0x5A, 0x13, 0x05, 0xFB, 0x19, 0x1F, 0x26, 0x3D, 0xE7, 0x19, 0xAA, 0xF7, 0x19, 0xF2, 0x97, 0x47, 0xB3, 0xBE, 0x79, 0xCA, 0x6E, 0x91, 0x5A, 0xC9, 0xB9, 0xA6, 0x83, 0xB8, 0x2A, 0x45, 0x1A, 0xA7, 0x17, 0x86, 0xBA, 0x48, 0x49, 0x62, 0x3C, 0x33, 0x11, 0x51, 0x97, 0x5F, 0xAA, 0xE5, 0x1E, 0x0B, 0x19, 0x0C, 0xE6, 0x80, 0x6A, 0x5A, 0xB1, 0xD6, 0xCE, 0xDB, 0x6E, 0xC0, 0x5D, 0x29, 0x04, 0x84, 0x56, 0xE3, 0x29, 0x7E, 0xAC, 0xE8, 0xEE, 0xB1, 0x91, 0x37, 0xEB, 0x98, 0x9C, 0xBD, 0x02, 0x6A, 0x78, 0x61, 0xB0, 0x79, 0x1A, 0x9F, 0x30, 0x86, 0xF6, 0x71, 0x5A, 0x5A, 0x12, 0xA1, 0x9E, 0xA1, 0x68, 0x03, 0xE5, 0x95, 0xA8, 0x38, 0x58, 0x87, 0x08, 0x57, 0x35, 0x32, 0x47, 0x3B, 0xFC, 0x02, 0x6F, 0xCE, 0x55, 0x61, 0xA3, 0x2A, 0x6B, 0x2F, 0xF8, 0xEE, 0x8D, 0xFA, 0x43, 0x33, 0x02, 0x63, 0x47, 0x02, 0x78, 0x5A, 0x7F, 0x64, 0x07, 0x92, 0xB7, 0x7C, 0x09, 0x7C, 0xFE, 0x2D, 0x1C, 0xFC, 0x77, 0x9F, 0x19, 0x20, 0xDD, 0x6D, 0x4C, 0xFE, 0x49, 0x09, 0x47, 0xCA, 0x9B, 0x1C, 0x8C, 0x1F, 0x37, 0xAC, 0x14, 0x85, 0x56, 0xC0, 0xFD, 0xD6, 0x01, 0xB3, 0x40, 0xA3, 0x1A, 0x32, 0x78, 0xA0, 0xDD, 0x21, 0x75, 0xBF, 0x24, 0xD2, 0x93, 0x85, 0xED, 0x22, 0xAD, 0x99, 0x91, 0x87, 0x4A, 0xEC, 0xC0, 0x6C, 0x71, 0x00, 0x76, 0x08, 0x23, 0xA2, 0xF3, 0xCF, 0x61 -}; - -static const unsigned char Dlp_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk4_AcexSig[0x100] = -{ - 0xAC, 0xE2, 0xA7, 0xC3, 0x00, 0xDE, 0xE8, 0xE9, 0xE0, 0x03, 0xB3, 0x54, 0x08, 0xA8, 0xF8, 0x3A, 0x2E, 0xD8, 0x10, 0x6B, 0xEC, 0xDC, 0x4E, 0xEE, 0x62, 0x10, 0x71, 0x49, 0xD4, 0x43, 0xB1, 0x0E, 0x6B, 0x8C, 0xD7, 0x54, 0xD5, 0x62, 0x28, 0x3F, 0xAA, 0xDE, 0xA9, 0x7D, 0xED, 0x37, 0x7C, 0xE7, 0x89, 0x0B, 0x02, 0xB2, 0x72, 0x4B, 0x17, 0xDB, 0xE2, 0xD3, 0x7C, 0x94, 0x12, 0x3F, 0x2E, 0xA1, 0x08, 0x99, 0xCC, 0x7F, 0x93, 0xE6, 0x38, 0xC9, 0x37, 0x84, 0xD7, 0x11, 0x9D, 0x02, 0x4D, 0x66, 0xB4, 0x70, 0x9F, 0xD8, 0xC6, 0xDD, 0xD5, 0x13, 0x52, 0xF0, 0xA6, 0x78, 0x8C, 0x8E, 0x15, 0xA0, 0xA1, 0xF3, 0xC4, 0xC3, 0x48, 0x45, 0xA5, 0xBE, 0xC9, 0x7A, 0x8B, 0xD3, 0x95, 0xA5, 0x4C, 0xF1, 0xB3, 0x0C, 0x6C, 0x76, 0xA7, 0x57, 0xA1, 0x77, 0xDF, 0x2F, 0xC8, 0x06, 0xA6, 0x0D, 0x1A, 0x09, 0xE4, 0x38, 0x64, 0x07, 0xBE, 0x6A, 0xD2, 0xA0, 0xC0, 0xEC, 0x09, 0x64, 0x9F, 0x0D, 0x93, 0x0C, 0x89, 0xA2, 0x71, 0xD6, 0xC6, 0xC2, 0x54, 0x79, 0x2A, 0xA4, 0x31, 0x28, 0x24, 0x1A, 0xF3, 0x56, 0x78, 0x63, 0x99, 0x97, 0xA5, 0xCE, 0x8F, 0x52, 0x7A, 0x79, 0x51, 0xEE, 0x4C, 0x8B, 0x00, 0x9D, 0x5C, 0x3E, 0xD5, 0xAA, 0x24, 0x9C, 0x94, 0xC6, 0xA3, 0x99, 0x1B, 0x2D, 0xD4, 0xFF, 0xB4, 0x25, 0x73, 0x13, 0x33, 0x9F, 0x03, 0x6F, 0x1E, 0x75, 0xC4, 0x70, 0xF4, 0x07, 0x4F, 0x18, 0xFE, 0xBD, 0x8F, 0x2C, 0x9B, 0x33, 0xD4, 0x30, 0xA7, 0x18, 0x4A, 0xF1, 0xA4, 0xDD, 0x78, 0x41, 0xA0, 0xB8, 0x02, 0x8D, 0x51, 0x96, 0xBE, 0xE7, 0x17, 0x94, 0x66, 0x65, 0x27, 0xF7, 0x69, 0x48, 0x7E, 0xA9, 0x08, 0x71, 0x20, 0x76, 0xB7, 0x8E, 0xD2, 0xBF, 0x5C, 0x7E, 0x5E, 0x06, 0x45, 0xAB, 0x7E, 0x2E -}; - - -/* SDK 7 (7.1.0) */ -static const unsigned char sdk7_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x38, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk7_HdrPubK[0x100] = -{ - 0x9B, 0x3B, 0x52, 0x2D, 0x61, 0xF5, 0x0D, 0x14, - 0x96, 0x09, 0x7A, 0x66, 0xC9, 0x86, 0x4C, 0x51, - 0x61, 0x7D, 0xF8, 0x9B, 0xFD, 0xB0, 0x3E, 0x44, - 0xC5, 0x0D, 0xC2, 0x6B, 0x6C, 0x66, 0x63, 0x3E, - 0xE7, 0xC8, 0x04, 0xCB, 0x06, 0xC8, 0x35, 0xC5, - 0x6D, 0xDB, 0x38, 0x36, 0xC5, 0x54, 0x32, 0xF0, - 0x60, 0x11, 0x44, 0x9F, 0xD9, 0xFA, 0x6A, 0x43, - 0xE1, 0x79, 0x56, 0xBF, 0xCF, 0xDD, 0xA8, 0x35, - 0x15, 0x23, 0x51, 0xF9, 0x4B, 0xDA, 0x1A, 0xD9, - 0x9D, 0x28, 0xF6, 0xCC, 0x1D, 0x53, 0x00, 0xC0, - 0x3C, 0x13, 0x32, 0xBC, 0x7F, 0x75, 0x82, 0xCD, - 0x79, 0xEF, 0x65, 0xBC, 0xCA, 0x98, 0x31, 0x0A, - 0x7B, 0xEF, 0x18, 0xD8, 0xF3, 0x8D, 0x3A, 0x10, - 0x22, 0xA0, 0xF2, 0x8D, 0xA5, 0xA8, 0xBE, 0xA0, - 0x62, 0xEC, 0xE2, 0xC7, 0x6C, 0xCF, 0x06, 0x6B, - 0xA7, 0xB5, 0xB8, 0x8C, 0xD5, 0x8E, 0xEF, 0xE3, - 0x42, 0xC9, 0xAD, 0x44, 0x46, 0x3A, 0x4E, 0x77, - 0x63, 0x02, 0xB4, 0x4E, 0xB4, 0x42, 0x65, 0x1D, - 0x68, 0x98, 0x37, 0x7A, 0x27, 0x87, 0x31, 0xBE, - 0x48, 0xFA, 0x4E, 0xD3, 0x85, 0xA6, 0xD6, 0xD2, - 0x2D, 0xCD, 0x10, 0xC9, 0x13, 0x59, 0x12, 0x48, - 0x14, 0x67, 0x3E, 0x40, 0xD3, 0xF8, 0x60, 0xA0, - 0xBD, 0x77, 0x31, 0x76, 0x78, 0x85, 0x55, 0x53, - 0x16, 0xF1, 0xB9, 0xFF, 0x7F, 0x3D, 0x9A, 0xF1, - 0x33, 0x1E, 0x67, 0x8F, 0x6B, 0x4A, 0x7A, 0x79, - 0x54, 0x8B, 0x43, 0xB5, 0xC2, 0xAF, 0xB8, 0x75, - 0x11, 0xDE, 0x4D, 0x34, 0x6A, 0xD6, 0x5A, 0x3B, - 0x48, 0x1F, 0x41, 0x9D, 0xF4, 0x58, 0x90, 0x67, - 0xA8, 0x71, 0xD4, 0x09, 0x67, 0xF7, 0x55, 0xEF, - 0xD3, 0x7C, 0x7D, 0x2F, 0x76, 0x84, 0x70, 0x6E, - 0xAA, 0x75, 0x7D, 0xA9, 0x95, 0x42, 0xEF, 0x28, - 0x29, 0x48, 0xCD, 0x79, 0xA8, 0x16, 0xB6, 0xB5 -}; - -static const unsigned char App_sdk7_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, - 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, - 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, - 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, - 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, - 0x41, 0x50, 0x54, 0x3A, 0x41, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x74, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x61, 0x6D, 0x3A, 0x61, 0x70, 0x70, 0x00, 0x00, - 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, - 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, - 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, - 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, - 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, - 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, - 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, - 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, - 0x6E, 0x69, 0x6D, 0x3A, 0x61, 0x6F, 0x63, 0x00, - 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, - 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, - 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, - 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, - 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, - 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, - 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, - 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, - 0x00, 0x02, 0x00, 0xFE, 0x27, 0x02, 0x00, 0xFC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk7_AcexSig[0x100] = -{ - 0x06, 0xDD, 0x68, 0x17, 0xAA, 0x40, 0x3A, 0x75, - 0xD2, 0xCF, 0xA2, 0x5A, 0xC8, 0x1B, 0x74, 0x9D, - 0x91, 0xCD, 0x38, 0x4E, 0xCA, 0x19, 0x60, 0x8E, - 0x39, 0x71, 0x6C, 0xB9, 0xF9, 0x9F, 0x68, 0x44, - 0xCF, 0x33, 0x94, 0x54, 0x72, 0xCC, 0xC6, 0x33, - 0x96, 0x9F, 0x12, 0x07, 0xE9, 0x38, 0x87, 0x70, - 0x11, 0x51, 0xFD, 0xBF, 0xD9, 0x2D, 0xFA, 0x3F, - 0x70, 0x42, 0x75, 0x39, 0xE3, 0x97, 0x85, 0xAF, - 0x7B, 0xC5, 0x87, 0x9B, 0x0B, 0xF9, 0xE4, 0x1C, - 0xC5, 0x6B, 0x44, 0x2A, 0x10, 0x14, 0x86, 0xAA, - 0xFE, 0x9E, 0x5B, 0x1D, 0x15, 0xBA, 0x8C, 0x34, - 0xA2, 0xAF, 0x14, 0xD0, 0xD4, 0x0E, 0x7B, 0x3A, - 0xD5, 0x3C, 0x53, 0xDB, 0x7C, 0xBE, 0x44, 0x58, - 0x79, 0x42, 0x23, 0x3A, 0x77, 0xA3, 0x2C, 0xB9, - 0xEB, 0x62, 0x19, 0x94, 0x2B, 0xA0, 0x67, 0x94, - 0xC6, 0xB2, 0x90, 0xC6, 0x61, 0xFD, 0x43, 0xEC, - 0xEA, 0x27, 0x7E, 0xA6, 0xB1, 0xED, 0xA9, 0x67, - 0xED, 0x56, 0x91, 0x90, 0xF9, 0x32, 0x4E, 0xC3, - 0x29, 0x5A, 0x84, 0x4C, 0xAB, 0x99, 0x75, 0x40, - 0x8E, 0x19, 0xD9, 0x12, 0xD1, 0x06, 0x2D, 0xD0, - 0x2C, 0xD9, 0x6C, 0x41, 0x35, 0x64, 0xDB, 0x80, - 0x63, 0xB2, 0x01, 0xF8, 0x29, 0xAB, 0xF5, 0x70, - 0x79, 0x4E, 0x0F, 0xFA, 0x23, 0x20, 0x2E, 0x04, - 0x75, 0x48, 0x15, 0x9B, 0x71, 0xD5, 0x85, 0x09, - 0x67, 0x7D, 0xAC, 0x6A, 0xFA, 0xC0, 0x16, 0xAF, - 0x58, 0x26, 0xCD, 0x6F, 0x1F, 0xB8, 0xF5, 0x8D, - 0xD1, 0x7D, 0x3D, 0x70, 0x2F, 0x08, 0xB8, 0x23, - 0x61, 0x24, 0xAE, 0x94, 0x31, 0xA3, 0xBD, 0x1E, - 0x18, 0xD7, 0x82, 0x92, 0xDD, 0x11, 0x79, 0x7D, - 0x1F, 0xEC, 0x03, 0x08, 0x82, 0xCC, 0x52, 0x62, - 0xC9, 0x27, 0x2D, 0x08, 0xD5, 0x6B, 0x4E, 0x86, - 0x2E, 0x3F, 0x50, 0x5C, 0xA3, 0xC1, 0xDF, 0xF5, -}; - -#endif \ No newline at end of file diff --git a/cia.c b/cia.c index 4879d91..fce6c3f 100644 --- a/cia.c +++ b/cia.c @@ -18,8 +18,8 @@ int get_CIASettings(cia_settings *ciaset, user_settings *usrset); int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset); int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset); -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader); -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs); +int GetCIADataFromNcch(cia_settings *ciaset, ncch_hdr *NcchHdr, extended_hdr *ExHeader); +int GetMetaRegion(cia_settings *ciaset, extended_hdr *ExHeader, u8 *ExeFs); int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset); int GetSettingsFromSrl(cia_settings *ciaset); int GetSettingsFromCci(cia_settings *ciaset); @@ -50,9 +50,9 @@ int build_CIA(user_settings *usrset) if(result) goto finish; // Create Output File - ciaset->out = fopen(usrset->outfile,"wb"); + ciaset->out = fopen(usrset->common.outFileName,"wb"); if(!ciaset->out){ - fprintf(stderr,"[CIA ERROR] Failed to create '%s'\n",usrset->outfile); + fprintf(stderr,"[CIA ERROR] Failed to create \"%s\"\n",usrset->common.outFileName); result = FAILED_TO_CREATE_OUTFILE; goto finish; } @@ -99,16 +99,16 @@ void init_CIASettings(cia_settings *set) void free_CIASettings(cia_settings *set) { - if(set->content.ContentFilePtrs){ - for(u32 i = 1; i < set->content.ContentCount; i++){ - fclose(set->content.ContentFilePtrs[i]); + if(set->content.contentFilePtrs){ + for(u32 i = 1; i < set->content.contentCount; i++){ + fclose(set->content.contentFilePtrs[i]); } - free(set->content.ContentFilePtrs); + free(set->content.contentFilePtrs); } - free(set->CIA_Sections.CertChain.buffer); - free(set->CIA_Sections.Ticket.buffer); - free(set->CIA_Sections.TitleMetaData.buffer); - free(set->CIA_Sections.CXI_MetaData.buffer); + free(set->ciaSections.certChain.buffer); + free(set->ciaSections.tik.buffer); + free(set->ciaSections.tmd.buffer); + free(set->ciaSections.meta.buffer); memset(set,0,sizeof(cia_settings)); @@ -122,19 +122,19 @@ int get_CIASettings(cia_settings *ciaset, user_settings *usrset) // Transfering data from usrset result = GetSettingsFromUsrset(ciaset,usrset); - if(usrset->Content0IsNcch){ + if(usrset->common.workingFileType == infile_ncch){ result = GetSettingsFromNcch0(ciaset,0); if(result) return result; result = GetContentFilePtrs(ciaset,usrset); if(result) return result; } - else if(usrset->Content0IsSrl){ + else if(usrset->common.workingFileType == infile_srl){ result = GetSettingsFromSrl(ciaset); if(result) return result; } - else if(usrset->ConvertCci){ + else if(usrset->common.workingFileType == infile_ncsd){ result = GetSettingsFromCci(ciaset); if(result) return result; } @@ -146,58 +146,63 @@ int get_CIASettings(cia_settings *ciaset, user_settings *usrset) int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset) { // General Stuff - ciaset->keys = &usrset->keys; - ciaset->content.content0 = usrset->Content0.buffer; - ciaset->content.content0_FileLen = usrset->Content0.size; - u32_to_u8(ciaset->Title_type,TYPE_CTR,BE); - ciaset->content.EncryptContents = usrset->EncryptContents; - if(ciaset->keys->aes.CommonKey[ciaset->keys->aes.CurrentCommonKey] == NULL && ciaset->content.EncryptContents){ + ciaset->keys = &usrset->common.keys; + ciaset->inFile = usrset->common.workingFile.buffer; + ciaset->inFileSize = usrset->common.workingFile.size; + u32_to_u8(ciaset->tmd.titleType,TYPE_CTR,BE); + ciaset->content.encryptCia = usrset->cia.encryptCia; + ciaset->content.IsDlc = usrset->cia.DlcContent; + if(ciaset->keys->aes.commonKey[ciaset->keys->aes.currentCommonKey] == NULL && ciaset->content.encryptCia){ fprintf(stderr,"[CIA WARNING] Common Key could not be loaded, CIA will not be encrypted\n"); - ciaset->content.EncryptContents = false; + ciaset->content.encryptCia = false; } - ciaset->cert.ca_crl_version = 0; - ciaset->cert.signer_crl_version = 0; + ciaset->cert.caCrlVersion = 0; + ciaset->cert.signerCrlVersion = 0; for(int i = 0; i < 3; i++){ - ciaset->Version[i] = usrset->Version[i]; + ciaset->common.titleVersion[i] = usrset->cia.titleVersion[i]; } + ciaset->content.overrideSaveDataSize = usrset->cia.overideSaveDataSize; + // Random Number generator u8 hash[0x20]; - ctr_sha(ciaset->content.content0,0x100,hash,CTR_SHA_256); - - // Ticket Data - memcpy(ciaset->tik.TicketID,(hash+0x8),8); - if(usrset->RandomTitleKey){ - memcpy(ciaset->tik.TitleKey,(hash+0x10),16); - } - else{ - memcpy(ciaset->tik.TitleKey,usrset->keys.aes.NormalKey,16); - } - - ciaset->tik.ticket_format_ver = 1; + if(usrset->common.rsfPath) + ctr_sha(usrset->common.rsfPath,strlen(usrset->common.rsfPath),hash,CTR_SHA_256); + else + ctr_sha(ciaset->inFile,(rand() % 0x200),hash,CTR_SHA_256); - int result = GenCertChildIssuer(ciaset->tik.TicketIssuer,usrset->keys.certs.tik_cert); + // Ticket Data + memcpy(ciaset->tik.ticketId,(hash+0x8),8); + if(usrset->cia.randomTitleKey) + memcpy(ciaset->common.titleKey,(hash+0x10),16); + else + memset(ciaset->common.titleKey,0,16); + + ciaset->tik.formatVersion = 1; + + int result = GenCertChildIssuer(ciaset->tik.issuer,ciaset->keys->certs.xsCert); if(result) return result; // Tmd Stuff - if(usrset->ContentID[0] > 0xffffffff){ - ciaset->content.ContentId[0] = u8_to_u32(hash,BE); + if(usrset->cia.contentId[0] > 0xffffffff){ + ciaset->content.contentId[0] = u8_to_u32(hash,BE); } - else ciaset->content.ContentId[0] = usrset->ContentID[0]; - ciaset->tmd.tmd_format_ver = 1; - result = GenCertChildIssuer(ciaset->tmd.TMDIssuer,usrset->keys.certs.tmd_cert); + else + ciaset->content.contentId[0] = usrset->cia.contentId[0]; + ciaset->tmd.formatVersion = 1; + result = GenCertChildIssuer(ciaset->tmd.issuer,ciaset->keys->certs.cpCert); return 0; } int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset) { /* Sanity Checks */ - if(!ciaset->content.content0_FileLen) + if(!ciaset->inFile) return CIA_NO_NCCH0; - u8 *ncch0 = (u8*)(ciaset->content.content0+ncch0_offset); + u8 *ncch0 = (u8*)(ciaset->inFile+ncch0_offset); if(!IsNCCH(NULL,ncch0)){ fprintf(stderr,"[CIA ERROR] Content0 is not NCCH\n"); @@ -205,26 +210,29 @@ int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset) } /* Get Ncch0 Header */ - NCCH_Header *hdr = NULL; + ncch_hdr *hdr = NULL; hdr = GetNCCH_CommonHDR(hdr,NULL,ncch0); if(IsCfa(hdr)){ ciaset->content.IsCfa = true; } - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.TotalContentSize = ciaset->content.ContentSize[0]; + ciaset->content.contentOffset[0] = 0; + ciaset->content.contentSize[0] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); + ciaset->content.totalContentSize = ciaset->content.contentSize[0]; /* Get Ncch0 Import Context */ - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); - if(!ncch_ctx){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); + ncch_struct *ncch_ctx = malloc(sizeof(ncch_struct)); + if(!ncch_ctx){ + fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memset(ncch_ctx,0x0,sizeof(ncch_struct)); GetCXIStruct(ncch_ctx,hdr); /* Verify Ncch0 (Sig&Hash Checks) */ - int result = VerifyNCCH(ncch0,ciaset->keys,true); + int result = VerifyNCCH(ncch0,ciaset->keys,false); if(result == UNABLE_TO_LOAD_NCCH_KEY){ - ciaset->content.KeyNotFound = true; + ciaset->content.keyNotFound = true; if(!ciaset->content.IsCfa){ fprintf(stderr,"[CIA WARNING] CXI AES Key could not be loaded\n"); fprintf(stderr," Meta Region, SaveDataSize, Remaster Version cannot be obtained\n"); @@ -236,17 +244,17 @@ int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset) } /* Gen Settings From Ncch0 */ - endian_memcpy(ciaset->TitleID,hdr->title_id,8,LE); + endian_memcpy(ciaset->common.titleId,hdr->titleId,8,LE); /* Getting ExeFs/ExHeader */ - u8 *ExeFs = malloc(ncch_ctx->exefs_size); + u8 *ExeFs = malloc(ncch_ctx->exefsSize); if(!ExeFs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); + extended_hdr *ExHeader = malloc(ncch_ctx->exhdrSize); if(!ExHeader){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); free(ExeFs); return MEM_ERROR; } - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection(ExeFs, ncch_ctx->exefs_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_exefs); - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection((u8*)ExHeader, ncch_ctx->exheader_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_ExHeader); + if(!(ciaset->content.IsCfa||ciaset->content.keyNotFound)) GetNCCHSection(ExeFs, ncch_ctx->exefsSize, 0, ncch0, ncch_ctx, ciaset->keys, ncch_exefs); + if(!(ciaset->content.IsCfa||ciaset->content.keyNotFound)) GetNCCHSection((u8*)ExHeader, ncch_ctx->exhdrSize, 0, ncch0, ncch_ctx, ciaset->keys, ncch_exhdr); result = GetCIADataFromNcch(ciaset,hdr,ExHeader); // Data For TMD if(result) goto finish; @@ -261,87 +269,100 @@ finish: return result; } -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader) +int GetCIADataFromNcch(cia_settings *ciaset, ncch_hdr *NcchHdr, extended_hdr *ExHeader) { - u16 Category = u8_to_u16((ciaset->TitleID+2),BE); - bool IsPatch = (Category == 0x000E); - if(IsPatch||ciaset->content.IsCfa||ciaset->content.KeyNotFound) u32_to_u8(ciaset->tmd.SaveDataSize,0,LE); - else u32_to_u8(ciaset->tmd.SaveDataSize,(u32)GetSaveDataSize_frm_exhdr(ExHeader),LE); - + u16 Category = u8_to_u16((ciaset->common.titleId+2),BE); + if(IsPatch(Category)||ciaset->content.IsCfa||ciaset->content.keyNotFound) u32_to_u8(ciaset->tmd.savedataSize,0,LE); + else u32_to_u8(ciaset->tmd.savedataSize,(u32)GetSaveDataSize_frm_exhdr(ExHeader),LE); + if(ciaset->content.overrideSaveDataSize){ + u64 size = 0; + GetSaveDataSizeFromString(&size,ciaset->content.overrideSaveDataSize); + u32_to_u8(ciaset->tmd.savedataSize,(u32)size,LE); + } - if(ciaset->content.IsCfa||ciaset->content.KeyNotFound){ - if(ciaset->Version[0] == 0xffff){ // '-major' wasn't set + if(ciaset->content.IsCfa||ciaset->content.keyNotFound){ + if(ciaset->common.titleVersion[0] == 0xffff){ // '-major' wasn't set if(ciaset->content.IsCfa){ // Is a CFA and can be decrypted - fprintf(stderr,"[CIA ERROR] Invalid major version. Use '-major' option.\n"); + fprintf(stderr,"[CIA ERROR] Invalid major version. Use \"-major\" option.\n"); return CIA_BAD_VERSION; } else // CXI which cannot be decrypted - ciaset->Version[0] = 0; + ciaset->common.titleVersion[0] = 0; } } else{ // Is a CXI and can be decrypted - if(ciaset->Version[0] != 0xffff){ // '-major' was set - fprintf(stderr,"[CIA ERROR] Option '-major' cannot be applied for cxi.\n"); + if(ciaset->common.titleVersion[0] != 0xffff){ // '-major' was set + fprintf(stderr,"[CIA ERROR] Option \"-major\" cannot be applied for cxi.\n"); return CIA_BAD_VERSION; } // Setting remaster ver - ciaset->Version[0] = GetRemasterVersion_frm_exhdr(ExHeader); + ciaset->common.titleVersion[0] = GetRemasterVersion_frm_exhdr(ExHeader); } - SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - u16 version = SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); + u16 version = SetupVersion(ciaset->common.titleVersion[0],ciaset->common.titleVersion[1],ciaset->common.titleVersion[2]); + ciaset->tik.version = version; + ciaset->tmd.version = version; return 0; } -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs) +int GetMetaRegion(cia_settings *ciaset, extended_hdr *ExHeader, u8 *ExeFs) { - if(ciaset->content.IsCfa || ciaset->content.KeyNotFound) return 0; - ciaset->CIA_Sections.CXI_MetaData.size = sizeof(MetaData_Struct) + GetExeFsSectionSize("icon",ExeFs); - ciaset->CIA_Sections.CXI_MetaData.buffer = malloc(ciaset->CIA_Sections.CXI_MetaData.size); - if(!ciaset->CIA_Sections.CXI_MetaData.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - MetaData_Struct *hdr = (MetaData_Struct*)ciaset->CIA_Sections.CXI_MetaData.buffer; - memset(hdr,0,sizeof(MetaData_Struct)); - GetDependancyList_frm_exhdr(hdr->DependancyList,ExHeader); - GetCoreVersion_frm_exhdr(hdr->CoreVersion,ExHeader); + if(ciaset->content.IsCfa || ciaset->content.keyNotFound) return 0; + ciaset->ciaSections.meta.size = sizeof(cia_metadata) + GetExeFsSectionSize("icon",ExeFs); + ciaset->ciaSections.meta.buffer = malloc(ciaset->ciaSections.meta.size); + if(!ciaset->ciaSections.meta.buffer){ + fprintf(stderr,"[CIA ERROR] Not enough memory\n"); + return MEM_ERROR; + } + cia_metadata *hdr = (cia_metadata*)ciaset->ciaSections.meta.buffer; + memset(hdr,0,sizeof(cia_metadata)); + GetDependencyList_frm_exhdr(hdr->dependencyList,ExHeader); + GetCoreVersion_frm_exhdr(hdr->coreVersion,ExHeader); if(DoesExeFsSectionExist("icon",ExeFs)){ - u8 *IconDestPos = (ciaset->CIA_Sections.CXI_MetaData.buffer + sizeof(MetaData_Struct)); + u8 *IconDestPos = (ciaset->ciaSections.meta.buffer + sizeof(cia_metadata)); memcpy(IconDestPos,GetExeFsSection("icon",ExeFs),GetExeFsSectionSize("icon",ExeFs)); + //memdump(stdout,"Icon: ",IconDestPos,0x10); } return 0; } int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset) { - ciaset->content.ContentFilePtrs = malloc(sizeof(FILE*)*CIA_MAX_CONTENT); - if(!ciaset->content.ContentFilePtrs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ciaset->content.ContentFilePtrs,0,sizeof(FILE*)*CIA_MAX_CONTENT); + ciaset->content.contentFilePtrs = malloc(sizeof(FILE*)*CIA_MAX_CONTENT); + if(!ciaset->content.contentFilePtrs){ + fprintf(stderr,"[CIA ERROR] Not enough memory\n"); + return MEM_ERROR; + } + memset(ciaset->content.contentFilePtrs,0,sizeof(FILE*)*CIA_MAX_CONTENT); int j = 1; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); + ncch_hdr *hdr = malloc(sizeof(ncch_hdr)); for(int i = 1; i < CIA_MAX_CONTENT; i++){ - if(usrset->ContentPath[i]){ - ciaset->content.ContentFilePtrs[j] = fopen(usrset->ContentPath[i],"rb"); - if(!ciaset->content.ContentFilePtrs[j]){ fprintf(stderr,"[CIA ERROR] Failed to open '%s'\n",usrset->ContentPath[i]); return FAILED_TO_OPEN_FILE; } - if(usrset->ContentID[i] == 0x100000000){ - u8 hash[0x20]; - ctr_sha(usrset->ContentPath[i],strlen(usrset->ContentPath[i]),hash,CTR_SHA_256); - ciaset->content.ContentId[j] = u8_to_u32(hash,BE); + if(usrset->common.contentPath[i]){ + ciaset->content.contentFilePtrs[j] = fopen(usrset->common.contentPath[i],"rb"); + if(!ciaset->content.contentFilePtrs[j]){ + fprintf(stderr,"[CIA ERROR] Failed to open \"%s\"\n",usrset->common.contentPath[i]); + return FAILED_TO_OPEN_FILE; } - else ciaset->content.ContentId[j] = (u32)usrset->ContentID[i]; - ciaset->content.ContentIndex[j] = (u16)i; + if(usrset->cia.contentId[i] == 0x100000000){ + u8 hash[0x20]; + ctr_sha(usrset->common.contentPath[i],strlen(usrset->common.contentPath[i]),hash,CTR_SHA_256); + ciaset->content.contentId[j] = u8_to_u32(hash,BE); + } + else + ciaset->content.contentId[j] = (u32)usrset->cia.contentId[i]; + ciaset->content.contentIndex[j] = (u16)i; // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,ciaset->content.ContentFilePtrs[j],NULL); + GetNCCH_CommonHDR(hdr,ciaset->content.contentFilePtrs[j],NULL); // Get TitleID - memcpy(ciaset->content.ContentTitleId[j],hdr->title_id,8); + memcpy(ciaset->content.contentTitleId[j],hdr->titleId,8); // Get Size - ciaset->content.ContentSize[j] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.ContentOffset[j] = ciaset->content.TotalContentSize; + ciaset->content.contentSize[j] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); + ciaset->content.contentOffset[j] = ciaset->content.totalContentSize,0x40; - ciaset->content.TotalContentSize += ciaset->content.ContentSize[j]; + ciaset->content.totalContentSize += ciaset->content.contentSize[j]; // Finish get next content @@ -349,13 +370,13 @@ int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset) } } free(hdr); - ciaset->content.ContentCount = j; + ciaset->content.contentCount = j; // Check Conflicting IDs - for(int i = 0; i < ciaset->content.ContentCount; i++){ - for(j = i+1; j < ciaset->content.ContentCount; j++){ - if(ciaset->content.ContentId[j] == ciaset->content.ContentId[i]){ - fprintf(stderr,"[CIA ERROR] CIA Content %d and %d, have conflicting IDs\n",ciaset->content.ContentIndex[j],ciaset->content.ContentIndex[i]); + for(int i = 0; i < ciaset->content.contentCount; i++){ + for(j = i+1; j < ciaset->content.contentCount; j++){ + if(ciaset->content.contentId[j] == ciaset->content.contentId[i]){ + fprintf(stderr,"[CIA ERROR] CIA Content %d and %d, have conflicting IDs\n",ciaset->content.contentIndex[j],ciaset->content.contentIndex[i]); return CIA_CONFILCTING_CONTENT_IDS; } } @@ -365,8 +386,8 @@ int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset) int GetSettingsFromSrl(cia_settings *ciaset) { - SRL_Header *hdr = (SRL_Header*)ciaset->content.content0; - if(!hdr || ciaset->content.content0_FileLen < sizeof(SRL_Header)) { + SRL_Header *hdr = (SRL_Header*)ciaset->inFile; + if(!hdr || ciaset->inFileSize < sizeof(SRL_Header)) { fprintf(stderr,"[CIA ERROR] Invalid TWL SRL File\n"); return FAILED_TO_IMPORT_FILE; } @@ -378,26 +399,26 @@ int GetSettingsFromSrl(cia_settings *ciaset) } // Generate and store Converted TitleID - u64_to_u8(ciaset->TitleID,ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE)),BE); + u64_to_u8(ciaset->common.titleId,ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE)),BE); //memdump(stdout,"SRL TID: ",ciaset->TitleID,8); // Get TWL Flag - ciaset->tmd.twl_flag = ((hdr->reserved_flags[3] & 6) >> 1); + ciaset->tmd.twlFlag = ((hdr->reserved_flags[3] & 6) >> 1); // Get Remaster Version - u16 version = SetupVersion(hdr->rom_version,ciaset->Version[1],0); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); + u16 version = SetupVersion(hdr->rom_version,ciaset->common.titleVersion[1],0); + ciaset->tik.version = version; + ciaset->tmd.version = version; // Get SaveDataSize (Public and Private) - memcpy(ciaset->tmd.SaveDataSize,hdr->pub_save_data_size,4); - memcpy(ciaset->tmd.PrivSaveDataSize,hdr->priv_save_data_size,4); + memcpy(ciaset->tmd.savedataSize,hdr->pub_save_data_size,4); + memcpy(ciaset->tmd.privSavedataSize,hdr->priv_save_data_size,4); // Setting CIA Content Settings - ciaset->content.ContentCount = 1; - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = ciaset->content.content0_FileLen; - ciaset->content.TotalContentSize = ciaset->content.content0_FileLen; + ciaset->content.contentCount = 1; + ciaset->content.contentOffset[0] = 0; + ciaset->content.contentSize[0] = ciaset->inFileSize; + ciaset->content.totalContentSize = ciaset->inFileSize; return 0; } @@ -408,14 +429,14 @@ int GetSettingsFromCci(cia_settings *ciaset) { int result = 0; - if(!IsCci(ciaset->content.content0)){ + if(!IsCci(ciaset->inFile)){ fprintf(stderr,"[CIA ERROR] Invalid CCI file\n"); return FAILED_TO_IMPORT_FILE; } - u32 ncch0_offset = GetPartitionOffset(ciaset->content.content0,0); + u32 ncch0_offset = GetPartitionOffset(ciaset->inFile,0); if(!ncch0_offset){ - fprintf(stderr,"[CIA ERROR] Invalid CCI file (invalid ncch0 size)\n"); + fprintf(stderr,"[CIA ERROR] Invalid CCI file (invalid ncch0)\n"); return FAILED_TO_IMPORT_FILE; } @@ -424,32 +445,32 @@ int GetSettingsFromCci(cia_settings *ciaset) fprintf(stderr,"Import of Ncch 0 failed(%d)\n",result); return result; } - ciaset->content.ContentCount = 1; - ciaset->content.CCIContentOffsets[0] = ncch0_offset; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); + ciaset->content.contentCount = 1; + ciaset->content.cciContentOffsets[0] = ncch0_offset; + ncch_hdr *hdr = malloc(sizeof(ncch_hdr)); for(int i = 1; i < 8; i++){ - if(GetPartitionSize(ciaset->content.content0,i)){ - ciaset->content.CCIContentOffsets[ciaset->content.ContentCount] = GetPartitionOffset(ciaset->content.content0,i); + if(GetPartitionSize(ciaset->inFile,i)){ + ciaset->content.cciContentOffsets[ciaset->content.contentCount] = GetPartitionOffset(ciaset->inFile,i); // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,NULL,GetPartition(ciaset->content.content0,i)); + GetNCCH_CommonHDR(hdr,NULL,GetPartition(ciaset->inFile,i)); // Get Size - ciaset->content.ContentSize[ciaset->content.ContentCount] = GetPartitionSize(ciaset->content.content0,i); - ciaset->content.ContentOffset[ciaset->content.ContentCount] = ciaset->content.TotalContentSize; + ciaset->content.contentSize[ciaset->content.contentCount] = GetPartitionSize(ciaset->inFile,i); + ciaset->content.contentOffset[ciaset->content.contentCount] = ciaset->content.totalContentSize; - ciaset->content.TotalContentSize += ciaset->content.ContentSize[ciaset->content.ContentCount]; + ciaset->content.totalContentSize += ciaset->content.contentSize[ciaset->content.contentCount]; // Get ID u8 hash[0x20]; ctr_sha((u8*)hdr,0x200,hash,CTR_SHA_256); - ciaset->content.ContentId[ciaset->content.ContentCount] = u8_to_u32(hash,BE); + ciaset->content.contentId[ciaset->content.contentCount] = u8_to_u32(hash,BE); // Get Index - ciaset->content.ContentIndex[ciaset->content.ContentCount] = i; + ciaset->content.contentIndex[ciaset->content.contentCount] = i; // Increment Content Count - ciaset->content.ContentCount++; + ciaset->content.contentCount++; } } free(hdr); @@ -464,130 +485,136 @@ u16 SetupVersion(u16 Major, u16 Minor, u16 Micro) int BuildCIA_CertChain(cia_settings *ciaset) { - ciaset->CIA_Sections.CertChain.size = GetCertSize(ciaset->keys->certs.ca_cert) + GetCertSize(ciaset->keys->certs.tik_cert) + GetCertSize(ciaset->keys->certs.tmd_cert); - ciaset->CIA_Sections.CertChain.buffer = malloc(ciaset->CIA_Sections.CertChain.size); - if(!ciaset->CIA_Sections.CertChain.buffer) { fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memcpy(ciaset->CIA_Sections.CertChain.buffer,ciaset->keys->certs.ca_cert,GetCertSize(ciaset->keys->certs.ca_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)),ciaset->keys->certs.tik_cert,GetCertSize(ciaset->keys->certs.tik_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)+GetCertSize(ciaset->keys->certs.tik_cert)),ciaset->keys->certs.tmd_cert,GetCertSize(ciaset->keys->certs.tmd_cert)); + ciaset->ciaSections.certChain.size = GetCertSize(ciaset->keys->certs.caCert) + GetCertSize(ciaset->keys->certs.xsCert) + GetCertSize(ciaset->keys->certs.cpCert); + ciaset->ciaSections.certChain.buffer = malloc(ciaset->ciaSections.certChain.size); + if(!ciaset->ciaSections.certChain.buffer) { + fprintf(stderr,"[CIA ERROR] Not enough memory\n"); + return MEM_ERROR; + } + memcpy(ciaset->ciaSections.certChain.buffer,ciaset->keys->certs.caCert,GetCertSize(ciaset->keys->certs.caCert)); + memcpy((ciaset->ciaSections.certChain.buffer+GetCertSize(ciaset->keys->certs.caCert)),ciaset->keys->certs.xsCert,GetCertSize(ciaset->keys->certs.xsCert)); + memcpy((ciaset->ciaSections.certChain.buffer+GetCertSize(ciaset->keys->certs.caCert)+GetCertSize(ciaset->keys->certs.xsCert)),ciaset->keys->certs.cpCert,GetCertSize(ciaset->keys->certs.cpCert)); return 0; } int BuildCIA_Header(cia_settings *ciaset) { // Allocating memory for header - ciaset->CIA_Sections.Header.size = sizeof(CIA_Header); - ciaset->CIA_Sections.Header.buffer = malloc(ciaset->CIA_Sections.Header.size); - if(!ciaset->CIA_Sections.Header.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } + ciaset->ciaSections.ciaHdr.size = sizeof(cia_hdr); + ciaset->ciaSections.ciaHdr.buffer = malloc(ciaset->ciaSections.ciaHdr.size); + if(!ciaset->ciaSections.ciaHdr.buffer){ + fprintf(stderr,"[CIA ERROR] Not enough memory\n"); + return MEM_ERROR; + } - CIA_Header *hdr = (CIA_Header*)ciaset->CIA_Sections.Header.buffer; + cia_hdr *hdr = (cia_hdr*)ciaset->ciaSections.ciaHdr.buffer; // Clearing - memset(hdr,0,sizeof(CIA_Header)); + memset(hdr,0,sizeof(cia_hdr)); // Predict TMD Size - ciaset->CIA_Sections.TitleMetaData.size = PredictTMDSize(ciaset->content.ContentCount); + ciaset->ciaSections.tmd.size = PredictTMDSize(ciaset->content.contentCount); // Setting Data - u32_to_u8(hdr->HdrSize,sizeof(CIA_Header),LE); - u16_to_u8(hdr->Type,0x0,LE); - u16_to_u8(hdr->Version,0x0,LE); - u32_to_u8(hdr->CertChainSize,ciaset->CIA_Sections.CertChain.size,LE); - u32_to_u8(hdr->TicketSize,ciaset->CIA_Sections.Ticket.size,LE); - u32_to_u8(hdr->TitleMetaDataSize,ciaset->CIA_Sections.TitleMetaData.size,LE); - u32_to_u8(hdr->CXI_MetaSize,ciaset->CIA_Sections.CXI_MetaData.size,LE); - u64_to_u8(hdr->ContentSize,ciaset->content.TotalContentSize,LE); + u32_to_u8(hdr->hdrSize,sizeof(cia_hdr),LE); + u16_to_u8(hdr->type,0x0,LE); + u16_to_u8(hdr->version,0x0,LE); + u32_to_u8(hdr->certChainSize,ciaset->ciaSections.certChain.size,LE); + u32_to_u8(hdr->tikSize,ciaset->ciaSections.tik.size,LE); + u32_to_u8(hdr->tmdSize,ciaset->ciaSections.tmd.size,LE); + u32_to_u8(hdr->metaSize,ciaset->ciaSections.meta.size,LE); + u64_to_u8(hdr->contentSize,ciaset->content.totalContentSize,LE); // Recording Offsets - ciaset->CIA_Sections.CertChainOffset = align_value(sizeof(CIA_Header),0x40); - ciaset->CIA_Sections.TicketOffset = align_value(ciaset->CIA_Sections.CertChainOffset+ciaset->CIA_Sections.CertChain.size,0x40); - ciaset->CIA_Sections.TitleMetaDataOffset = align_value(ciaset->CIA_Sections.TicketOffset+ciaset->CIA_Sections.Ticket.size,0x40); - ciaset->CIA_Sections.ContentOffset = align_value(ciaset->CIA_Sections.TitleMetaDataOffset+ciaset->CIA_Sections.TitleMetaData.size,0x40); - ciaset->CIA_Sections.CXI_MetaDataOffset = align_value(ciaset->CIA_Sections.ContentOffset+ciaset->content.TotalContentSize,0x40); + ciaset->ciaSections.certChainOffset = align_value(sizeof(cia_hdr),0x40); + ciaset->ciaSections.tikOffset = align_value(ciaset->ciaSections.certChainOffset+ciaset->ciaSections.certChain.size,0x40); + ciaset->ciaSections.tmdOffset = align_value(ciaset->ciaSections.tikOffset+ciaset->ciaSections.tik.size,0x40); + ciaset->ciaSections.contentOffset = align_value(ciaset->ciaSections.tmdOffset+ciaset->ciaSections.tmd.size,0x40); + ciaset->ciaSections.metaOffset = align_value(ciaset->ciaSections.contentOffset+ciaset->content.totalContentSize,0x40); - // SetCIAContentIndex, actually works for all index values now. CIA files generated can now hold, with - // validity, 65536 contents. Or at least have a content with index value of 65535. - for(int i = 0; i < ciaset->content.ContentCount; i++){ + for(int i = 0; i < ciaset->content.contentCount; i++){ // This works by treating the 0x2000 byte index array as an array of 2048 u32 values // Used for determining which u32 chunk to write the value to - u16 section = ciaset->content.ContentIndex[i]/32; + u16 section = ciaset->content.contentIndex[i]/32; // Calculating the value added to the u32 - u32 value = 0x80000000/(1<content.ContentIndex[i]); - + u32 value = 1 << (0x1F-ciaset->content.contentIndex[i]); + // Retrieving current u32 block - u32 cur_content_index_section = u8_to_u32(hdr->ContentIndex+(sizeof(u32)*section),BE); + u32 cur_content_index_section = u8_to_u32(hdr->contentIndex+(sizeof(u32)*section),BE); // Adding value to block cur_content_index_section += value; // Returning block - u32_to_u8(hdr->ContentIndex+(sizeof(u32)*section),cur_content_index_section,BE); + u32_to_u8(hdr->contentIndex+(sizeof(u32)*section),cur_content_index_section,BE); } return 0; } int WriteCurrentSectionstoFile(cia_settings *ciaset) { - WriteBuffer(ciaset->CIA_Sections.Header.buffer,ciaset->CIA_Sections.Header.size,0,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CertChain.buffer,ciaset->CIA_Sections.CertChain.size,ciaset->CIA_Sections.CertChainOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.Ticket.buffer,ciaset->CIA_Sections.Ticket.size,ciaset->CIA_Sections.TicketOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CXI_MetaData.buffer,ciaset->CIA_Sections.CXI_MetaData.size,ciaset->CIA_Sections.CXI_MetaDataOffset,ciaset->out); + WriteBuffer(ciaset->ciaSections.ciaHdr.buffer,ciaset->ciaSections.ciaHdr.size,0,ciaset->out); + WriteBuffer(ciaset->ciaSections.certChain.buffer,ciaset->ciaSections.certChain.size,ciaset->ciaSections.certChainOffset,ciaset->out); + WriteBuffer(ciaset->ciaSections.tik.buffer,ciaset->ciaSections.tik.size,ciaset->ciaSections.tikOffset,ciaset->out); + WriteBuffer(ciaset->ciaSections.meta.buffer,ciaset->ciaSections.meta.size,ciaset->ciaSections.metaOffset,ciaset->out); return 0; } -int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset) +int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset) // re-implement so it's one for loop { - u8 *Content0 = ciaset->content.content0; - if(usrset->ConvertCci) Content0 = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[0]); + u8 *content0 = ciaset->inFile; + if(usrset->common.workingFileType == infile_ncsd) content0 = (u8*)(ciaset->inFile+ciaset->content.cciContentOffsets[0]); - ctr_sha(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentHash[0],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[0] |= Encrypted; - CryptContent(Content0,Content0,ciaset->content.ContentSize[0],ciaset->tik.TitleKey,ciaset->content.ContentIndex[0],ENC); + ctr_sha(content0,ciaset->content.contentSize[0],ciaset->content.contentHash[0],CTR_SHA_256); + if(ciaset->content.encryptCia) { + ciaset->content.contentFlags[0] |= content_Encrypted; + CryptContent(content0,content0,ciaset->content.contentSize[0],ciaset->common.titleKey,ciaset->content.contentIndex[0],ENC); } - WriteBuffer(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentOffset[0]+ciaset->CIA_Sections.ContentOffset,ciaset->out); + WriteBuffer(content0,ciaset->content.contentSize[0],ciaset->content.contentOffset[0]+ciaset->ciaSections.contentOffset,ciaset->out); - // Free Buffer if Not CCI - if(!usrset->ConvertCci){ - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; + // Free Buffer if Not CCI, as the rest of the content are in this image + if(usrset->common.workingFileType != infile_ncsd){ + free(usrset->common.workingFile.buffer); + usrset->common.workingFile.buffer = NULL; + usrset->common.workingFile.size = 0; } // Add additional contents, recreating them with their new TitleID - if(usrset->Content0IsNcch){ + if(usrset->common.workingFileType == infile_ncch){ u8 TitleId[8]; - endian_memcpy(TitleId,ciaset->TitleID,8,LE); - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = RetargetNCCH(ciaset->content.ContentFilePtrs[i],ciaset->content.ContentSize[i],ciaset->content.ContentTitleId[i],TitleId,ciaset->keys); - if(!ContentBuff){ + endian_memcpy(TitleId,ciaset->common.titleId,8,LE); + for(int i = 1; i < ciaset->content.contentCount; i++){ + u8 *content = RetargetNCCH(ciaset->content.contentFilePtrs[i],ciaset->content.contentSize[i],ciaset->content.contentTitleId[i],TitleId,ciaset->keys); + if(!content){ fprintf(stderr,"[CIA ERROR] Could not import content %d to CIA\n",i); return FAILED_TO_IMPORT_FILE; } - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); + ctr_sha(content,ciaset->content.contentSize[i],ciaset->content.contentHash[i],CTR_SHA_256); + if(ciaset->content.IsDlc) + ciaset->content.contentFlags[i] |= content_Optional; + if(ciaset->content.encryptCia) { + ciaset->content.contentFlags[i] |= content_Encrypted; + CryptContent(content,content,ciaset->content.contentSize[i],ciaset->common.titleKey,ciaset->content.contentIndex[i],ENC); } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - free(ContentBuff); + WriteBuffer(content,ciaset->content.contentSize[i],ciaset->content.contentOffset[i]+ciaset->ciaSections.contentOffset,ciaset->out); + free(content); } } - else if(usrset->ConvertCci){ - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[i]); - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); + else if(usrset->common.workingFileType == infile_ncsd){ // This makes the assumption the CCI is valid + for(int i = 1; i < ciaset->content.contentCount; i++){ + u8 *content = (u8*)(ciaset->inFile+ciaset->content.cciContentOffsets[i]); + ctr_sha(content,ciaset->content.contentSize[i],ciaset->content.contentHash[i],CTR_SHA_256); + if(ciaset->content.encryptCia) { + ciaset->content.contentFlags[i] |= content_Encrypted; + CryptContent(content,content,ciaset->content.contentSize[i],ciaset->common.titleKey,ciaset->content.contentIndex[i],ENC); } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); + WriteBuffer(content,ciaset->content.contentSize[i],ciaset->content.contentOffset[i]+ciaset->ciaSections.contentOffset,ciaset->out); } - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; + free(usrset->common.workingFile.buffer); + usrset->common.workingFile.buffer = NULL; + usrset->common.workingFile.size = 0; } @@ -596,7 +623,7 @@ int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset) int WriteTMDToFile(cia_settings *ciaset) { - WriteBuffer(ciaset->CIA_Sections.TitleMetaData.buffer,ciaset->CIA_Sections.TitleMetaData.size,ciaset->CIA_Sections.TitleMetaDataOffset,ciaset->out); + WriteBuffer(ciaset->ciaSections.tmd.buffer,ciaset->ciaSections.tmd.size,ciaset->ciaSections.tmdOffset,ciaset->out); return 0; } diff --git a/cia.h b/cia.h index e932fa7..6b36c2b 100644 --- a/cia.h +++ b/cia.h @@ -10,98 +10,115 @@ typedef enum // Structs typedef struct { - u8 HdrSize[4]; - u8 Type[2]; - u8 Version[2]; - u8 CertChainSize[4]; - u8 TicketSize[4]; - u8 TitleMetaDataSize[4]; - u8 CXI_MetaSize[4]; - u8 ContentSize[8]; - u8 ContentIndex[0x2000]; -} CIA_Header; + u8 hdrSize[4]; + u8 type[2]; + u8 version[2]; + u8 certChainSize[4]; + u8 tikSize[4]; + u8 tmdSize[4]; + u8 metaSize[4]; + u8 contentSize[8]; + u8 contentIndex[0x2000]; +} cia_hdr; typedef struct { - u8 DependancyList[0x30*0x8]; - u8 Reserved0[0x180]; - u8 CoreVersion[4]; - u8 Reserved1[0xfc]; -} MetaData_Struct; + u8 dependencyList[0x30*0x8]; + u8 padding0[0x180]; + u8 coreVersion[4]; + u8 padding1[0xfc]; +} cia_metadata; typedef struct { + u8 *inFile; + u64 inFileSize; + FILE *out; - u8 TitleID[8]; - u8 Title_type[4]; - u16 Version[3]; - keys_struct *keys; struct{ - u8 ca_crl_version; - u8 signer_crl_version; + u8 titleId[8]; + u16 titleVersion[4]; + u8 titleKey[16]; + } common; + + + struct{ + u8 caCrlVersion; + u8 signerCrlVersion; } cert; struct{ - u8 TicketIssuer[0x40]; - u8 ticket_format_ver; - u8 TicketID[8]; - u8 DeviceID[8]; - u8 TicketVersion[3]; - u8 TitleKey[16]; + u8 issuer[0x40]; + u8 formatVersion; + + u16 version; + + u8 ticketId[8]; + u8 deviceId[8]; + u8 licenceType; + u8 audit; + u8 eshopAccId[4]; } tik; struct{ - u8 TMDIssuer[0x40]; - u8 tmd_format_ver; - u8 TitleVersion[3]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; - u8 twl_flag; + u8 issuer[0x40]; + u8 formatVersion; + + u16 version; + + u8 titleType[4]; + u8 savedataSize[4]; + u8 privSavedataSize[4]; + u8 twlFlag; } tmd; struct{ - u8 *content0; - u64 content0_FileLen; bool IsCfa; - bool KeyNotFound; - bool EncryptContents; + bool IsDlc; + bool encryptCia; + char *overrideSaveDataSize; - FILE **ContentFilePtrs; - u64 CCIContentOffsets[CCI_MAX_CONTENT]; - u16 ContentCount; - u64 ContentSize[CIA_MAX_CONTENT]; - u64 ContentOffset[CIA_MAX_CONTENT]; - u16 ContentIndex[CIA_MAX_CONTENT]; - u16 ContentType[CIA_MAX_CONTENT]; - u32 ContentId[CIA_MAX_CONTENT]; - u8 ContentHash[CIA_MAX_CONTENT][0x20]; + bool keyNotFound; - u8 ContentTitleId[CIA_MAX_CONTENT][8]; - u64 TotalContentSize; + FILE **contentFilePtrs; + u64 cciContentOffsets[CCI_MAX_CONTENT]; + + /* Misc Records */ + u16 contentCount; + u64 contentOffset[CIA_MAX_CONTENT]; + u64 totalContentSize; + + /* Content Chunk Records */ + u64 contentSize[CIA_MAX_CONTENT]; + u16 contentIndex[CIA_MAX_CONTENT]; + u16 contentFlags[CIA_MAX_CONTENT]; + u32 contentId[CIA_MAX_CONTENT]; + u8 contentHash[CIA_MAX_CONTENT][0x20]; + + u8 contentTitleId[CIA_MAX_CONTENT][8]; + } content; struct{ - COMPONENT_STRUCT Header; + COMPONENT_STRUCT ciaHdr; - u32 CertChainOffset; - COMPONENT_STRUCT CertChain; + u32 certChainOffset; + COMPONENT_STRUCT certChain; - u32 TicketOffset; - COMPONENT_STRUCT Ticket; + u32 tikOffset; + COMPONENT_STRUCT tik; - u32 TitleMetaDataOffset; - COMPONENT_STRUCT TitleMetaData; + u32 tmdOffset; + COMPONENT_STRUCT tmd; - u32 CXI_MetaDataOffset; - COMPONENT_STRUCT CXI_MetaData; + u32 metaOffset; + COMPONENT_STRUCT meta; - u64 ContentOffset; - } CIA_Sections; - - // Finish CIA data req. + u64 contentOffset; + } ciaSections; } cia_settings; // Public Prototypes diff --git a/cia_certificates.h b/cia_certificates.h deleted file mode 100644 index ec5016a..0000000 --- a/cia_certificates.h +++ /dev/null @@ -1,670 +0,0 @@ -#ifndef _CIA_CERTS_H_ -#define _CIA_CERTS_H_ - -//RetailCerts -static const unsigned char ca3_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, - 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, - 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, - 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, - 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, - 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, - 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, - 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, - 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, - 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, - 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, - 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, - 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, - 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, - 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, - 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, - 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, - 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, - 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, - 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, - 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, - 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, - 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, - 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, - 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, - 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, - 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, - 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, - 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, - 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, - 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, - 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, - 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, - 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, - 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, - 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, - 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, - 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, - 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, - 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, - 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, - 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, - 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, - 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, - 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, - 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, - 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, - 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, - 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, - 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, - 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, - 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, - 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, - 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, - 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, - 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, - 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, - 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, - 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, - 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, - 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, - 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, - 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, - 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, - 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, - 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, - 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, - 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, - 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, - 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, - 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, - 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, - 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, - 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, - 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, - 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, - 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, - 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, - 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, - 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, - 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, - 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, - 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, - 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, - 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, - 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, - 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, - 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, - 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, - 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, - 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, - 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, - 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, - 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, - 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, - 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, - 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xsC_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, - 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, - 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, - 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, - 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, - 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, - 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, - 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, - 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, - 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, - 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, - 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, - 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, - 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, - 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, - 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, - 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, - 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, - 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, - 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, - 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, - 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, - 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, - 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, - 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, - 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, - 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, - 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, - 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, - 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, - 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, - 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, - 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, - 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, - 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, - 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, - 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, - 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, - 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, - 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, - 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, - 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, - 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, - 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, - 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, - 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, - 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, - 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, - 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, - 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, - 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, - 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, - 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, - 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, - 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, - 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, - 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, - 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, - 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, - 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, - 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, - 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, - 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, - 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, - 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpB_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, - 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, - 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, - 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, - 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, - 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, - 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, - 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, - 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, - 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, - 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, - 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, - 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, - 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, - 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, - 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, - 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, - 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, - 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, - 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, - 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, - 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, - 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, - 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, - 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, - 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, - 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, - 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, - 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, - 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, - 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, - 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, - 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, - 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, - 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, - 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, - 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, - 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, - 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, - 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, - 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, - 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, - 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, - 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, - 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, - 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, - 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, - 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, - 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, - 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, - 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, - 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, - 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, - 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, - 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, - 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, - 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, - 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, - 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, - 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, - 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, - 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, - 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, - 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, - 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -//DevCerts -static const unsigned char ca4_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x19, 0x49, 0x42, 0x9D, - 0x1E, 0x58, 0xA6, 0x2E, 0x7E, 0x8B, 0x56, 0xD1, - 0xB7, 0x6A, 0xE3, 0x02, 0xFD, 0x8B, 0x97, 0x49, - 0x1F, 0x77, 0x87, 0x45, 0xF7, 0x53, 0x88, 0xC4, - 0xDD, 0x0B, 0xEB, 0x1D, 0xF1, 0x22, 0xFB, 0x96, - 0x42, 0x15, 0x14, 0x97, 0x76, 0x4A, 0x53, 0xCF, - 0x78, 0x15, 0x18, 0x45, 0xE4, 0x2C, 0xA8, 0xFD, - 0xE4, 0x86, 0xFD, 0x2A, 0x4F, 0x53, 0xF8, 0xA1, - 0xBA, 0x00, 0x8A, 0x74, 0x85, 0xFF, 0x73, 0xB3, - 0xBF, 0x7E, 0x3C, 0x98, 0x07, 0x29, 0xD0, 0x65, - 0x6B, 0x69, 0x32, 0x19, 0xAD, 0xE8, 0x35, 0xEB, - 0x5F, 0xFF, 0xFC, 0xCB, 0x7C, 0xBB, 0x5E, 0x30, - 0x7F, 0xE0, 0x68, 0x8B, 0x88, 0x8E, 0xF2, 0xD2, - 0x05, 0x3F, 0xB7, 0xE7, 0x91, 0xE9, 0x85, 0xFD, - 0x15, 0xEF, 0x10, 0xD7, 0x9C, 0xCA, 0x88, 0xD6, - 0xBB, 0x15, 0xE8, 0xE4, 0x71, 0x4A, 0x98, 0xEE, - 0x09, 0xBF, 0x7B, 0x8A, 0xF0, 0x53, 0x23, 0x2B, - 0x64, 0x50, 0xE6, 0xD5, 0xFD, 0xFF, 0xC2, 0x0A, - 0x6D, 0x1E, 0xA6, 0xA2, 0x38, 0x12, 0xE1, 0x01, - 0x45, 0x25, 0xD5, 0x6D, 0x40, 0x82, 0x70, 0x3B, - 0x86, 0x98, 0x69, 0x59, 0xA7, 0x3C, 0xD1, 0xA1, - 0x43, 0x64, 0xD2, 0xC2, 0xDA, 0xEA, 0x96, 0xB0, - 0x95, 0xF7, 0x6C, 0x46, 0xE4, 0xFF, 0x41, 0x55, - 0x46, 0x5E, 0x70, 0xEF, 0x1E, 0xD3, 0x10, 0x53, - 0xD9, 0x70, 0x11, 0xE0, 0x10, 0xCC, 0x93, 0xE7, - 0x91, 0x40, 0x13, 0x68, 0x7F, 0xA3, 0xA8, 0x02, - 0x99, 0x6D, 0x1E, 0x55, 0x7B, 0x1C, 0xCC, 0x7A, - 0x7E, 0x8F, 0x58, 0x65, 0xC1, 0x74, 0x2E, 0x28, - 0xE2, 0x6D, 0xEF, 0x38, 0xA9, 0x3A, 0xB5, 0xD8, - 0x2D, 0x43, 0xEC, 0xCC, 0xBF, 0x0B, 0xEF, 0x22, - 0xE1, 0xFD, 0x57, 0xE2, 0x86, 0x43, 0x33, 0x58, - 0x2F, 0xED, 0xEA, 0xBC, 0x01, 0x2F, 0x98, 0x6D, - 0xDF, 0xC3, 0xE9, 0x44, 0x79, 0x73, 0x47, 0x03, - 0x08, 0x45, 0x5B, 0xDC, 0x57, 0xAA, 0x17, 0x0B, - 0x84, 0x42, 0x7F, 0x73, 0xA2, 0x9B, 0x48, 0xF6, - 0xDA, 0x13, 0x5F, 0x66, 0xC7, 0x45, 0xC1, 0x42, - 0xA8, 0x4A, 0xFB, 0x0E, 0x6A, 0x5E, 0xED, 0x85, - 0xD7, 0xB9, 0x71, 0x99, 0x36, 0xF8, 0xCE, 0x2B, - 0x62, 0x1F, 0x39, 0x5F, 0x40, 0xDC, 0x03, 0xBE, - 0xF8, 0x85, 0x4C, 0x11, 0x17, 0xFF, 0x0C, 0x12, - 0x86, 0x41, 0xCC, 0x78, 0x43, 0xB9, 0x7B, 0x43, - 0x46, 0xDB, 0x22, 0x6F, 0x60, 0x26, 0xAC, 0xB5, - 0x6C, 0x27, 0x8B, 0x8E, 0x0E, 0xA7, 0x9A, 0x2D, - 0x65, 0xEF, 0x79, 0x8E, 0x10, 0x78, 0xAD, 0x80, - 0xED, 0x4B, 0x96, 0x04, 0xD2, 0xF0, 0x8B, 0x2C, - 0xD6, 0x4A, 0x23, 0xA3, 0xDB, 0x27, 0x08, 0x33, - 0xB4, 0x02, 0xF8, 0x08, 0x51, 0xF3, 0x5B, 0xED, - 0x3E, 0xE4, 0x57, 0x7C, 0x66, 0x60, 0xFB, 0xF1, - 0x6D, 0x94, 0x13, 0xE0, 0x9C, 0x91, 0x7A, 0x49, - 0xD4, 0x2C, 0x6D, 0xA3, 0x75, 0xBC, 0x27, 0xF0, - 0x23, 0x0D, 0xB9, 0x8F, 0x89, 0x73, 0xAB, 0x02, - 0x7B, 0x52, 0x2C, 0xD5, 0x7E, 0xC0, 0x3D, 0x25, - 0xE8, 0xB3, 0xFC, 0x34, 0x94, 0xC9, 0x7F, 0xB1, - 0x08, 0xFE, 0x18, 0xC6, 0x8A, 0x43, 0x36, 0xE4, - 0x6C, 0x26, 0xB6, 0xF2, 0x80, 0xD2, 0x7E, 0x34, - 0xBE, 0x28, 0x7C, 0x3E, 0x46, 0x87, 0xBC, 0x9D, - 0x77, 0x6B, 0x76, 0xD9, 0x28, 0xD1, 0xB6, 0x35, - 0x2E, 0xC0, 0x34, 0x7D, 0x72, 0x94, 0xAA, 0x93, - 0x60, 0x26, 0x8D, 0x26, 0xF5, 0xF6, 0x52, 0x06, - 0x4A, 0xF2, 0x40, 0xD7, 0xD0, 0x0C, 0x7C, 0x5E, - 0xA3, 0xC3, 0x2D, 0xE6, 0x2D, 0x9B, 0x5C, 0x4B, - 0x4C, 0xAB, 0x6F, 0xD7, 0xBD, 0x37, 0x1D, 0x57, - 0xC2, 0x16, 0x60, 0x95, 0x91, 0x0E, 0x4A, 0xD8, - 0xE9, 0xED, 0x18, 0x1E, 0xF7, 0x61, 0x93, 0x61, - 0x53, 0x89, 0x2D, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x12, 0x2A, 0x46, - 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, - 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, - 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, - 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, - 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, - 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, - 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, - 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, - 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, - 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, - 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, - 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, - 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, - 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, - 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, - 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, - 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, - 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, - 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, - 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, - 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, - 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, - 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, - 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, - 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, - 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, - 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, - 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, - 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, - 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, - 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, - 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xs9_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x63, 0x80, 0x5A, 0x35, - 0x1A, 0x43, 0x7B, 0xA2, 0x43, 0x19, 0xBB, 0x3A, - 0x77, 0x7B, 0x7A, 0xF3, 0x5E, 0x72, 0x4B, 0x15, - 0x0A, 0x06, 0x39, 0x6C, 0x5F, 0xEC, 0x38, 0x45, - 0xB1, 0x88, 0x76, 0x26, 0x8D, 0x5E, 0xDA, 0xE6, - 0x2F, 0x14, 0xBA, 0x02, 0xFA, 0xD6, 0xFC, 0x3B, - 0x2B, 0xBE, 0x87, 0x07, 0x63, 0x8E, 0x55, 0xBF, - 0x05, 0x5A, 0xFC, 0xFC, 0xB3, 0x47, 0x69, 0x11, - 0x89, 0xDB, 0x1C, 0xAF, 0x4B, 0x43, 0x76, 0x62, - 0x3E, 0x30, 0x89, 0x0A, 0x9D, 0x3B, 0xBB, 0x3E, - 0x50, 0xBD, 0xF7, 0xA6, 0xC0, 0xF7, 0xF8, 0xBB, - 0x0D, 0xB5, 0x6A, 0xBB, 0xC6, 0xC3, 0x50, 0xC8, - 0x88, 0xBB, 0x9D, 0xF0, 0x9B, 0xD1, 0x30, 0x64, - 0x60, 0x69, 0xDD, 0x34, 0x67, 0xA7, 0x00, 0xEB, - 0xDC, 0xF9, 0x8C, 0xB0, 0xF7, 0x93, 0x0E, 0x81, - 0xFE, 0x98, 0xD9, 0x72, 0x45, 0x8B, 0x94, 0x7E, - 0x59, 0xE2, 0xBE, 0x4E, 0x91, 0x2D, 0x75, 0xCA, - 0x1B, 0x8E, 0x2E, 0xF4, 0x6D, 0x73, 0xB1, 0x6B, - 0x35, 0xB5, 0x67, 0x0D, 0x63, 0x2D, 0x51, 0x38, - 0x53, 0x28, 0x19, 0x1D, 0x9D, 0xAE, 0x8D, 0xC6, - 0x61, 0xCC, 0xEF, 0xA4, 0xAB, 0xE2, 0xF3, 0xB0, - 0x4C, 0x7B, 0xE2, 0x71, 0xB5, 0xF9, 0x2C, 0xFA, - 0x55, 0xCD, 0x88, 0x8B, 0x72, 0xCC, 0xBE, 0x67, - 0xFA, 0xDF, 0xEF, 0x6B, 0x53, 0x3C, 0x45, 0xD8, - 0xCB, 0xDF, 0xB2, 0x76, 0x41, 0x46, 0xD6, 0xC2, - 0x6F, 0x27, 0x16, 0xC5, 0x07, 0xF3, 0xF4, 0x44, - 0x66, 0xA3, 0x15, 0xD2, 0x77, 0xF2, 0x89, 0xDA, - 0xFD, 0xD5, 0x50, 0xCF, 0xA4, 0x9B, 0xEA, 0xCA, - 0xC9, 0x7B, 0xE5, 0x46, 0x0E, 0xED, 0x9B, 0xFB, - 0x04, 0xA9, 0xDA, 0x19, 0x58, 0xD9, 0x2A, 0x20, - 0x8A, 0xAC, 0xC1, 0xF4, 0x8E, 0xE9, 0x14, 0xD8, - 0x8A, 0xD7, 0x41, 0xD5, 0x5B, 0x9B, 0x64, 0x22, - 0xD8, 0xAF, 0xAE, 0xC7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x47, 0xA4, - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpA_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x50, 0x05, 0xD7, 0x5E, - 0x6D, 0xDE, 0xB8, 0x78, 0x3C, 0x81, 0xE9, 0xEF, - 0x0D, 0x17, 0xCD, 0x58, 0xF5, 0x94, 0x26, 0xA3, - 0xFD, 0x6F, 0x69, 0x90, 0xE8, 0xF8, 0x32, 0x87, - 0x12, 0x2E, 0xC2, 0x5C, 0xA1, 0x4B, 0x99, 0x24, - 0x23, 0x37, 0xBA, 0x91, 0xA7, 0x5B, 0x0F, 0x7C, - 0x59, 0xFB, 0xF7, 0xD1, 0x89, 0x27, 0x22, 0xC4, - 0xE6, 0xAF, 0xC7, 0xDE, 0xC7, 0x4A, 0x6E, 0x00, - 0x7F, 0x43, 0x4A, 0x88, 0x8A, 0x82, 0x15, 0xE8, - 0xDF, 0x2B, 0x52, 0xED, 0x42, 0x00, 0xBC, 0x69, - 0xB4, 0xDA, 0x7F, 0xEB, 0x74, 0x6C, 0x7A, 0x2D, - 0x96, 0x56, 0x5B, 0x45, 0x59, 0x7B, 0x8F, 0xAE, - 0xB1, 0x6B, 0xDC, 0x76, 0xC1, 0xC8, 0x0C, 0x47, - 0xF5, 0x0D, 0xA9, 0xC3, 0xE1, 0xFE, 0x28, 0x50, - 0x1C, 0x26, 0xA2, 0xD1, 0x54, 0x4B, 0xD1, 0x60, - 0x4A, 0x9E, 0x8F, 0x32, 0x2A, 0xEF, 0x31, 0x5F, - 0xEA, 0x48, 0x22, 0x67, 0x22, 0xB7, 0xCB, 0x37, - 0x2F, 0xF3, 0x5F, 0x5E, 0x61, 0x6A, 0x53, 0x44, - 0xA5, 0x85, 0xE5, 0xA0, 0x8A, 0x2E, 0x17, 0x77, - 0x57, 0x2B, 0x7A, 0x9A, 0xF7, 0xD2, 0xD8, 0xC4, - 0x9C, 0xD0, 0xA0, 0x54, 0xBF, 0x8A, 0x9D, 0xB4, - 0x9F, 0xC6, 0x60, 0x61, 0x7C, 0xB8, 0x35, 0x4E, - 0x25, 0x7F, 0x68, 0x68, 0x2F, 0x94, 0xB3, 0xCC, - 0x53, 0x8C, 0x42, 0x6F, 0x88, 0xC5, 0x48, 0x5C, - 0xBE, 0xC1, 0xD0, 0x48, 0x04, 0x74, 0x96, 0x5A, - 0x7E, 0x82, 0x59, 0xAA, 0x9F, 0xB6, 0x61, 0x46, - 0xCE, 0x59, 0x21, 0xC6, 0xF0, 0xC1, 0x75, 0x1F, - 0x21, 0x91, 0x7F, 0x24, 0x96, 0xCB, 0x0C, 0x70, - 0x15, 0x7A, 0xB7, 0xBB, 0x3A, 0x9F, 0x57, 0x56, - 0x56, 0x5C, 0x38, 0x92, 0x2E, 0xFD, 0xC8, 0xF1, - 0x70, 0xB9, 0xAE, 0xA1, 0xAE, 0x36, 0xF5, 0x5E, - 0x35, 0x26, 0x63, 0x0A, 0xBA, 0xB2, 0x05, 0x0F, - 0xF0, 0x0C, 0xDC, 0xBB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x4D, 0x5B, - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/crypto.c b/crypto.c index 90dc016..cc7b0fb 100644 --- a/crypto.c +++ b/crypto.c @@ -10,6 +10,43 @@ void ctr_sha(void *data, u64 size, u8 *hash, int mode) } } +u8* AesKeyScrambler(u8 *KeyX, u8 *KeyY) +{ + u32 *KeyX_u32 = (u32*) KeyX; + u32 *KeyY_u32 = (u32*) KeyY; + u32 *Key = malloc(16); + + for(int i = 0,j; i < 4; i++) + { + switch(i) + { + ///* Type 1 + case 0 : j = 2; break; + case 1 : j = 3; break; + case 2 : j = 0; break; + case 3 : j = 1; break; + //*/ + /* Type 2 + case 0 : j = 3; break; + case 1 : j = 2; break; + case 2 : j = 1; break; + case 3 : j = 0; break; + //*/ + /* Type 3 + case 0 : j = 1; break; + case 1 : j = 0; break; + case 2 : j = 3; break; + case 3 : j = 2; break; + //*/ + } + + Key[j] = KeyX_u32[i] ^ KeyY_u32[i]; + } + + // Done Stuff + return (u8*)Key; +} + void ctr_add_counter(ctr_aes_context* ctx, u32 carry) { u32 counter[4]; diff --git a/crypto.h b/crypto.h index 1380d1b..c2c3f98 100644 --- a/crypto.h +++ b/crypto.h @@ -74,6 +74,7 @@ extern "C" { // SHA void ctr_sha(void *data, u64 size, u8 *hash, int mode); // AES +u8* AesKeyScrambler(u8 *KeyX, u8 *KeyY); void ctr_add_counter(ctr_aes_context* ctx, u32 carry); void ctr_init_counter(ctr_aes_context* ctx, u8 key[16],u8 ctr[16]); void ctr_crypt_counter_block(ctr_aes_context* ctx, u8 input[16], u8 output[16]); diff --git a/desc_dev_sigdata.h b/desc_dev_sigdata.h new file mode 100644 index 0000000..2eb7964 --- /dev/null +++ b/desc_dev_sigdata.h @@ -0,0 +1,118 @@ +#ifndef _DESC_DEV_SIGDATA_H_ +#define _DESC_DEV_SIGDATA_H_ + +/* CTR_SDK 1 (1.2.0) */ +// APP +static const unsigned char app_1_dev_hdrpub[0x100] = +{ + 0x9B, 0x82, 0x9C, 0x19, 0x01, 0x73, 0x23, 0x50, 0x89, 0xE3, 0x0B, 0xC8, 0x8F, 0xFB, 0xA5, 0xE4, 0xFD, 0x44, 0xAE, 0x49, 0x32, 0xC7, 0xEF, 0x0A, 0x7E, 0x93, 0x95, 0xBA, 0xA2, 0x48, 0x4D, 0x8E, 0x18, 0x82, 0x34, 0x66, 0xFE, 0xDA, 0x7A, 0x45, 0x4A, 0x7D, 0xD5, 0x3C, 0xC6, 0x5C, 0xE0, 0x71, 0xFC, 0xD0, 0x82, 0xCC, 0xB2, 0xCF, 0x77, 0x0E, 0xAD, 0xCD, 0xD2, 0xAC, 0x1D, 0x66, 0x1B, 0xC1, 0xEA, 0xAC, 0x39, 0x96, 0x2C, 0x52, 0xDE, 0xFF, 0xF2, 0x74, 0xF6, 0xC5, 0xCA, 0x99, 0x31, 0x95, 0x13, 0xBB, 0x3F, 0xED, 0x30, 0xAE, 0x0A, 0xD3, 0x86, 0x0D, 0x0B, 0xF5, 0x56, 0x7D, 0x33, 0xBA, 0xA1, 0x39, 0xA2, 0xF5, 0xB6, 0x47, 0x78, 0x1F, 0xFD, 0x04, 0xA3, 0x49, 0xA9, 0x10, 0xD3, 0x41, 0x2E, 0x92, 0x7D, 0xE1, 0xA4, 0xA8, 0x02, 0x18, 0x01, 0x2C, 0xC2, 0x61, 0xB1, 0xAC, 0xCB, 0xB3, 0x7A, 0x64, 0xB1, 0xC3, 0xE6, 0x3B, 0x50, 0xAD, 0xDD, 0x55, 0xAB, 0x28, 0xDA, 0x59, 0xE7, 0x57, 0x6A, 0x76, 0x4F, 0x6B, 0x08, 0xD1, 0x61, 0x7D, 0x28, 0xD5, 0x88, 0x7B, 0x8E, 0x80, 0x78, 0xF3, 0xFF, 0x50, 0x00, 0xBD, 0x73, 0xFB, 0x62, 0xB3, 0xCA, 0xA8, 0x05, 0x48, 0xE6, 0xE6, 0x71, 0xB5, 0xAC, 0xDA, 0xE9, 0xC6, 0x1F, 0x9B, 0x72, 0x98, 0x2E, 0xFF, 0xB2, 0x9C, 0x36, 0x9F, 0x7E, 0x7D, 0x25, 0x65, 0x6F, 0xB0, 0x60, 0xB1, 0xB5, 0x5F, 0xCF, 0x74, 0x29, 0x91, 0x9D, 0xAB, 0x84, 0x97, 0x1A, 0x27, 0x5D, 0x69, 0x49, 0x16, 0xF8, 0x77, 0x31, 0x26, 0x3E, 0x6F, 0x97, 0x41, 0x4A, 0x26, 0xFD, 0x5B, 0xAB, 0x65, 0x77, 0x45, 0x1C, 0x76, 0x15, 0xDC, 0x1A, 0x63, 0x0F, 0x51, 0x2D, 0xA0, 0x07, 0x6E, 0xE5, 0x29, 0xD3, 0x37, 0x4B, 0xE5, 0x7F, 0xBB, 0x23, 0xD0, 0x2B, 0xB9, 0x76, 0x1F +}; + +static const unsigned char app_1_dev_hdrpvt[0x100] = +{ + 0x66, 0x9F, 0xB5, 0xC5, 0xA6, 0xB8, 0x45, 0xD8, 0xD3, 0x75, 0xFB, 0x03, 0xBB, 0x48, 0xF5, 0x7C, 0x7D, 0x4B, 0x02, 0xBD, 0x19, 0x7E, 0xE9, 0x98, 0x02, 0x5A, 0x00, 0xD8, 0x6E, 0x59, 0xCA, 0x9C, 0x78, 0x3E, 0x0C, 0xB8, 0xDF, 0x7C, 0x6C, 0x6E, 0x27, 0xAF, 0x8C, 0xB6, 0x13, 0xAD, 0x9D, 0x0C, 0x7C, 0x2B, 0x59, 0xF6, 0x1E, 0x16, 0x5D, 0x5A, 0x59, 0x86, 0x57, 0x7D, 0xEF, 0xD4, 0xBF, 0x82, 0xA4, 0x0C, 0x4D, 0xE0, 0x75, 0x95, 0xA6, 0xC6, 0x3F, 0x49, 0xC2, 0xC4, 0x5A, 0x63, 0xE8, 0x5D, 0x99, 0xEC, 0xDB, 0x4D, 0xFA, 0xEF, 0x10, 0x03, 0xF1, 0x15, 0xD1, 0x0B, 0x71, 0xAD, 0x24, 0x23, 0x08, 0x5C, 0x91, 0xD7, 0x17, 0x18, 0x69, 0x04, 0xAB, 0x23, 0x91, 0x62, 0x7D, 0xE8, 0xB5, 0x90, 0xF1, 0x5C, 0x09, 0x28, 0x8C, 0x51, 0xB7, 0x38, 0x02, 0x26, 0x78, 0x8C, 0xA2, 0x05, 0x07, 0x53, 0x7D, 0x99, 0x46, 0xFD, 0x12, 0x77, 0x32, 0x0E, 0xA8, 0x54, 0xE3, 0x32, 0x0E, 0x93, 0x05, 0x10, 0xFA, 0x59, 0x7A, 0x5D, 0x2E, 0xDE, 0x32, 0xE8, 0xE9, 0xF0, 0x27, 0x4E, 0x08, 0x83, 0x08, 0xD4, 0x92, 0x58, 0x4D, 0x6D, 0x34, 0x9F, 0xD9, 0xAF, 0xA9, 0x01, 0x62, 0xB5, 0x1A, 0x1D, 0x7E, 0x8D, 0xBB, 0x8A, 0x58, 0xBA, 0xFF, 0xB4, 0xD3, 0x75, 0xF3, 0x44, 0xE7, 0x13, 0x05, 0xC6, 0xC5, 0xA4, 0xD2, 0x6B, 0x18, 0x31, 0x9F, 0xBE, 0x42, 0x45, 0x82, 0x2E, 0x47, 0x9B, 0x26, 0x73, 0x28, 0xD7, 0x9A, 0x64, 0xA6, 0x3D, 0x38, 0x9C, 0x11, 0x36, 0x01, 0x5B, 0x82, 0x2F, 0x7E, 0xA8, 0xC4, 0x82, 0x15, 0x6C, 0x0B, 0xBA, 0x1C, 0x58, 0xF5, 0x81, 0xF9, 0x45, 0xA9, 0xC6, 0x05, 0x6A, 0x2C, 0xA6, 0xCF, 0xF5, 0xDF, 0xEB, 0xBB, 0xC0, 0x92, 0xE3, 0xA6, 0x9D, 0x23, 0x09, 0x09, 0x0E, 0x98, 0x39 +}; + +static const unsigned char app_1_dev_acexsig[0x100] = +{ + 0x05, 0x90, 0xAF, 0x65, 0x16, 0x9F, 0x18, 0x2C, 0x17, 0x78, 0x9F, 0xDF, 0xB6, 0x37, 0xCF, 0x26, 0x9B, 0x1B, 0x75, 0x51, 0xB8, 0x57, 0xA3, 0x8F, 0xD7, 0x93, 0x19, 0x61, 0x81, 0x0D, 0x3D, 0xBC, 0x36, 0x50, 0x53, 0xDA, 0x7D, 0xA9, 0x7F, 0xAA, 0x3E, 0x51, 0x2C, 0x75, 0xA1, 0xB9, 0xB1, 0x56, 0xEB, 0x2A, 0x46, 0x21, 0xEC, 0x4F, 0xA7, 0x0C, 0xA1, 0xA8, 0xFD, 0xEE, 0xA3, 0x4A, 0xFD, 0x54, 0xB0, 0x3A, 0x49, 0x5C, 0x8F, 0x8D, 0xB2, 0xBC, 0x32, 0x50, 0x7E, 0x2C, 0x50, 0xD2, 0x1A, 0x6B, 0x61, 0xCB, 0x2A, 0xC9, 0x7E, 0x6E, 0x6A, 0xC8, 0xD6, 0x9B, 0x21, 0xE7, 0x3B, 0xB8, 0x39, 0x1C, 0xD7, 0xEB, 0x69, 0x35, 0xF5, 0xBC, 0xB5, 0x23, 0x54, 0x81, 0x4F, 0x73, 0xAB, 0x9C, 0x55, 0xF0, 0x04, 0x0B, 0x4A, 0xEA, 0x54, 0x08, 0xBF, 0x36, 0x28, 0x12, 0x5E, 0x44, 0x41, 0xF5, 0x3D, 0xFE, 0xA7, 0x6B, 0x35, 0xF2, 0x9A, 0xF2, 0x88, 0xCD, 0xD6, 0x2E, 0x7B, 0xF3, 0xF5, 0x0D, 0x06, 0x2E, 0x13, 0x4F, 0x78, 0xEE, 0x27, 0xAB, 0x31, 0x06, 0x62, 0xE9, 0xB2, 0x3E, 0xC6, 0x99, 0xD7, 0xA9, 0xCC, 0x21, 0x70, 0xD7, 0xCD, 0x9F, 0x03, 0x66, 0x91, 0x7E, 0xBD, 0x3E, 0x83, 0xC4, 0xFF, 0xC9, 0xAA, 0x7E, 0x27, 0xAE, 0x5C, 0x37, 0x7D, 0x93, 0x57, 0x60, 0xB9, 0x0B, 0x71, 0x43, 0x8A, 0x2F, 0x43, 0x50, 0x94, 0xF8, 0x0D, 0x40, 0xCC, 0x64, 0x16, 0x09, 0x70, 0xCD, 0x03, 0xCA, 0x95, 0x30, 0x20, 0xE2, 0x85, 0x2F, 0x2A, 0xCF, 0x65, 0xAA, 0xE9, 0xCF, 0x1F, 0x57, 0xC1, 0x8F, 0xD5, 0x46, 0x51, 0x5A, 0x99, 0x60, 0x65, 0x93, 0xA9, 0xBB, 0xEA, 0x5F, 0xA0, 0x47, 0xD7, 0x11, 0x04, 0xC7, 0xB4, 0x82, 0x66, 0x24, 0x17, 0x17, 0x5E, 0x9D, 0xC8, 0x50, 0x80, 0x63, 0x28, 0xB3, 0xF8, 0xE3 +}; + +// DLP +static const unsigned char dlp_1_dev_hdrpub[0x100] = +{ + 0xD9, 0xF0, 0xC9, 0x35, 0x1E, 0x55, 0xD8, 0x7E, 0x96, 0x53, 0x33, 0x34, 0xBB, 0x8A, 0xAE, 0x03, 0x92, 0x35, 0xE2, 0x05, 0x58, 0x7C, 0xCC, 0x08, 0xB2, 0xDF, 0x43, 0x41, 0xB7, 0x7A, 0xB5, 0x29, 0xEE, 0x4E, 0xF3, 0xC7, 0x35, 0x3B, 0x7E, 0xC5, 0xEE, 0x74, 0xF0, 0xAA, 0x7E, 0x60, 0xF1, 0x28, 0x35, 0x17, 0xD6, 0xC9, 0x9A, 0xF2, 0x84, 0xFE, 0xC8, 0x93, 0x86, 0xF7, 0xA7, 0x36, 0xA6, 0xB0, 0x28, 0xDC, 0xE8, 0x38, 0x0B, 0x54, 0x42, 0x8D, 0x4E, 0x4B, 0x55, 0x0F, 0x4A, 0x0D, 0x72, 0xA0, 0x23, 0xC9, 0x68, 0x22, 0x37, 0x31, 0x88, 0x2C, 0x05, 0x49, 0x86, 0x80, 0x9A, 0xFC, 0x1D, 0x02, 0xE3, 0x20, 0x15, 0x0C, 0x7E, 0x28, 0x40, 0x57, 0xEF, 0xA7, 0xBC, 0xAA, 0xC5, 0xD6, 0xD7, 0x6F, 0xF9, 0x26, 0x9A, 0x32, 0xB2, 0x9E, 0x10, 0x5F, 0x93, 0xE6, 0xB2, 0xC6, 0xB2, 0x62, 0x34, 0x6A, 0xB0, 0xD9, 0x71, 0x3B, 0x0F, 0x34, 0x6C, 0xB1, 0xFE, 0x3A, 0x39, 0xDE, 0x3D, 0x6A, 0xCB, 0x32, 0x95, 0xFA, 0x18, 0x4F, 0xF4, 0xEB, 0x5F, 0x20, 0xE4, 0xEF, 0x64, 0xC5, 0x06, 0x27, 0xC3, 0x44, 0x2A, 0x39, 0x35, 0xD8, 0x00, 0xDF, 0x00, 0xAD, 0xC4, 0x98, 0x06, 0x52, 0xD8, 0x4A, 0xC5, 0x2A, 0x7F, 0x77, 0x50, 0x62, 0x7E, 0x05, 0x3E, 0x8C, 0x28, 0x0A, 0x26, 0xD2, 0x6C, 0x9B, 0x27, 0x65, 0xE9, 0x77, 0x68, 0xE9, 0xE6, 0xAA, 0xBA, 0xF5, 0x85, 0xFC, 0x75, 0x07, 0x84, 0xB2, 0xCA, 0x35, 0x85, 0x52, 0x10, 0x08, 0xEF, 0x85, 0xD3, 0x70, 0x17, 0x31, 0xE1, 0x44, 0xF6, 0x34, 0xDF, 0x7C, 0x42, 0xF7, 0x74, 0xAA, 0xFC, 0xC3, 0xE4, 0x84, 0x2D, 0xBF, 0x15, 0x1E, 0x84, 0x00, 0xE3, 0x80, 0xD7, 0x89, 0x56, 0xEE, 0x60, 0x09, 0x1F, 0xD3, 0xBF, 0xBF, 0x50, 0x8F, 0xA3, 0x0C, 0x72, 0x3F +}; + +static const unsigned char dlp_1_dev_hdrpvt[0x100] = +{ + 0x10, 0x19, 0x3A, 0x33, 0xA3, 0x47, 0x02, 0x13, 0xEF, 0xB4, 0xBB, 0x9E, 0x94, 0x8F, 0xDC, 0xE4, 0xC4, 0xA3, 0x18, 0x4B, 0xFE, 0xCA, 0x51, 0x23, 0xFF, 0x5A, 0x80, 0x94, 0x55, 0x22, 0x4A, 0x49, 0x8B, 0xA1, 0xE7, 0x5D, 0xFA, 0xAF, 0xA7, 0x60, 0xA5, 0x89, 0x9B, 0xD1, 0x6C, 0x3E, 0x6A, 0xF1, 0xE6, 0x62, 0x19, 0x6A, 0x90, 0xF8, 0x83, 0x1C, 0x72, 0xE2, 0x7A, 0xE0, 0xC6, 0x48, 0x42, 0x2D, 0xD7, 0x06, 0xE2, 0x5C, 0x69, 0x71, 0xD2, 0xEC, 0xAF, 0x30, 0xDF, 0x5A, 0x9E, 0xC4, 0xB9, 0x87, 0xDC, 0xBC, 0xDE, 0xE5, 0x50, 0x20, 0x67, 0x87, 0xA0, 0xE8, 0x5A, 0x78, 0x1B, 0x7A, 0xAE, 0x05, 0xED, 0x93, 0x0C, 0x1A, 0xFD, 0x22, 0xAA, 0x06, 0x14, 0xDC, 0xD6, 0x11, 0xE3, 0x45, 0x48, 0x6A, 0xAC, 0x03, 0xCE, 0xF6, 0x19, 0xBD, 0x95, 0x46, 0x0A, 0x1D, 0xCB, 0x6C, 0xE3, 0xF6, 0x5F, 0x1A, 0xB3, 0x81, 0xC7, 0xE2, 0xAB, 0xFE, 0xEF, 0xFB, 0xEC, 0xFE, 0x88, 0x36, 0x26, 0x60, 0x47, 0x43, 0x78, 0x36, 0xA7, 0xC8, 0xC9, 0x40, 0x98, 0x2E, 0xF2, 0x7E, 0xE4, 0x0D, 0x6C, 0x45, 0x88, 0x2A, 0x32, 0x9B, 0xA2, 0x7C, 0x39, 0x20, 0xAA, 0x6B, 0x64, 0x35, 0xC6, 0xA9, 0x20, 0x71, 0x4A, 0x78, 0x6E, 0x55, 0x3C, 0x9B, 0xEA, 0x10, 0x73, 0xBB, 0xA7, 0xD8, 0xFE, 0x69, 0x42, 0xB8, 0xE7, 0xA1, 0xE5, 0xDF, 0x8A, 0xDE, 0x4C, 0x2B, 0x3A, 0x92, 0xB8, 0x3E, 0x5E, 0x2C, 0x29, 0x0D, 0xC1, 0x3D, 0x10, 0x65, 0x1E, 0xF1, 0x95, 0xE5, 0xF6, 0x45, 0x15, 0xBF, 0xE2, 0x30, 0xA6, 0x70, 0x19, 0xA4, 0x11, 0x57, 0x12, 0x1C, 0x81, 0x4B, 0x54, 0x04, 0xBE, 0x67, 0xF5, 0x00, 0x22, 0x06, 0xDA, 0x6B, 0xCE, 0x23, 0x3F, 0x86, 0xE4, 0x70, 0x6A, 0xD1, 0x3E, 0xE5, 0x74, 0x44, 0x86, 0xDA, 0xBE, 0x79 +}; + +static const unsigned char dlp_1_dev_acexsig[0x100] = +{ + 0x13, 0xB2, 0xF4, 0x89, 0xBB, 0xB4, 0xFF, 0x55, 0x7E, 0x3E, 0x9B, 0x90, 0x44, 0x45, 0xC6, 0x8A, 0x17, 0x32, 0x91, 0x77, 0x7D, 0xCB, 0x4A, 0x26, 0x3D, 0xCA, 0xD8, 0x6E, 0x72, 0x27, 0x93, 0x9C, 0xE4, 0x27, 0xFE, 0x54, 0xDC, 0xE7, 0xDC, 0x02, 0x17, 0x9C, 0x82, 0xA8, 0xB0, 0xE8, 0x69, 0x07, 0xE3, 0x34, 0x0E, 0xBF, 0x17, 0x05, 0x58, 0x23, 0x5F, 0x6D, 0xDA, 0xE8, 0xC6, 0xEE, 0x49, 0x29, 0xEF, 0xD7, 0x48, 0x48, 0x41, 0xE2, 0x2A, 0x57, 0x2B, 0x21, 0x13, 0x64, 0xD4, 0x79, 0x5A, 0xE3, 0x84, 0xDA, 0x63, 0x9A, 0x07, 0x39, 0xE2, 0x7E, 0xA7, 0x56, 0x34, 0x1C, 0xE2, 0xAF, 0xCD, 0x65, 0xD1, 0xC0, 0x1B, 0x72, 0xB1, 0x1D, 0xFC, 0xE2, 0x6E, 0x0F, 0xC7, 0xB0, 0xF5, 0x84, 0x0F, 0xA5, 0x2B, 0xDF, 0x3A, 0xCF, 0x43, 0xE8, 0xE4, 0x07, 0x29, 0xC6, 0x41, 0x0E, 0x7B, 0xEE, 0x35, 0xF9, 0xFC, 0xE7, 0x15, 0xF3, 0x8C, 0x3A, 0xB4, 0x77, 0xBD, 0x88, 0x70, 0x83, 0x4A, 0x03, 0x9E, 0x01, 0x9B, 0xBB, 0xD2, 0xE4, 0xA5, 0xBE, 0xF7, 0x80, 0x92, 0x5A, 0x9F, 0x14, 0x9B, 0x49, 0x5D, 0x3D, 0xDC, 0x32, 0x34, 0x7E, 0xC0, 0xD4, 0xAC, 0xDA, 0x8C, 0xF7, 0xA1, 0xE1, 0xCA, 0x29, 0xF5, 0x58, 0x5E, 0xEB, 0x02, 0xB6, 0x67, 0x42, 0x89, 0x46, 0x4C, 0xA6, 0xA8, 0xBD, 0xEB, 0xEB, 0xDD, 0x8F, 0x2E, 0x72, 0x26, 0x49, 0x70, 0x01, 0x7D, 0x5B, 0x03, 0x06, 0x2C, 0x92, 0x1E, 0x55, 0xB2, 0xDA, 0xD7, 0x0D, 0x70, 0x74, 0x42, 0xD5, 0x62, 0x42, 0x3C, 0xC1, 0x70, 0x8E, 0x67, 0xB1, 0xD9, 0xF3, 0x7E, 0xB2, 0xBA, 0x6D, 0x0F, 0x42, 0x65, 0x24, 0x79, 0xE8, 0x8F, 0xB4, 0x4B, 0x32, 0x35, 0xCA, 0x39, 0x70, 0xFE, 0x8E, 0x81, 0x49, 0x73, 0x8D, 0x3C, 0xCD, 0x60, 0xAF, 0xA3, 0x52, 0x45, 0xEE +}; + +/* CTR_SDK 2 (2.3.4) */ +// APP +static const unsigned char app_2_dev_hdrpub[0x100] = +{ + 0xE9, 0x45, 0xF0, 0xC6, 0x96, 0xD5, 0x6F, 0x7E, 0xAE, 0x03, 0x92, 0x2E, 0xEA, 0xCB, 0xFD, 0xEA, 0xA4, 0x7A, 0x9F, 0x12, 0xDA, 0x4C, 0x10, 0x0A, 0xBE, 0x08, 0x9D, 0x87, 0xE0, 0x14, 0xAC, 0x7F, 0x39, 0xD2, 0xFE, 0x9D, 0x88, 0xB2, 0x81, 0xF6, 0x1A, 0x9E, 0x15, 0x57, 0xD4, 0xE2, 0x31, 0x08, 0x07, 0xEC, 0x4F, 0x10, 0x00, 0xDE, 0xEF, 0x8B, 0x6F, 0xCF, 0x84, 0xE7, 0x3B, 0x41, 0x08, 0x64, 0x3B, 0x1C, 0x00, 0x7C, 0x73, 0xBB, 0x59, 0x4D, 0xD8, 0xD6, 0xE7, 0x7B, 0xBE, 0xDD, 0x50, 0x98, 0xA1, 0x1A, 0xD5, 0xAA, 0x37, 0x69, 0xB8, 0x25, 0xCB, 0x7B, 0x03, 0x00, 0x90, 0x25, 0xF3, 0x7E, 0x9A, 0x0F, 0xA3, 0xAA, 0xC4, 0xB9, 0x3B, 0x3A, 0x18, 0x2B, 0xBC, 0x9C, 0x11, 0x04, 0x92, 0x16, 0x6E, 0xC3, 0xFA, 0x01, 0xD3, 0x00, 0x02, 0xF3, 0x2E, 0xD5, 0x60, 0xA8, 0xAF, 0xAB, 0xEE, 0x2F, 0x9D, 0x30, 0x3E, 0x0E, 0xDC, 0xB8, 0xEC, 0x87, 0x9E, 0x4A, 0xA9, 0x01, 0x34, 0x69, 0x2C, 0x4C, 0x34, 0xB7, 0x7D, 0xB9, 0x7A, 0x17, 0x74, 0x31, 0xB0, 0x29, 0xC4, 0x7D, 0x27, 0x1F, 0xBA, 0xBA, 0x3F, 0x5B, 0x62, 0xF6, 0x90, 0xB8, 0x37, 0x33, 0xFC, 0x73, 0xD6, 0x19, 0x11, 0xCA, 0x83, 0x2A, 0x58, 0x62, 0x9C, 0xB1, 0x83, 0x43, 0x1D, 0x2C, 0x00, 0xA2, 0xE5, 0x87, 0x97, 0x12, 0x63, 0x31, 0x83, 0x0E, 0xB1, 0x1E, 0x69, 0x99, 0x02, 0xAF, 0xDF, 0xFF, 0x0F, 0xA9, 0x7C, 0x1B, 0x33, 0x9E, 0xFF, 0x9C, 0x14, 0x19, 0xA6, 0xCA, 0xFD, 0xB9, 0x17, 0xE0, 0x22, 0xCF, 0xB5, 0x00, 0x77, 0x2E, 0x31, 0xAD, 0xF7, 0xE5, 0xAD, 0x98, 0x14, 0xDF, 0x19, 0xF0, 0xC9, 0xBE, 0x37, 0xF6, 0xF0, 0x23, 0x66, 0xCF, 0x34, 0xE3, 0xD5, 0x8F, 0xD4, 0x07, 0xBA, 0x06, 0x56, 0x00, 0x66, 0x9A, 0xEB, 0x93 +}; + +static const unsigned char app_2_dev_hdrpvt[0x100] = +{ + 0xBC, 0x49, 0x29, 0xB9, 0x01, 0x52, 0x31, 0x76, 0x4C, 0xBA, 0xB1, 0x29, 0x91, 0x77, 0x29, 0xF2, 0x54, 0xE4, 0x6C, 0xB5, 0x68, 0xE1, 0xF0, 0x28, 0xDB, 0x8E, 0x54, 0xA8, 0xB1, 0xA3, 0xBE, 0x3F, 0xCA, 0xCA, 0x95, 0x9D, 0x4E, 0x12, 0xD7, 0x77, 0x6F, 0xB0, 0x9D, 0x85, 0x91, 0x5D, 0x29, 0x3A, 0x54, 0x3A, 0xD6, 0xEE, 0x11, 0xE5, 0xDF, 0xEF, 0xEA, 0x45, 0xD3, 0xFE, 0x58, 0x03, 0x7B, 0xE4, 0x7B, 0x19, 0x75, 0x02, 0xFE, 0xDE, 0xFF, 0x8C, 0x28, 0x33, 0xFE, 0x10, 0x11, 0xD4, 0xCD, 0x13, 0x05, 0x26, 0x85, 0xC3, 0xA8, 0x8A, 0x7A, 0x8A, 0x77, 0x1D, 0x49, 0x25, 0x11, 0x34, 0xB0, 0xBF, 0x45, 0x56, 0xCE, 0x42, 0x2E, 0x1B, 0x5C, 0xC4, 0xDD, 0x71, 0xA0, 0x01, 0x50, 0x73, 0x21, 0xFF, 0x5D, 0x54, 0x6D, 0xDD, 0x3F, 0x14, 0x49, 0x4D, 0x44, 0x46, 0x12, 0x88, 0xD5, 0x92, 0xAE, 0xE2, 0xD0, 0xF6, 0x2C, 0x10, 0xD5, 0x67, 0x61, 0x87, 0x7F, 0x2A, 0x17, 0x9D, 0x4F, 0xC6, 0x79, 0xC3, 0xAF, 0x4D, 0x6F, 0xFB, 0x0F, 0x3B, 0x48, 0x5D, 0x46, 0x9A, 0xE8, 0x53, 0xB7, 0xC5, 0x69, 0xEC, 0x31, 0x25, 0xD1, 0xDC, 0x93, 0xAB, 0x2E, 0x53, 0x3B, 0x8E, 0x96, 0x27, 0x59, 0xD4, 0xF7, 0xB3, 0xAB, 0x51, 0x59, 0xAE, 0x6E, 0x26, 0x4F, 0xC2, 0x95, 0xCE, 0x42, 0xC6, 0xAF, 0x46, 0xC6, 0x2E, 0x32, 0x09, 0x7B, 0xAF, 0x67, 0x4E, 0x57, 0xC8, 0x93, 0x5F, 0x8C, 0xD5, 0x66, 0x7B, 0xCC, 0xE9, 0xBE, 0x86, 0xB9, 0xBB, 0xD0, 0xC8, 0xD2, 0xDC, 0x5F, 0x95, 0x83, 0x28, 0x55, 0x21, 0x1E, 0xEE, 0xCF, 0x23, 0xB7, 0x6D, 0xE0, 0x9A, 0x87, 0x99, 0xFB, 0x82, 0x50, 0xD0, 0x2D, 0xC4, 0xFB, 0xA0, 0x11, 0x2F, 0xDD, 0x05, 0x7E, 0x1C, 0xE3, 0xFB, 0x98, 0x69, 0xD4, 0x49, 0x2F, 0x0D, 0xF6, 0x61 +}; + +static const unsigned char app_2_dev_acexsig[0x100] = +{ + 0x62, 0xFE, 0xD9, 0x12, 0x3D, 0x99, 0x53, 0xC4, 0x20, 0x25, 0xDE, 0x59, 0xEA, 0x6E, 0xF3, 0x16, 0x5B, 0x36, 0xBA, 0x1C, 0xB3, 0xB5, 0x48, 0x37, 0xD2, 0xA4, 0x04, 0xE5, 0x14, 0xC6, 0xE7, 0x22, 0x14, 0x40, 0x6F, 0x92, 0x6A, 0x9B, 0xDF, 0xDE, 0xFA, 0xCE, 0x3C, 0xBB, 0x4B, 0xC4, 0x66, 0xA8, 0x86, 0x58, 0xAC, 0xEB, 0x2F, 0xB7, 0xA3, 0xEC, 0xEA, 0x31, 0x23, 0x61, 0xF6, 0x72, 0x1E, 0x26, 0x8A, 0x1D, 0x68, 0x2A, 0x2A, 0x21, 0x5A, 0xA2, 0x6A, 0xBD, 0xCE, 0xC0, 0x19, 0x08, 0x61, 0x64, 0xB3, 0xF6, 0x90, 0xB1, 0x34, 0xF8, 0x50, 0x6F, 0x83, 0xB6, 0x8D, 0x35, 0x12, 0x7F, 0x9C, 0x7B, 0x6E, 0x3C, 0x4E, 0xD1, 0xFD, 0xC3, 0x30, 0xD2, 0xE8, 0x7E, 0x15, 0x1F, 0xAD, 0xDB, 0x1D, 0x92, 0xDA, 0x8C, 0x4E, 0xE9, 0x84, 0x83, 0xFF, 0x1A, 0x09, 0x77, 0x05, 0x5A, 0xCF, 0x5C, 0x8B, 0x4F, 0x68, 0x36, 0xC8, 0xDA, 0x5B, 0x1A, 0x5A, 0x49, 0xF9, 0xA1, 0xF2, 0xC8, 0x02, 0xFD, 0x69, 0x1F, 0x1D, 0xB3, 0xE8, 0xF8, 0xE1, 0x6B, 0x15, 0x9A, 0x5E, 0x41, 0x84, 0x06, 0x1F, 0x2A, 0xB3, 0xB2, 0xA1, 0xDC, 0x63, 0x81, 0xB3, 0x6B, 0x4B, 0x21, 0x67, 0x19, 0x82, 0x52, 0xFE, 0x75, 0x96, 0xA1, 0xDF, 0x02, 0xD4, 0x07, 0x1F, 0x1B, 0x88, 0x12, 0x5A, 0x76, 0x54, 0xC4, 0x06, 0x2D, 0xB1, 0xAA, 0x41, 0x3C, 0x9F, 0x43, 0xA2, 0x75, 0x20, 0x39, 0xB6, 0x06, 0xF9, 0x9C, 0xFC, 0x00, 0xC5, 0xBC, 0x84, 0x13, 0x80, 0xE4, 0x10, 0x1A, 0xCD, 0x95, 0xBB, 0xF2, 0xDC, 0x57, 0x7B, 0xBA, 0x87, 0x05, 0x0B, 0x96, 0xC1, 0xCD, 0x60, 0xC7, 0x10, 0x44, 0x78, 0x0E, 0x0F, 0x2F, 0x91, 0x54, 0x6C, 0xDE, 0xB8, 0x14, 0x46, 0xF3, 0x9C, 0xAC, 0x7B, 0xAA, 0xE7, 0x1B, 0x52, 0xD6, 0xBE, 0x71, 0x97, 0x22 +}; + +// DLP +static const unsigned char dlp_2_dev_hdrpub[0x100] = +{ + 0xB9, 0xDE, 0x3D, 0xC0, 0x55, 0xB9, 0xCC, 0x3F, 0x55, 0xE0, 0x61, 0x1D, 0x6F, 0xCF, 0x3E, 0x7F, 0xE2, 0xF7, 0xF5, 0xAD, 0x5C, 0x02, 0x7F, 0x17, 0x5B, 0x44, 0x2F, 0x2D, 0xDC, 0xD4, 0xA6, 0x63, 0xD2, 0xA7, 0x82, 0xD3, 0x00, 0x77, 0xC8, 0x0B, 0x28, 0x09, 0x3D, 0x81, 0x86, 0x93, 0xF5, 0xF6, 0xE4, 0x69, 0x3B, 0x60, 0x4C, 0x7F, 0x8D, 0x72, 0xA3, 0x22, 0x42, 0x86, 0x87, 0x06, 0xD8, 0x29, 0x89, 0x8A, 0x9F, 0x5F, 0x6C, 0x06, 0x0C, 0x96, 0x84, 0x00, 0x24, 0x5D, 0x0B, 0xEA, 0x15, 0xEC, 0xAD, 0x90, 0xA4, 0x0C, 0x7B, 0xAE, 0x0E, 0x85, 0x3E, 0xA2, 0x20, 0x04, 0xE8, 0xD9, 0x59, 0x0F, 0x31, 0x0E, 0xD4, 0x5D, 0xC1, 0x18, 0xED, 0x0E, 0xB4, 0xD2, 0x5E, 0x65, 0xA2, 0x78, 0x0C, 0x76, 0x03, 0x3A, 0x71, 0x18, 0xE4, 0x38, 0x44, 0x14, 0xE0, 0x93, 0x84, 0xFE, 0x34, 0x82, 0xCA, 0x0B, 0xB8, 0xF2, 0x41, 0xAB, 0x63, 0xF3, 0xDE, 0xAE, 0xF4, 0x36, 0x81, 0xA4, 0x78, 0x7B, 0xF9, 0xA8, 0xFB, 0xC9, 0xA7, 0x6E, 0xA4, 0xD5, 0xE2, 0xA9, 0xD8, 0xD9, 0xE8, 0x98, 0x1B, 0x25, 0x75, 0x00, 0x11, 0x51, 0x97, 0x62, 0x0D, 0xF0, 0x0C, 0xE9, 0x6B, 0x0C, 0xEE, 0xCE, 0x25, 0x2C, 0x3F, 0xDF, 0xBE, 0x54, 0xD5, 0xD6, 0x5E, 0xEE, 0x1F, 0x73, 0xFC, 0xE8, 0xEC, 0xB3, 0x8A, 0x48, 0x9F, 0x6A, 0xC1, 0x63, 0x85, 0xE4, 0x94, 0x85, 0x8F, 0x3D, 0x9D, 0x43, 0xB4, 0xA7, 0x4C, 0x82, 0xA3, 0x0B, 0x67, 0x43, 0x12, 0x31, 0x77, 0x89, 0xB0, 0xD5, 0x00, 0x1B, 0x52, 0x29, 0xCE, 0x54, 0xC7, 0xC4, 0x7D, 0xB6, 0x69, 0x7B, 0xFE, 0xDC, 0xDB, 0x4E, 0xD8, 0x58, 0x42, 0x14, 0x34, 0x72, 0x64, 0xBC, 0x09, 0x6D, 0xAC, 0xD3, 0xC4, 0x1B, 0x5C, 0x8E, 0xF9, 0xBE, 0x84, 0xCD, 0x9A, 0x86, 0x4B, 0x17 +}; + +static const unsigned char dlp_2_dev_hdrpvt[0x100] = +{ + 0xAA, 0x51, 0x62, 0x58, 0x9A, 0xB5, 0x74, 0xDA, 0x1C, 0xC1, 0x4D, 0x7C, 0x81, 0xF6, 0x70, 0x99, 0x13, 0xCC, 0x90, 0x0D, 0xD9, 0xA0, 0x58, 0x01, 0x79, 0x1A, 0x53, 0xF9, 0x3C, 0xC0, 0x87, 0xF0, 0x35, 0x1A, 0x56, 0xA1, 0x2F, 0x6E, 0x93, 0x9A, 0xD5, 0x87, 0x12, 0x1B, 0x5C, 0xCC, 0xBC, 0xB9, 0x0E, 0xB8, 0xF7, 0x35, 0xD9, 0x23, 0x90, 0xE4, 0x19, 0x64, 0xCD, 0x7D, 0x24, 0xC2, 0x3A, 0xD6, 0x65, 0x38, 0xE7, 0xAD, 0xB2, 0xF9, 0x20, 0x13, 0xD4, 0xC5, 0xA4, 0x8C, 0xB6, 0xDC, 0x3C, 0x56, 0xF2, 0xFC, 0xF5, 0xB6, 0x92, 0xA6, 0xFE, 0x9B, 0x4E, 0xB7, 0x95, 0x8B, 0xAA, 0x2B, 0x70, 0x96, 0xA1, 0x27, 0xAB, 0xA6, 0x75, 0xC9, 0x77, 0x80, 0xE0, 0x65, 0x5D, 0x26, 0xD8, 0xE8, 0x14, 0xD3, 0x17, 0x46, 0x38, 0x58, 0xCC, 0xD8, 0x5A, 0x5A, 0x9F, 0x27, 0xCE, 0xD8, 0x7A, 0x19, 0xD7, 0x35, 0xB2, 0x32, 0xAF, 0x47, 0x2E, 0x9F, 0x4B, 0x64, 0xEC, 0x1F, 0xC6, 0x40, 0xD0, 0x2C, 0x47, 0xD1, 0xEA, 0x33, 0xE5, 0x0E, 0x80, 0xFC, 0x68, 0xEC, 0x8C, 0x12, 0x33, 0xCE, 0x34, 0x28, 0x79, 0xFA, 0x05, 0x5D, 0x70, 0x15, 0xDE, 0xB1, 0x22, 0x85, 0x18, 0x63, 0x15, 0x35, 0x57, 0x04, 0x17, 0x64, 0x20, 0xC8, 0x52, 0x44, 0x64, 0x5E, 0x47, 0x4E, 0x5F, 0x80, 0x21, 0x16, 0x94, 0x4B, 0x18, 0x11, 0x36, 0x67, 0x3B, 0x6C, 0x69, 0x19, 0xCF, 0xC9, 0x05, 0x85, 0x9B, 0x3A, 0xDE, 0x12, 0x1E, 0x0A, 0xC6, 0x22, 0xA8, 0xC7, 0x9A, 0x34, 0x14, 0x98, 0xFD, 0xD9, 0x0F, 0xE8, 0x64, 0xE6, 0x89, 0x63, 0x6E, 0x17, 0x76, 0xD7, 0x1B, 0x6F, 0x92, 0x00, 0xD8, 0xBB, 0xF6, 0xA0, 0x65, 0x9D, 0xAA, 0x7A, 0x0E, 0x4B, 0x56, 0xA5, 0x33, 0xDA, 0x3F, 0x5D, 0xFE, 0xD3, 0xAD, 0x6E, 0x0E, 0xB3, 0xD4, 0x41 +}; + +static const unsigned char dlp_2_dev_acexsig[0x100] = +{ + 0x97, 0x84, 0x97, 0xEE, 0x4F, 0x35, 0xCC, 0xBE, 0x08, 0xB4, 0x5D, 0x7E, 0x17, 0xC3, 0x94, 0x2B, 0x4D, 0x3A, 0xA5, 0xB5, 0x01, 0xD4, 0xAE, 0x2A, 0x90, 0x26, 0x21, 0x8F, 0x56, 0x05, 0xB9, 0xA2, 0x5E, 0xCE, 0x73, 0xC7, 0x42, 0xDC, 0x99, 0xD2, 0x7C, 0x08, 0x62, 0xBF, 0x10, 0x7A, 0xC1, 0x5D, 0x22, 0x53, 0x8F, 0x63, 0x2D, 0x73, 0xF3, 0x05, 0xDA, 0x9D, 0x6A, 0xF8, 0xB9, 0x5B, 0x80, 0xB4, 0x30, 0xB3, 0x11, 0xF7, 0x96, 0x8A, 0xCF, 0x70, 0xD7, 0x62, 0x6E, 0x99, 0x32, 0xFD, 0x74, 0x34, 0x16, 0xFD, 0x17, 0x1F, 0xB1, 0xEC, 0xA4, 0x0F, 0x52, 0x13, 0x9F, 0x62, 0x0D, 0xE0, 0x50, 0xA6, 0xA0, 0x7B, 0x69, 0x95, 0xE0, 0xE9, 0xBB, 0x38, 0x0C, 0x62, 0xE0, 0xE3, 0xCE, 0x82, 0xE0, 0xB9, 0xE0, 0xF6, 0x61, 0x50, 0xBF, 0xA8, 0x18, 0x15, 0x38, 0xFE, 0xFA, 0x8C, 0xBA, 0xA5, 0xB9, 0x9C, 0x05, 0xA6, 0x91, 0x5C, 0xA7, 0x13, 0x6F, 0x13, 0x3F, 0xF1, 0xF6, 0x68, 0xAF, 0x40, 0xEC, 0x27, 0xE0, 0x33, 0x6B, 0xCF, 0x26, 0x06, 0xF8, 0x6A, 0x13, 0x6C, 0xBC, 0xDB, 0xAF, 0x6F, 0x78, 0xA0, 0x80, 0x10, 0x8F, 0xB6, 0x91, 0x5A, 0x43, 0x2C, 0x5F, 0x1D, 0xBA, 0xB4, 0x5E, 0xBE, 0xAE, 0x53, 0x09, 0x17, 0x5B, 0x6C, 0xC1, 0x5E, 0x0F, 0x72, 0x6E, 0xD6, 0x10, 0x0B, 0xC3, 0x26, 0xDC, 0xAF, 0xCA, 0x28, 0xAB, 0x00, 0x67, 0x04, 0xE3, 0x54, 0xE8, 0x95, 0xC6, 0x23, 0xB6, 0x79, 0x70, 0xA4, 0x87, 0x6D, 0x12, 0x48, 0xCC, 0x11, 0x86, 0xEC, 0x82, 0xF4, 0x30, 0xC9, 0xB1, 0x6D, 0x08, 0xA7, 0xEA, 0x8C, 0x6A, 0x97, 0xAA, 0x89, 0xD5, 0xC5, 0x07, 0xA9, 0xD5, 0xCF, 0x09, 0x08, 0xBC, 0x56, 0x63, 0x8D, 0x70, 0x2F, 0x64, 0xAF, 0x51, 0x9E, 0x22, 0xA4, 0x88, 0xF0, 0xDC, 0x56, 0x72, 0x28 +}; + +/* CTR_SDK 4/5 (4.2.8) */ +// APP +static const unsigned char app_4_dev_hdrpub[0x100] = +{ + 0xCF, 0xEC, 0xB2, 0x48, 0x03, 0x6D, 0xB8, 0x09, 0xE3, 0x5C, 0x6C, 0x62, 0x2C, 0xA9, 0x49, 0xE1, 0xF4, 0xF4, 0x0C, 0x6C, 0xC3, 0xE5, 0x2F, 0x9D, 0x50, 0xA0, 0x2B, 0x5A, 0x00, 0xC6, 0x72, 0x00, 0x0B, 0xA3, 0x04, 0x5D, 0x94, 0x46, 0xE7, 0x00, 0x1B, 0x48, 0x85, 0xB5, 0x61, 0x2C, 0xC9, 0x74, 0xCA, 0x2B, 0x43, 0x13, 0xC1, 0x78, 0x97, 0x5C, 0x33, 0x2F, 0x07, 0xC7, 0x85, 0xF0, 0xDA, 0xDB, 0x60, 0x96, 0x50, 0x0F, 0x7C, 0x4B, 0x7A, 0xD7, 0x17, 0x9D, 0xE4, 0xE5, 0xC3, 0xAB, 0x6F, 0x5D, 0xA5, 0x78, 0x32, 0xAD, 0x04, 0xDD, 0x96, 0x6E, 0xDC, 0x75, 0xFF, 0xC2, 0x2F, 0xFA, 0xA2, 0xEE, 0x46, 0x89, 0xCD, 0xAE, 0x69, 0x92, 0xA4, 0x48, 0xBC, 0x46, 0x47, 0xC4, 0x8C, 0x89, 0x63, 0xE1, 0x0A, 0x4D, 0x1C, 0xDC, 0x46, 0x2F, 0x5B, 0x70, 0x8A, 0x7C, 0xE9, 0x22, 0x9C, 0x09, 0x0B, 0xA8, 0x97, 0x40, 0xCA, 0x2A, 0x7D, 0x84, 0xA1, 0x04, 0x4A, 0x2E, 0xDB, 0xD7, 0xD0, 0x64, 0x43, 0x9C, 0xD0, 0x78, 0x11, 0x41, 0x88, 0x33, 0xDD, 0x31, 0x62, 0x90, 0x2D, 0x17, 0xF2, 0xC6, 0xA9, 0x2B, 0x9C, 0x70, 0xAB, 0xDC, 0xD3, 0xAB, 0x5D, 0xDA, 0xEE, 0x3D, 0x6C, 0x0E, 0x81, 0xFF, 0xF6, 0x67, 0x5A, 0x44, 0xF9, 0xAC, 0x07, 0x3D, 0x23, 0x94, 0x75, 0x65, 0x93, 0x20, 0x0C, 0xC5, 0x76, 0x1D, 0x0F, 0x65, 0x06, 0x3D, 0x21, 0xA2, 0xF0, 0x96, 0x80, 0xB7, 0x0A, 0x49, 0x53, 0x38, 0xA3, 0x5D, 0xC0, 0x74, 0x3C, 0xA4, 0xD9, 0x40, 0x36, 0x85, 0x1F, 0x8C, 0xD1, 0x2D, 0x15, 0xF9, 0xEF, 0x24, 0xA9, 0x7E, 0x9D, 0xB2, 0x1E, 0xF8, 0xA0, 0x72, 0x81, 0x17, 0x77, 0x73, 0xB1, 0x56, 0x7F, 0xAD, 0x05, 0xA2, 0xD2, 0x30, 0x5A, 0xF5, 0xD3, 0xAF, 0x0F, 0x10, 0x4A, 0x52, 0xD8, 0x09, 0x47, 0x97 +}; + +static const unsigned char app_4_dev_hdrpvt[0x100] = +{ + 0x8C, 0xBD, 0xB2, 0x3B, 0xCE, 0x9E, 0x51, 0x09, 0xD8, 0x6D, 0x72, 0x2B, 0xCE, 0x01, 0x55, 0x32, 0x6E, 0xC5, 0x57, 0x37, 0xB4, 0x2E, 0x09, 0x59, 0xD9, 0xFE, 0x60, 0xF9, 0xCE, 0x36, 0x85, 0x6A, 0x04, 0x76, 0x76, 0xF9, 0x04, 0xEA, 0x2D, 0x68, 0xC4, 0x0F, 0x05, 0xFA, 0xAD, 0x69, 0x4C, 0x80, 0x12, 0x6C, 0xD0, 0x3D, 0xAA, 0x22, 0xFF, 0x89, 0x78, 0x57, 0xE8, 0x53, 0x25, 0x15, 0xD0, 0x7E, 0xD8, 0x55, 0x46, 0xA2, 0x04, 0xC7, 0x6E, 0xC1, 0xF3, 0x89, 0x7C, 0x2C, 0x0E, 0x93, 0x97, 0x91, 0x72, 0xF4, 0xF6, 0x90, 0x69, 0x0F, 0xB8, 0xC9, 0x17, 0xCF, 0x83, 0xAC, 0xA5, 0x1F, 0x69, 0x74, 0x12, 0x29, 0x2B, 0x21, 0x58, 0xF2, 0xDA, 0xE3, 0x25, 0x16, 0x09, 0x74, 0x40, 0x90, 0xAB, 0x1B, 0xE4, 0x06, 0x28, 0x77, 0xED, 0xC6, 0x16, 0x86, 0x0A, 0x27, 0xDD, 0x03, 0x01, 0x4D, 0x9A, 0x26, 0x6E, 0xC8, 0x9F, 0xD3, 0x9A, 0x4B, 0x59, 0xD1, 0x10, 0x9B, 0xEB, 0xA9, 0x58, 0x72, 0xBD, 0xA1, 0xFE, 0x9D, 0x86, 0xED, 0x29, 0xE9, 0x29, 0x49, 0x62, 0x4B, 0xD8, 0x7D, 0x2A, 0x7A, 0x66, 0x1B, 0xE5, 0x04, 0x81, 0x56, 0x10, 0x50, 0xAF, 0xB8, 0x48, 0x27, 0xC1, 0xC9, 0x46, 0xBD, 0x3F, 0x16, 0x06, 0xA5, 0x3D, 0x04, 0x9F, 0x0D, 0x54, 0x71, 0x1C, 0xF4, 0x82, 0xC0, 0x66, 0x74, 0xEA, 0x9C, 0x83, 0x3C, 0x27, 0x01, 0xDF, 0x6F, 0x56, 0xA8, 0x1B, 0xE3, 0x68, 0x55, 0x9F, 0xAB, 0x90, 0x67, 0x20, 0x25, 0xFA, 0x3D, 0x51, 0x2A, 0x23, 0x16, 0xCB, 0x06, 0x5A, 0xAD, 0xAC, 0xC8, 0x47, 0xF9, 0x39, 0x2E, 0x6A, 0xF8, 0xFA, 0x0A, 0xE8, 0x8A, 0x64, 0x84, 0x6B, 0xED, 0xDA, 0x8F, 0x2A, 0x08, 0x86, 0x8F, 0x56, 0x69, 0x64, 0xC3, 0x98, 0x55, 0x37, 0x9A, 0x48, 0x40, 0xDA, 0xD5, 0x03, 0x21 +}; + +static const unsigned char app_4_dev_acexsig[0x100] = +{ + 0xDF, 0x1C, 0x8B, 0x98, 0xE4, 0x6F, 0xA2, 0x35, 0x6C, 0xC3, 0x18, 0x17, 0x98, 0xF3, 0xCE, 0x54, 0x7E, 0x14, 0x2E, 0x7F, 0x1E, 0xD8, 0x6D, 0xCF, 0xBC, 0x29, 0x4E, 0xFE, 0x32, 0x2E, 0xC1, 0x11, 0xAD, 0x46, 0x9A, 0xC6, 0x70, 0xEA, 0xEE, 0x28, 0x55, 0x22, 0xE1, 0x36, 0x05, 0x1C, 0x04, 0x8A, 0xCE, 0x0F, 0x0C, 0x83, 0x8F, 0xC8, 0xD6, 0xDE, 0x11, 0x8E, 0xEA, 0xCF, 0xAD, 0x9B, 0xCF, 0x81, 0x0D, 0xEB, 0x71, 0x13, 0xB3, 0xD3, 0xAE, 0x83, 0x02, 0x4C, 0x0E, 0x10, 0x50, 0x59, 0x3C, 0xEE, 0x60, 0x06, 0xFB, 0x8C, 0x7F, 0xC2, 0x20, 0x24, 0x01, 0x62, 0x55, 0x87, 0x60, 0x0F, 0xAD, 0xFA, 0x73, 0x2E, 0xF6, 0x65, 0x62, 0xD2, 0xE5, 0x10, 0x45, 0x69, 0x70, 0x39, 0x03, 0xD1, 0x39, 0xEC, 0x50, 0xC1, 0xD4, 0x25, 0x39, 0xB2, 0x90, 0x11, 0x4E, 0x95, 0xCB, 0x19, 0xEB, 0xCA, 0x0F, 0xB5, 0xFA, 0xC7, 0xB0, 0xE2, 0xD7, 0xE0, 0x71, 0xC3, 0xE5, 0x55, 0x33, 0x9E, 0x5C, 0xDC, 0x4D, 0x3B, 0x51, 0x11, 0x0D, 0x31, 0x78, 0x96, 0xCA, 0xD7, 0x18, 0x58, 0xEE, 0x00, 0xE9, 0x28, 0xF2, 0x68, 0x76, 0xD4, 0x57, 0xFE, 0x65, 0xB1, 0x4B, 0x49, 0x3F, 0xF6, 0xA6, 0x58, 0x4A, 0xC7, 0xFC, 0xC4, 0xBB, 0x61, 0xBC, 0x58, 0x8D, 0x55, 0x65, 0xE6, 0x0A, 0x79, 0x39, 0x41, 0xB8, 0x80, 0x61, 0xF7, 0x05, 0xC3, 0xFE, 0xD6, 0x8B, 0x09, 0x82, 0xC2, 0x5F, 0xA6, 0x56, 0xF9, 0xEE, 0x1D, 0x0E, 0x06, 0x3E, 0x9F, 0x3F, 0xF1, 0x93, 0x9A, 0x4F, 0xA2, 0xD5, 0x91, 0x87, 0x8A, 0xFE, 0xCF, 0xC3, 0xFC, 0x8A, 0xB1, 0xC4, 0x78, 0xE9, 0xD1, 0x1A, 0xF7, 0xB1, 0xD3, 0x20, 0xCB, 0x83, 0xBE, 0x03, 0xD5, 0xCA, 0xA5, 0x5E, 0x17, 0xA6, 0x91, 0x10, 0xD4, 0xBE, 0x23, 0xD6, 0x4B, 0x4F, 0x03, 0xA9, 0xAE +}; + +// DEMO +static const unsigned char demo_4_dev_hdrpub[0x100] = +{ + 0xB5, 0x11, 0x8D, 0x9E, 0x2D, 0xDB, 0x70, 0x6D, 0x6E, 0xEE, 0xAA, 0x21, 0xE0, 0x4E, 0x80, 0x0A, 0x96, 0x4A, 0x10, 0xD0, 0x9C, 0xD7, 0xD9, 0xD4, 0x94, 0x87, 0x72, 0xA2, 0xAF, 0x02, 0xA0, 0x05, 0x2E, 0xBF, 0x17, 0xEB, 0xFE, 0x5B, 0x9F, 0xB7, 0x0B, 0x1E, 0x3E, 0xF9, 0xAC, 0xBC, 0x7B, 0xB1, 0x56, 0x10, 0x24, 0x5F, 0x57, 0x2C, 0x08, 0xD0, 0x14, 0x79, 0x83, 0x84, 0x6A, 0x45, 0x25, 0xEB, 0xD9, 0xBE, 0x02, 0x21, 0xF7, 0x35, 0xC2, 0x74, 0x57, 0xC5, 0xAC, 0x34, 0x05, 0xC6, 0x9E, 0x82, 0xB8, 0xED, 0x78, 0xC4, 0x3B, 0xFD, 0x23, 0x59, 0x54, 0xD2, 0x0A, 0x0B, 0x5B, 0x25, 0xC0, 0x71, 0xC3, 0x84, 0x3A, 0xA7, 0xF9, 0x99, 0x86, 0xD8, 0xFE, 0x60, 0x10, 0x85, 0x77, 0x57, 0x76, 0x0C, 0x25, 0xE1, 0x18, 0x18, 0x3B, 0x83, 0xFD, 0x36, 0x7C, 0x84, 0x58, 0xC2, 0xC4, 0x68, 0x4F, 0xD1, 0xD7, 0x0A, 0x88, 0xFD, 0xCA, 0x97, 0xA1, 0xE5, 0xCE, 0x72, 0x63, 0xCF, 0x74, 0xD0, 0x20, 0xD9, 0xDE, 0x3F, 0xBB, 0x11, 0xF9, 0x21, 0xAB, 0x3F, 0x54, 0x41, 0xA7, 0xAA, 0xCA, 0xFC, 0xE1, 0x1A, 0x8C, 0x12, 0xC9, 0x39, 0x13, 0x5A, 0x81, 0x29, 0x49, 0xE8, 0xFB, 0x48, 0xC9, 0x4D, 0x50, 0x87, 0xAE, 0x51, 0xFB, 0x94, 0xFC, 0xF0, 0x9C, 0x70, 0x1C, 0xE8, 0x6E, 0x44, 0x53, 0x1E, 0x2F, 0x27, 0x5C, 0xB8, 0xEC, 0xBE, 0xFC, 0xD9, 0x98, 0x6A, 0x08, 0xD0, 0x5C, 0x4D, 0x78, 0x2D, 0x4D, 0x07, 0xAD, 0x5E, 0xB8, 0x51, 0x40, 0xE2, 0x2A, 0x7F, 0xB1, 0x54, 0x47, 0x5C, 0x99, 0x12, 0xC2, 0x6D, 0x5E, 0xED, 0x25, 0x30, 0x6A, 0x99, 0xC5, 0x0D, 0x65, 0x83, 0x68, 0x3A, 0xFD, 0x82, 0x59, 0x0D, 0xCE, 0x0B, 0x49, 0xBE, 0x17, 0x46, 0x51, 0xA9, 0xB6, 0x54, 0xE1, 0x18, 0xBD, 0x49, 0xE6, 0x7F +}; + +static const unsigned char demo_4_dev_hdrpvt[0x100] = +{ + 0x1D, 0x7B, 0x79, 0x32, 0xAB, 0x46, 0xD2, 0xBC, 0x8E, 0xD6, 0x7F, 0x8F, 0x3A, 0x85, 0xAD, 0xA5, 0x8B, 0xA9, 0x0D, 0xA9, 0xDA, 0x0F, 0xEF, 0x61, 0x04, 0xBA, 0x35, 0x39, 0x36, 0x03, 0xD8, 0x68, 0x5F, 0x9F, 0x2F, 0xD6, 0xF6, 0x38, 0x96, 0xFD, 0xE7, 0xEA, 0x89, 0xD8, 0x7F, 0x7E, 0xC5, 0x29, 0x2F, 0xD9, 0x3B, 0x02, 0xE7, 0x1F, 0xBD, 0x63, 0x9C, 0x21, 0xD8, 0xFF, 0x43, 0x8A, 0x74, 0xCD, 0x3D, 0x4C, 0x09, 0xEE, 0xDB, 0xE0, 0xBE, 0x03, 0xD1, 0x92, 0xD7, 0x22, 0x35, 0x5A, 0x8C, 0xCE, 0xBE, 0x2B, 0xB4, 0x81, 0x47, 0x3F, 0x45, 0x75, 0x33, 0x31, 0x6B, 0xFF, 0x43, 0x5D, 0x17, 0x43, 0xAE, 0xD1, 0x25, 0xF7, 0xD9, 0xD5, 0x5C, 0xB6, 0x92, 0x5C, 0xB3, 0xF3, 0xF7, 0x65, 0x9F, 0x4C, 0x05, 0x12, 0xEC, 0xA8, 0x6D, 0x70, 0x65, 0x57, 0x6C, 0xD8, 0xE3, 0xD6, 0xFA, 0xC1, 0xFD, 0x54, 0xE8, 0x34, 0x67, 0x4D, 0x0A, 0x14, 0x2F, 0xA3, 0xD4, 0x81, 0x8C, 0xC3, 0xD0, 0x8B, 0x09, 0x08, 0x90, 0x70, 0x68, 0xA0, 0x0E, 0xD1, 0x0B, 0xAA, 0x71, 0xEC, 0x9A, 0x1A, 0x83, 0xFF, 0xA1, 0x70, 0xEB, 0xAC, 0xF2, 0xE9, 0x80, 0xA1, 0xB8, 0x20, 0x31, 0x83, 0xF5, 0x37, 0x01, 0x72, 0x06, 0x50, 0x05, 0x3F, 0x14, 0xF9, 0x29, 0x48, 0x84, 0xA0, 0x0E, 0xF7, 0xB8, 0x1D, 0xA3, 0x36, 0x5A, 0x78, 0x6D, 0x83, 0x90, 0x27, 0xE3, 0x50, 0x49, 0x2F, 0x65, 0xE5, 0x61, 0xED, 0x65, 0xBE, 0xEA, 0x34, 0xA6, 0x6A, 0xEF, 0x49, 0xB4, 0xE0, 0xBC, 0xC2, 0xA5, 0xB8, 0xEB, 0xA9, 0x2F, 0xBA, 0x26, 0x76, 0xB2, 0x5A, 0x3A, 0x3B, 0xFD, 0xAD, 0xFB, 0xE4, 0x79, 0xE2, 0x85, 0x54, 0x5B, 0xAB, 0x1F, 0x0A, 0xE5, 0x8B, 0x77, 0x3A, 0x10, 0x98, 0x26, 0x74, 0xC8, 0xB0, 0x82, 0xB1, 0xF9, 0x8F, 0x68, 0x59 +}; + +static const unsigned char demo_4_dev_acexsig[0x100] = +{ + 0xD3, 0x7D, 0x42, 0xBA, 0x6A, 0x1E, 0xD8, 0x07, 0x3C, 0x4A, 0xC4, 0xCD, 0x8C, 0x68, 0x3D, 0xCD, 0xCD, 0xBD, 0x9D, 0xCE, 0xB5, 0x2A, 0xF9, 0x63, 0x3D, 0xA9, 0x54, 0x0A, 0x2E, 0x4C, 0xE1, 0x60, 0x4B, 0xD0, 0xC9, 0xEB, 0xEF, 0x31, 0x65, 0x70, 0xB9, 0x0E, 0x06, 0x3B, 0x3D, 0x42, 0x4C, 0x6E, 0x8D, 0x2C, 0xD4, 0x71, 0x29, 0x76, 0xB7, 0xDD, 0x8C, 0xDA, 0xE7, 0xE3, 0x96, 0xA7, 0xAA, 0xF8, 0xCA, 0x05, 0xE8, 0xA7, 0x0A, 0xDD, 0x01, 0x49, 0xBD, 0xF1, 0xA5, 0xE8, 0x16, 0x22, 0xEE, 0x47, 0x1F, 0xEF, 0x28, 0x48, 0x87, 0xA9, 0x2D, 0xFC, 0x4E, 0xD5, 0xA5, 0x98, 0xB1, 0xFE, 0x1B, 0xEB, 0xA9, 0x06, 0x3C, 0x76, 0xD9, 0xAA, 0x0E, 0x9C, 0x60, 0xFC, 0xE9, 0x77, 0x9D, 0x7F, 0x67, 0xAC, 0xF5, 0xC7, 0x49, 0x12, 0xFD, 0x76, 0xAC, 0xD2, 0x54, 0xDB, 0x73, 0x41, 0x10, 0x1F, 0x04, 0x3F, 0xD0, 0x6F, 0xE0, 0x80, 0x24, 0xCC, 0xEE, 0xBF, 0x25, 0x9D, 0x0D, 0x5A, 0x2A, 0x1C, 0xC5, 0xD4, 0xE3, 0x5D, 0x3A, 0xC1, 0x86, 0xD3, 0xD4, 0x52, 0x1C, 0x4C, 0xBF, 0x31, 0xEB, 0x54, 0xCA, 0x4C, 0x06, 0x50, 0x52, 0x87, 0xD4, 0x9D, 0x4A, 0x4B, 0x22, 0xE1, 0x4A, 0xE9, 0x4D, 0x05, 0xA8, 0x57, 0xEC, 0xF8, 0x90, 0xF8, 0x58, 0xC3, 0x8B, 0x3A, 0x0F, 0x88, 0x36, 0xF4, 0xE5, 0x44, 0x10, 0x80, 0x68, 0x86, 0x1D, 0xAE, 0x90, 0x20, 0x03, 0x22, 0x2D, 0x44, 0xBF, 0xAB, 0x2B, 0xA1, 0x14, 0xAD, 0x6B, 0x40, 0x57, 0xDB, 0xBB, 0xDA, 0x09, 0x4C, 0x51, 0x26, 0x9B, 0xE3, 0xD9, 0xF9, 0xE1, 0xBC, 0xF1, 0xF1, 0xCD, 0x30, 0xB4, 0xF5, 0x39, 0xD0, 0xBC, 0xF7, 0x98, 0x05, 0xAF, 0xA8, 0x33, 0x4B, 0xC1, 0x16, 0x0F, 0xF2, 0xC2, 0x79, 0x96, 0xEC, 0xBE, 0xA9, 0xF5, 0x55, 0x7C, 0x82, 0x95, 0x73 +}; + +// DLP +static const unsigned char dlp_4_dev_hdrpub[0x100] = +{ + 0xB3, 0x16, 0x68, 0xF1, 0xED, 0x59, 0xC8, 0x7F, 0xC6, 0x50, 0x21, 0xFE, 0x36, 0x7C, 0x55, 0xE7, 0x07, 0xF9, 0x1D, 0x1B, 0xF5, 0xB1, 0x2A, 0x6B, 0x3A, 0xDE, 0x2D, 0x4C, 0x51, 0xCD, 0x4C, 0x9F, 0xEE, 0x1D, 0xE4, 0xE8, 0xF0, 0xFD, 0x09, 0x8E, 0x0F, 0x92, 0x5F, 0xDB, 0x9C, 0x5C, 0x15, 0x55, 0x1A, 0x4D, 0x04, 0x8C, 0xB0, 0xA4, 0x88, 0x97, 0xC4, 0xD5, 0x92, 0x04, 0x42, 0x33, 0x84, 0x81, 0x06, 0xD6, 0xF2, 0x17, 0xDE, 0x83, 0x17, 0x50, 0xD0, 0x47, 0x61, 0x14, 0x0D, 0xB7, 0xC7, 0xA0, 0xC1, 0x8B, 0x82, 0x47, 0x13, 0xEE, 0x76, 0xA2, 0xA3, 0x8D, 0xCE, 0x55, 0xC1, 0xF3, 0x7A, 0xEA, 0x91, 0xE1, 0xB9, 0x2F, 0x8F, 0x9B, 0xC3, 0x7B, 0x51, 0x2F, 0xE7, 0xAD, 0x93, 0x9C, 0xFD, 0xDF, 0x19, 0xC8, 0x6C, 0x24, 0xC2, 0xE2, 0x91, 0x97, 0x1F, 0xEB, 0x4B, 0xD4, 0x46, 0x6C, 0x06, 0x93, 0xAF, 0xF5, 0x5E, 0x8F, 0x77, 0x25, 0xC4, 0x28, 0xC0, 0x82, 0x4A, 0x78, 0xE9, 0x14, 0x08, 0xC3, 0xC3, 0x58, 0x24, 0x44, 0x2D, 0x2B, 0xA7, 0xEE, 0x28, 0xEF, 0x1B, 0x6D, 0xAA, 0x9C, 0xED, 0x7F, 0x35, 0xCE, 0x86, 0x5C, 0x6B, 0x8A, 0x23, 0xD3, 0x9D, 0x05, 0x8F, 0xD2, 0x41, 0x93, 0x1D, 0x1D, 0x7E, 0xB0, 0x46, 0x23, 0x63, 0x07, 0xEA, 0x5F, 0x26, 0xE3, 0x81, 0x27, 0xB3, 0x95, 0xB1, 0x93, 0x59, 0xD4, 0x1A, 0xB8, 0x73, 0xD0, 0x09, 0x95, 0x2B, 0xE8, 0x8B, 0xE2, 0x73, 0x5F, 0x34, 0xB9, 0x98, 0x82, 0xF0, 0x11, 0xC6, 0x8F, 0x12, 0x4D, 0x09, 0x57, 0x10, 0x97, 0x22, 0x0E, 0xC8, 0x7D, 0x40, 0xC1, 0x9D, 0x12, 0x1F, 0x71, 0xFE, 0x1E, 0x1A, 0x8C, 0x3F, 0x56, 0xAC, 0x43, 0xC3, 0x66, 0x0C, 0x81, 0xAE, 0xC1, 0x8F, 0x68, 0xFF, 0x87, 0x07, 0x3C, 0xCD, 0x0A, 0x23, 0xDE, 0xBA, 0x9B +}; + +static const unsigned char dlp_4_dev_hdrpvt[0x100] = +{ + 0x77, 0xC2, 0x7A, 0xB7, 0x9E, 0x13, 0xB6, 0x62, 0xCC, 0x09, 0x76, 0x51, 0xFB, 0xB9, 0xB5, 0xF0, 0x63, 0x82, 0x91, 0x96, 0xCA, 0xFC, 0x88, 0xF3, 0x60, 0x50, 0x87, 0x56, 0x4C, 0x35, 0xD0, 0x11, 0xFB, 0x38, 0x7E, 0x85, 0xCF, 0xF2, 0x46, 0xDB, 0x7B, 0x4A, 0x55, 0x54, 0x15, 0x01, 0xF7, 0x3A, 0x0B, 0xF6, 0x89, 0x1E, 0x54, 0x5A, 0x13, 0x05, 0xFB, 0x19, 0x1F, 0x26, 0x3D, 0xE7, 0x19, 0xAA, 0xF7, 0x19, 0xF2, 0x97, 0x47, 0xB3, 0xBE, 0x79, 0xCA, 0x6E, 0x91, 0x5A, 0xC9, 0xB9, 0xA6, 0x83, 0xB8, 0x2A, 0x45, 0x1A, 0xA7, 0x17, 0x86, 0xBA, 0x48, 0x49, 0x62, 0x3C, 0x33, 0x11, 0x51, 0x97, 0x5F, 0xAA, 0xE5, 0x1E, 0x0B, 0x19, 0x0C, 0xE6, 0x80, 0x6A, 0x5A, 0xB1, 0xD6, 0xCE, 0xDB, 0x6E, 0xC0, 0x5D, 0x29, 0x04, 0x84, 0x56, 0xE3, 0x29, 0x7E, 0xAC, 0xE8, 0xEE, 0xB1, 0x91, 0x37, 0xEB, 0x98, 0x9C, 0xBD, 0x02, 0x6A, 0x78, 0x61, 0xB0, 0x79, 0x1A, 0x9F, 0x30, 0x86, 0xF6, 0x71, 0x5A, 0x5A, 0x12, 0xA1, 0x9E, 0xA1, 0x68, 0x03, 0xE5, 0x95, 0xA8, 0x38, 0x58, 0x87, 0x08, 0x57, 0x35, 0x32, 0x47, 0x3B, 0xFC, 0x02, 0x6F, 0xCE, 0x55, 0x61, 0xA3, 0x2A, 0x6B, 0x2F, 0xF8, 0xEE, 0x8D, 0xFA, 0x43, 0x33, 0x02, 0x63, 0x47, 0x02, 0x78, 0x5A, 0x7F, 0x64, 0x07, 0x92, 0xB7, 0x7C, 0x09, 0x7C, 0xFE, 0x2D, 0x1C, 0xFC, 0x77, 0x9F, 0x19, 0x20, 0xDD, 0x6D, 0x4C, 0xFE, 0x49, 0x09, 0x47, 0xCA, 0x9B, 0x1C, 0x8C, 0x1F, 0x37, 0xAC, 0x14, 0x85, 0x56, 0xC0, 0xFD, 0xD6, 0x01, 0xB3, 0x40, 0xA3, 0x1A, 0x32, 0x78, 0xA0, 0xDD, 0x21, 0x75, 0xBF, 0x24, 0xD2, 0x93, 0x85, 0xED, 0x22, 0xAD, 0x99, 0x91, 0x87, 0x4A, 0xEC, 0xC0, 0x6C, 0x71, 0x00, 0x76, 0x08, 0x23, 0xA2, 0xF3, 0xCF, 0x61 +}; + +static const unsigned char dlp_4_dev_acexsig[0x100] = +{ + 0xAC, 0xE2, 0xA7, 0xC3, 0x00, 0xDE, 0xE8, 0xE9, 0xE0, 0x03, 0xB3, 0x54, 0x08, 0xA8, 0xF8, 0x3A, 0x2E, 0xD8, 0x10, 0x6B, 0xEC, 0xDC, 0x4E, 0xEE, 0x62, 0x10, 0x71, 0x49, 0xD4, 0x43, 0xB1, 0x0E, 0x6B, 0x8C, 0xD7, 0x54, 0xD5, 0x62, 0x28, 0x3F, 0xAA, 0xDE, 0xA9, 0x7D, 0xED, 0x37, 0x7C, 0xE7, 0x89, 0x0B, 0x02, 0xB2, 0x72, 0x4B, 0x17, 0xDB, 0xE2, 0xD3, 0x7C, 0x94, 0x12, 0x3F, 0x2E, 0xA1, 0x08, 0x99, 0xCC, 0x7F, 0x93, 0xE6, 0x38, 0xC9, 0x37, 0x84, 0xD7, 0x11, 0x9D, 0x02, 0x4D, 0x66, 0xB4, 0x70, 0x9F, 0xD8, 0xC6, 0xDD, 0xD5, 0x13, 0x52, 0xF0, 0xA6, 0x78, 0x8C, 0x8E, 0x15, 0xA0, 0xA1, 0xF3, 0xC4, 0xC3, 0x48, 0x45, 0xA5, 0xBE, 0xC9, 0x7A, 0x8B, 0xD3, 0x95, 0xA5, 0x4C, 0xF1, 0xB3, 0x0C, 0x6C, 0x76, 0xA7, 0x57, 0xA1, 0x77, 0xDF, 0x2F, 0xC8, 0x06, 0xA6, 0x0D, 0x1A, 0x09, 0xE4, 0x38, 0x64, 0x07, 0xBE, 0x6A, 0xD2, 0xA0, 0xC0, 0xEC, 0x09, 0x64, 0x9F, 0x0D, 0x93, 0x0C, 0x89, 0xA2, 0x71, 0xD6, 0xC6, 0xC2, 0x54, 0x79, 0x2A, 0xA4, 0x31, 0x28, 0x24, 0x1A, 0xF3, 0x56, 0x78, 0x63, 0x99, 0x97, 0xA5, 0xCE, 0x8F, 0x52, 0x7A, 0x79, 0x51, 0xEE, 0x4C, 0x8B, 0x00, 0x9D, 0x5C, 0x3E, 0xD5, 0xAA, 0x24, 0x9C, 0x94, 0xC6, 0xA3, 0x99, 0x1B, 0x2D, 0xD4, 0xFF, 0xB4, 0x25, 0x73, 0x13, 0x33, 0x9F, 0x03, 0x6F, 0x1E, 0x75, 0xC4, 0x70, 0xF4, 0x07, 0x4F, 0x18, 0xFE, 0xBD, 0x8F, 0x2C, 0x9B, 0x33, 0xD4, 0x30, 0xA7, 0x18, 0x4A, 0xF1, 0xA4, 0xDD, 0x78, 0x41, 0xA0, 0xB8, 0x02, 0x8D, 0x51, 0x96, 0xBE, 0xE7, 0x17, 0x94, 0x66, 0x65, 0x27, 0xF7, 0x69, 0x48, 0x7E, 0xA9, 0x08, 0x71, 0x20, 0x76, 0xB7, 0x8E, 0xD2, 0xBF, 0x5C, 0x7E, 0x5E, 0x06, 0x45, 0xAB, 0x7E, 0x2E +}; +#endif \ No newline at end of file diff --git a/desc_presets.h b/desc_presets.h new file mode 100644 index 0000000..d9d6198 --- /dev/null +++ b/desc_presets.h @@ -0,0 +1,85 @@ +#ifndef _DESC_PRESETS_H_ +#define _DESC_PRESETS_H_ + +/* CTR_SDK 1 (1.2.0) */ +// DependencyList +static const unsigned char sdk1_dep_list[0x180] = +{ + 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// APP +static const unsigned char app_1_acex_data[0x200] = +{ + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +// DLP +static const unsigned char dlp_1_acex_data[0x200] = +{ + 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +/* CTR_SDK 2 (2.3.4) */ +static const unsigned char sdk2_dep_list[0x180] = +{ + 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// APP +static const unsigned char app_2_acex_data[0x200] = +{ + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +// DLP +static const unsigned char dlp_2_acex_data[0x200] = +{ + 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +/* CTR_SDK 4/5 (4.2.8) */ +// DependencyList +static const unsigned char sdk4_dep_list[0x180] = +{ + 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// SD APP +static const unsigned char app_4_acex_data[0x200] = +{ + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +// EC App +static const unsigned char ecapp_4_acex_data[0x200] = +{ + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6E, 0x69, 0x6D, 0x3A, 0x61, 0x6F, 0x63, 0x00, 0x61, 0x6D, 0x3A, 0x61, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x20, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + + +// DEMO +static const unsigned char demo_4_acex_data[0x200] = +{ + 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +// DLP +static const unsigned char dlp_4_acex_data[0x200] = +{ + 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +/* SDK 7 (7.1.0) */ +static const unsigned char sdk7_dep_list[0x180] = +{ + 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x38, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// APP +static const unsigned char app_7_acex_data[0x200] = +{ + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x41, 0x00, 0x00, 0x00, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x61, 0x63, 0x74, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x61, 0x6D, 0x3A, 0x61, 0x70, 0x70, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x69, 0x6D, 0x3A, 0x61, 0x6F, 0x63, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x27, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 +}; + +#endif \ No newline at end of file diff --git a/desc_prod_sigdata.h b/desc_prod_sigdata.h new file mode 100644 index 0000000..73826ca --- /dev/null +++ b/desc_prod_sigdata.h @@ -0,0 +1,38 @@ +#ifndef _DESC_PROD_SIGDATA_H_ +#define _DESC_PROD_SIGDATA_H_ + +/* CTR_SDK 4/5 (4.2.8) */ +// APP +static const unsigned char app_4_prod_hdrpub[0x100] = // app_4_prod_hdrpub +{ + 0xCF, 0x00, 0x9C, 0xB3, 0x20, 0xA0, 0x32, 0x47, 0x65, 0x89, 0xE0, 0xA0, 0x40, 0xC5, 0x57, 0x03, 0xA5, 0xF6, 0x8E, 0x66, 0xF5, 0x20, 0x28, 0xEE, 0xA7, 0x44, 0x3E, 0x8E, 0x4F, 0xC0, 0xC9, 0xD3, 0xE4, 0x3A, 0x0B, 0x31, 0xEC, 0x8F, 0xCC, 0x8D, 0x4C, 0xA6, 0x14, 0x49, 0x14, 0xBE, 0x05, 0xC1, 0xB4, 0x22, 0xAD, 0xCE, 0x1D, 0xCD, 0x29, 0x7B, 0x45, 0x16, 0xE5, 0xB9, 0xD6, 0xD2, 0x7A, 0xD0, 0x63, 0xCE, 0x69, 0xB2, 0xCA, 0xB8, 0x6D, 0x10, 0x9B, 0x99, 0x62, 0xF9, 0x45, 0xC0, 0x2E, 0xB5, 0xA1, 0xCD, 0x6B, 0xAF, 0x77, 0x9B, 0xEF, 0xD8, 0x56, 0x48, 0x75, 0x34, 0x02, 0x6E, 0xBA, 0xBF, 0x30, 0x54, 0xBF, 0x33, 0x4D, 0xB1, 0x36, 0xDC, 0x2A, 0xCD, 0x68, 0x81, 0x8C, 0x4F, 0xCB, 0xC2, 0xA2, 0x1D, 0x6E, 0xB0, 0xC0, 0x02, 0xF5, 0xF8, 0x1C, 0x6C, 0xB4, 0xC9, 0xD6, 0x90, 0x27, 0x50, 0xCA, 0x61, 0xE4, 0x1E, 0xA6, 0x1E, 0x43, 0x94, 0x01, 0x81, 0xC3, 0x69, 0xD0, 0xE2, 0x2C, 0xD7, 0x86, 0x1B, 0x8B, 0x69, 0x4D, 0xF0, 0xF1, 0x54, 0x24, 0x20, 0x91, 0xDD, 0x87, 0x12, 0x0A, 0x23, 0x98, 0x09, 0x63, 0xFD, 0xB4, 0x00, 0x69, 0x06, 0xD2, 0xF1, 0xC3, 0xE7, 0x9D, 0xCC, 0x87, 0x99, 0x01, 0x20, 0xDA, 0xD6, 0xA4, 0x24, 0x58, 0x9A, 0x62, 0x52, 0xF0, 0x30, 0x98, 0x6C, 0x08, 0x90, 0xB4, 0xA6, 0xE4, 0x79, 0x47, 0xF3, 0x1D, 0x58, 0x86, 0x4D, 0x9B, 0xA3, 0xE8, 0xFC, 0x1A, 0x63, 0xC3, 0x2F, 0xDF, 0xD3, 0xC6, 0x3B, 0x8E, 0xDA, 0xFB, 0xEA, 0x6D, 0xE3, 0x92, 0x14, 0xC8, 0x21, 0x2C, 0xE3, 0xF2, 0xE3, 0x31, 0x2E, 0xF6, 0x73, 0x27, 0xE8, 0xF2, 0xD5, 0x38, 0xB7, 0x04, 0x46, 0xA7, 0xBE, 0x92, 0x14, 0x66, 0x1E, 0x8D, 0x88, 0xF7, 0xC0, 0x60, 0xB5, 0x7F, 0xF3, 0xCE, 0x43 +}; + +static const unsigned char app_4_prod_acexsig[0x100] = // app_4_prod_acexsig +{ + 0x04, 0xE3, 0xD1, 0xD2, 0x32, 0xF4, 0x04, 0xE5, 0x79, 0x67, 0x1E, 0x74, 0xD8, 0x1B, 0x8F, 0x6C, 0xEB, 0xE2, 0xFE, 0x1B, 0xCE, 0xAB, 0x92, 0x03, 0xF0, 0x3C, 0xF5, 0x31, 0x07, 0xCE, 0x8E, 0x47, 0xB2, 0xE8, 0x52, 0x8F, 0xFF, 0xA7, 0x1B, 0xE1, 0xFF, 0x58, 0x5E, 0x99, 0xBA, 0x71, 0x90, 0x87, 0x01, 0x92, 0xE8, 0xD0, 0x67, 0x6E, 0x29, 0xD3, 0x1E, 0xA6, 0x22, 0x8F, 0x52, 0xAD, 0x6B, 0xB1, 0xB6, 0xC0, 0xC6, 0x44, 0x5D, 0x41, 0xD8, 0xCE, 0x3A, 0xEB, 0x04, 0x5A, 0x8C, 0x4D, 0x03, 0x9F, 0x31, 0xDC, 0x4E, 0x37, 0xEF, 0x7B, 0x42, 0x02, 0x19, 0x6A, 0x33, 0x60, 0xEF, 0xB9, 0x01, 0x11, 0xAC, 0x82, 0x10, 0xFD, 0x79, 0xD8, 0x2D, 0x5F, 0x42, 0xDE, 0xEC, 0x38, 0x79, 0xF6, 0x70, 0x84, 0x5A, 0xA8, 0x83, 0x58, 0xEF, 0x57, 0x2A, 0x04, 0x1E, 0x9B, 0xAF, 0xB3, 0xCC, 0x67, 0x62, 0xD1, 0x9B, 0xB0, 0xA4, 0x3C, 0x16, 0xB8, 0x0B, 0xC1, 0x7B, 0xE9, 0x39, 0x96, 0x32, 0xF5, 0xC4, 0xA0, 0xAB, 0xE8, 0xEA, 0x2F, 0x2D, 0x83, 0xF4, 0x8C, 0x62, 0xA3, 0x03, 0xDC, 0x6E, 0xAD, 0x9C, 0x46, 0x56, 0xD6, 0xF5, 0xDD, 0xB1, 0x95, 0x47, 0xE9, 0xAB, 0x40, 0x28, 0x87, 0x2B, 0x97, 0x42, 0x1A, 0x71, 0x9F, 0xB7, 0x7D, 0x45, 0x4A, 0x2B, 0xF6, 0xF7, 0xA8, 0x01, 0x14, 0x40, 0x77, 0x14, 0x49, 0x2B, 0x5D, 0x84, 0xA5, 0xC4, 0xA8, 0x10, 0xCD, 0x4B, 0x85, 0x34, 0x58, 0x74, 0x99, 0xD2, 0x44, 0x26, 0x37, 0xC7, 0x7A, 0x7A, 0x60, 0x85, 0x77, 0x73, 0xE9, 0x75, 0xB1, 0x6B, 0xDA, 0x43, 0x02, 0xAD, 0xD2, 0xC6, 0x7F, 0x53, 0xC4, 0xD3, 0x0F, 0x1D, 0xA0, 0x6F, 0xD8, 0x3B, 0xAF, 0xFF, 0x94, 0xF6, 0x27, 0x27, 0x7A, 0xEF, 0xF3, 0x96, 0xA5, 0x29, 0x4A, 0x47, 0xB1, 0x09, 0x2D, 0x34, 0xF5 +}; + +// EC APP +static const unsigned char ecapp_4_prod_hdrpub[0x100] = // ecapp_4_prod_hdrpub +{ + 0xE1, 0xF2, 0xF8, 0x92, 0xEC, 0x5D, 0xD9, 0xB2, 0x38, 0xCE, 0x52, 0x72, 0x10, 0x3A, 0x51, 0xB2, 0x47, 0xD9, 0xC7, 0x00, 0xF9, 0xEB, 0xE2, 0x1E, 0xE8, 0x53, 0x2F, 0xFF, 0xB0, 0x0D, 0x9E, 0x1B, 0x21, 0x48, 0x0B, 0xBF, 0x53, 0x48, 0x93, 0x9E, 0x20, 0x55, 0xF2, 0x8F, 0xFE, 0x5E, 0x0D, 0xE6, 0xBF, 0xDD, 0xF5, 0xE6, 0xDF, 0x95, 0xA6, 0x5B, 0x38, 0x81, 0x49, 0x1E, 0xE9, 0x77, 0xB1, 0x96, 0xEA, 0xAA, 0x83, 0x18, 0x09, 0x2F, 0x77, 0x59, 0x16, 0x0B, 0xA9, 0xF1, 0xE8, 0xE8, 0x3A, 0x05, 0xEA, 0x35, 0x4F, 0x1D, 0xD4, 0xF9, 0xC5, 0x1A, 0xA2, 0x9E, 0xF7, 0xBD, 0x3B, 0x90, 0xDA, 0x80, 0xA9, 0xA3, 0xED, 0xFC, 0xE3, 0xBF, 0x7A, 0xF1, 0x43, 0x67, 0x5F, 0x35, 0x24, 0xD1, 0x4B, 0xCF, 0x1F, 0x59, 0xF5, 0xF4, 0x5E, 0x88, 0xDE, 0x3D, 0x19, 0xDD, 0x5E, 0x04, 0xB2, 0x39, 0xB3, 0x29, 0x32, 0xBA, 0xA3, 0x1C, 0x18, 0x75, 0x01, 0xE0, 0xC9, 0x22, 0x23, 0xA1, 0x95, 0x04, 0xA6, 0x0F, 0xFB, 0x5D, 0x25, 0xC2, 0x88, 0x21, 0x5F, 0xFD, 0x13, 0xFE, 0x9F, 0x06, 0xE6, 0x5E, 0x53, 0x69, 0x1A, 0x15, 0xD0, 0xAB, 0xBE, 0x16, 0xC5, 0x01, 0x52, 0xEA, 0x87, 0x5F, 0xFE, 0xE6, 0xC3, 0xD1, 0x4F, 0xB9, 0xC3, 0x6B, 0xBD, 0x7D, 0x4E, 0x1D, 0xA9, 0xCD, 0xD8, 0x89, 0x1B, 0x0E, 0x64, 0x97, 0x57, 0x7E, 0x23, 0xF4, 0x85, 0xD0, 0xE9, 0x68, 0x00, 0xBF, 0x7E, 0x8B, 0xB2, 0x42, 0xED, 0x9B, 0xDD, 0xD8, 0x62, 0x13, 0x26, 0x93, 0xF8, 0x66, 0x0B, 0x32, 0x30, 0x8A, 0x9C, 0xF0, 0x7A, 0x7E, 0xD2, 0x04, 0x5D, 0xF1, 0xF2, 0xB2, 0x4A, 0xF2, 0x18, 0xF4, 0xAF, 0xA4, 0x34, 0x06, 0xE7, 0x09, 0x77, 0x01, 0x8F, 0xEE, 0x17, 0x27, 0x89, 0x9B, 0xF0, 0x76, 0x00, 0x25, 0x01, 0x09, 0xC1, 0x51 +}; + +static const unsigned char ecapp_4_prod_acexsig[0x100] = // ecapp_4_prod_acexsig +{ + 0x6F, 0x5C, 0xA2, 0xD4, 0xDB, 0x21, 0x69, 0x54, 0xFE, 0x63, 0x55, 0x4C, 0x18, 0x86, 0xFF, 0x47, 0x73, 0x9B, 0x3A, 0x6B, 0xF3, 0x63, 0x47, 0x7E, 0x76, 0x86, 0x3B, 0xF1, 0xC6, 0x05, 0xE4, 0x4B, 0x8B, 0x61, 0xF3, 0x06, 0x02, 0x9B, 0x1B, 0xD1, 0x48, 0xCC, 0x51, 0xAF, 0x78, 0xE5, 0x58, 0xEE, 0xC4, 0x93, 0x83, 0xC2, 0xC9, 0x91, 0xD4, 0x4E, 0x00, 0xAD, 0xA8, 0x12, 0x40, 0x77, 0x20, 0xF8, 0xED, 0x11, 0xC1, 0x1D, 0x71, 0x14, 0x75, 0x1D, 0xB6, 0x89, 0xCC, 0xE1, 0x38, 0x3B, 0x8E, 0xAD, 0xA5, 0x17, 0x88, 0x90, 0xC1, 0xBE, 0x95, 0xBB, 0x0F, 0x0B, 0x12, 0xF9, 0x9E, 0xA9, 0x4F, 0x16, 0x34, 0x06, 0x2D, 0xFD, 0x1B, 0x51, 0x92, 0xE1, 0xD3, 0x7D, 0x6B, 0x31, 0xF0, 0xB4, 0xC0, 0x75, 0x91, 0x75, 0x2A, 0x0C, 0x99, 0x46, 0x2F, 0x4B, 0x34, 0xF3, 0x72, 0x10, 0x04, 0x23, 0x62, 0xC8, 0x94, 0xAD, 0x06, 0xC7, 0x69, 0x2A, 0x78, 0x3A, 0xCE, 0x8B, 0xE0, 0x16, 0x7D, 0x28, 0x35, 0xB2, 0xE1, 0x71, 0x49, 0x1C, 0x55, 0xD7, 0xA8, 0x6D, 0xCB, 0xA6, 0xF3, 0xB9, 0x35, 0xEA, 0x9D, 0xB0, 0x04, 0xE8, 0xB5, 0xEC, 0x15, 0xC6, 0xB1, 0x01, 0x69, 0xFB, 0x01, 0x87, 0x58, 0x83, 0xCC, 0xF5, 0x91, 0xC3, 0x3C, 0x2D, 0x7E, 0xAF, 0x43, 0xB9, 0xCD, 0x95, 0x20, 0xF9, 0x8F, 0x6F, 0x39, 0xDE, 0x95, 0x7B, 0x3F, 0xAD, 0x56, 0xF3, 0x07, 0xA3, 0x52, 0x12, 0x0F, 0x56, 0xA4, 0xF7, 0xAC, 0x55, 0xC2, 0x2F, 0x01, 0x0E, 0xFD, 0x26, 0xC9, 0x06, 0x8B, 0xCB, 0x6A, 0x4A, 0xE3, 0xF4, 0x58, 0x04, 0xAB, 0x64, 0x02, 0x99, 0xB9, 0xC5, 0xDA, 0x1F, 0x96, 0xEA, 0xEE, 0xB0, 0x33, 0xFD, 0xE9, 0x74, 0x90, 0x48, 0x7B, 0x88, 0xDE, 0x72, 0x57, 0x4C, 0x69, 0x47, 0x89, 0x03, 0xD6, 0x6B, 0x22, 0xFF +}; + +/* SDK 7 (7.1.0) */ +// APP +static const unsigned char app_7_prod_hdrpub[0x100] = +{ + 0x9B, 0x3B, 0x52, 0x2D, 0x61, 0xF5, 0x0D, 0x14, 0x96, 0x09, 0x7A, 0x66, 0xC9, 0x86, 0x4C, 0x51, 0x61, 0x7D, 0xF8, 0x9B, 0xFD, 0xB0, 0x3E, 0x44, 0xC5, 0x0D, 0xC2, 0x6B, 0x6C, 0x66, 0x63, 0x3E, 0xE7, 0xC8, 0x04, 0xCB, 0x06, 0xC8, 0x35, 0xC5, 0x6D, 0xDB, 0x38, 0x36, 0xC5, 0x54, 0x32, 0xF0, 0x60, 0x11, 0x44, 0x9F, 0xD9, 0xFA, 0x6A, 0x43, 0xE1, 0x79, 0x56, 0xBF, 0xCF, 0xDD, 0xA8, 0x35, 0x15, 0x23, 0x51, 0xF9, 0x4B, 0xDA, 0x1A, 0xD9, 0x9D, 0x28, 0xF6, 0xCC, 0x1D, 0x53, 0x00, 0xC0, 0x3C, 0x13, 0x32, 0xBC, 0x7F, 0x75, 0x82, 0xCD, 0x79, 0xEF, 0x65, 0xBC, 0xCA, 0x98, 0x31, 0x0A, 0x7B, 0xEF, 0x18, 0xD8, 0xF3, 0x8D, 0x3A, 0x10, 0x22, 0xA0, 0xF2, 0x8D, 0xA5, 0xA8, 0xBE, 0xA0, 0x62, 0xEC, 0xE2, 0xC7, 0x6C, 0xCF, 0x06, 0x6B, 0xA7, 0xB5, 0xB8, 0x8C, 0xD5, 0x8E, 0xEF, 0xE3, 0x42, 0xC9, 0xAD, 0x44, 0x46, 0x3A, 0x4E, 0x77, 0x63, 0x02, 0xB4, 0x4E, 0xB4, 0x42, 0x65, 0x1D, 0x68, 0x98, 0x37, 0x7A, 0x27, 0x87, 0x31, 0xBE, 0x48, 0xFA, 0x4E, 0xD3, 0x85, 0xA6, 0xD6, 0xD2, 0x2D, 0xCD, 0x10, 0xC9, 0x13, 0x59, 0x12, 0x48, 0x14, 0x67, 0x3E, 0x40, 0xD3, 0xF8, 0x60, 0xA0, 0xBD, 0x77, 0x31, 0x76, 0x78, 0x85, 0x55, 0x53, 0x16, 0xF1, 0xB9, 0xFF, 0x7F, 0x3D, 0x9A, 0xF1, 0x33, 0x1E, 0x67, 0x8F, 0x6B, 0x4A, 0x7A, 0x79, 0x54, 0x8B, 0x43, 0xB5, 0xC2, 0xAF, 0xB8, 0x75, 0x11, 0xDE, 0x4D, 0x34, 0x6A, 0xD6, 0x5A, 0x3B, 0x48, 0x1F, 0x41, 0x9D, 0xF4, 0x58, 0x90, 0x67, 0xA8, 0x71, 0xD4, 0x09, 0x67, 0xF7, 0x55, 0xEF, 0xD3, 0x7C, 0x7D, 0x2F, 0x76, 0x84, 0x70, 0x6E, 0xAA, 0x75, 0x7D, 0xA9, 0x95, 0x42, 0xEF, 0x28, 0x29, 0x48, 0xCD, 0x79, 0xA8, 0x16, 0xB6, 0xB5 +}; + +static const unsigned char app_7_prod_acexsig[0x100] = +{ + 0x06, 0xDD, 0x68, 0x17, 0xAA, 0x40, 0x3A, 0x75, 0xD2, 0xCF, 0xA2, 0x5A, 0xC8, 0x1B, 0x74, 0x9D, 0x91, 0xCD, 0x38, 0x4E, 0xCA, 0x19, 0x60, 0x8E, 0x39, 0x71, 0x6C, 0xB9, 0xF9, 0x9F, 0x68, 0x44, 0xCF, 0x33, 0x94, 0x54, 0x72, 0xCC, 0xC6, 0x33, 0x96, 0x9F, 0x12, 0x07, 0xE9, 0x38, 0x87, 0x70, 0x11, 0x51, 0xFD, 0xBF, 0xD9, 0x2D, 0xFA, 0x3F, 0x70, 0x42, 0x75, 0x39, 0xE3, 0x97, 0x85, 0xAF, 0x7B, 0xC5, 0x87, 0x9B, 0x0B, 0xF9, 0xE4, 0x1C, 0xC5, 0x6B, 0x44, 0x2A, 0x10, 0x14, 0x86, 0xAA, 0xFE, 0x9E, 0x5B, 0x1D, 0x15, 0xBA, 0x8C, 0x34, 0xA2, 0xAF, 0x14, 0xD0, 0xD4, 0x0E, 0x7B, 0x3A, 0xD5, 0x3C, 0x53, 0xDB, 0x7C, 0xBE, 0x44, 0x58, 0x79, 0x42, 0x23, 0x3A, 0x77, 0xA3, 0x2C, 0xB9, 0xEB, 0x62, 0x19, 0x94, 0x2B, 0xA0, 0x67, 0x94, 0xC6, 0xB2, 0x90, 0xC6, 0x61, 0xFD, 0x43, 0xEC, 0xEA, 0x27, 0x7E, 0xA6, 0xB1, 0xED, 0xA9, 0x67, 0xED, 0x56, 0x91, 0x90, 0xF9, 0x32, 0x4E, 0xC3, 0x29, 0x5A, 0x84, 0x4C, 0xAB, 0x99, 0x75, 0x40, 0x8E, 0x19, 0xD9, 0x12, 0xD1, 0x06, 0x2D, 0xD0, 0x2C, 0xD9, 0x6C, 0x41, 0x35, 0x64, 0xDB, 0x80, 0x63, 0xB2, 0x01, 0xF8, 0x29, 0xAB, 0xF5, 0x70, 0x79, 0x4E, 0x0F, 0xFA, 0x23, 0x20, 0x2E, 0x04, 0x75, 0x48, 0x15, 0x9B, 0x71, 0xD5, 0x85, 0x09, 0x67, 0x7D, 0xAC, 0x6A, 0xFA, 0xC0, 0x16, 0xAF, 0x58, 0x26, 0xCD, 0x6F, 0x1F, 0xB8, 0xF5, 0x8D, 0xD1, 0x7D, 0x3D, 0x70, 0x2F, 0x08, 0xB8, 0x23, 0x61, 0x24, 0xAE, 0x94, 0x31, 0xA3, 0xBD, 0x1E, 0x18, 0xD7, 0x82, 0x92, 0xDD, 0x11, 0x79, 0x7D, 0x1F, 0xEC, 0x03, 0x08, 0x82, 0xCC, 0x52, 0x62, 0xC9, 0x27, 0x2D, 0x08, 0xD5, 0x6B, 0x4E, 0x86, 0x2E, 0x3F, 0x50, 0x5C, 0xA3, 0xC1, 0xDF, 0xF5 +}; +#endif \ No newline at end of file diff --git a/keys_debug.h b/dpki.h similarity index 82% rename from keys_debug.h rename to dpki.h index ee5ba02..337b0db 100644 --- a/keys_debug.h +++ b/dpki.h @@ -1,47 +1,31 @@ -#ifndef _KEYS_DEBUG_H_ -#define _KEYS_DEBUG_H_ +#ifndef _DPKI_H_ +#define _DPKI_H_ -static const unsigned char system_fixed_aesKey[16] = //system_fixed_aesKey +#ifdef PKI_LEGACY +#include "dpki_legacy.h" +#endif + +// AES KEYS +static const unsigned char ctr_unfixed_ncch_keyX_dpki[2][16] = // Dummy { - 0x52, 0x7C, 0xE6, 0x30, 0xA9, 0xCA, 0x30, 0x5F, - 0x36, 0x96, 0xF3, 0xCD, 0xE9, 0x54, 0x19, 0x4B + {0x82, 0xAD, 0xED, 0xC7, 0xBA, 0x0A, 0x3F, 0x3D, 0x5F, 0xDD, 0x30, 0x0F, 0x0E, 0x9B, 0xE1, 0x5B} , // Normal + {0xE5, 0x70, 0x6F, 0x65, 0x6A, 0xF4, 0xD9, 0x3F, 0x1E, 0x2F, 0x29, 0x3F, 0x16, 0x15, 0x4E, 0xD8} , // 7.X new Crypto }; -static const unsigned char ctr_aes_common_key_dev0[16] = //ctr_aes_common_key_dev0 +static const unsigned char ctr_fixed_ncch_key_dpki[2][16] = { - 0x55, 0xA3, 0xF8, 0x72, 0xBD, 0xC8, 0x0C, 0x55, - 0x5A, 0x65, 0x43, 0x81, 0x13, 0x9E, 0x15, 0x3B + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} , // NormalFixedKey + {0x52, 0x7C, 0xE6, 0x30, 0xA9, 0xCA, 0x30, 0x5F, 0x36, 0x96, 0xF3, 0xCD, 0xE9, 0x54, 0x19, 0x4B} , // systemFixedKey }; -static const unsigned char ctr_aes_common_key_dev1[16] = //ctr_aes_common_key_dev1 +static const unsigned char ctr_common_etd_key_dpki[2][16] = { - 0x44, 0x34, 0xED, 0x14, 0x82, 0x0C, 0xA1, 0xEB, - 0xAB, 0x82, 0xC1, 0x6E, 0x7B, 0xEF, 0x0C, 0x25 -}; - -static const unsigned char common_dpki_aesKey[16] = //common_dpki_aesKey a.k.a. DSi DevCommonKey -{ - 0xA1, 0x60, 0x4A, 0x6A, 0x71, 0x23, 0xB5, 0x29, - 0xAE, 0x8B, 0xEC, 0x32, 0xC8, 0x16, 0xFC, 0xAA -}; - -//ECC Keys - -static const unsigned char xs_dpki_eccPubKey[60] = //xs_dpki_eccPubKey -{ - 0x01, 0xD5, 0xA2, 0x3C, 0xE8, 0xE9, 0xDF, 0x8C, - 0x0A, 0xA5, 0xAA, 0xE1, 0x76, 0xE1, 0x24, 0x7C, - 0x90, 0x97, 0xA6, 0xFE, 0x2A, 0xD3, 0x8C, 0xB4, - 0xDE, 0x74, 0x32, 0xDE, 0x5B, 0x84, 0x01, 0xAC, - 0xB2, 0x13, 0x71, 0x9D, 0x4B, 0x9C, 0xEB, 0xD4, - 0x13, 0xC2, 0x27, 0x66, 0xC5, 0x5F, 0x83, 0x97, - 0xC4, 0x83, 0xA3, 0x9E, 0x3B, 0xFC, 0xE8, 0xA9, - 0xB5, 0x10, 0x3A, 0x7B + {0x55, 0xA3, 0xF8, 0x72, 0xBD, 0xC8, 0x0C, 0x55, 0x5A, 0x65, 0x43, 0x81, 0x13, 0x9E, 0x15, 0x3B} , // 0 - eShop Titles + {0x44, 0x34, 0xED, 0x14, 0x82, 0x0C, 0xA1, 0xEB, 0xAB, 0x82, 0xC1, 0x6E, 0x7B, 0xEF, 0x0C, 0x25} , // 1 - System Titles }; //RSA Keys - -static const unsigned char dev_cert_root_rsa_pubk[0x200] = +static const unsigned char root_dpki_rsa_pub[0x200] = { 0xD0, 0x1F, 0xE1, 0x00, 0xD4, 0x35, 0x56, 0xB2, 0x4B, 0x56, 0xDA, 0xE9, 0x71, 0xB5, 0xA5, 0xD3, @@ -109,7 +93,7 @@ static const unsigned char dev_cert_root_rsa_pubk[0x200] = 0x65, 0x9A, 0xC7, 0x39, 0x5A, 0xB4, 0xF3, 0x29 }; -static const unsigned char cpA_dpki_rsa_privExp[256] = //cpA_dpki_rsa_privExp +static const unsigned char cpA_dpki_rsa_priv[0x100] = { 0x28, 0xCE, 0xDC, 0x39, 0x02, 0x7F, 0x3E, 0x8E, 0xAA, 0xB7, 0x59, 0x11, 0xE0, 0x68, 0xBF, 0x80, @@ -145,7 +129,7 @@ static const unsigned char cpA_dpki_rsa_privExp[256] = //cpA_dpki_rsa_privExp 0x1F, 0x82, 0xB8, 0x91, 0x71, 0x11, 0xB2, 0xC1 }; -static const unsigned char cpA_dpki_rsa_pubMod[256] = //cpA_dpki_rsa_pubMod +static const unsigned char cpA_dpki_rsa_pub[0x100] = { 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, @@ -181,7 +165,7 @@ static const unsigned char cpA_dpki_rsa_pubMod[256] = //cpA_dpki_rsa_pubMod 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77 }; -static const unsigned char xs9_dpki_rsa_privExp[256] = //xs9_dpki_rsa_privExp +static const unsigned char xs9_dpki_rsa_priv[0x100] = { 0x74, 0xCB, 0xCF, 0x1E, 0xD0, 0x2D, 0xD4, 0xF9, 0xE0, 0x05, 0xCE, 0x9C, 0x66, 0x3D, 0xE3, 0x62, @@ -217,7 +201,7 @@ static const unsigned char xs9_dpki_rsa_privExp[256] = //xs9_dpki_rsa_privExp 0x89, 0xC5, 0x7D, 0x89, 0xDE, 0x2B, 0x4E, 0x01 }; -static const unsigned char xs9_dpki_rsa_pubMod[256] = //xs9_dpki_rsa_pubMod +static const unsigned char xs9_dpki_rsa_pub[0x100] = { 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, @@ -253,7 +237,7 @@ static const unsigned char xs9_dpki_rsa_pubMod[256] = //xs9_dpki_rsa_pubMod 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F }; -static const unsigned char DevNcsdCfa_privExp[256] = //DevNcsdCfa_privExp +static const unsigned char dev_ncsd_cfa_priv[0x100] = { 0x32, 0x36, 0x43, 0xC2, 0xB3, 0x1A, 0x7E, 0x13, 0xAB, 0xA2, 0xB6, 0x8B, 0x4F, 0x05, 0xA7, 0xA6, @@ -289,7 +273,7 @@ static const unsigned char DevNcsdCfa_privExp[256] = //DevNcsdCfa_privExp 0xE8, 0xD9, 0x2C, 0x2A, 0x21, 0x69, 0xE4, 0xC1 }; -static const unsigned char DevNcsdCfa_pubMod[256] = //DevNcsdCfa_pubMod +static const unsigned char dev_ncsd_cfa_pub[0x100] = { 0xB9, 0x0C, 0xC4, 0xC6, 0x78, 0xF8, 0x6E, 0x30, 0x05, 0x28, 0xC1, 0xCB, 0xD2, 0xCF, 0xA7, 0x80, @@ -325,7 +309,7 @@ static const unsigned char DevNcsdCfa_pubMod[256] = //DevNcsdCfa_pubMod 0x3C, 0x38, 0x24, 0xBE, 0xF5, 0x8A, 0xB5, 0xF5 }; -static const unsigned char AccessDesc_privExp[256] = //AccessDesc_privExp +static const unsigned char dev_acex_priv[0x100] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -361,7 +345,7 @@ static const unsigned char AccessDesc_privExp[256] = //AccessDesc_privExp 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const unsigned char AccessDesc_pubMod[256] = //AccessDesc_pubMod +static const unsigned char dev_acex_pub[0x100] = { 0xF4, 0x3C, 0x45, 0x82, 0xFB, 0xF8, 0x90, 0x5D, 0x07, 0x02, 0x9F, 0x2A, 0x98, 0x8B, 0x63, 0xB7, @@ -397,7 +381,79 @@ static const unsigned char AccessDesc_pubMod[256] = //AccessDesc_pubMod 0x29, 0x78, 0xBF, 0x2A, 0x3C, 0x3B, 0xB6, 0xB1 }; -static const unsigned char CrrDevKey_privExp[256] = //CrrDevKey_privExp +static const unsigned char dev_crr_cert_pub[0x100] = +{ + 0xC5, 0xF7, 0x09, 0x80, 0x5F, 0xDA, 0xDC, 0xBD, + 0x46, 0x07, 0x52, 0xAA, 0x6D, 0xCD, 0x72, 0xB2, + 0x50, 0x09, 0x77, 0x47, 0x8A, 0x4F, 0x09, 0x2A, + 0xE2, 0x91, 0xB4, 0x5F, 0x04, 0x97, 0x51, 0x75, + 0xC9, 0x19, 0x6F, 0x95, 0xBB, 0x23, 0x14, 0x7D, + 0x34, 0xDF, 0x77, 0x78, 0x07, 0xE8, 0xD1, 0x10, + 0x11, 0xAF, 0xCE, 0x02, 0xB8, 0x73, 0xA9, 0xFB, + 0x64, 0xB7, 0x65, 0x87, 0xE5, 0x67, 0xDD, 0x67, + 0x37, 0x75, 0xFD, 0x0F, 0xE2, 0x97, 0xBC, 0x79, + 0xA8, 0xCC, 0xF9, 0xFA, 0x18, 0xB2, 0x62, 0x4D, + 0xF7, 0x53, 0x6B, 0x9C, 0x0E, 0x1A, 0xAB, 0x90, + 0xE6, 0x52, 0x86, 0xC8, 0x1C, 0x92, 0x2C, 0x61, + 0x53, 0xA9, 0x01, 0xDA, 0x43, 0x93, 0xD0, 0x42, + 0x2E, 0xDD, 0xD5, 0x4C, 0x8C, 0x4C, 0xE8, 0x91, + 0x56, 0xEC, 0xEE, 0x12, 0x70, 0x0B, 0x64, 0xF0, + 0x0A, 0xD6, 0xAF, 0xF8, 0x60, 0xC2, 0xA8, 0x26, + 0x7A, 0xC8, 0xBA, 0x55, 0x9A, 0xA1, 0x44, 0xFD, + 0x09, 0x47, 0x26, 0xA0, 0xC1, 0x99, 0x9E, 0xF1, + 0x24, 0xDF, 0xA3, 0xC2, 0xBB, 0xFF, 0x07, 0x45, + 0xD9, 0xD6, 0xA4, 0xC0, 0xFF, 0x6C, 0x6C, 0x78, + 0x7B, 0x6D, 0x70, 0x8C, 0x74, 0x44, 0xB0, 0x95, + 0xE6, 0xC6, 0x66, 0x5E, 0x7E, 0xBE, 0x71, 0xC5, + 0x91, 0x34, 0x73, 0xA7, 0xD4, 0x4C, 0x0D, 0xFC, + 0xA9, 0x21, 0x49, 0x94, 0x92, 0xA1, 0x6A, 0x4D, + 0x30, 0xA3, 0xD6, 0x9F, 0x6C, 0x60, 0x40, 0x0C, + 0xEE, 0xEB, 0xF8, 0x99, 0x22, 0xE1, 0x6F, 0xFC, + 0x3C, 0x96, 0x23, 0xAA, 0x11, 0x34, 0x00, 0x4E, + 0xFC, 0x2D, 0x60, 0x41, 0x45, 0xE3, 0x5D, 0x78, + 0x06, 0xB1, 0xF1, 0xC3, 0x07, 0xB9, 0xD3, 0x47, + 0xD0, 0xF1, 0x8C, 0x26, 0x33, 0x1F, 0x6B, 0x46, + 0xDD, 0xF3, 0xE3, 0x84, 0x64, 0xA7, 0xF1, 0x53, + 0x11, 0xE1, 0x53, 0x4E, 0x99, 0xDB, 0xAC, 0x53 +}; + +static const unsigned char dev_crr_cert[0x100] = +{ + 0x96, 0x5C, 0xBE, 0x5E, 0xEF, 0x08, 0x0B, 0x29, + 0xEF, 0x95, 0x12, 0xA4, 0x80, 0x36, 0x47, 0xD5, + 0x8F, 0xEC, 0xD0, 0xCB, 0x00, 0x4C, 0x29, 0xDC, + 0x5E, 0x87, 0xCF, 0x87, 0x66, 0x4B, 0x94, 0xDE, + 0xF0, 0xF6, 0x95, 0x19, 0x13, 0xF4, 0x29, 0xC7, + 0x89, 0x55, 0x91, 0x2E, 0x3B, 0x17, 0x1C, 0x86, + 0x61, 0x03, 0x03, 0xDC, 0x6A, 0x3E, 0x33, 0xD4, + 0x7A, 0xEA, 0xF9, 0x14, 0x82, 0x50, 0xF9, 0x3F, + 0xAD, 0xCF, 0x9F, 0xB8, 0xE0, 0xAD, 0xF6, 0x40, + 0x0F, 0xE6, 0x41, 0x7D, 0x18, 0xB4, 0xC2, 0x1A, + 0x1F, 0xA6, 0x2F, 0x51, 0x40, 0x5F, 0x0A, 0x4B, + 0x57, 0x4B, 0x73, 0xC2, 0x6A, 0xB9, 0x73, 0x18, + 0x5A, 0x9E, 0xC3, 0x90, 0x7D, 0xCC, 0x5B, 0xEC, + 0x46, 0x6D, 0x93, 0x09, 0xB6, 0xF0, 0x84, 0x64, + 0x46, 0x12, 0x77, 0x7C, 0x87, 0x25, 0xEB, 0x4C, + 0xAE, 0x83, 0xB8, 0x25, 0x6E, 0xF7, 0x7D, 0x45, + 0xDF, 0xF6, 0x4A, 0x32, 0x9B, 0x8E, 0x32, 0xC6, + 0xCF, 0x63, 0x37, 0x92, 0x7D, 0x01, 0xDD, 0xE9, + 0x71, 0x37, 0x0C, 0x2E, 0xB7, 0x83, 0xB7, 0x7C, + 0x43, 0x37, 0x20, 0x34, 0xF1, 0xAF, 0x78, 0x4A, + 0xB0, 0x84, 0xE0, 0x4C, 0x67, 0x54, 0xA8, 0x75, + 0x12, 0xE5, 0x27, 0x38, 0x45, 0xFF, 0x49, 0x9D, + 0xF3, 0xFC, 0x3F, 0xCE, 0x73, 0x44, 0xE3, 0x28, + 0xD0, 0xD6, 0x00, 0x1F, 0x46, 0xF9, 0x64, 0x3B, + 0xDC, 0xEE, 0x30, 0xA8, 0x63, 0x05, 0xB0, 0xF1, + 0xA6, 0x4B, 0x21, 0x34, 0x2A, 0xEE, 0xBA, 0x1C, + 0x89, 0x0B, 0x80, 0xB8, 0x00, 0xC7, 0x40, 0xCB, + 0x66, 0x69, 0x44, 0x27, 0x01, 0xAC, 0x08, 0xC3, + 0x97, 0xC5, 0x37, 0xE4, 0x8B, 0xAA, 0x41, 0xB1, + 0xEE, 0x48, 0xE0, 0xA7, 0xD6, 0x6F, 0x8A, 0xF5, + 0x40, 0x90, 0xD4, 0x2D, 0x81, 0xD4, 0xED, 0x9D, + 0xCA, 0x03, 0xFE, 0x35, 0xB3, 0x66, 0xAF, 0x82 +}; + +static const unsigned char dev_crr_priv[0x100] = { 0x8D, 0x27, 0x29, 0x6B, 0xC7, 0xA7, 0xED, 0xCD, 0x94, 0x2D, 0x36, 0x5E, 0x86, 0xA8, 0x26, 0xE7, @@ -433,7 +489,7 @@ static const unsigned char CrrDevKey_privExp[256] = //CrrDevKey_privExp 0xF7, 0x01, 0x65, 0xF6, 0x2D, 0x36, 0x6E, 0x71 }; -static const unsigned char CrrDevKey_pubMod[256] = //CrrDevKey_pubMod +static const unsigned char dev_crr_pub[0x100] = { 0xE2, 0xAD, 0xA6, 0xEA, 0xCA, 0xA3, 0xE8, 0xCC, 0xA9, 0x70, 0x1D, 0x2E, 0x23, 0x4B, 0xC6, 0x55, @@ -469,6 +525,42 @@ static const unsigned char CrrDevKey_pubMod[256] = //CrrDevKey_pubMod 0xDA, 0x65, 0xE7, 0x6E, 0xEF, 0x2E, 0xF5, 0x67 }; +static const unsigned char dev_firm_pub[0x100] = +{ + 0xC1, 0x1E, 0x84, 0xE4, 0xDA, 0xD7, 0xED, 0xC8, + 0xA5, 0xD9, 0xCB, 0x0B, 0xE9, 0x3B, 0x9D, 0xBC, + 0x15, 0x69, 0xF7, 0x95, 0xF6, 0x8F, 0xB7, 0x91, + 0x24, 0x19, 0xBE, 0x8F, 0xFE, 0xBB, 0xC1, 0x1D, + 0x09, 0xF0, 0xE3, 0x78, 0xA2, 0x0C, 0xC0, 0x0B, + 0x8E, 0xCD, 0xBA, 0x0E, 0x69, 0x4C, 0x61, 0x4A, + 0xBD, 0x13, 0xEA, 0xE2, 0x23, 0xE4, 0x0B, 0x62, + 0x1F, 0x9B, 0x63, 0x1B, 0x31, 0x34, 0xB7, 0x12, + 0x73, 0x64, 0x6B, 0x4E, 0x60, 0x41, 0x0A, 0x3D, + 0x54, 0x86, 0xFA, 0x49, 0xEC, 0x2D, 0x77, 0xAD, + 0x1D, 0xBC, 0x48, 0xE7, 0xFB, 0x07, 0xEF, 0x48, + 0xC3, 0xBE, 0xC3, 0xD6, 0xE1, 0x5B, 0x3D, 0xCD, + 0x5E, 0x6B, 0x46, 0x08, 0x6A, 0x3A, 0x0E, 0xAE, + 0x25, 0x49, 0x44, 0xA5, 0x40, 0x0D, 0x94, 0x53, + 0x18, 0xA4, 0x8F, 0x57, 0x8E, 0xF4, 0xCD, 0xB4, + 0xD3, 0x4E, 0xE7, 0x15, 0x9B, 0x11, 0x95, 0x85, + 0x00, 0xC4, 0x92, 0x94, 0xB8, 0xBE, 0xFE, 0xCB, + 0xB7, 0x50, 0xA0, 0xBE, 0x8A, 0xF5, 0xFD, 0xC8, + 0x0E, 0x4B, 0xA9, 0x41, 0x13, 0x62, 0x48, 0xCD, + 0x1A, 0xF3, 0xC8, 0x6B, 0xA5, 0xA0, 0xDF, 0xF1, + 0x9D, 0x3D, 0xFD, 0xE4, 0xD1, 0x7C, 0x1F, 0x00, + 0x0D, 0x99, 0x72, 0x6B, 0xA3, 0x05, 0x7F, 0x86, + 0x38, 0xBE, 0x4D, 0x5E, 0xAB, 0x93, 0xDF, 0xF3, + 0xEE, 0xA1, 0x9F, 0x22, 0x50, 0xA8, 0x7F, 0x31, + 0xAA, 0x2B, 0x03, 0x71, 0x9B, 0x14, 0xC4, 0x30, + 0x88, 0x42, 0x6F, 0xD5, 0x2C, 0x7B, 0x03, 0x64, + 0x3B, 0x14, 0xEC, 0x46, 0x33, 0xCC, 0x2C, 0x95, + 0x9F, 0x5C, 0x7B, 0x83, 0xC5, 0x67, 0xDD, 0x7C, + 0xA1, 0x2D, 0xD6, 0xEC, 0x17, 0x0B, 0x23, 0xC7, + 0xB1, 0x9A, 0x72, 0xBA, 0x78, 0xCB, 0x39, 0x68, + 0x5C, 0xB6, 0xB4, 0x61, 0xE1, 0x98, 0xCF, 0x1D, + 0x69, 0xF9, 0xD7, 0xB0, 0xA0, 0x5E, 0x9C, 0xEB +}; + //Certificates static const unsigned char ca4_dpki_cert[0x400] = { diff --git a/dpki_legacy.h b/dpki_legacy.h new file mode 100644 index 0000000..a91e54f --- /dev/null +++ b/dpki_legacy.h @@ -0,0 +1,201 @@ +#ifndef _DPKI_LEGACY_H_ +#define _DPKI_LEGACY_H_ + +// AES Keys +static const unsigned char rvl_twl_common_etd_key_dpki[1][16] = +{ + {0xA1, 0x60, 0x4A, 0x6A, 0x71, 0x23, 0xB5, 0x29, 0xAE, 0x8B, 0xEC, 0x32, 0xC8, 0x16, 0xFC, 0xAA} , // 0 +}; + +// ECC Keys +static const unsigned char xs_dpki_eccPubKey[60] = +{ + 0x01, 0xD5, 0xA2, 0x3C, 0xE8, 0xE9, 0xDF, 0x8C, + 0x0A, 0xA5, 0xAA, 0xE1, 0x76, 0xE1, 0x24, 0x7C, + 0x90, 0x97, 0xA6, 0xFE, 0x2A, 0xD3, 0x8C, 0xB4, + 0xDE, 0x74, 0x32, 0xDE, 0x5B, 0x84, 0x01, 0xAC, + 0xB2, 0x13, 0x71, 0x9D, 0x4B, 0x9C, 0xEB, 0xD4, + 0x13, 0xC2, 0x27, 0x66, 0xC5, 0x5F, 0x83, 0x97, + 0xC4, 0x83, 0xA3, 0x9E, 0x3B, 0xFC, 0xE8, 0xA9, + 0xB5, 0x10, 0x3A, 0x7B +}; + +// RSA Keys +// CA2 PKI +static const unsigned char cp7_dpki_rsa_priv[256] = +{ + 0x32, 0xB5, 0xC3, 0x23, 0x67, 0x7B, 0x04, 0xF2, + 0xBB, 0x00, 0x9F, 0xBC, 0x37, 0x4D, 0x9D, 0x2F, + 0x71, 0xDB, 0x8C, 0xC7, 0x06, 0xB4, 0xEF, 0x0E, + 0x43, 0x4E, 0xDC, 0xDD, 0x77, 0xC0, 0x16, 0xD8, + 0x16, 0x10, 0xE3, 0x5F, 0x0E, 0x68, 0x0D, 0x08, + 0xAF, 0x0E, 0x8E, 0xFB, 0x53, 0xDD, 0xAB, 0xE0, + 0x9C, 0x75, 0x9E, 0xFC, 0xB8, 0x6C, 0x8E, 0x62, + 0xBB, 0x6E, 0x6B, 0x99, 0x63, 0xD8, 0x76, 0xB1, + 0x98, 0x05, 0xCA, 0xC4, 0x92, 0xBE, 0x2F, 0x5A, + 0x76, 0xE8, 0xCA, 0xF4, 0xAC, 0xA2, 0xB0, 0x32, + 0x8A, 0xB7, 0xBB, 0xEB, 0xB3, 0xF1, 0xC2, 0xB1, + 0x80, 0x9D, 0x17, 0xBA, 0x4F, 0xF6, 0x5B, 0x23, + 0xF6, 0x5D, 0xAD, 0x43, 0xA6, 0xF1, 0xE4, 0x47, + 0x7C, 0x4F, 0x93, 0x2E, 0x04, 0x75, 0xEE, 0x2E, + 0x09, 0x6E, 0xCA, 0x17, 0x0E, 0x58, 0x4C, 0x99, + 0x7C, 0x45, 0x07, 0xD8, 0x70, 0x91, 0xDE, 0x89, + 0x13, 0xB9, 0xBA, 0x47, 0x33, 0x4F, 0x4F, 0x79, + 0x58, 0x16, 0x3F, 0x86, 0x11, 0x35, 0x91, 0x48, + 0x9B, 0xA7, 0xF7, 0x77, 0xB0, 0xF0, 0x48, 0xE4, + 0x11, 0x41, 0xF4, 0x25, 0x7D, 0xE5, 0xAC, 0x71, + 0x6F, 0xCD, 0x9B, 0x6E, 0xD2, 0x30, 0xFF, 0x1D, + 0x38, 0xE9, 0x2F, 0xE0, 0xD9, 0xA9, 0x89, 0x68, + 0xB6, 0xAC, 0x45, 0xC8, 0x3B, 0x9F, 0x49, 0x30, + 0x93, 0x3B, 0x69, 0x6B, 0xBE, 0x20, 0x68, 0x4B, + 0x87, 0x1F, 0x7C, 0xEA, 0xBC, 0xC2, 0x77, 0xED, + 0xCC, 0x36, 0xCD, 0xA0, 0xC6, 0xAD, 0x46, 0xF2, + 0xFD, 0x2D, 0xB9, 0x55, 0x2F, 0x81, 0xD5, 0xA7, + 0xDF, 0x4E, 0x5B, 0xE3, 0xEA, 0x92, 0xB4, 0xBF, + 0x22, 0xAA, 0x05, 0xA2, 0x86, 0x7B, 0x1A, 0x06, + 0xFB, 0x58, 0x00, 0x64, 0xC0, 0xE0, 0xF8, 0x9E, + 0x1B, 0x1C, 0x3C, 0x23, 0x20, 0xA4, 0x03, 0xEC, + 0x27, 0x7A, 0x9D, 0x8B, 0xD2, 0x71, 0xAB, 0xFD +}; + +static const unsigned char cp7_dpki_rsa_pub[256] = +{ + 0xC3, 0xD9, 0xA5, 0xF3, 0xC2, 0x5D, 0x16, 0xD2, + 0x64, 0xAD, 0x2C, 0x0C, 0xB7, 0xE6, 0x5C, 0x50, + 0x6D, 0x07, 0x63, 0x05, 0x32, 0x6E, 0xD9, 0xCD, + 0xEB, 0x3A, 0x5F, 0x23, 0xB0, 0x3F, 0x38, 0x80, + 0x3F, 0x60, 0x96, 0xDC, 0xCC, 0xDB, 0xE3, 0xD4, + 0x6E, 0x9A, 0x00, 0x7B, 0x25, 0xBE, 0xF9, 0x59, + 0xE7, 0x90, 0x4A, 0xDD, 0x10, 0xF6, 0x12, 0x00, + 0x99, 0xC6, 0xFD, 0x3C, 0x80, 0xBE, 0x9B, 0xDF, + 0x74, 0x5A, 0x04, 0x59, 0xB2, 0x2A, 0x7C, 0x0C, + 0xB4, 0xE7, 0x73, 0xD7, 0x04, 0xF4, 0x2B, 0x77, + 0x9A, 0x69, 0xAC, 0x9F, 0xDA, 0x4E, 0x65, 0xF1, + 0x3C, 0x30, 0x38, 0x98, 0x4E, 0x94, 0x67, 0xE3, + 0xA9, 0x11, 0x2D, 0x81, 0x5E, 0x53, 0xF5, 0x75, + 0xD9, 0x27, 0x52, 0x87, 0xFB, 0x98, 0x10, 0x98, + 0x2F, 0x62, 0x30, 0x93, 0x5E, 0xAF, 0xEB, 0xC0, + 0x3A, 0x64, 0x53, 0x6B, 0x60, 0x2E, 0x17, 0x22, + 0x25, 0x97, 0x5F, 0x64, 0x8B, 0x10, 0x67, 0xC0, + 0x14, 0x9C, 0xBE, 0x8F, 0x1E, 0x15, 0xF5, 0x73, + 0xA7, 0x50, 0x04, 0x7F, 0x34, 0xEB, 0x02, 0x03, + 0x32, 0x41, 0x75, 0x20, 0x4A, 0x40, 0x7C, 0x79, + 0xDD, 0xE4, 0x29, 0xD6, 0x60, 0x73, 0x2E, 0x02, + 0xD4, 0x79, 0x87, 0xF1, 0x33, 0x5A, 0xAA, 0x95, + 0xFB, 0x55, 0x0D, 0x29, 0x0D, 0xA2, 0xCF, 0xC6, + 0x04, 0xB7, 0x8A, 0x63, 0xCA, 0x64, 0x52, 0x87, + 0xAA, 0xEB, 0xE0, 0x7D, 0x6F, 0x6C, 0xDF, 0x0E, + 0x6F, 0xF1, 0xC4, 0xC2, 0x60, 0x6C, 0xC4, 0x77, + 0x29, 0x03, 0x1E, 0x6B, 0x9C, 0x3C, 0xA3, 0xED, + 0x2D, 0xB4, 0xF0, 0x58, 0x81, 0x50, 0xB2, 0x6E, + 0x66, 0xDB, 0x99, 0xAC, 0x44, 0x77, 0xA6, 0xFE, + 0x80, 0x6E, 0x08, 0xFA, 0xEA, 0xC5, 0x27, 0x92, + 0x71, 0xFF, 0xCF, 0x29, 0xB1, 0x13, 0xEB, 0x14, + 0x50, 0xD1, 0x81, 0xD8, 0xBF, 0x48, 0x05, 0xBD +}; + +static const unsigned char xs6_dpki_rsa_priv[256] = +{ + 0x53, 0x00, 0x39, 0x3F, 0x1F, 0xA6, 0x21, 0xFA, + 0x9E, 0xB9, 0x0C, 0x94, 0xF8, 0xF3, 0x48, 0x5E, + 0x73, 0xAC, 0xEC, 0xFD, 0x34, 0x74, 0x46, 0x30, + 0x01, 0xD5, 0xEF, 0x1D, 0x39, 0x88, 0xB2, 0x26, + 0x51, 0xC7, 0xD1, 0x12, 0xC2, 0xAA, 0xAE, 0x3B, + 0x10, 0x12, 0x48, 0x18, 0x54, 0x60, 0xEA, 0xC6, + 0x63, 0x8F, 0xAE, 0x8E, 0x5E, 0x62, 0xAE, 0x7F, + 0x6C, 0x8A, 0x61, 0xB2, 0x7F, 0x25, 0x0D, 0xB5, + 0x62, 0x15, 0xAF, 0x56, 0x71, 0xBF, 0xC6, 0x8C, + 0x53, 0x1D, 0x70, 0xD3, 0x36, 0xE6, 0x37, 0x12, + 0x26, 0x0C, 0x61, 0xB6, 0x11, 0x25, 0x2C, 0x7C, + 0x49, 0x2A, 0x2E, 0xAE, 0xBF, 0x01, 0xBA, 0x7F, + 0x82, 0x43, 0xDE, 0xD6, 0x62, 0x7C, 0x61, 0x47, + 0xB8, 0xAD, 0xA7, 0x64, 0xD5, 0xE5, 0xAF, 0x1D, + 0xE6, 0xA9, 0x0D, 0x83, 0x2D, 0x74, 0x00, 0xD5, + 0x86, 0x45, 0xEA, 0xCA, 0x31, 0xF1, 0x0B, 0xFB, + 0xCF, 0x92, 0xFF, 0xB9, 0x95, 0x18, 0xB4, 0xBA, + 0xAC, 0x49, 0x5B, 0x04, 0x45, 0x39, 0x6A, 0x3E, + 0xB9, 0x52, 0xA9, 0x47, 0x18, 0xA4, 0x60, 0x18, + 0x3D, 0xFD, 0xE2, 0x43, 0x5E, 0x64, 0x2C, 0x48, + 0xC4, 0x65, 0xC5, 0x75, 0x81, 0xB4, 0xC9, 0x12, + 0x64, 0x7E, 0x7E, 0x9E, 0x6E, 0x3D, 0xA2, 0x82, + 0x47, 0xBD, 0xAB, 0x40, 0x76, 0x5F, 0x39, 0x50, + 0x3C, 0x93, 0x3A, 0x0D, 0xD7, 0x00, 0x9B, 0xCA, + 0x50, 0x63, 0xDD, 0x1C, 0x86, 0x69, 0xE1, 0x9D, + 0xD1, 0xFF, 0x99, 0x03, 0x70, 0x82, 0xCF, 0xE2, + 0xBB, 0x70, 0x9E, 0x51, 0xFC, 0x9C, 0x53, 0x3F, + 0x3F, 0x45, 0xA7, 0x2F, 0x9D, 0xEC, 0x05, 0x0B, + 0xE7, 0x5D, 0x89, 0xD4, 0xC4, 0x2F, 0x50, 0xB6, + 0x91, 0xF5, 0x81, 0xA5, 0x83, 0xC7, 0x07, 0x9C, + 0x82, 0x64, 0x9C, 0xD7, 0x66, 0x4A, 0x1B, 0x4F, + 0x34, 0x7E, 0x3C, 0xFC, 0x6B, 0x73, 0x01, 0x51 +}; + +static const unsigned char xs6_dpki_rsa_pub[256] = +{ + 0xCB, 0xDA, 0x82, 0x8B, 0xB1, 0x9C, 0x9F, 0xCD, + 0x0B, 0x6E, 0xBE, 0x65, 0xE6, 0x85, 0x7B, 0x29, + 0x85, 0xB1, 0x56, 0x67, 0x16, 0xD8, 0xEB, 0xD1, + 0x42, 0x68, 0x50, 0x01, 0x01, 0x04, 0x24, 0x37, + 0x73, 0x87, 0x87, 0x9A, 0x92, 0x7D, 0xCD, 0x52, + 0xC2, 0x3A, 0xA3, 0x80, 0xB6, 0xE8, 0x50, 0x81, + 0x13, 0xE5, 0xEC, 0xDE, 0xDA, 0x5D, 0x38, 0xB3, + 0x3D, 0x9B, 0xFA, 0x4A, 0x61, 0x02, 0x00, 0xF1, + 0xC2, 0xC8, 0x68, 0x7F, 0x1B, 0xCE, 0x09, 0xDD, + 0x04, 0x95, 0x64, 0xBD, 0xA5, 0x9A, 0x22, 0x14, + 0x9E, 0x3E, 0xA0, 0x33, 0x73, 0x31, 0xD3, 0x93, + 0x60, 0x44, 0xB0, 0x9C, 0x65, 0x01, 0xF8, 0xB8, + 0x79, 0xE9, 0x5E, 0x8A, 0x16, 0x0D, 0xC6, 0x3F, + 0x1B, 0x7D, 0x5F, 0x3B, 0x7E, 0x64, 0xAA, 0xE1, + 0x51, 0x27, 0x38, 0x91, 0x29, 0xB4, 0xB1, 0x13, + 0xC1, 0x2C, 0xB7, 0x96, 0x5C, 0x48, 0xE4, 0x89, + 0xE8, 0x58, 0xA5, 0x34, 0x86, 0xFE, 0x21, 0x11, + 0x76, 0x6E, 0x01, 0x24, 0xCB, 0x5F, 0x83, 0x36, + 0x99, 0x87, 0x32, 0xCB, 0xAC, 0xF5, 0x6E, 0x46, + 0x4A, 0x6C, 0xD2, 0xCD, 0x65, 0x27, 0x2C, 0xD1, + 0x46, 0x30, 0x3F, 0x31, 0xAA, 0x39, 0x9A, 0x44, + 0xBE, 0x5E, 0x91, 0x93, 0x51, 0x82, 0xF8, 0x65, + 0xF3, 0x66, 0x5D, 0x06, 0x10, 0x7C, 0x9E, 0xE3, + 0x8D, 0x91, 0x03, 0xEE, 0x58, 0x54, 0x8B, 0x30, + 0x1A, 0x9E, 0x01, 0xDB, 0x37, 0x6B, 0x89, 0x3D, + 0xC4, 0xE6, 0xC7, 0x4E, 0xBE, 0xA2, 0x5A, 0xCF, + 0x0D, 0x28, 0xE7, 0xC7, 0xB3, 0x12, 0x99, 0x8D, + 0xE7, 0x71, 0x93, 0x9D, 0xD1, 0xE3, 0xD6, 0x6B, + 0xD4, 0x37, 0xC0, 0xD5, 0x7D, 0x8B, 0xEF, 0x33, + 0xE5, 0x27, 0xBA, 0x04, 0xCF, 0xD0, 0x62, 0x61, + 0x9C, 0xD0, 0x7E, 0x38, 0xC1, 0xC7, 0xE6, 0x70, + 0x49, 0x20, 0x71, 0x5C, 0xC6, 0x35, 0x76, 0x15 +}; + +// Certificates +// CA2 Chain +static const unsigned char ca2_dpki_cert[0x400] = +{ + 0x00, 0x01, 0x00, 0x00, 0x90, 0x56, 0xB5, 0x0C, 0x36, 0x30, 0xEB, 0xF9, 0xC8, 0x80, 0xD7, 0xB7, 0x74, 0x78, 0x04, 0x14, 0xB8, 0xA9, 0x35, 0x89, 0x5F, 0xD4, 0x87, 0xBB, 0xA0, 0x13, 0x52, 0xC2, 0x6F, 0x62, 0x99, 0x18, 0x3E, 0x68, 0xEB, 0xF0, 0xFF, 0x79, 0xD4, 0x2E, 0xF6, 0xB1, 0x8C, 0xB6, 0x30, 0x5D, 0xB3, 0x9B, 0x18, 0xA9, 0x12, 0x33, 0x1A, 0x5F, 0xA6, 0xAB, 0x3F, 0x50, 0xCB, 0xB8, 0xDD, 0xAB, 0x4F, 0x66, 0xC5, 0xA3, 0x58, 0x35, 0x8F, 0x4A, 0x48, 0x33, 0x4E, 0x3A, 0x86, 0x68, 0x6E, 0x66, 0x8C, 0x0C, 0xBE, 0x84, 0x47, 0xA1, 0x66, 0xCB, 0xCB, 0x4E, 0xFD, 0xF6, 0x25, 0x37, 0x30, 0x07, 0x6C, 0x2A, 0x78, 0x51, 0x56, 0x94, 0xCD, 0x4C, 0xF4, 0x91, 0x98, 0x9F, 0xA5, 0x09, 0x04, 0x41, 0x72, 0x50, 0x7A, 0x51, 0xEA, 0x8E, 0x71, 0xC6, 0x1A, 0x94, 0x33, 0xB0, 0x2A, 0x07, 0xA5, 0xF1, 0x26, 0x57, 0x42, 0x4D, 0x44, 0x75, 0x2A, 0xFE, 0x65, 0x56, 0x96, 0x36, 0x33, 0xC7, 0xC3, 0x97, 0x98, 0x2A, 0x71, 0xA4, 0x80, 0x7F, 0x09, 0x78, 0x9A, 0xEE, 0xFB, 0x2B, 0x07, 0x69, 0xCB, 0x1D, 0xA4, 0xE0, 0xCA, 0xA7, 0x0B, 0xB8, 0xF6, 0xFD, 0xCF, 0x46, 0xBD, 0x35, 0xC0, 0x8A, 0x00, 0x9C, 0x75, 0xAB, 0x9F, 0x52, 0x23, 0xC9, 0x5F, 0xF7, 0xDA, 0xAE, 0x2F, 0x53, 0xE8, 0xE1, 0xAF, 0x25, 0x0D, 0xAB, 0x1D, 0x1B, 0xB2, 0xD7, 0x6A, 0x4A, 0x33, 0x38, 0x69, 0x95, 0x38, 0xC6, 0xCD, 0xFE, 0xBC, 0x72, 0xD0, 0xC3, 0x69, 0xEC, 0x1F, 0x91, 0x9E, 0x81, 0xEE, 0x2B, 0x40, 0x90, 0x6C, 0xFD, 0xD3, 0x69, 0x97, 0xAB, 0x49, 0xD3, 0xA9, 0xD5, 0x91, 0xDD, 0xC8, 0x42, 0xA0, 0xE4, 0x89, 0x7B, 0xC8, 0x8B, 0xD0, 0x21, 0x67, 0x4F, 0x7E, 0xBC, 0xB2, 0x00, 0xA3, 0xC4, 0x21, 0xB3, 0x95, 0x7F, 0x65, 0x50, 0x9C, 0xD1, 0xC3, 0x2C, 0xB5, 0x5E, 0xEB, 0xB4, 0x62, 0x99, 0xB8, 0x27, 0xD6, 0x2E, 0x53, 0x63, 0x2C, 0xFF, 0x70, 0x07, 0xBF, 0xFB, 0x5D, 0xCF, 0x84, 0x15, 0xFD, 0x3F, 0xC3, 0xD8, 0x34, 0xE3, 0x6B, 0xF3, 0x1F, 0x59, 0x90, 0x9F, 0x2F, 0x66, 0xC6, 0xEA, 0xC1, 0xFD, 0xFB, 0x34, 0x20, 0xA8, 0xEC, 0x94, 0xDD, 0x25, 0xF1, 0x04, 0x10, 0xF3, 0x08, 0x33, 0xD8, 0xCB, 0x08, 0x70, 0x2E, 0x4A, 0x8D, 0x27, 0xCC, 0xA7, 0x5B, 0xCB, 0x5A, 0xC3, 0xEB, 0x30, 0x96, 0xEC, 0x64, 0xF8, 0xF5, 0x28, 0xDD, 0xFE, 0x51, 0xF6, 0x26, 0x9C, 0xF6, 0x9E, 0x8D, 0x79, 0x4F, 0x1A, 0xD0, 0x46, 0x04, 0x06, 0xFE, 0x79, 0xEC, 0x98, 0x00, 0x9C, 0x6A, 0x3E, 0xE7, 0xBD, 0x3D, 0x26, 0x30, 0x44, 0x06, 0x6B, 0xA1, 0xF4, 0x58, 0xB6, 0x13, 0x40, 0x13, 0x8B, 0x03, 0x32, 0xA3, 0x10, 0xB8, 0xD3, 0xC2, 0x3E, 0xAC, 0x22, 0xB0, 0xD6, 0x06, 0xA9, 0x8F, 0x51, 0x98, 0xD8, 0xCF, 0x3A, 0xC7, 0x63, 0x85, 0x04, 0xFF, 0x0A, 0x02, 0xD1, 0x37, 0xAF, 0x4A, 0x7B, 0xB8, 0x91, 0x46, 0x95, 0x25, 0xF3, 0x6C, 0xEB, 0xFD, 0xCB, 0x0C, 0xD7, 0xF2, 0xD5, 0xE7, 0x2E, 0xCE, 0xDC, 0x26, 0xFE, 0x5D, 0xB2, 0x0B, 0x71, 0xAB, 0x5B, 0x47, 0xD3, 0xA4, 0xC9, 0xEF, 0xEB, 0xF4, 0x2F, 0x48, 0x48, 0xAB, 0xF7, 0xF5, 0x63, 0x79, 0x97, 0x08, 0x8A, 0x4C, 0x75, 0x0D, 0xDE, 0x29, 0x0F, 0x18, 0x77, 0x8B, 0x2B, 0x8C, 0x3D, 0x60, 0x17, 0xEB, 0x2A, 0xDA, 0x37, 0x4E, 0x1D, 0x17, 0xEF, 0xF9, 0x98, 0xE8, 0xBF, 0xB2, 0x53, 0xDE, 0xE2, 0xF4, 0xB5, 0x63, 0x02, 0x62, 0x95, 0xEB, 0x89, 0x49, 0xB5, 0xB4, 0xD1, 0x03, 0xA2, 0xF5, 0x00, 0x11, 0x5F, 0x45, 0xA1, 0xD0, 0xF2, 0x3B, 0x92, 0xC0, 0x34, 0x06, 0xE4, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x64, 0x8F, 0x2B, 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char cp7_dpki_cert[0x300] = +{ + 0x00, 0x01, 0x00, 0x01, 0x5B, 0x02, 0xA6, 0x86, 0x5D, 0xE2, 0x37, 0x0B, 0xFB, 0x79, 0x36, 0x2F, 0xDE, 0x0E, 0x40, 0xB6, 0x03, 0x58, 0x1E, 0xD7, 0x94, 0xAA, 0x6A, 0x3E, 0xB3, 0xC3, 0x09, 0x43, 0xAA, 0x0B, 0xBD, 0xDE, 0x69, 0x40, 0xC0, 0x19, 0x29, 0x09, 0xB6, 0xE9, 0xA2, 0x16, 0x1A, 0x77, 0x65, 0x11, 0x72, 0x69, 0x0B, 0x4C, 0xBB, 0x74, 0x77, 0x46, 0xC2, 0x5E, 0x82, 0x7C, 0x80, 0x8B, 0x7F, 0x56, 0x1E, 0x51, 0x3A, 0xAB, 0x6A, 0x1B, 0xEB, 0xCE, 0x05, 0x8D, 0x2F, 0x47, 0x7D, 0x80, 0x27, 0xE8, 0x08, 0xEA, 0x9A, 0x00, 0x41, 0x5C, 0xA0, 0x32, 0xBB, 0x9F, 0x4C, 0xE8, 0x15, 0x94, 0x20, 0xF2, 0xE9, 0x08, 0xAB, 0x82, 0x50, 0xAE, 0x00, 0x56, 0x59, 0xE4, 0xE8, 0x27, 0x7C, 0x8F, 0xFB, 0x06, 0x19, 0x19, 0xDF, 0x61, 0x3E, 0x84, 0x29, 0x5B, 0x1D, 0x30, 0x76, 0xF5, 0x08, 0x98, 0x7D, 0x59, 0x8F, 0x6D, 0x94, 0x0D, 0x0F, 0x37, 0xF9, 0x2C, 0x3F, 0xAE, 0x6F, 0xB3, 0x5E, 0xCD, 0x3D, 0xE5, 0xF1, 0x86, 0x0D, 0xF1, 0xD1, 0x45, 0x9B, 0x98, 0xA3, 0x3A, 0x86, 0xDC, 0x4B, 0x0E, 0x1C, 0x68, 0xFB, 0x61, 0xF4, 0x70, 0xD5, 0x7C, 0x42, 0x35, 0x8E, 0x96, 0xB2, 0x88, 0x32, 0x9B, 0x52, 0x9B, 0xE9, 0xA5, 0x5B, 0x17, 0x0C, 0x8A, 0x94, 0x6B, 0xF6, 0x48, 0x45, 0x76, 0x51, 0xD3, 0x50, 0x76, 0xC3, 0x2D, 0xC4, 0x28, 0x75, 0x26, 0xB8, 0x52, 0xDB, 0x66, 0xE3, 0x78, 0xA2, 0x1C, 0x81, 0x16, 0xE4, 0x14, 0x08, 0xBA, 0xD8, 0x94, 0x18, 0xEA, 0x4D, 0x09, 0xA8, 0x88, 0x73, 0x67, 0x5E, 0xF4, 0x2C, 0x67, 0x38, 0x81, 0x59, 0x4B, 0x76, 0x2F, 0x66, 0x6F, 0x20, 0xBB, 0x01, 0x17, 0xB1, 0xFF, 0x13, 0x64, 0xE7, 0x14, 0x42, 0x79, 0x69, 0x15, 0x19, 0x50, 0x2D, 0x6D, 0x4E, 0x1E, 0x62, 0x6E, 0x78, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x68, 0x28, 0xDD, 0xC3, 0xD9, 0xA5, 0xF3, 0xC2, 0x5D, 0x16, 0xD2, 0x64, 0xAD, 0x2C, 0x0C, 0xB7, 0xE6, 0x5C, 0x50, 0x6D, 0x07, 0x63, 0x05, 0x32, 0x6E, 0xD9, 0xCD, 0xEB, 0x3A, 0x5F, 0x23, 0xB0, 0x3F, 0x38, 0x80, 0x3F, 0x60, 0x96, 0xDC, 0xCC, 0xDB, 0xE3, 0xD4, 0x6E, 0x9A, 0x00, 0x7B, 0x25, 0xBE, 0xF9, 0x59, 0xE7, 0x90, 0x4A, 0xDD, 0x10, 0xF6, 0x12, 0x00, 0x99, 0xC6, 0xFD, 0x3C, 0x80, 0xBE, 0x9B, 0xDF, 0x74, 0x5A, 0x04, 0x59, 0xB2, 0x2A, 0x7C, 0x0C, 0xB4, 0xE7, 0x73, 0xD7, 0x04, 0xF4, 0x2B, 0x77, 0x9A, 0x69, 0xAC, 0x9F, 0xDA, 0x4E, 0x65, 0xF1, 0x3C, 0x30, 0x38, 0x98, 0x4E, 0x94, 0x67, 0xE3, 0xA9, 0x11, 0x2D, 0x81, 0x5E, 0x53, 0xF5, 0x75, 0xD9, 0x27, 0x52, 0x87, 0xFB, 0x98, 0x10, 0x98, 0x2F, 0x62, 0x30, 0x93, 0x5E, 0xAF, 0xEB, 0xC0, 0x3A, 0x64, 0x53, 0x6B, 0x60, 0x2E, 0x17, 0x22, 0x25, 0x97, 0x5F, 0x64, 0x8B, 0x10, 0x67, 0xC0, 0x14, 0x9C, 0xBE, 0x8F, 0x1E, 0x15, 0xF5, 0x73, 0xA7, 0x50, 0x04, 0x7F, 0x34, 0xEB, 0x02, 0x03, 0x32, 0x41, 0x75, 0x20, 0x4A, 0x40, 0x7C, 0x79, 0xDD, 0xE4, 0x29, 0xD6, 0x60, 0x73, 0x2E, 0x02, 0xD4, 0x79, 0x87, 0xF1, 0x33, 0x5A, 0xAA, 0x95, 0xFB, 0x55, 0x0D, 0x29, 0x0D, 0xA2, 0xCF, 0xC6, 0x04, 0xB7, 0x8A, 0x63, 0xCA, 0x64, 0x52, 0x87, 0xAA, 0xEB, 0xE0, 0x7D, 0x6F, 0x6C, 0xDF, 0x0E, 0x6F, 0xF1, 0xC4, 0xC2, 0x60, 0x6C, 0xC4, 0x77, 0x29, 0x03, 0x1E, 0x6B, 0x9C, 0x3C, 0xA3, 0xED, 0x2D, 0xB4, 0xF0, 0x58, 0x81, 0x50, 0xB2, 0x6E, 0x66, 0xDB, 0x99, 0xAC, 0x44, 0x77, 0xA6, 0xFE, 0x80, 0x6E, 0x08, 0xFA, 0xEA, 0xC5, 0x27, 0x92, 0x71, 0xFF, 0xCF, 0x29, 0xB1, 0x13, 0xEB, 0x14, 0x50, 0xD1, 0x81, 0xD8, 0xBF, 0x48, 0x05, 0xBD, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char xs6_dpki_cert[0x300] = +{ + 0x00, 0x01, 0x00, 0x01, 0x87, 0xC6, 0xF8, 0x0F, 0xAE, 0xE2, 0xA8, 0x5A, 0x01, 0xA1, 0xE0, 0x4B, 0x04, 0x76, 0xC9, 0x04, 0x08, 0xE6, 0x93, 0xF5, 0x14, 0xEE, 0x46, 0x96, 0xBC, 0xFD, 0x06, 0x91, 0xE3, 0xE7, 0xF9, 0x67, 0x8F, 0x0B, 0x9B, 0x90, 0xAE, 0xCB, 0x99, 0x56, 0xA7, 0xBB, 0x1C, 0x9B, 0x1E, 0xE3, 0x96, 0x31, 0xC8, 0xD5, 0x5D, 0xAE, 0x20, 0x30, 0x48, 0xF2, 0xCC, 0xFF, 0xC5, 0xCA, 0xCA, 0x3E, 0xBE, 0xB0, 0xCC, 0x1E, 0x3A, 0x58, 0x26, 0xF5, 0x7E, 0xB3, 0x3E, 0x48, 0x44, 0x5D, 0xD6, 0xCA, 0x34, 0xCD, 0x1A, 0x1B, 0xE6, 0x70, 0x18, 0xA4, 0xD8, 0xCC, 0x85, 0x41, 0xCE, 0x3E, 0x0D, 0xBA, 0xAE, 0x1F, 0x68, 0x3C, 0x40, 0x87, 0xDF, 0x84, 0x65, 0xBA, 0x82, 0x2A, 0xF6, 0xBD, 0x37, 0xC6, 0x93, 0x92, 0xE3, 0x2F, 0xE2, 0xAD, 0xD0, 0x23, 0xF5, 0xF3, 0x72, 0x1A, 0x56, 0x76, 0xAE, 0x72, 0x47, 0x19, 0x43, 0x71, 0xFE, 0x87, 0x27, 0x27, 0xAB, 0x09, 0xE0, 0x64, 0x87, 0x4C, 0x1A, 0x9B, 0xF7, 0x0F, 0x5E, 0x4B, 0x6F, 0x6D, 0x8F, 0xE5, 0x24, 0xF4, 0xA8, 0x2C, 0x28, 0xAA, 0xFE, 0x80, 0x69, 0x68, 0xF4, 0x9F, 0xEE, 0x7E, 0x2E, 0xB9, 0xB8, 0xF9, 0x1E, 0x7B, 0xF8, 0xB3, 0xA9, 0xAA, 0x1D, 0x1E, 0xF2, 0xC1, 0xE3, 0xCB, 0x88, 0xB4, 0xBC, 0x47, 0x29, 0x86, 0xEB, 0xC2, 0x1D, 0x39, 0xF3, 0x91, 0x3E, 0xCD, 0x00, 0x19, 0x71, 0x41, 0xF2, 0xB5, 0x3A, 0x2F, 0x47, 0xD6, 0xB2, 0xFE, 0xBE, 0x0D, 0x77, 0xEB, 0xC4, 0x01, 0x35, 0x55, 0x8E, 0xA8, 0x86, 0xE3, 0x5F, 0x7B, 0xD9, 0x0B, 0x3F, 0x45, 0x0B, 0x19, 0xA4, 0x4D, 0xA4, 0x68, 0x28, 0x6F, 0xA1, 0x2D, 0x0A, 0xBB, 0xB7, 0x81, 0x64, 0x0A, 0x09, 0x5B, 0x01, 0x36, 0x87, 0xA3, 0xEA, 0x61, 0x15, 0xF4, 0xE5, 0x88, 0xEA, 0x95, 0x17, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x68, 0x28, 0x9D, 0xCB, 0xDA, 0x82, 0x8B, 0xB1, 0x9C, 0x9F, 0xCD, 0x0B, 0x6E, 0xBE, 0x65, 0xE6, 0x85, 0x7B, 0x29, 0x85, 0xB1, 0x56, 0x67, 0x16, 0xD8, 0xEB, 0xD1, 0x42, 0x68, 0x50, 0x01, 0x01, 0x04, 0x24, 0x37, 0x73, 0x87, 0x87, 0x9A, 0x92, 0x7D, 0xCD, 0x52, 0xC2, 0x3A, 0xA3, 0x80, 0xB6, 0xE8, 0x50, 0x81, 0x13, 0xE5, 0xEC, 0xDE, 0xDA, 0x5D, 0x38, 0xB3, 0x3D, 0x9B, 0xFA, 0x4A, 0x61, 0x02, 0x00, 0xF1, 0xC2, 0xC8, 0x68, 0x7F, 0x1B, 0xCE, 0x09, 0xDD, 0x04, 0x95, 0x64, 0xBD, 0xA5, 0x9A, 0x22, 0x14, 0x9E, 0x3E, 0xA0, 0x33, 0x73, 0x31, 0xD3, 0x93, 0x60, 0x44, 0xB0, 0x9C, 0x65, 0x01, 0xF8, 0xB8, 0x79, 0xE9, 0x5E, 0x8A, 0x16, 0x0D, 0xC6, 0x3F, 0x1B, 0x7D, 0x5F, 0x3B, 0x7E, 0x64, 0xAA, 0xE1, 0x51, 0x27, 0x38, 0x91, 0x29, 0xB4, 0xB1, 0x13, 0xC1, 0x2C, 0xB7, 0x96, 0x5C, 0x48, 0xE4, 0x89, 0xE8, 0x58, 0xA5, 0x34, 0x86, 0xFE, 0x21, 0x11, 0x76, 0x6E, 0x01, 0x24, 0xCB, 0x5F, 0x83, 0x36, 0x99, 0x87, 0x32, 0xCB, 0xAC, 0xF5, 0x6E, 0x46, 0x4A, 0x6C, 0xD2, 0xCD, 0x65, 0x27, 0x2C, 0xD1, 0x46, 0x30, 0x3F, 0x31, 0xAA, 0x39, 0x9A, 0x44, 0xBE, 0x5E, 0x91, 0x93, 0x51, 0x82, 0xF8, 0x65, 0xF3, 0x66, 0x5D, 0x06, 0x10, 0x7C, 0x9E, 0xE3, 0x8D, 0x91, 0x03, 0xEE, 0x58, 0x54, 0x8B, 0x30, 0x1A, 0x9E, 0x01, 0xDB, 0x37, 0x6B, 0x89, 0x3D, 0xC4, 0xE6, 0xC7, 0x4E, 0xBE, 0xA2, 0x5A, 0xCF, 0x0D, 0x28, 0xE7, 0xC7, 0xB3, 0x12, 0x99, 0x8D, 0xE7, 0x71, 0x93, 0x9D, 0xD1, 0xE3, 0xD6, 0x6B, 0xD4, 0x37, 0xC0, 0xD5, 0x7D, 0x8B, 0xEF, 0x33, 0xE5, 0x27, 0xBA, 0x04, 0xCF, 0xD0, 0x62, 0x61, 0x9C, 0xD0, 0x7E, 0x38, 0xC1, 0xC7, 0xE6, 0x70, 0x49, 0x20, 0x71, 0x5C, 0xC6, 0x35, 0x76, 0x15, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char ms3_dpki_cert[0x240] = +{ + 0x00, 0x01, 0x00, 0x01, 0x92, 0x72, 0xBB, 0xBD, 0x15, 0x6C, 0x59, 0xAB, 0x4D, 0x88, 0x0D, 0x8D, 0xF2, 0xA8, 0x69, 0xF7, 0x77, 0xDB, 0xDB, 0x5A, 0x27, 0xFC, 0xB3, 0x71, 0x22, 0x4E, 0x06, 0xBD, 0x13, 0x85, 0x62, 0xAD, 0x87, 0x0C, 0x77, 0xD2, 0xF1, 0x69, 0x6E, 0x41, 0xA7, 0x01, 0xD0, 0x3A, 0xEF, 0x5B, 0xB1, 0x54, 0x56, 0xC4, 0x93, 0xA9, 0x66, 0x10, 0xFF, 0x8E, 0x3E, 0x61, 0x7B, 0x42, 0xF3, 0x63, 0x58, 0x32, 0x26, 0xAD, 0x2B, 0x8F, 0x9E, 0xE4, 0x7E, 0xCF, 0xAC, 0x0D, 0x02, 0xFE, 0xE0, 0xA7, 0xD1, 0xED, 0x0C, 0x6E, 0x7E, 0x5A, 0xB4, 0x04, 0x5C, 0x8D, 0xFC, 0x66, 0x44, 0x1D, 0x6D, 0xB4, 0x0E, 0x40, 0xE7, 0x1E, 0x82, 0x0D, 0xE9, 0x9D, 0xB2, 0x70, 0xAF, 0x5F, 0x27, 0x0D, 0x47, 0x4A, 0x9F, 0x4F, 0xE7, 0xDB, 0x81, 0x08, 0x1D, 0x1E, 0xF0, 0xDC, 0xEC, 0x2A, 0xEC, 0x8E, 0x3D, 0xAF, 0x60, 0xD0, 0xAA, 0xDD, 0x0B, 0x0C, 0x3E, 0x9E, 0xC0, 0x49, 0xEE, 0xF6, 0x07, 0x0E, 0xC3, 0x97, 0x92, 0x28, 0x0A, 0xC4, 0x8B, 0xF8, 0x1F, 0x4B, 0x16, 0x56, 0x0D, 0xFB, 0x40, 0xF2, 0xC9, 0x2A, 0xF2, 0xCE, 0x8F, 0x3E, 0x1C, 0x44, 0x3D, 0x85, 0xE6, 0x63, 0x09, 0x16, 0xE2, 0x77, 0x9A, 0x92, 0x29, 0x47, 0x8E, 0x4E, 0x7D, 0xFB, 0x22, 0x16, 0xA9, 0x3D, 0xD9, 0xEC, 0x2D, 0xD6, 0xC3, 0x10, 0x50, 0x15, 0xF6, 0x99, 0x8D, 0x65, 0xB5, 0x04, 0x76, 0x22, 0x1D, 0xCA, 0x37, 0xE2, 0x45, 0xC6, 0x60, 0x49, 0xA5, 0x54, 0x0A, 0x47, 0x5B, 0x63, 0x27, 0xD4, 0x97, 0x62, 0xAD, 0x52, 0x9E, 0x23, 0xC2, 0x74, 0xCF, 0x13, 0xFA, 0x78, 0x14, 0x0B, 0x6A, 0x8F, 0xFA, 0x57, 0xC0, 0xC6, 0x95, 0x24, 0x83, 0x16, 0xFC, 0x19, 0xBC, 0x95, 0x2B, 0xD2, 0x4A, 0x35, 0x51, 0x83, 0x5A, 0xC7, 0xC5, 0xA9, 0x5F, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4D, 0x53, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xF5, 0xA9, 0xBC, 0x00, 0x8C, 0xF9, 0x5D, 0x1A, 0x80, 0xDB, 0x01, 0xB2, 0xFD, 0x61, 0x68, 0xE0, 0x80, 0x4A, 0xAF, 0x95, 0xEA, 0xF2, 0x75, 0x69, 0x6E, 0x40, 0x84, 0x17, 0x2C, 0xCE, 0x74, 0x42, 0x05, 0x00, 0x9B, 0xE0, 0x20, 0x0C, 0xC9, 0x47, 0x68, 0x49, 0x38, 0xFB, 0x14, 0x54, 0x35, 0x46, 0x80, 0xAB, 0xDB, 0xED, 0x0B, 0xBF, 0x49, 0xBA, 0x82, 0xD0, 0x8A, 0x8C, 0xA5, 0x71, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char ng1f5_dpki_cert[0x180] = +{ + 0x00, 0x01, 0x00, 0x02, 0x00, 0xA9, 0x07, 0x04, 0x79, 0xB8, 0x26, 0x08, 0x05, 0xA5, 0xC3, 0x09, 0xDC, 0xFC, 0xBC, 0xE3, 0xF5, 0x8A, 0x22, 0x03, 0xB7, 0x41, 0x69, 0x6A, 0xEB, 0x61, 0xA7, 0x40, 0xF1, 0x4A, 0x00, 0x72, 0xB1, 0x89, 0xAD, 0x52, 0x12, 0xF6, 0xC7, 0xEA, 0x8D, 0xA8, 0xC5, 0x6F, 0x97, 0x16, 0xD0, 0x2E, 0x64, 0xC6, 0x19, 0xB2, 0x5A, 0x98, 0xE5, 0x43, 0xD5, 0xA1, 0x53, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x2D, 0x4D, 0x53, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4E, 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x66, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xF0, 0x0E, 0xFA, 0x01, 0xB0, 0x5C, 0x9C, 0x55, 0xB5, 0x72, 0x0F, 0x43, 0xFC, 0x98, 0x80, 0x46, 0x30, 0xF3, 0xD2, 0xBB, 0xE8, 0x92, 0xC8, 0x93, 0xBA, 0x12, 0x37, 0x62, 0x7F, 0xE0, 0x18, 0xC8, 0x7E, 0x00, 0xFD, 0xEE, 0x69, 0x66, 0xB0, 0xE3, 0xF1, 0x59, 0x8C, 0x83, 0x9B, 0x76, 0x1C, 0x0B, 0xE9, 0x0B, 0xA0, 0x7E, 0x63, 0x2D, 0xB3, 0xD5, 0x50, 0xBD, 0x44, 0xD1, 0x57, 0x27, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char ms8_dpki_cert[0x240] = +{ + 0x00, 0x01, 0x00, 0x01, 0xA6, 0x5A, 0x2B, 0x92, 0xC0, 0xE7, 0xAF, 0x0C, 0x11, 0xD2, 0x5A, 0x9A, 0x6D, 0xC2, 0x9B, 0xC3, 0xDD, 0xBF, 0x0F, 0x30, 0x17, 0xB1, 0xBE, 0x1F, 0xD5, 0x29, 0xE9, 0x99, 0x73, 0x06, 0x67, 0x52, 0x04, 0x05, 0xCF, 0x34, 0x0C, 0x28, 0x6D, 0xBB, 0xA7, 0x69, 0x2E, 0x7E, 0xD2, 0x1F, 0x44, 0x43, 0xCA, 0x15, 0x22, 0x68, 0xB4, 0x6F, 0x7D, 0x03, 0x63, 0xFB, 0xAA, 0x89, 0x3D, 0x0B, 0x6D, 0xC0, 0xBC, 0x2D, 0x89, 0x3C, 0xB5, 0xE6, 0xF8, 0x97, 0x97, 0x94, 0x09, 0xBC, 0x4D, 0x1B, 0x56, 0x18, 0xD4, 0x50, 0x9D, 0xC2, 0xCE, 0x1B, 0xC3, 0x97, 0x22, 0xC1, 0x38, 0xA2, 0x29, 0x2C, 0x11, 0x42, 0xE0, 0xBB, 0x14, 0xAA, 0x7A, 0xD8, 0x6B, 0xB3, 0x28, 0x76, 0xA6, 0xF1, 0xBD, 0x7D, 0x80, 0x99, 0xD0, 0xEA, 0x7A, 0xF5, 0xC4, 0x47, 0x52, 0x01, 0x28, 0x6B, 0x27, 0x08, 0xAE, 0xFA, 0x68, 0x97, 0x50, 0x2D, 0x91, 0x4D, 0x89, 0x96, 0xC9, 0xDE, 0xAC, 0x4A, 0x4F, 0x31, 0x7F, 0xB8, 0x7C, 0xDE, 0xFD, 0x59, 0xE8, 0xC7, 0xA0, 0x65, 0xB7, 0x73, 0xAA, 0xB0, 0xEA, 0x80, 0xE6, 0x58, 0x2B, 0xC0, 0xF7, 0x89, 0xA8, 0x84, 0x3D, 0xB6, 0x59, 0xAC, 0xB5, 0xB2, 0x43, 0x0E, 0x20, 0xA7, 0xAA, 0xC3, 0x93, 0xA0, 0x8F, 0x66, 0x37, 0xE8, 0xF3, 0x83, 0x14, 0x28, 0x71, 0x1A, 0x0B, 0x47, 0x8D, 0x21, 0xE6, 0x5A, 0xC1, 0xF3, 0x26, 0xD2, 0x41, 0x75, 0x90, 0xDA, 0xB1, 0x05, 0x64, 0xBC, 0xD4, 0xFE, 0xD0, 0xCB, 0x9B, 0x92, 0xD8, 0x27, 0xDC, 0x93, 0x05, 0xC1, 0x21, 0xAC, 0x59, 0xB1, 0x08, 0xDC, 0xFF, 0xEC, 0xD5, 0x53, 0x56, 0xB4, 0xC3, 0x90, 0x32, 0xA0, 0xC4, 0xFE, 0xE4, 0x8A, 0x57, 0xA5, 0xAD, 0x32, 0x9D, 0x94, 0x1E, 0x16, 0x29, 0xEA, 0x57, 0x10, 0x87, 0x82, 0x54, 0xC7, 0xEC, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4D, 0x53, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x36, 0xC6, 0xAC, 0x01, 0xEE, 0xFF, 0xD1, 0x3D, 0x2B, 0x54, 0xC4, 0x4D, 0xE5, 0xE9, 0x28, 0x5E, 0x16, 0x98, 0x20, 0xDC, 0x0E, 0x61, 0x54, 0x62, 0xC7, 0x23, 0x90, 0x0B, 0xA7, 0xBA, 0xC3, 0x2B, 0x5A, 0x00, 0xFE, 0x7A, 0xB1, 0x38, 0x5C, 0x83, 0x15, 0xF5, 0x27, 0x40, 0x2A, 0x8B, 0xFC, 0x50, 0x11, 0x82, 0x80, 0x89, 0x6C, 0xF8, 0x24, 0x9E, 0x9D, 0x0D, 0x42, 0xF0, 0xDA, 0xED, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif \ No newline at end of file diff --git a/elf.c b/elf.c index 63f7e8f..2a7e98d 100644 --- a/elf.c +++ b/elf.c @@ -21,7 +21,9 @@ ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 Nam int GetElfContext(ElfContext *elf, u8 *ElfFile); int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile); int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile); +#ifdef DEBUG void PrintElfContext(ElfContext *elf, u8 *ElfFile); +#endif int ReadElfHdr(ElfContext *elf, u8 *ElfFile); int CreateElfSegments(ElfContext *elf, u8 *ElfFile); @@ -61,11 +63,13 @@ u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile); int BuildExeFsCode(ncch_settings *ncchset) { int result = 0; - if(ncchset->ComponentFilePtrs.plainregion){ // Import PlainRegion from file + if(ncchset->options.IsCfa) + return result; + if(ncchset->componentFilePtrs.plainregion){ // Import PlainRegion from file result = ImportPlainRegionFromFile(ncchset); if(result) return result; } - if(!ncchset->Options.IsBuildingCodeSection){ // Import ExeFs Code from file and return + if(!ncchset->options.IsBuildingCodeSection){ // Import ExeFs Code from file and return result = ImportExeFsCodeBinaryFromFile(ncchset); return result; } @@ -74,9 +78,9 @@ int BuildExeFsCode(ncch_settings *ncchset) printf("[DEBUG] Import ELF\n"); #endif /* Import ELF */ - u8 *ElfFile = malloc(ncchset->ComponentFilePtrs.elf_size); + u8 *ElfFile = malloc(ncchset->componentFilePtrs.elfSize); if(!ElfFile) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ElfFile,ncchset->ComponentFilePtrs.elf_size,0,ncchset->ComponentFilePtrs.elf); + ReadFile_64(ElfFile,ncchset->componentFilePtrs.elfSize,0,ncchset->componentFilePtrs.elf); #ifdef DEBUG printf("[DEBUG] Create ELF Context\n"); @@ -90,17 +94,13 @@ int BuildExeFsCode(ncch_settings *ncchset) if(result) goto finish; /* Setting Page Size */ - elf->PageSize = GetPageSize(ncchset); + elf->pageSize = GetPageSize(ncchset); - if(!ncchset->ComponentFilePtrs.plainregion){ + if(!ncchset->componentFilePtrs.plainregion){ result = ImportPlainRegionFromElf(elf,ElfFile,ncchset); if(result) goto finish; } -#ifdef ELF_DEBUG - PrintElfContext(elf,ElfFile); -#endif - #ifdef DEBUG PrintElfContext(elf,ElfFile); #endif @@ -128,74 +128,74 @@ finish: #ifdef DEBUG printf("[DEBUG] Free Segment Header/Sections\n"); #endif - for(int i = 0; i < elf->ActiveSegments; i++){ + for(int i = 0; i < elf->activeSegments; i++){ #ifdef DEBUG printf("[DEBUG] %d\n",i); #endif - free(elf->Segments[i].Sections); + free(elf->segments[i].sections); } #ifdef DEBUG printf("[DEBUG] Free others\n"); #endif free(ElfFile); - free(elf->Sections); - free(elf->ProgramHeaders); - free(elf->Segments); + free(elf->sections); + free(elf->programHeaders); + free(elf->segments); free(elf); return result; } int ImportPlainRegionFromFile(ncch_settings *ncchset) { - ncchset->Sections.PlainRegion.size = align_value(ncchset->ComponentFilePtrs.plainregion_size,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.PlainRegion.buffer,ncchset->ComponentFilePtrs.plainregion_size,0,ncchset->ComponentFilePtrs.plainregion); + ncchset->sections.plainRegion.size = align_value(ncchset->componentFilePtrs.plainregionSize,ncchset->options.mediaSize); + ncchset->sections.plainRegion.buffer = malloc(ncchset->sections.plainRegion.size); + if(!ncchset->sections.plainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->sections.plainRegion.buffer,ncchset->componentFilePtrs.plainregionSize,0,ncchset->componentFilePtrs.plainregion); return 0; } int ImportExeFsCodeBinaryFromFile(ncch_settings *ncchset) { - u32 size = ncchset->ComponentFilePtrs.code_size; + u32 size = ncchset->componentFilePtrs.codeSize; u8 *buffer = malloc(size); if(!buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(buffer,size,0,ncchset->ComponentFilePtrs.code); + ReadFile_64(buffer,size,0,ncchset->componentFilePtrs.code); - ncchset->ExeFs_Sections.Code.size = ncchset->ComponentFilePtrs.code_size; - ncchset->ExeFs_Sections.Code.buffer = malloc(ncchset->ExeFs_Sections.Code.size); - if(!ncchset->ExeFs_Sections.Code.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,0,ncchset->ComponentFilePtrs.code); - if(ncchset->Options.CompressCode){ + ncchset->exefsSections.code.size = ncchset->componentFilePtrs.codeSize; + ncchset->exefsSections.code.buffer = malloc(ncchset->exefsSections.code.size); + if(!ncchset->exefsSections.code.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->exefsSections.code.buffer,ncchset->exefsSections.code.size,0,ncchset->componentFilePtrs.code); + if(ncchset->options.CompressCode){ u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(buffer,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; + ncchset->exefsSections.code.buffer = BLZ_Code(buffer,size,&new_len,BLZ_NORMAL); + ncchset->exefsSections.code.size = new_len; free(buffer); } else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = buffer; + ncchset->exefsSections.code.size = size; + ncchset->exefsSections.code.buffer = buffer; } return 0; } u32 GetPageSize(ncch_settings *ncchset) { - if(ncchset->yaml_set->Option.PageSize) - return strtoul(ncchset->yaml_set->Option.PageSize,NULL,10); + if(ncchset->rsfSet->Option.PageSize) + return strtoul(ncchset->rsfSet->Option.PageSize,NULL,10); return 0x1000; } u32 SizeToPage(u32 memorySize, ElfContext *elf) { - return align_value(memorySize,elf->PageSize)/elf->PageSize; + return align_value(memorySize,elf->pageSize)/elf->pageSize; } int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) { - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(IsBss(&elf->Sections[i])) { - ncchset->CodeDetails.BSS_Size = elf->Sections[i].Size; + for(int i = 0; i < elf->sectionTableEntryCount; i++){ + if(IsBss(&elf->sections[i])) { + ncchset->codeDetails.bssSize = elf->sections[i].size; return 0; } } @@ -204,16 +204,16 @@ int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) // Doesn't work same as N makerom { - if(!ncchset->yaml_set->PlainRegionNum) return 0; - u16 *Index = malloc(sizeof(u16)*ncchset->yaml_set->PlainRegionNum); + if(!ncchset->rsfSet->PlainRegionNum) return 0; + u16 *Index = malloc(sizeof(u16)*ncchset->rsfSet->PlainRegionNum); /* Getting Index Values for each section */ - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - Index[i] = GetElfSectionIndexFromName(ncchset->yaml_set->PlainRegion[i],elf,ElfFile); + for(int i = 0; i < ncchset->rsfSet->PlainRegionNum; i++){ + Index[i] = GetElfSectionIndexFromName(ncchset->rsfSet->PlainRegion[i],elf,ElfFile); } // Eliminating Duplicated Sections - for(int i = ncchset->yaml_set->PlainRegionNum - 1; i >= 0; i--){ + for(int i = ncchset->rsfSet->PlainRegionNum - 1; i >= 0; i--){ for(int j = i-1; j >= 0; j--){ if(Index[i] == Index[j]) Index[i] = 0; } @@ -221,21 +221,21 @@ int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchse /* Calculating Total Size of Data */ u64 TotalSize = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - TotalSize += elf->Sections[Index[i]].Size; + for(int i = 0; i < ncchset->rsfSet->PlainRegionNum; i++){ + TotalSize += elf->sections[Index[i]].size; } /* Creating Output Buffer */ - ncchset->Sections.PlainRegion.size = align_value(TotalSize,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.PlainRegion.buffer,0,ncchset->Sections.PlainRegion.size); + ncchset->sections.plainRegion.size = align_value(TotalSize,ncchset->options.mediaSize); + ncchset->sections.plainRegion.buffer = malloc(ncchset->sections.plainRegion.size); + if(!ncchset->sections.plainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} + memset(ncchset->sections.plainRegion.buffer,0,ncchset->sections.plainRegion.size); /* Storing Sections */ u64 pos = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - memcpy((ncchset->Sections.PlainRegion.buffer+pos),elf->Sections[Index[i]].Ptr,elf->Sections[Index[i]].Size); - pos += elf->Sections[Index[i]].Size; + for(int i = 0; i < ncchset->rsfSet->PlainRegionNum; i++){ + memcpy((ncchset->sections.plainRegion.buffer+pos),elf->sections[Index[i]].ptr,elf->sections[Index[i]].size); + pos += elf->sections[Index[i]].size; } return 0; } @@ -250,53 +250,53 @@ int CreateExeFsCode(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) CodeSegment Data; memset(&Data,0,sizeof(CodeSegment)); - int result = CreateCodeSegmentFromElf(&Text,elf,ElfFile,ncchset->yaml_set->ExeFs.Text,ncchset->yaml_set->ExeFs.TextNum); + int result = CreateCodeSegmentFromElf(&Text,elf,ElfFile,ncchset->rsfSet->ExeFs.Text,ncchset->rsfSet->ExeFs.TextNum); if(result) return result; - result = CreateCodeSegmentFromElf(&RO,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadOnly,ncchset->yaml_set->ExeFs.ReadOnlyNum); + result = CreateCodeSegmentFromElf(&RO,elf,ElfFile,ncchset->rsfSet->ExeFs.ReadOnly,ncchset->rsfSet->ExeFs.ReadOnlyNum); if(result) return result; - result = CreateCodeSegmentFromElf(&Data,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadWrite,ncchset->yaml_set->ExeFs.ReadWriteNum); + result = CreateCodeSegmentFromElf(&Data,elf,ElfFile,ncchset->rsfSet->ExeFs.ReadWrite,ncchset->rsfSet->ExeFs.ReadWriteNum); if(result) return result; /* Allocating Buffer for ExeFs Code */ - u32 size = (Text.MaxPageNum + RO.MaxPageNum + Data.MaxPageNum)*elf->PageSize; + u32 size = (Text.maxPageNum + RO.maxPageNum + Data.maxPageNum)*elf->pageSize; u8 *code = malloc(size); /* Writing Code into Buffer */ u8 *TextPos = (code + 0); - u8 *ROPos = (code + Text.MaxPageNum*elf->PageSize); - u8 *DataPos = (code + (Text.MaxPageNum + RO.MaxPageNum)*elf->PageSize); - if(Text.Size) memcpy(TextPos,Text.Data,Text.Size); - if(RO.Size) memcpy(ROPos,RO.Data,RO.Size); - if(Data.Size) memcpy(DataPos,Data.Data,Data.Size); + u8 *ROPos = (code + Text.maxPageNum*elf->pageSize); + u8 *DataPos = (code + (Text.maxPageNum + RO.maxPageNum)*elf->pageSize); + if(Text.size) memcpy(TextPos,Text.data,Text.size); + if(RO.size) memcpy(ROPos,RO.data,RO.size); + if(Data.size) memcpy(DataPos,Data.data,Data.size); /* Compressing If needed */ - if(ncchset->Options.CompressCode){ + if(ncchset->options.CompressCode){ u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(code,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; + ncchset->exefsSections.code.buffer = BLZ_Code(code,size,&new_len,BLZ_NORMAL); + ncchset->exefsSections.code.size = new_len; free(code); } else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = code; + ncchset->exefsSections.code.size = size; + ncchset->exefsSections.code.buffer = code; } /* Setting CodeSegment Data and freeing original buffers */ - ncchset->CodeDetails.TextAddress = Text.Address; - ncchset->CodeDetails.TextMaxPages = Text.MaxPageNum; - ncchset->CodeDetails.TextSize = Text.Size; - if(Text.Size) free(Text.Data); + ncchset->codeDetails.textAddress = Text.address; + ncchset->codeDetails.textMaxPages = Text.maxPageNum; + ncchset->codeDetails.textSize = Text.size; + if(Text.size) free(Text.data); - ncchset->CodeDetails.ROAddress = RO.Address; - ncchset->CodeDetails.ROMaxPages = RO.MaxPageNum; - ncchset->CodeDetails.ROSize = RO.Size; - if(RO.Size) free(RO.Data); + ncchset->codeDetails.roAddress = RO.address; + ncchset->codeDetails.roMaxPages = RO.maxPageNum; + ncchset->codeDetails.roSize = RO.size; + if(RO.size) free(RO.data); - ncchset->CodeDetails.DataAddress = Data.Address; - ncchset->CodeDetails.DataMaxPages = Data.MaxPageNum; - ncchset->CodeDetails.DataSize = Data.Size; - if(Data.Size) free(Data.Data); + ncchset->codeDetails.rwAddress = Data.address; + ncchset->codeDetails.rwMaxPages = Data.maxPageNum; + ncchset->codeDetails.rwSize = Data.size; + if(Data.size) free(Data.data); /* Return */ return 0; @@ -308,8 +308,10 @@ int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, cha memset(out,0,sizeof(CodeSegment)); ElfSegment **ContinuousSegments = GetContinuousSegments(&ContinuousSegmentNum,elf,Names,NameNum); if (ContinuousSegments == NULL){ - if(!ContinuousSegmentNum) // Nothing Was Found + if(!ContinuousSegmentNum){// Nothing Was Found + //printf("Nothing was found\n"); return 0; + } else // Error with found segments return ELF_SEGMENTS_NOT_CONTINUOUS; } @@ -319,56 +321,56 @@ int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, cha u32 memorySize = 0; for(int i = 0; i < ContinuousSegmentNum; i++){ if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; + vAddr = ContinuousSegments[i]->vAddr; } else{ // Add rounded size from previous segment - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); + u32 num = ContinuousSegments[i]->vAddr - (vAddr + memorySize); memorySize += num; } - memorySize += ContinuousSegments[i]->Header->SizeInMemory; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (IsBss(Section) && j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; + memorySize += ContinuousSegments[i]->header->sizeInMemory; + for (int j = 0; j < ContinuousSegments[i]->sectionNum; j++){ + ElfSectionEntry *Section = &ContinuousSegments[i]->sections[j]; + if (IsBss(Section) && j == (ContinuousSegments[i]->sectionNum-1)) + memorySize -= Section->size; } } // For Check -#ifdef ELF_DEBUG +#ifdef DEBUG printf("Address: 0x%x\n",vAddr); printf("Size: 0x%x\n",memorySize); #endif - out->Address = vAddr; - out->Size = memorySize; - out->MaxPageNum = SizeToPage(memorySize,elf); - out->Data = malloc(memorySize); + out->address = vAddr; + out->size = memorySize; + out->maxPageNum = SizeToPage(memorySize,elf); + out->data = malloc(memorySize); /* Writing Segment to Buffer */ vAddr = 0; memorySize = 0; for(int i = 0; i < ContinuousSegmentNum; i++){ if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; + vAddr = ContinuousSegments[i]->vAddr; } else{ - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); + u32 num = ContinuousSegments[i]->vAddr - (vAddr + memorySize); memorySize += num; } u32 size = 0; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (!IsBss(Section)){ - u8 *pos = (out->Data + memorySize + size); - memcpy(pos,Section->Ptr,Section->Size); - size += Section->Size; + for (int j = 0; j < ContinuousSegments[i]->sectionNum; j++){ + ElfSectionEntry *Section = &ContinuousSegments[i]->sections[j]; + if (!IsBss(Section)){ + u8 *pos = (out->data + (Section->address - ContinuousSegments[i]->vAddr)); + memcpy(pos,Section->ptr,Section->size); + size += Section->size; } - else if (j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; + else if (j == (ContinuousSegments[i]->sectionNum-1)) + memorySize -= Section->size; else - size += Section->Size; + size += Section->size; } } @@ -391,10 +393,10 @@ ElfSegment** GetContinuousSegments(u16 *ContinuousSegmentNum, ElfContext *elf, c return Segments; } - u32 vAddr = Segments[0]->VAddr + Segments[0]->Header->SizeInMemory; + u32 vAddr = Segments[0]->vAddr + Segments[0]->header->sizeInMemory; for (int i = 1; i < SegmentNum; i++){ - if (Segments[i]->VAddr != (u32)align_value(vAddr,Segments[i]->Header->Alignment)){ //Each Segment must start after each other - fprintf(stderr,"[ELF ERROR] %s segment and %s segment are not continuous\n", Segments[i]->Name, Segments[i - 1]->Name); + if (Segments[i]->vAddr != (u32)align_value(vAddr,Segments[i]->header->alignment)){ //Each Segment must start after each other + fprintf(stderr,"[ELF ERROR] %s segment and %s segment are not continuous\n", Segments[i]->name, Segments[i - 1]->name); free(Segments); *ContinuousSegmentNum = 0xffff; // Signify to function that an error occured return NULL; @@ -415,9 +417,9 @@ ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 Nam ElfSegment **Segments = malloc(sizeof(ElfSegment*)*NameNum); *SegmentNum = 0; // There can be a max of NameNum Segments, however, they might not all exist for (int i = 0; i < NameNum; i++){ - for(int j = 0; j < elf->ActiveSegments; j++){ - if(strcmp(Names[i],elf->Segments[j].Name) == 0){ // If there is a match, store Segment data pointer & increment index - Segments[*SegmentNum] = &elf->Segments[j]; + for(int j = 0; j < elf->activeSegments; j++){ + if(strcmp(Names[i],elf->segments[j].name) == 0){ // If there is a match, store Segment data pointer & increment index + Segments[*SegmentNum] = &elf->segments[j]; *SegmentNum = *SegmentNum + 1; } } @@ -451,116 +453,118 @@ int GetElfContext(ElfContext *elf, u8 *ElfFile) int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile) { - elf->Sections = malloc(sizeof(ElfSectionEntry)*elf->SectionTableEntryCount); - if(!elf->Sections) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} + elf->sections = malloc(sizeof(ElfSectionEntry)*elf->sectionTableEntryCount); + if(!elf->sections) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - elf->Sections[i].Name = GetELFSectionEntryName(i,elf,ElfFile); - elf->Sections[i].Type = GetELFSectionEntryType(i,elf,ElfFile); - elf->Sections[i].Flags = GetELFSectionEntryFlags(i,elf,ElfFile); - elf->Sections[i].Ptr = GetELFSectionEntry(i,elf,ElfFile); - elf->Sections[i].OffsetInFile = GetELFSectionEntryFileOffset(i,elf,ElfFile); - elf->Sections[i].Size = GetELFSectionEntrySize(i,elf,ElfFile); - elf->Sections[i].Address = GetELFSectionEntryAddress(i,elf,ElfFile); - elf->Sections[i].Alignment = GetELFSectionEntryAlignment(i,elf,ElfFile); + for(int i = 0; i < elf->sectionTableEntryCount; i++){ + elf->sections[i].name = GetELFSectionEntryName(i,elf,ElfFile); + elf->sections[i].type = GetELFSectionEntryType(i,elf,ElfFile); + elf->sections[i].flags = GetELFSectionEntryFlags(i,elf,ElfFile); + elf->sections[i].ptr = GetELFSectionEntry(i,elf,ElfFile); + elf->sections[i].offsetInFile = GetELFSectionEntryFileOffset(i,elf,ElfFile); + elf->sections[i].size = GetELFSectionEntrySize(i,elf,ElfFile); + elf->sections[i].address = GetELFSectionEntryAddress(i,elf,ElfFile); + elf->sections[i].alignment = GetELFSectionEntryAlignment(i,elf,ElfFile); } return 0; } int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile) { - elf->ProgramHeaders = malloc(sizeof(ElfProgramEntry)*elf->ProgramTableEntryCount); - if(!elf->ProgramHeaders) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} + elf->programHeaders = malloc(sizeof(ElfProgramEntry)*elf->programTableEntryCount); + if(!elf->programHeaders) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - for(int i = 0; i < elf->ProgramTableEntryCount; i++){ - elf->ProgramHeaders[i].Type = GetELFProgramEntryType(i,elf,ElfFile); - elf->ProgramHeaders[i].Flags = GetELFProgramEntryFlags(i,elf,ElfFile); - elf->ProgramHeaders[i].Ptr = GetELFProgramEntry(i,elf,ElfFile); - elf->ProgramHeaders[i].OffsetInFile = GetELFProgramEntryFileOffset(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInFile = GetELFProgramEntryFileSize(i,elf,ElfFile); - elf->ProgramHeaders[i].PhysicalAddress = GetELFProgramEntryPAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].VirtualAddress = GetELFProgramEntryVAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInMemory = GetELFProgramEntryMemorySize(i,elf,ElfFile); - elf->ProgramHeaders[i].Alignment = GetELFProgramEntryAlignment(i,elf,ElfFile); + for(int i = 0; i < elf->programTableEntryCount; i++){ + elf->programHeaders[i].type = GetELFProgramEntryType(i,elf,ElfFile); + elf->programHeaders[i].flags = GetELFProgramEntryFlags(i,elf,ElfFile); + elf->programHeaders[i].ptr = GetELFProgramEntry(i,elf,ElfFile); + elf->programHeaders[i].offsetInFile = GetELFProgramEntryFileOffset(i,elf,ElfFile); + elf->programHeaders[i].sizeInFile = GetELFProgramEntryFileSize(i,elf,ElfFile); + elf->programHeaders[i].physicalAddress = GetELFProgramEntryPAddress(i,elf,ElfFile); + elf->programHeaders[i].virtualAddress = GetELFProgramEntryVAddress(i,elf,ElfFile); + elf->programHeaders[i].sizeInMemory = GetELFProgramEntryMemorySize(i,elf,ElfFile); + elf->programHeaders[i].alignment = GetELFProgramEntryAlignment(i,elf,ElfFile); } return 0; } +#ifdef DEBUG void PrintElfContext(ElfContext *elf, u8 *ElfFile) { printf("[+] Basic Details\n"); printf(" Class: %s\n",elf->Is64bit ? "64-bit" : "32-bit"); printf(" Data: %s\n",elf->IsLittleEndian ? "Little Endian" : "Big Endian"); printf("\n[+] Program Table Data\n"); - printf(" Offset: 0x%lx\n",elf->ProgramTableOffset); - printf(" Size: 0x%x\n",elf->ProgramTableEntrySize); - printf(" Count: 0x%x\n",elf->ProgramTableEntryCount); + printf(" Offset: 0x%lx\n",elf->programTableOffset); + printf(" Size: 0x%x\n",elf->programTableEntrySize); + printf(" Count: 0x%x\n",elf->programTableEntryCount); printf("\n[+] Section Table Data\n"); - printf(" Offset: 0x%lx\n",elf->SectionTableOffset); - printf(" Size: 0x%x\n",elf->SectionTableEntrySize); - printf(" Count: 0x%x\n",elf->SectionTableEntryCount); - printf(" Lable Index: 0x%x\n",elf->SectionHeaderNameEntryIndex); - for(int i = 0; i < elf->ActiveSegments; i++){ - printf(" Segment [%d][%s]\n",i,elf->Segments[i].Name); - printf(" > Size : 0x%x\n",elf->Segments[i].Header->SizeInFile); - printf(" > Address : 0x%x\n",elf->Segments[i].VAddr); - printf(" > Sections : %d\n",elf->Segments[i].SectionNum); - for(int j = 0; j < elf->Segments[i].SectionNum; j++){ - printf(" > Section [%d][%s]\n",j,elf->Segments[i].Sections[j].Name); + printf(" Offset: 0x%lx\n",elf->sectionTableOffset); + printf(" Size: 0x%x\n",elf->sectionTableEntrySize); + printf(" Count: 0x%x\n",elf->sectionTableEntryCount); + printf(" Lable Index: 0x%x\n",elf->sectionHeaderNameEntryIndex); + for(int i = 0; i < elf->activeSegments; i++){ + printf(" Segment [%d][%s]\n",i,elf->segments[i].name); + printf(" > Size : 0x%x\n",elf->segments[i].header->sizeInFile); + printf(" > Address : 0x%x\n",elf->segments[i].vAddr); + printf(" > Sections : %d\n",elf->segments[i].sectionNum); + for(int j = 0; j < elf->segments[i].sectionNum; j++){ + printf(" > Section [%d][%s]\n",j,elf->segments[i].sections[j].name); } /* char outpath[100]; memset(&outpath,0,100); - sprintf(outpath,"%s.bin",elf->Sections[i].Name); + sprintf(outpath,"%s.bin",elf->sections[i].name); chdir("elfsections"); FILE *tmp = fopen(outpath,"wb"); - WriteBuffer(elf->Sections[i].Ptr,elf->Sections[i].Size,0,tmp); + WriteBuffer(elf->sections[i].ptr,elf->sections[i].size,0,tmp); fclose(tmp); chdir(".."); */ } } +#endif int ReadElfHdr(ElfContext *elf, u8 *ElfFile) { if(elf->Is64bit){ elf_64_hdr *hdr = (elf_64_hdr*)ElfFile; - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); + u16 Architecture = u8_to_u16(hdr->targetArchitecture,elf->IsLittleEndian); + u16 Type = u8_to_u16(hdr->type,elf->IsLittleEndian); if(Architecture != elf_arm) return NOT_ARM_ELF; if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - elf->ProgramTableOffset = u8_to_u64(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); + elf->programTableOffset = u8_to_u64(hdr->programHeaderTableOffset,elf->IsLittleEndian); + elf->programTableEntrySize = u8_to_u16(hdr->programHeaderEntrySize,elf->IsLittleEndian); + elf->programTableEntryCount = u8_to_u16(hdr->programHeaderEntryCount,elf->IsLittleEndian); - elf->SectionTableOffset = u8_to_u64(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); + elf->sectionTableOffset = u8_to_u64(hdr->sectionHeaderTableOffset,elf->IsLittleEndian); + elf->sectionTableEntrySize = u8_to_u16(hdr->sectionTableEntrySize,elf->IsLittleEndian); + elf->sectionTableEntryCount = u8_to_u16(hdr->sectionHeaderEntryCount,elf->IsLittleEndian); - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); + elf->sectionHeaderNameEntryIndex = u8_to_u16(hdr->sectionHeaderNameEntryIndex,elf->IsLittleEndian); } else{ elf_32_hdr *hdr = (elf_32_hdr*)ElfFile; - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); + u16 Architecture = u8_to_u16(hdr->targetArchitecture,elf->IsLittleEndian); + u16 Type = u8_to_u16(hdr->type,elf->IsLittleEndian); if(Architecture != elf_arm) return NOT_ARM_ELF; if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - elf->ProgramTableOffset = u8_to_u32(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); + elf->programTableOffset = u8_to_u32(hdr->programHeaderTableOffset,elf->IsLittleEndian); + elf->programTableEntrySize = u8_to_u16(hdr->programHeaderEntrySize,elf->IsLittleEndian); + elf->programTableEntryCount = u8_to_u16(hdr->programHeaderEntryCount,elf->IsLittleEndian); - elf->SectionTableOffset = u8_to_u32(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); + elf->sectionTableOffset = u8_to_u32(hdr->sectionHeaderTableOffset,elf->IsLittleEndian); + elf->sectionTableEntrySize = u8_to_u16(hdr->sectionTableEntrySize,elf->IsLittleEndian); + elf->sectionTableEntryCount = u8_to_u16(hdr->sectionHeaderEntryCount,elf->IsLittleEndian); - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); + elf->sectionHeaderNameEntryIndex = u8_to_u16(hdr->sectionHeaderNameEntryIndex,elf->IsLittleEndian); } return 0; } @@ -569,21 +573,21 @@ int ReadElfHdr(ElfContext *elf, u8 *ElfFile) u8* GetELFSectionHeader(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return NULL; + if(Index >= elf->sectionTableEntryCount) return NULL; - return (ElfFile + elf->SectionTableOffset + elf->SectionTableEntrySize*Index); + return (ElfFile + elf->sectionTableOffset + elf->sectionTableEntrySize*Index); } u8* GetELFSectionEntry(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return NULL; + if(Index >= elf->sectionTableEntryCount) return NULL; return (u8*) (ElfFile + GetELFSectionEntryFileOffset(Index,elf,ElfFile)); } char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; u64 NameIndex = 0; if(elf->Is64bit){ @@ -595,14 +599,14 @@ char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile) NameIndex = u8_to_u32(shdr->sh_name,elf->IsLittleEndian); } - u8 *NameTable = GetELFSectionEntry(elf->SectionHeaderNameEntryIndex,elf,ElfFile); + u8 *NameTable = GetELFSectionEntry(elf->sectionHeaderNameEntryIndex,elf,ElfFile); return (char*)(NameTable+NameIndex); } u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -618,7 +622,7 @@ u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -634,7 +638,7 @@ u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -650,7 +654,7 @@ u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -666,7 +670,7 @@ u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -682,7 +686,7 @@ u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->SectionTableEntryCount) return 0; + if(Index >= elf->sectionTableEntryCount) return 0; if(elf->Is64bit){ elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); @@ -699,36 +703,36 @@ u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) u16 GetElfSectionIndexFromName(char *Name, ElfContext *elf, u8 *ElfFile) { - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(strcmp(Name,elf->Sections[i].Name) == 0) return i; + for(int i = 0; i < elf->sectionTableEntryCount; i++){ + if(strcmp(Name,elf->sections[i].name) == 0) return i; } return 0; // Assuming 0 is always empty } bool IsBss(ElfSectionEntry *Section) { - if(Section->Type == 8 && Section->Flags == 3) + if(Section->type == 8 && Section->flags == 3) return true; return false; } bool IsData(ElfSectionEntry *Section) { - if(Section->Type == 1 && Section->Flags == 3) + if(Section->type == 1 && Section->flags == 3) return true; return false; } bool IsRO(ElfSectionEntry *Section) { - if(Section->Type == 1 && Section->Flags == 2) + if(Section->type == 1 && Section->flags == 2) return true; return false; } bool IsText(ElfSectionEntry *Section) { - if(Section->Type == 1 && Section->Flags == 6) + if(Section->type == 1 && Section->flags == 6) return true; return false; } @@ -737,14 +741,14 @@ bool IsText(ElfSectionEntry *Section) u8* GetELFProgramHeader(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return NULL; + if(Index >= elf->programTableEntryCount) return NULL; - return (ElfFile + elf->ProgramTableOffset + elf->ProgramTableEntrySize*Index); + return (ElfFile + elf->programTableOffset + elf->programTableEntrySize*Index); } u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return NULL; + if(Index >= elf->programTableEntryCount) return NULL; return (u8*) (ElfFile + GetELFProgramEntryFileOffset(Index,elf,ElfFile)); @@ -753,7 +757,7 @@ u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -769,7 +773,7 @@ u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -785,7 +789,7 @@ u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -801,7 +805,7 @@ u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -817,7 +821,7 @@ u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -833,7 +837,7 @@ u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -849,7 +853,7 @@ u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -866,7 +870,7 @@ u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile) u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) { - if(Index >= elf->ProgramTableEntryCount) return 0; + if(Index >= elf->programTableEntryCount) return 0; if(elf->Is64bit){ elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); @@ -885,52 +889,60 @@ int CreateElfSegments(ElfContext *elf, u8 *ElfFile) { int num = 0; // Interate through Each Program Header - elf->ActiveSegments = 0; - elf->Segments = malloc(sizeof(ElfSegment)*elf->ProgramTableEntryCount); + elf->activeSegments = 0; + elf->segments = malloc(sizeof(ElfSegment)*elf->programTableEntryCount); ElfSegment *segment = malloc(sizeof(ElfSegment)); // Temporary Buffer - for (int i = 0; i < elf->ProgramTableEntryCount; i++){ - if (elf->ProgramHeaders[i].SizeInMemory != 0 && elf->ProgramHeaders[i].Type == 1){ + for (int i = 0; i < elf->programTableEntryCount; i++){ + if (elf->programHeaders[i].sizeInMemory != 0 && elf->programHeaders[i].type == 1){ memset(segment,0,sizeof(ElfSegment)); bool flag = false; u32 size = 0; - u32 vAddr = elf->ProgramHeaders[i].VirtualAddress; - u32 memorySize = elf->ProgramHeaders[i].SizeInMemory; + u32 vAddr = elf->programHeaders[i].virtualAddress; + u32 memorySize = elf->programHeaders[i].sizeInMemory; + //printf("Segment Size in memory: 0x%x\n",memorySize); u16 SectionInfoCapacity = 10; - segment->SectionNum = 0; - segment->Sections = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); + segment->sectionNum = 0; + segment->sections = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); // Itterate Through Section Headers - for (int j = num; j < elf->SectionTableEntryCount; j++){ + for (int j = num; j < elf->sectionTableEntryCount; j++){ if (!flag){ - if (elf->Sections[j].Address != vAddr) + if (elf->sections[j].address != vAddr) goto Skip; - while (j < (int)elf->Sections[j].Size && elf->Sections[j].Address == vAddr && !IsIgnoreSection(elf->Sections[j])) + while (j < (int)elf->sections[j].size && elf->sections[j].address == vAddr && !IsIgnoreSection(elf->sections[j])) j++; j--; flag = true; - segment->VAddr = elf->Sections[j].Address; - segment->Name = elf->Sections[j].Name; + segment->vAddr = elf->sections[j].address; + segment->name = elf->sections[j].name; } - if(segment->SectionNum < SectionInfoCapacity) - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); + if(segment->sectionNum < SectionInfoCapacity) + memcpy(&segment->sections[segment->sectionNum],&elf->sections[j],sizeof(ElfSectionEntry)); else{ SectionInfoCapacity = SectionInfoCapacity*2; ElfSectionEntry *tmp = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); - for(int k = 0; k < segment->SectionNum; k++) - memcpy(&tmp[k],&segment->Sections[k],sizeof(ElfSectionEntry)); - free(segment->Sections); - segment->Sections = tmp; - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); + for(int k = 0; k < segment->sectionNum; k++) + memcpy(&tmp[k],&segment->sections[k],sizeof(ElfSectionEntry)); + free(segment->sections); + segment->sections = tmp; + memcpy(&segment->sections[segment->sectionNum],&elf->sections[j],sizeof(ElfSectionEntry)); } - segment->SectionNum++; + segment->sectionNum++; - size += elf->Sections[j].Size; + if(size == 0) + size = elf->sections[j].size; + else + size = align_value(size,elf->sections[j].alignment) + elf->sections[j].size; + + //printf("Section Name: %s",elf->sections[j].name); + //printf(" 0x%lx",elf->sections[j].size); + //printf(" (Total Size: 0x%x)\n",size); if (size == memorySize) break; @@ -941,13 +953,13 @@ int CreateElfSegments(ElfContext *elf, u8 *ElfFile) } Skip: ; } - if(segment->SectionNum){ - segment->Header = &elf->ProgramHeaders[i]; - memcpy(&elf->Segments[elf->ActiveSegments],segment,sizeof(ElfSegment)); - elf->ActiveSegments++; + if(segment->sectionNum){ + segment->header = &elf->programHeaders[i]; + memcpy(&elf->segments[elf->activeSegments],segment,sizeof(ElfSegment)); + elf->activeSegments++; } else{ - free(segment->Sections); + free(segment->sections); free(segment); fprintf(stderr,"[ELF ERROR] Program Header Has no corresponding Sections, ELF Cannot be proccessed\n"); return ELF_SEGMENTS_NOT_FOUND; @@ -961,15 +973,15 @@ int CreateElfSegments(ElfContext *elf, u8 *ElfFile) bool IsIgnoreSection(ElfSectionEntry info) { - if (info.Address) + if (info.address) return false; - if (info.Type != 1 && info.Type != 0) + if (info.type != 1 && info.type != 0) return true; char IgnoreSectionNames[7][20] = { ".debug_abbrev", ".debug_frame", ".debug_info", ".debug_line", ".debug_loc", ".debug_pubnames", ".comment" }; for (int i = 0; i < 7; i++){ - if (strcmp(IgnoreSectionNames[i],info.Name) == 0) + if (strcmp(IgnoreSectionNames[i],info.name) == 0) return true; } return false; diff --git a/elf.h b/elf.h index ece978c..d16e881 100644 --- a/elf.h +++ b/elf.h @@ -16,69 +16,69 @@ typedef enum typedef struct { - char *Name; - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 Size; - u64 Address; - u64 Alignment; + char *name; + u64 type; + u64 flags; + u8 *ptr; + u64 offsetInFile; + u64 size; + u64 address; + u64 alignment; } ElfSectionEntry; typedef struct { - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 SizeInFile; - u64 VirtualAddress; - u64 PhysicalAddress; - u64 SizeInMemory; - u64 Alignment; + u64 type; + u64 flags; + u8 *ptr; + u64 offsetInFile; + u64 sizeInFile; + u64 virtualAddress; + u64 physicalAddress; + u64 sizeInMemory; + u64 alignment; } ElfProgramEntry; typedef struct { - char *Name; - u64 VAddr; + char *name; + u64 vAddr; - ElfProgramEntry *Header; - u32 SectionNum; - ElfSectionEntry *Sections; + ElfProgramEntry *header; + u32 sectionNum; + ElfSectionEntry *sections; } ElfSegment; typedef struct { - u32 Address; - u32 Size; - u32 MaxPageNum; - u8 *Data; + u32 address; + u32 size; + u32 maxPageNum; + u8 *data; } CodeSegment; typedef struct { - u32 PageSize; + u32 pageSize; bool IsLittleEndian; bool Is64bit; - u64 ProgramTableOffset; - u16 ProgramTableEntrySize; - u16 ProgramTableEntryCount; + u64 programTableOffset; + u16 programTableEntrySize; + u16 programTableEntryCount; - u64 SectionTableOffset; - u16 SectionTableEntrySize; - u16 SectionTableEntryCount; + u64 sectionTableOffset; + u16 sectionTableEntrySize; + u16 sectionTableEntryCount; - u16 SectionHeaderNameEntryIndex; + u16 sectionHeaderNameEntryIndex; - ElfSectionEntry *Sections; - ElfProgramEntry *ProgramHeaders; + ElfSectionEntry *sections; + ElfProgramEntry *programHeaders; - u16 ActiveSegments; - ElfSegment *Segments; + u16 activeSegments; + ElfSegment *segments; } ElfContext; diff --git a/elf_hdr.h b/elf_hdr.h index 260f420..e4be2c3 100644 --- a/elf_hdr.h +++ b/elf_hdr.h @@ -30,50 +30,51 @@ typedef enum typedef struct { - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[4]; - u8 ProgramHeaderTableOffset[4]; - u8 SectionHeaderTableOffset[4]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; + u8 magic[4]; + u8 bitFormat; + u8 endianness; + u8 elfVersion; + u8 os; + u8 padding0[8]; + u8 type[2]; + u8 targetArchitecture[2]; + u8 version[4]; + u8 entryPoint[4]; + u8 programHeaderTableOffset[4]; + u8 sectionHeaderTableOffset[4]; + u8 flags[4]; + u8 headerSize[2]; + u8 programHeaderEntrySize[2]; + u8 programHeaderEntryCount[2]; + u8 sectionTableEntrySize[2]; + u8 sectionHeaderEntryCount[2]; + u8 sectionHeaderNameEntryIndex[2]; } elf_32_hdr; typedef struct { - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[8]; - u8 ProgramHeaderTableOffset[8]; - u8 SectionHeaderTableOffset[8]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; + u8 magic[4]; + u8 bitFormat; + u8 endianness; + u8 elfVersion; + u8 os; + u8 padding0[8]; + u8 type[2]; + u8 targetArchitecture[2]; + u8 version[4]; + u8 entryPoint[8]; + u8 programHeaderTableOffset[8]; + u8 sectionHeaderTableOffset[8]; + u8 flags[4]; + u8 headerSize[2]; + u8 programHeaderEntrySize[2]; + u8 programHeaderEntryCount[2]; + u8 sectionTableEntrySize[2]; + u8 sectionHeaderEntryCount[2]; + u8 sectionHeaderNameEntryIndex[2]; } elf_64_hdr; +/* taken from elf specs, will not follow global style */ /* Section header. */ @@ -96,9 +97,9 @@ typedef struct #define SHT_LOSUNW 0x6ffffffb /* Sun-specific low bound. */ #define SHT_SUNW_COMDAT 0x6ffffffb #define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ +#define SHT_GNU_verdef 0x6ffffffd /* titleVersion definition section. */ +#define SHT_GNU_verneed 0x6ffffffe /* titleVersion needs section. */ +#define SHT_GNU_versym 0x6fffffff /* titleVersion symbol table. */ #define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ #define SHT_HIOS 0x6fffffff /* End OS-specific type */ #define SHT_LOPROC 0x70000000 /* Start of processor-specific */ diff --git a/exefs.c b/exefs.c index 15dd4ae..f931e08 100644 --- a/exefs.c +++ b/exefs.c @@ -17,30 +17,30 @@ int BuildExeFs(ncch_settings *ncchset) ExeFs_BuildContext *ctx = malloc(sizeof(ExeFs_BuildContext)); if(!ctx) {fprintf(stderr,"[EXEFS ERROR] MEM ERROR\n"); return MEM_ERROR;} InitialiseExeFSContext(ctx); - ctx->media_unit = ncchset->Options.MediaSize; + ctx->media_unit = ncchset->options.mediaSize; /* Importing ExeFs */ - if(ncchset->ExeFs_Sections.Code.size) - ImportToExeFSContext(ctx,".code",ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size); - if(ncchset->ExeFs_Sections.Banner.size) - ImportToExeFSContext(ctx,"banner",ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size); - if(ncchset->ExeFs_Sections.Icon.size) - ImportToExeFSContext(ctx,"icon",ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size); - if(ncchset->Sections.Logo.size && ncchset->Options.IncludeExeFsLogo) - ImportToExeFSContext(ctx,"logo",ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); + if(ncchset->exefsSections.code.size) + ImportToExeFSContext(ctx,".code",ncchset->exefsSections.code.buffer,ncchset->exefsSections.code.size); + if(ncchset->exefsSections.banner.size) + ImportToExeFSContext(ctx,"banner",ncchset->exefsSections.banner.buffer,ncchset->exefsSections.banner.size); + if(ncchset->exefsSections.icon.size) + ImportToExeFSContext(ctx,"icon",ncchset->exefsSections.icon.buffer,ncchset->exefsSections.icon.size); + if(ncchset->sections.logo.size && ncchset->options.IncludeExeFsLogo) + ImportToExeFSContext(ctx,"logo",ncchset->sections.logo.buffer,ncchset->sections.logo.size); /* Allocating Memory for ExeFs */ - ncchset->Sections.ExeFs.size = PredictExeFS_Size(ctx); - ncchset->Sections.ExeFs.buffer = malloc(ncchset->Sections.ExeFs.size); - if(!ncchset->Sections.ExeFs.buffer){ + ncchset->sections.exeFs.size = PredictExeFS_Size(ctx); + ncchset->sections.exeFs.buffer = malloc(ncchset->sections.exeFs.size); + if(!ncchset->sections.exeFs.buffer){ printf("[EXEFS ERROR] Could Not Allocate Memory for ExeFS\n"); return Fail; } - memset(ncchset->Sections.ExeFs.buffer,0,ncchset->Sections.ExeFs.size); + memset(ncchset->sections.exeFs.buffer,0,ncchset->sections.exeFs.size); /* Generating Header, and writing sections to buffer */ - GenerateExeFS_Header(ctx,ncchset->Sections.ExeFs.buffer); - ImportDatatoExeFS(ctx,ncchset->Sections.ExeFs.buffer); + GenerateExeFS_Header(ctx,ncchset->sections.exeFs.buffer); + ImportDatatoExeFS(ctx,ncchset->sections.exeFs.buffer); /* Finish */ FreeExeFSContext(ctx); diff --git a/exheader.c b/exheader.c index 22e948c..24ae023 100644 --- a/exheader.c +++ b/exheader.c @@ -5,7 +5,11 @@ #include "titleid.h" #include "polarssl/base64.h" -#include "accessdesc_sig.h" // For AccessDesc Presets +#include "desc_presets.h" +#ifndef PUBLIC_BUILD +#include "desc_dev_sigdata.h" +#include "desc_prod_sigdata.h" +#endif /* Prototypes */ void init_ExHeaderSettings(exheader_settings *exhdrset); @@ -13,63 +17,69 @@ void free_ExHeaderSettings(exheader_settings *exhdrset); int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *ncchset); int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset); -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml); -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml); -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml); -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset); -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int GetAppType(int *AppType, rsf_settings *yaml); -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml); -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml); -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); +int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf); +int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf); +int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf); +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset); +int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int GetAppType(int *AppType, rsf_settings *rsf); +int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf); +int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf); +int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); +int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i); -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); +int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); bool IsEndAddress(u32 Address); bool IsStartAddress(u32 Address); u32 GetIOMappingDesc(u32 Address); u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly); u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO); -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); +int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); +int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value); void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask); void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num); u32 GetDescPrefixMask(int numPrefixBits); u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal); -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml); +int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf); int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset); int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset); int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset); int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset); +void accessdesc_GetPresetData(u8 **AccessDescData, u8 **DepList, ncch_settings *ncchset); +#ifndef PUBLIC_BUILD +void accessdesc_GetPresetSigData(u8 **AccessDescSig, u8 **CXI_Pubk, u8 **CXI_Privk, ncch_settings *ncchset); +#endif + +void ErrorParamNotFound(char *string); /* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys) +int SignAccessDesc(extended_hdr *exHdr, keys_struct *keys) { - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,keys->rsa.AccessDesc_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); + u8 *AccessDesc = (u8*) &exHdr->accessDescriptor.ncchRsaPubKey; + u8 *Signature = (u8*) &exHdr->accessDescriptor.signature; + return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.acexPub,keys->rsa.acexPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys) +int CheckaccessDescSignature(extended_hdr *exHdr, keys_struct *keys) { - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); + u8 *AccessDesc = (u8*) &exHdr->accessDescriptor.ncchRsaPubKey; + u8 *Signature = (u8*) &exHdr->accessDescriptor.signature; + return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.acexPub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); } /* ExHeader Build Functions */ @@ -77,6 +87,9 @@ int BuildExHeader(ncch_settings *ncchset) { int result = 0; + if(ncchset->options.IsCfa) + return 0; + exheader_settings *exhdrset = malloc(sizeof(exheader_settings)); if(!exhdrset) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} init_ExHeaderSettings(exhdrset); @@ -91,7 +104,7 @@ int BuildExHeader(ncch_settings *ncchset) result = set_AccessDesc(exhdrset,ncchset); if(result) goto finish; - exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6] = 5; + exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.flags[6] = 5; finish: if(result) fprintf(stderr,"[EXHEADER ERROR] Failed to create ExHeader\n"); @@ -114,53 +127,53 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * { /* Transfer settings */ exhdrset->keys = ncchset->keys; - exhdrset->yaml = ncchset->yaml_set; - exhdrset->UseAccessDescPreset = ncchset->keys->AccessDescSign.PresetType != not_preset; + exhdrset->rsf = ncchset->rsfSet; + exhdrset->useAccessDescPreset = ncchset->keys->accessDescSign.presetType != not_preset; /* Creating Output Buffer */ - ncchset->Sections.ExHeader.size = 0x800; - ncchset->Sections.ExHeader.buffer = malloc(ncchset->Sections.ExHeader.size); - if(!ncchset->Sections.ExHeader.buffer) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.ExHeader.buffer,0,ncchset->Sections.ExHeader.size); + ncchset->sections.exhdr.size = 0x800; + ncchset->sections.exhdr.buffer = malloc(ncchset->sections.exhdr.size); + if(!ncchset->sections.exhdr.buffer) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} + memset(ncchset->sections.exhdr.buffer,0,ncchset->sections.exhdr.size); /* Import ExHeader Code Section template */ - if(ncchset->ComponentFilePtrs.exheader_size){ - u32 import_size = 0x30; min_u64(0x30,ncchset->ComponentFilePtrs.exheader_size); + if(ncchset->componentFilePtrs.exhdrSize){ + u32 import_size = 0x30; //min_u64(0x30,ncchset->componentFilePtrs.exhdrSize); u32 import_offset = 0x10; - if((import_size+import_offset) > ncchset->ComponentFilePtrs.exheader_size){ + if((import_size+import_offset) > ncchset->componentFilePtrs.exhdrSize){ fprintf(stderr,"[EXHEADER ERROR] Exheader Template is too small\n"); } - ReadFile_64((ncchset->Sections.ExHeader.buffer+import_offset),import_size,import_offset,ncchset->ComponentFilePtrs.exheader); + ReadFile_64((ncchset->sections.exhdr.buffer+import_offset),import_size,import_offset,ncchset->componentFilePtrs.exhdr); } /* Create ExHeader Struct for output */ - exhdrset->ExHdr = (ExtendedHeader_Struct*)ncchset->Sections.ExHeader.buffer; + exhdrset->exHdr = (extended_hdr*)ncchset->sections.exhdr.buffer; /* Set Code Info if Code Section was built not imported */ - if(ncchset->Options.IsBuildingCodeSection){ + if(ncchset->options.IsBuildingCodeSection){ /* BSS Size */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.BssSize,ncchset->CodeDetails.BSS_Size,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.bssSize,ncchset->codeDetails.bssSize,LE); /* Data */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.Address,ncchset->CodeDetails.DataAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.CodeSize,ncchset->CodeDetails.DataSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.NumMaxPages,ncchset->CodeDetails.DataMaxPages,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.dataSectionInfo.address,ncchset->codeDetails.rwAddress,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.dataSectionInfo.codeSize,ncchset->codeDetails.rwSize,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.dataSectionInfo.numMaxPages,ncchset->codeDetails.rwMaxPages,LE); /* RO */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.Address,ncchset->CodeDetails.ROAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.CodeSize,ncchset->CodeDetails.ROSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.NumMaxPages,ncchset->CodeDetails.ROMaxPages,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.readOnlySectionInfo.address,ncchset->codeDetails.roAddress,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.readOnlySectionInfo.codeSize,ncchset->codeDetails.roSize,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.readOnlySectionInfo.numMaxPages,ncchset->codeDetails.roMaxPages,LE); /* Text */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.Address,ncchset->CodeDetails.TextAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.CodeSize,ncchset->CodeDetails.TextSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.NumMaxPages,ncchset->CodeDetails.TextMaxPages,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.textSectionInfo.address,ncchset->codeDetails.textAddress,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.textSectionInfo.codeSize,ncchset->codeDetails.textSize,LE); + u32_to_u8(exhdrset->exHdr->codeSetInfo.textSectionInfo.numMaxPages,ncchset->codeDetails.textMaxPages,LE); } /* Set Simple Flags */ - if(ncchset->Options.CompressCode) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= ExeFsCodeCompress; - if(ncchset->Options.UseOnSD) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= RetailSDAppFlag; - if(!ncchset->Options.UseRomFS) // Move this later - exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo.OtherAttributes |= 1 << attribute_NOT_USE_ROMFS; + if(ncchset->options.CompressCode) + exhdrset->exHdr->codeSetInfo.flags.flag |= Compress; + if(ncchset->options.UseOnSD) + exhdrset->exHdr->codeSetInfo.flags.flag |= RetailSDAppFlag; + if(!ncchset->options.UseRomFS) // Move this later + exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo.otherAttributes |= attribute_NOT_USE_ROMFS; return 0; } @@ -168,25 +181,25 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset) { int result = 0; - result = get_ExHeaderCodeSetInfo(&exhdrset->ExHdr->CodeSetInfo, exhdrset->yaml); + result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf); if(result) goto finish; - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderDependencyList((u8*)&exhdrset->ExHdr->DependencyList[0], exhdrset->yaml); + if(!exhdrset->useAccessDescPreset){ + result = get_ExHeaderDependencyList((u8*)&exhdrset->exHdr->dependencyList[0], exhdrset->rsf); if(result) goto finish; } - result = get_ExHeaderSystemInfo(&exhdrset->ExHdr->SystemInfo, exhdrset->yaml); + result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf); if(result) goto finish; - result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->ExHdr->ARM11SystemLocalCapabilities, exhdrset->yaml, exhdrset->UseAccessDescPreset); + result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf, exhdrset->useAccessDescPreset); if(result) goto finish; - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderARM11KernelInfo(&exhdrset->ExHdr->ARM11KernelCapabilities, exhdrset->yaml); + if(!exhdrset->useAccessDescPreset){ + result = get_ExHeaderARM11KernelInfo(&exhdrset->exHdr->arm11KernelCapabilities, exhdrset->rsf); if(result) goto finish; - result = get_ExHeaderARM9AccessControlInfo(&exhdrset->ExHdr->ARM9AccessControlInfo, exhdrset->yaml); + result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf); if(result) goto finish; } @@ -194,152 +207,128 @@ finish: return result; } -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml) +int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf) { /* Name */ - if(yaml->BasicInfo.Title){ - if(strlen(yaml->BasicInfo.Title) > 8){ - fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long 'BasicInfo/Title'\n"); - return EXHDR_BAD_YAML_OPT; - } - strcpy((char*)CodeSetInfo->Name,yaml->BasicInfo.Title); + if(rsf->BasicInfo.Title){ + //if(strlen(rsf->BasicInfo.Title) > 8){ + // fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long \"BasicInfo/Title\"\n"); + // return EXHDR_BAD_YAML_OPT; + //} + strncpy((char*)CodeSetInfo->name,rsf->BasicInfo.Title,8); } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'BasicInfo/Title'\n"); + ErrorParamNotFound("BasicInfo/Title"); return EXHDR_BAD_YAML_OPT; } /* Stack Size */ - if(yaml->SystemControlInfo.StackSize){ - u32 StackSize = strtoul(yaml->SystemControlInfo.StackSize,NULL,0); - u32_to_u8(CodeSetInfo->StackSize,StackSize,LE); + if(rsf->SystemControlInfo.StackSize){ + u32 StackSize = strtoul(rsf->SystemControlInfo.StackSize,NULL,0); + u32_to_u8(CodeSetInfo->stackSize,StackSize,LE); } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'SystemControlInfo/StackSize'\n"); + ErrorParamNotFound("SystemControlInfo/StackSize"); return EXHDR_BAD_YAML_OPT; } /* Remaster Version */ - if(yaml->SystemControlInfo.RemasterVersion){ - u16 RemasterVersion = strtol(yaml->SystemControlInfo.RemasterVersion,NULL,0); - u16_to_u8(CodeSetInfo->Flags.remasterVersion,RemasterVersion,LE); + if(rsf->SystemControlInfo.RemasterVersion){ + u16 RemasterVersion = strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0); + u16_to_u8(CodeSetInfo->flags.remasterVersion,RemasterVersion,LE); } else{ - u16_to_u8(CodeSetInfo->Flags.remasterVersion,0,LE); + u16_to_u8(CodeSetInfo->flags.remasterVersion,0,LE); } return 0; } -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml) +int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf) { - if(yaml->SystemControlInfo.DependencyNum > 0x30){ + if(rsf->SystemControlInfo.DependencyNum > 0x30){ fprintf(stderr,"[EXHEADER ERROR] Too Many Dependency IDs\n"); return EXHDR_BAD_YAML_OPT; } - for(int i = 0; i < yaml->SystemControlInfo.DependencyNum; i++){ + for(int i = 0; i < rsf->SystemControlInfo.DependencyNum; i++){ u8 *pos = (DependencyList + 0x8*i); - u64 TitleID = strtoull(yaml->SystemControlInfo.Dependency[i],NULL,0); + u64 TitleID = strtoull(rsf->SystemControlInfo.Dependency[i],NULL,0); u64_to_u8(pos,TitleID,LE); } return 0; } -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml) +int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf) { /* SaveDataSize */ - if(yaml->Rom.SaveDataSize){ - u64 SaveDataSize = strtoull(yaml->Rom.SaveDataSize,NULL,10); - if(strstr(yaml->Rom.SaveDataSize,"K")){ - char *str = strstr(yaml->Rom.SaveDataSize,"K"); - if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ - SaveDataSize *= KB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"M")){ - char *str = strstr(yaml->Rom.SaveDataSize,"M"); - if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ - SaveDataSize *= MB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"G")){ - char *str = strstr(yaml->Rom.SaveDataSize,"G"); - if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ - SaveDataSize *= GB; - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; - } - if((SaveDataSize & 65536) != 0){ - fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64_to_u8(SystemInfo->SaveDataSize,SaveDataSize,LE); + if(rsf->Rom.SaveDataSize){ + u64 SaveDataSize = 0; + int ret = GetSaveDataSizeFromString(&SaveDataSize,rsf->Rom.SaveDataSize); + if(ret) return ret; + u64_to_u8(SystemInfo->savedataSize,SaveDataSize,LE); } else{ - u64_to_u8(SystemInfo->SaveDataSize,0,LE); + u64_to_u8(SystemInfo->savedataSize,0,LE); } /* Jump Id */ - if(yaml->SystemControlInfo.JumpId){ - u64 JumpId = strtoull(yaml->SystemControlInfo.JumpId,NULL,0); - u64_to_u8(SystemInfo->JumpId,JumpId,LE); + if(rsf->SystemControlInfo.JumpId){ + u64 JumpId = strtoull(rsf->SystemControlInfo.JumpId,NULL,0); + u64_to_u8(SystemInfo->jumpId,JumpId,LE); } else{ u64 JumpId = 0; - int result = GetProgramID(&JumpId,yaml,false); + int result = GetProgramID(&JumpId,rsf,false); if(result) return result; - u64_to_u8(SystemInfo->JumpId,JumpId,LE); + u64_to_u8(SystemInfo->jumpId,JumpId,LE); } return 0; } -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset) +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset) { /* Program Id */ u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,yaml,true); + int result = GetProgramID(&ProgramId,rsf,true); if(result) return result; - u64_to_u8(arm11->ProgramId,ProgramId,LE); + u64_to_u8(arm11->programId,ProgramId,LE); - if(!UseAccessDescPreset){ + if(!useAccessDescPreset){ /* Flags */ - result = SetARM11SystemLocalInfoFlags(arm11, yaml); + result = SetARM11SystemLocalInfoFlags(arm11, rsf); if(result) return result; /* Resource Limit Descriptors */ - result = SetARM11ResLimitDesc(arm11, yaml); + result = SetARM11ResLimitDesc(arm11, rsf); if(result) return result; } /* Storage Info */ - result = SetARM11StorageInfo(arm11, yaml); + result = SetARM11StorageInfo(arm11, rsf); if(result) return result; - if(!UseAccessDescPreset){ + if(!useAccessDescPreset){ /* Service Access Control */ - result = SetARM11ServiceAccessControl(arm11, yaml); + result = SetARM11ServiceAccessControl(arm11, rsf); if(result) return result; /* Resource Limit Category */ - if(yaml->AccessControlInfo.ResourceLimitCategory){ - if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->ResourceLimitCategory = resrc_limit_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_SYS_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_LIB_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->ResourceLimitCategory = resrc_limit_OTHER; + if(rsf->AccessControlInfo.ResourceLimitCategory){ + if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->resourceLimitCategory = resrc_limit_APPLICATION; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->resourceLimitCategory = resrc_limit_SYS_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->resourceLimitCategory = resrc_limit_LIB_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->resourceLimitCategory = resrc_limit_OTHER; } } /* Finish */ return 0; } -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { /* Core Version */ - if(yaml->AccessControlInfo.CoreVersion){ - u32 Version = strtoul(yaml->AccessControlInfo.CoreVersion,NULL,0); - u32_to_u8(&arm11->Flags[0],Version,LE); + if(rsf->AccessControlInfo.CoreVersion){ + u32 Version = strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0); + u32_to_u8(&arm11->flags[0],Version,LE); } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/CoreVersion'\n"); + ErrorParamNotFound("AccessControlInfo/CoreVersion"); return EXHDR_BAD_YAML_OPT; } @@ -347,34 +336,34 @@ int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ u8 AffinityMask = 0; u8 IdealProcessor = 0; u8 SystemMode = 0; - if(yaml->AccessControlInfo.AffinityMask){ - AffinityMask = strtol(yaml->AccessControlInfo.AffinityMask,NULL,0); + if(rsf->AccessControlInfo.AffinityMask){ + AffinityMask = strtol(rsf->AccessControlInfo.AffinityMask,NULL,0); if(AffinityMask > 1){ fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",AffinityMask); return EXHDR_BAD_YAML_OPT; } } - if(yaml->AccessControlInfo.IdealProcessor){ - IdealProcessor = strtol(yaml->AccessControlInfo.IdealProcessor,NULL,0); + if(rsf->AccessControlInfo.IdealProcessor){ + IdealProcessor = strtol(rsf->AccessControlInfo.IdealProcessor,NULL,0); if(IdealProcessor > 1){ fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",IdealProcessor); return EXHDR_BAD_YAML_OPT; } } - if(yaml->AccessControlInfo.SystemMode){ - SystemMode = strtol(yaml->AccessControlInfo.SystemMode,NULL,0); + if(rsf->AccessControlInfo.SystemMode){ + SystemMode = strtol(rsf->AccessControlInfo.SystemMode,NULL,0); if(SystemMode > 15){ fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",SystemMode); return EXHDR_BAD_YAML_OPT; } } - arm11->Flags[6] = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); + arm11->flags[6] = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); /* Thread Priority */ - if(yaml->AccessControlInfo.Priority){ - u8 Priority = strtoul(yaml->AccessControlInfo.Priority,NULL,0); + if(rsf->AccessControlInfo.Priority){ + u8 Priority = strtoul(rsf->AccessControlInfo.Priority,NULL,0); int ProccessType = 0; - GetAppType(&ProccessType,yaml); + GetAppType(&ProccessType,rsf); if(ProccessType == processtype_APPLICATION || ProccessType == processtype_DEFAULT){ Priority += 32; } @@ -382,34 +371,34 @@ int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority); return EXHDR_BAD_YAML_OPT; } - arm11->Flags[7] = Priority; + arm11->flags[7] = Priority; } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/Priority'\n"); + ErrorParamNotFound("AccessControlInfo/Priority"); return EXHDR_BAD_YAML_OPT; } return 0; } -int GetAppType(int *AppType, rsf_settings *yaml) +int GetAppType(int *AppType, rsf_settings *rsf) { *AppType = processtype_DEFAULT; - if(yaml->SystemControlInfo.AppType){ - if(strcasecmp(yaml->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; - else if(strcasecmp(yaml->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; + if(rsf->SystemControlInfo.AppType){ + if(strcasecmp(rsf->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; + else if(strcasecmp(rsf->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; } return 0; } -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { for(int i = 0; i < 16; i++){ if(i == 0){ /* MaxCpu */ // N's makerom actually reads this from the pre-made accessdesc. Damn cheaters. But we can improvise - if(yaml->AccessControlInfo.MaxCpu){ - arm11->ResourceLimitDescriptor[i][0] = strtol(yaml->AccessControlInfo.MaxCpu,NULL,0); + if(rsf->AccessControlInfo.MaxCpu){ + arm11->resourceLimitDescriptor[i][0] = strtol(rsf->AccessControlInfo.MaxCpu,NULL,0); } } } @@ -417,167 +406,167 @@ int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings return 0; } -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(yaml->AccessControlInfo.UseExtendedSaveDataAccessControl || yaml->AccessControlInfo.AccessibleSaveDataIds){ + if(rsf->AccessControlInfo.UseExtendedSaveDataAccessControl || rsf->AccessControlInfo.AccessibleSaveDataIds){ /* Accessible SaveData IDs */ - if(!CheckCondiditionsForNewAccessibleSaveDataIds(yaml)) + if(!CheckCondiditionsForNewAccessibleSaveDataIds(rsf)) return EXHDR_BAD_YAML_OPT; - SetARM11StorageInfoAccessibleSaveDataIds(arm11,yaml); + SetARM11StorageInfoAccessibleSaveDataIds(arm11,rsf); } else{ /* Extdata Id */ - int ret = SetARM11StorageInfoExtSaveDataId(arm11,yaml); + int ret = SetARM11StorageInfoExtSaveDataId(arm11,rsf); if(ret) return ret; /* OtherUserSaveData */ - SetARM11StorageInfoOtherUserSaveData(arm11,yaml); + SetARM11StorageInfoOtherUserSaveData(arm11,rsf); } /* System Savedata Id */ - SetARM11StorageInfoSystemSaveDataId(arm11,yaml); + SetARM11StorageInfoSystemSaveDataId(arm11,rsf); /* FileSystem Access Info */ u32 AccessInfo = 0; - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_APPLICATION; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HARDWARE_CHECK; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_FILE_SYSTEM_TOOL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= 1 << fsaccess_DEBUG; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= 1 << fsaccess_TWL_CARD_BACKUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= 1 << fsaccess_TWL_NAND_DATA; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= 1 << fsaccess_BOSS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= 1 << fsaccess_CORE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RW; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_SETTINGS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= 1 << fsaccess_CARD_BOARD; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= 1 << fsaccess_EXPORT_IMPORT_IVS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= 1 << fsaccess_SWITCH_CLEANUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= 1 << fsaccess_SAVE_DATA_MOVE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= 1 << fsaccess_SHOP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= 1 << fsaccess_SHELL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HOME_MENU; + for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ + if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) + AccessInfo |= fsaccess_CATEGORY_SYSTEM_APPLICATION; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) + AccessInfo |= fsaccess_CATEGORY_HARDWARE_CHECK; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) + AccessInfo |= fsaccess_CATEGORY_FILE_SYSTEM_TOOL; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) + AccessInfo |= fsaccess_DEBUG; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) + AccessInfo |= fsaccess_TWL_CARD_BACKUP; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) + AccessInfo |= fsaccess_TWL_NAND_DATA; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) + AccessInfo |= fsaccess_BOSS; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) + AccessInfo |= fsaccess_DIRECT_SDMC; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Core") == 0) + AccessInfo |= fsaccess_CORE; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) + AccessInfo |= fsaccess_CTR_NAND_RO; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) + AccessInfo |= fsaccess_CTR_NAND_RW; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) + AccessInfo |= fsaccess_CTR_NAND_RO_WRITE; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) + AccessInfo |= fsaccess_CATEGORY_SYSTEM_SETTINGS; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) + AccessInfo |= fsaccess_CARD_BOARD; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) + AccessInfo |= fsaccess_EXPORT_IMPORT_IVS; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) + AccessInfo |= fsaccess_DIRECT_SDMC_WRITE; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) + AccessInfo |= fsaccess_SWITCH_CLEANUP; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) + AccessInfo |= fsaccess_SAVE_DATA_MOVE; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) + AccessInfo |= fsaccess_SHOP; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) + AccessInfo |= fsaccess_SHELL; + else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) + AccessInfo |= fsaccess_CATEGORY_HOME_MENU; else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: '%s'\n",yaml->AccessControlInfo.FileSystemAccess[i]); + fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: \"%s\"\n",rsf->AccessControlInfo.FileSystemAccess[i]); return EXHDR_BAD_YAML_OPT; } } - u32_to_u8(arm11->StorageInfo.AccessInfo,AccessInfo,LE); + u32_to_u8(arm11->storageInfo.accessInfo,AccessInfo,LE); return 0; } -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(yaml->AccessControlInfo.SystemSaveDataId1){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId1,NULL,0); - u32_to_u8(arm11->StorageInfo.SystemSaveDataId,SaveId,LE); + if(rsf->AccessControlInfo.SystemSaveDataId1){ + u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId1,NULL,0); + u32_to_u8(arm11->storageInfo.systemSavedataId,SaveId,LE); } - if(yaml->AccessControlInfo.SystemSaveDataId2){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId2,NULL,0); - u32_to_u8(&arm11->StorageInfo.SystemSaveDataId[4],SaveId,LE); + if(rsf->AccessControlInfo.SystemSaveDataId2){ + u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId2,NULL,0); + u32_to_u8(&arm11->storageInfo.systemSavedataId[4],SaveId,LE); } return 0; } -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(yaml->AccessControlInfo.ExtSaveDataId){ - if(!yaml->AccessControlInfo.UseExtSaveData){ + if(rsf->AccessControlInfo.ExtSaveDataId){ + if(!rsf->AccessControlInfo.UseExtSaveData){ fprintf(stderr,"[EXHEADER ERROR] Failed to set ExtSaveDataId. UseExtSaveData must be true.\n"); return EXHDR_BAD_YAML_OPT; } - u64 ExtdataId = strtoull(yaml->AccessControlInfo.ExtSaveDataId,NULL,0); - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,ExtdataId,LE); + u64 ExtdataId = strtoull(rsf->AccessControlInfo.ExtSaveDataId,NULL,0); + u64_to_u8(arm11->storageInfo.extSavedataId,ExtdataId,LE); } return 0; } -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { u64 Value = 0; - if(yaml->AccessControlInfo.OtherUserSaveDataId1) - Value = 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0); + if(rsf->AccessControlInfo.OtherUserSaveDataId1) + Value = 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0); Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId2) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0); + if(rsf->AccessControlInfo.OtherUserSaveDataId2) + Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0); Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId3) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0); + if(rsf->AccessControlInfo.OtherUserSaveDataId3) + Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0); /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ + if(rsf->AccessControlInfo.UseOtherVariationSaveData) Value |= 0x1000000000000000; - } - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,Value,LE); + + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,Value,LE); return 0; } -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml) +bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf) { - if(!yaml->AccessControlInfo.UseExtendedSaveDataAccessControl){ - if(yaml->AccessControlInfo.AccessibleSaveDataIds) + if(!rsf->AccessControlInfo.UseExtendedSaveDataAccessControl){ + if(rsf->AccessControlInfo.AccessibleSaveDataIds) fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds is unavailable if UseExtendedSaveDataAccessControl is false.\n"); return false; } /* - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ + if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds must be specified if UseExtendedSaveDataAccessControl is true.\n"); return false; } */ - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ + if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ fprintf(stderr,"[EXHEADER ERROR] Too many UniqueId in \"AccessibleSaveDataIds\".\n"); return false; } - if(yaml->AccessControlInfo.UseExtSaveData){ + if(rsf->AccessControlInfo.UseExtSaveData){ fprintf(stderr,"[EXHEADER ERROR] UseExtSaveData must be false if AccessibleSaveDataIds is specified.\n"); return false; } - if (yaml->AccessControlInfo.ExtSaveDataId){ + if (rsf->AccessControlInfo.ExtSaveDataId){ fprintf(stderr,"[EXHEADER ERROR] ExtSaveDataId is unavailable if AccessibleSaveDataIds is specified.\n"); return false; } - if (yaml->AccessControlInfo.OtherUserSaveDataId1){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ + if (rsf->AccessControlInfo.OtherUserSaveDataId1){ + if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); return false; } } - if (yaml->AccessControlInfo.OtherUserSaveDataId2){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ + if (rsf->AccessControlInfo.OtherUserSaveDataId2){ + if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); return false; } } - if (yaml->AccessControlInfo.OtherUserSaveDataId3){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ + if (rsf->AccessControlInfo.OtherUserSaveDataId3){ + if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); return false; } @@ -585,80 +574,79 @@ bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml) return true; } -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { u64 RegionExtSaveDataId = 0; u64 RegionOtherUseSaveData = 0; - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ - u32 Max = yaml->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? yaml->AccessControlInfo.AccessibleSaveDataIdsNum : 3; + if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ + u32 Max = rsf->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? rsf->AccessControlInfo.AccessibleSaveDataIdsNum : 3; for(int i = 0; i < Max; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); RegionOtherUseSaveData = RegionOtherUseSaveData << 20; RegionOtherUseSaveData |= UniqueID; } } - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ - for(int i = 3; i < yaml->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ + for(int i = 3; i < rsf->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ + u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); RegionExtSaveDataId = RegionExtSaveDataId << 20; RegionExtSaveDataId |= UniqueID; } } - arm11->StorageInfo.OtherAttributes |= 1 << attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; + arm11->storageInfo.otherAttributes |= attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ + if(rsf->AccessControlInfo.UseOtherVariationSaveData) RegionOtherUseSaveData |= 0x1000000000000000; - } - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,RegionExtSaveDataId,LE); - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,RegionOtherUseSaveData,LE); + u64_to_u8(arm11->storageInfo.extSavedataId,RegionExtSaveDataId,LE); + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,RegionOtherUseSaveData,LE); return 0; } -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) +int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(yaml->AccessControlInfo.ServiceAccessControl){ - if(yaml->AccessControlInfo.ServiceAccessControlNum > 32){ + if(rsf->AccessControlInfo.ServiceAccessControl){ + if(rsf->AccessControlInfo.ServiceAccessControlNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too Many Service Names, maximum is 32\n"); return EXHDR_BAD_YAML_OPT; } - for(int i = 0; i < yaml->AccessControlInfo.ServiceAccessControlNum; i++){ - int svc_handle_len = strlen(yaml->AccessControlInfo.ServiceAccessControl[i]); + for(int i = 0; i < rsf->AccessControlInfo.ServiceAccessControlNum; i++){ + int svc_handle_len = strlen(rsf->AccessControlInfo.ServiceAccessControl[i]); if(svc_handle_len > 8){ - fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",yaml->AccessControlInfo.ServiceAccessControl[i]); + fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",rsf->AccessControlInfo.ServiceAccessControl[i]); return EXHDR_BAD_YAML_OPT; } - memcpy(arm11->ServiceAccessControl[i],yaml->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); + memcpy(arm11->serviceAccessControl[i],rsf->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); } } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: \"AccessControlInfo/ServiceAccessControl\"\n"); + ErrorParamNotFound("AccessControlInfo/ServiceAccessControl"); return EXHDR_BAD_YAML_OPT; } return 0; } -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml) +int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf) { int result = 0; ARM11KernelCapabilityDescriptor desc[6]; memset(&desc,0,sizeof(ARM11KernelCapabilityDescriptor)*6); /* Get Descriptors */ - result = SetARM11KernelDescSysCallControl(&desc[0],yaml); + result = SetARM11KernelDescSysCallControl(&desc[0],rsf); if(result) goto finish; - result = SetARM11KernelDescInteruptNumList(&desc[1],yaml); + result = SetARM11KernelDescInteruptNumList(&desc[1],rsf); if(result) goto finish; - result = SetARM11KernelDescAddressMapping(&desc[2],yaml); + result = SetARM11KernelDescAddressMapping(&desc[2],rsf); if(result) goto finish; - result = SetARM11KernelDescOtherCapabilities(&desc[3],yaml); + result = SetARM11KernelDescOtherCapabilities(&desc[3],rsf); if(result) goto finish; - result = SetARM11KernelDescHandleTableSize(&desc[4],yaml); + result = SetARM11KernelDescHandleTableSize(&desc[4],rsf); if(result) goto finish; - result = SetARM11KernelDescReleaseKernelVersion(&desc[5],yaml); + result = SetARM11KernelDescReleaseKernelVersion(&desc[5],rsf); /* Write Descriptors To Exheader */ u16 TotalDesc = 0; @@ -690,7 +678,7 @@ finish: return result; } -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; @@ -703,7 +691,7 @@ int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_ SetARM11KernelDescValue(&tmp,i,desc_SysCallControl | (i << 24)); // Get SysCalls - ret = GetARM11SysCalls(&tmp,yaml); + ret = GetARM11SysCalls(&tmp,rsf); if(ret) goto finish; // Count Active Syscall Descs @@ -728,14 +716,14 @@ finish: return ret; } -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!yaml->AccessControlInfo.SystemCallAccess){ - fprintf(stderr,"[EXHEADER ERROR] Parameter not found: 'AccessControlInfo/SystemCallAccess'\n"); + if(!rsf->AccessControlInfo.SystemCallAccess){ + ErrorParamNotFound("AccessControlInfo/SystemCallAccess"); return EXHDR_BAD_YAML_OPT; } - for(int i = 0; i < yaml->AccessControlInfo.SystemCallAccessNum; i++){ - int SysCall = strtoul(yaml->AccessControlInfo.SystemCallAccess[i],NULL,0); + for(int i = 0; i < rsf->AccessControlInfo.SystemCallAccessNum; i++){ + int SysCall = strtoul(rsf->AccessControlInfo.SystemCallAccess[i],NULL,0); if(SysCall > 184){ fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",SysCall); return EXHDR_BAD_YAML_OPT; @@ -760,7 +748,7 @@ void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) desc->Data[num] = desc->Data[num] & ~(1 << (num1 & 31)); } -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; @@ -771,7 +759,7 @@ int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf AllocateARM11KernelDescMemory(&tmp,8); // Get Interupts - ret = GetARM11Interupts(&tmp,yaml); + ret = GetARM11Interupts(&tmp,rsf); if(ret) goto finish; // Count Active Interupt Descs @@ -796,17 +784,17 @@ finish: return ret; } -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!yaml->AccessControlInfo.InterruptNumbers){ + if(!rsf->AccessControlInfo.InterruptNumbers){ return 0; } - if(yaml->AccessControlInfo.InterruptNumbersNum > 32){ + if(rsf->AccessControlInfo.InterruptNumbersNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too many Interupts. Maximum is 32\n"); return EXHDR_BAD_YAML_OPT; } - for(int i = 0; i < yaml->AccessControlInfo.InterruptNumbersNum; i++){ - int Interrupt = strtoul(yaml->AccessControlInfo.InterruptNumbers[i],NULL,0); + for(int i = 0; i < rsf->AccessControlInfo.InterruptNumbersNum; i++){ + int Interrupt = strtoul(rsf->AccessControlInfo.InterruptNumbers[i],NULL,0); if(Interrupt > 0x7f){ fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",Interrupt); return EXHDR_BAD_YAML_OPT; @@ -825,7 +813,7 @@ void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i) desc->Data[num] |= Interrupt; } -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; // Create Temporary Descriptors @@ -835,11 +823,11 @@ int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_ memset(&static_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); // Getting IO Mapping - ret = GetARM11IOMappings(&io_tmp,yaml); + ret = GetARM11IOMappings(&io_tmp,rsf); if(ret) goto finish; // Getting Static Mapping - ret = GetARM11StaticMappings(&static_tmp,yaml); + ret = GetARM11StaticMappings(&static_tmp,rsf); if(ret) goto finish; @@ -861,17 +849,17 @@ finish: return ret; } -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!yaml->AccessControlInfo.IORegisterMapping) + if(!rsf->AccessControlInfo.IORegisterMapping) return 0; - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.IORegisterMappingNum*2); + AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.IORegisterMappingNum*2); u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.IORegisterMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.IORegisterMapping[i])){ + for(int i = 0; i < rsf->AccessControlInfo.IORegisterMappingNum; i++){ + if(strlen(rsf->AccessControlInfo.IORegisterMapping[i])){ // Parse Address String - char *AddressStartStr = yaml->AccessControlInfo.IORegisterMapping[i]; + char *AddressStartStr = rsf->AccessControlInfo.IORegisterMapping[i]; char *AddressEndStr = strstr(AddressStartStr,"-"); if(AddressEndStr){ if(strlen(AddressEndStr) > 1) // if not just '-' @@ -919,16 +907,16 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml return 0; } -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!yaml->AccessControlInfo.MemoryMapping) + if(!rsf->AccessControlInfo.MemoryMapping) return 0; - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.MemoryMappingNum*2); + AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.MemoryMappingNum*2); u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.MemoryMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.MemoryMapping[i])){ - char *AddressStartStr = yaml->AccessControlInfo.MemoryMapping[i]; + for(int i = 0; i < rsf->AccessControlInfo.MemoryMappingNum; i++){ + if(strlen(rsf->AccessControlInfo.MemoryMapping[i])){ + char *AddressStartStr = rsf->AccessControlInfo.MemoryMapping[i]; char *AddressEndStr = strstr(AddressStartStr,"-"); char *ROFlagStr = strstr(AddressStartStr,":"); bool IsRO = false; @@ -1014,39 +1002,39 @@ u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO) return Desc; } -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { u32 OtherCapabilities = 0; - if(!yaml->AccessControlInfo.DisableDebug) - OtherCapabilities |= 1 << othcap_PERMIT_DEBUG; - if(yaml->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= 1 << othcap_FORCE_DEBUG; - if(yaml->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= 1 << othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; - if(yaml->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= 1 << othcap_CAN_WRITE_SHARED_PAGE; - if(yaml->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= 1 << othcap_CAN_USE_PRIVILEGE_PRIORITY; - if(yaml->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= 1 << othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; - if(yaml->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= 1 << othcap_CAN_SHARE_DEVICE_MEMORY; - if(yaml->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= 1 << othcap_RUNNABLE_ON_SLEEP; - if(yaml->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= 1 << othcap_SPECIAL_MEMORY_ARRANGE; + if(!rsf->AccessControlInfo.DisableDebug) + OtherCapabilities |= othcap_PERMIT_DEBUG; + if(rsf->AccessControlInfo.EnableForceDebug) + OtherCapabilities |= othcap_FORCE_DEBUG; + if(rsf->AccessControlInfo.CanUseNonAlphabetAndNumber) + OtherCapabilities |= othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; + if(rsf->AccessControlInfo.CanWriteSharedPage) + OtherCapabilities |= othcap_CAN_WRITE_SHARED_PAGE; + if(rsf->AccessControlInfo.CanUsePrivilegedPriority) + OtherCapabilities |= othcap_CAN_USE_PRIVILEGE_PRIORITY; + if(rsf->AccessControlInfo.PermitMainFunctionArgument) + OtherCapabilities |= othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; + if(rsf->AccessControlInfo.CanShareDeviceMemory) + OtherCapabilities |= othcap_CAN_SHARE_DEVICE_MEMORY; + if(rsf->AccessControlInfo.RunnableOnSleep) + OtherCapabilities |= othcap_RUNNABLE_ON_SLEEP; + if(rsf->AccessControlInfo.SpecialMemoryArrange) + OtherCapabilities |= othcap_SPECIAL_MEMORY_ARRANGE; - if(yaml->AccessControlInfo.MemoryType){ + if(rsf->AccessControlInfo.MemoryType){ u32 MemType = 0; - if(strcasecmp(yaml->AccessControlInfo.MemoryType,"application") == 0) + if(strcasecmp(rsf->AccessControlInfo.MemoryType,"application") == 0) MemType = memtype_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"system") == 0) + else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"system") == 0) MemType = memtype_SYSTEM; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"base") == 0) + else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"base") == 0) MemType = memtype_BASE; else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: '%s'\n",yaml->AccessControlInfo.MemoryType); + fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: \"%s\"\n",rsf->AccessControlInfo.MemoryType); return EXHDR_BAD_YAML_OPT; } OtherCapabilities = (OtherCapabilities & 0xffffff0f) | MemType << 8; @@ -1060,10 +1048,10 @@ int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, r return 0; } -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(yaml->AccessControlInfo.HandleTableSize){ - u16 HandleTableSize = strtoul(yaml->AccessControlInfo.HandleTableSize,NULL,0); + if(rsf->AccessControlInfo.HandleTableSize){ + u16 HandleTableSize = strtoul(rsf->AccessControlInfo.HandleTableSize,NULL,0); if(HandleTableSize > 1023){ fprintf(stderr,"[EXHEADER ERROR] Too large handle table size\n"); return EXHDR_BAD_YAML_OPT; @@ -1073,19 +1061,19 @@ int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf SetARM11KernelDescValue(desc,0,HandleTableSize); } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/HandleTableSize'\n"); + ErrorParamNotFound("AccessControlInfo/HandleTableSize"); return EXHDR_BAD_YAML_OPT; } return 0; } -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) +int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(yaml->AccessControlInfo.ReleaseKernelMajor && yaml->AccessControlInfo.ReleaseKernelMinor){ - u32 releaseKernelMajor = strtoul(yaml->AccessControlInfo.ReleaseKernelMajor,NULL,0); - u32 releaseKernelMinor = strtoul(yaml->AccessControlInfo.ReleaseKernelMinor,NULL,0); + if(rsf->AccessControlInfo.ReleaseKernelMajor && rsf->AccessControlInfo.ReleaseKernelMinor){ + u32 releaseKernelMajor = strtoul(rsf->AccessControlInfo.ReleaseKernelMajor,NULL,0); + u32 releaseKernelMinor = strtoul(rsf->AccessControlInfo.ReleaseKernelMinor,NULL,0); if (releaseKernelMajor > 255 || releaseKernelMinor > 255){ - fprintf(stderr,"[EXHEADER ERROR] Invalid release kernel version"); + fprintf(stderr,"[EXHEADER ERROR] Invalid release kernel Version"); } AllocateARM11KernelDescMemory(desc,1); SetARM11KernelDescBitmask(desc,desc_KernelReleaseVersion); @@ -1125,47 +1113,47 @@ u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal) return PrefixVal << (32 - (numPrefixBits & 31)); } -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml) +int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf) { u32 Arm9AccessControl = 0; - for(int i = 0; i < yaml->AccessControlInfo.IoAccessControlNum; i++){ - if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_TWLN; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_WNAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_CARD_SPI; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_SDIF3; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= 1 << arm9cap_CREATE_SEED; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_CARD_SPI; + for(int i = 0; i < rsf->AccessControlInfo.IoAccessControlNum; i++){ + if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) + Arm9AccessControl |= arm9cap_FS_MOUNT_NAND; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) + Arm9AccessControl |= arm9cap_FS_MOUNT_NAND_RO_WRITE; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) + Arm9AccessControl |= arm9cap_FS_MOUNT_TWLN; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) + Arm9AccessControl |= arm9cap_FS_MOUNT_WNAND; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) + Arm9AccessControl |= arm9cap_FS_MOUNT_CARD_SPI; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) + Arm9AccessControl |= arm9cap_USE_SDIF3; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) + Arm9AccessControl |= arm9cap_CREATE_SEED; + else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) + Arm9AccessControl |= arm9cap_USE_CARD_SPI; else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: '%s'\n",yaml->AccessControlInfo.IoAccessControl[i]); + fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: \"%s\"\n",rsf->AccessControlInfo.IoAccessControl[i]); return EXHDR_BAD_YAML_OPT; } } - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_DIRECT_SDMC; + for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ + if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) + Arm9AccessControl |= arm9cap_USE_DIRECT_SDMC; } - if(yaml->Option.UseOnSD) - Arm9AccessControl |= 1 << arm9cap_SD_APPLICATION; + if(rsf->Option.UseOnSD) + Arm9AccessControl |= arm9cap_SD_APPLICATION; u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); - if(yaml->AccessControlInfo.DescVersion){ - arm9->descriptors[15] = strtol(yaml->AccessControlInfo.DescVersion,NULL,0); + if(rsf->AccessControlInfo.DescVersion){ + arm9->descriptors[15] = strtol(rsf->AccessControlInfo.DescVersion,NULL,0); } else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/DescVersion'\n"); + ErrorParamNotFound("AccessControlInfo/DescVersion"); return EXHDR_BAD_YAML_OPT; } @@ -1176,12 +1164,12 @@ int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_set int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset) { - if(ncchset->keys->AccessDescSign.PresetType == not_preset){ - if(ncchset->yaml_set->CommonHeaderKey.Found) + if(ncchset->keys->accessDescSign.presetType == not_preset){ + if(ncchset->rsfSet->CommonHeaderKey.Found) // Keydata exists in RSF return accessdesc_GetSignFromRsf(exhdrset,ncchset); - else if(!ncchset->keys->rsa.RequiresPresignedDesc) + else if(!ncchset->keys->rsa.requiresPresignedDesc) // Else if The AccessDesc can be signed with key return accessdesc_SignWithKey(exhdrset,ncchset); - else{ + else{ // No way the access desc signature can be 'obtained' fprintf(stderr,"[EXHEADER ERROR] Current keyset cannot sign AccessDesc, please appropriatly setup RSF, or specify a preset with -accessdesc\n"); return CANNOT_SIGN_ACCESSDESC; } @@ -1192,83 +1180,83 @@ int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset) int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset) { /* Set RSA Keys */ - memcpy(ncchset->CxiRsaKey.PrivK,exhdrset->keys->rsa.CFA_Priv,0x100); - memcpy(ncchset->CxiRsaKey.PubK,exhdrset->keys->rsa.CFA_Pub,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,exhdrset->keys->rsa.CFA_Pub,0x100); + memcpy(exhdrset->keys->rsa.cxiHdrPvt,exhdrset->keys->rsa.cciCfaPvt,0x100); + memcpy(exhdrset->keys->rsa.cxiHdrPub,exhdrset->keys->rsa.cciCfaPub,0x100); + memcpy(&exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100); /* Copy Data From ExHeader */ - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,&exhdrset->ExHdr->ARM11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities)); - u8 *byte6 = &exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)+1; + memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,&exhdrset->exHdr->arm11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities)); + u8 *byte6 = &exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.flags[6]; + u8 SystemMode = (*byte6>>4)&0xF; + u8 AffinityMask = (*byte6>>2)&0x3; + u8 IdealProcessor = ((*byte6>>0)&0x3)+1; *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11KernelCapabilities,&exhdrset->ExHdr->ARM11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM9AccessControlInfo,&exhdrset->ExHdr->ARM9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo)); + memcpy(&exhdrset->exHdr->accessDescriptor.arm11KernelCapabilities,&exhdrset->exHdr->arm11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities)); + memcpy(&exhdrset->exHdr->accessDescriptor.arm9AccessControlInfo,&exhdrset->exHdr->arm9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo)); /* Sign AccessDesc */ - return SignAccessDesc(exhdrset->ExHdr,exhdrset->keys); + return SignAccessDesc(exhdrset->exHdr,exhdrset->keys); } int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset) { /* Yaml Option Sanity Checks */ - if(!exhdrset->yaml->CommonHeaderKey.Found){ - fprintf(stderr,"[EXHEADER ERROR] RSF Section 'CommonHeaderKey' not found\n"); + if(!exhdrset->rsf->CommonHeaderKey.Found){ + fprintf(stderr,"[EXHEADER ERROR] RSF Section \"CommonHeaderKey\" not found\n"); return COMMON_HEADER_KEY_NOT_FOUND; } - if(!exhdrset->yaml->CommonHeaderKey.D){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' not found\n"); + if(!exhdrset->rsf->CommonHeaderKey.D){ + ErrorParamNotFound("CommonHeaderKey/D"); return COMMON_HEADER_KEY_NOT_FOUND; } - if(strlen(exhdrset->yaml->CommonHeaderKey.D) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.D)); + if(strlen(exhdrset->rsf->CommonHeaderKey.D) != 350){ + fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/D\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.D)); return COMMON_HEADER_KEY_NOT_FOUND; } - if(!exhdrset->yaml->CommonHeaderKey.Modulus){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' not found\n"); + if(!exhdrset->rsf->CommonHeaderKey.Modulus){ + ErrorParamNotFound("CommonHeaderKey/Modulus"); return COMMON_HEADER_KEY_NOT_FOUND; } - if(strlen(exhdrset->yaml->CommonHeaderKey.Modulus) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); + if(strlen(exhdrset->rsf->CommonHeaderKey.Modulus) != 350){ + fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Modulus\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.Modulus)); return COMMON_HEADER_KEY_NOT_FOUND; } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescSign){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' not found\n"); + if(!exhdrset->rsf->CommonHeaderKey.AccCtlDescSign){ + ErrorParamNotFound("CommonHeaderKey/Signature"); return COMMON_HEADER_KEY_NOT_FOUND; } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); + if(strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign) != 350){ + fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Signature\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign)); return COMMON_HEADER_KEY_NOT_FOUND; } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescBin){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' not found\n"); + if(!exhdrset->rsf->CommonHeaderKey.AccCtlDescBin){ + ErrorParamNotFound("CommonHeaderKey/Descriptor"); return COMMON_HEADER_KEY_NOT_FOUND; } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin) != 695){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); + if(strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin) != 695){ + fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Descriptor\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin)); return COMMON_HEADER_KEY_NOT_FOUND; } /* Set RSA Keys */ int result = 0; u32 out = 0x500; u8 *tmp = malloc(0x500); - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.Modulus,strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); + result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.Modulus,strlen(exhdrset->rsf->CommonHeaderKey.Modulus)); if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PubK,tmp,0x100); + memcpy(exhdrset->keys->rsa.cxiHdrPub,tmp,0x100); out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.D,strlen(exhdrset->yaml->CommonHeaderKey.D)); + result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.D,strlen(exhdrset->rsf->CommonHeaderKey.D)); if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PrivK,tmp,0x100); + memcpy(exhdrset->keys->rsa.cxiHdrPvt,tmp,0x100); /* Set AccessDesc */ out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescSign,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); + result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescSign,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign)); if(result) goto finish; - memcpy(exhdrset->ExHdr->AccessDescriptor.signature,tmp,0x100); - memcpy(exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,ncchset->CxiRsaKey.PubK,0x100); + memcpy(exhdrset->exHdr->accessDescriptor.signature,tmp,0x100); + memcpy(exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100); out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); + result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin)); if(result) goto finish; - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,tmp,0x200); + memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,tmp,0x200); finish: free(tmp); return result; @@ -1276,85 +1264,17 @@ finish: int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset) { - u8 *AccessDescSig = NULL; u8 *AccessDescData = NULL; u8 *DepList = NULL; + u8 *AccessDescSig = NULL; u8 *CXI_Pubk = NULL; u8 *CXI_Privk = NULL; - if(ncchset->keys->AccessDescSign.PresetType == app){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)App_sdk1_AcexSig; - AccessDescData = (u8*)App_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)App_sdk1_HdrPubK; - CXI_Privk = (u8*)App_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)App_sdk2_AcexSig; - AccessDescData = (u8*)App_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)App_sdk2_HdrPubK; - CXI_Privk = (u8*)App_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)App_sdk4_AcexSig; - AccessDescData = (u8*)App_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)App_sdk4_HdrPubK; - CXI_Privk = (u8*)App_sdk4_HdrPrivK; - break; - case 7: - AccessDescSig = NULL; - AccessDescData = (u8*)App_sdk7_AcexData; - DepList = (u8*)sdk7_dep_list; - CXI_Pubk = NULL; - CXI_Privk = NULL; - break; - - } - } - else if(ncchset->keys->AccessDescSign.PresetType == dlp){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)Dlp_sdk1_AcexSig; - AccessDescData = (u8*)Dlp_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)Dlp_sdk1_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)Dlp_sdk2_AcexSig; - AccessDescData = (u8*)Dlp_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)Dlp_sdk2_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)Dlp_sdk4_AcexSig; - AccessDescData = (u8*)Dlp_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Dlp_sdk4_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk4_HdrPrivK; - break; - } - } - else if(ncchset->keys->AccessDescSign.PresetType == demo){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 4: - case 5: - AccessDescSig = (u8*)Demo_sdk4_AcexSig; - AccessDescData = (u8*)Demo_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Demo_sdk4_HdrPubK; - CXI_Privk = (u8*)Demo_sdk4_HdrPrivK; - break; - } - } + accessdesc_GetPresetData(&AccessDescData,&DepList,ncchset); +#ifndef PUBLIC_BUILD + accessdesc_GetPresetSigData(&AccessDescSig,&CXI_Pubk,&CXI_Privk,ncchset); +#endif // Error Checking if(!AccessDescData || !DepList){ @@ -1362,135 +1282,329 @@ int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncc return CANNOT_SIGN_ACCESSDESC; } - if((!CXI_Pubk || !CXI_Privk || !AccessDescSig) && ncchset->keys->rsa.RequiresPresignedDesc){ + if((!CXI_Pubk || !CXI_Privk || !AccessDescSig) && ncchset->keys->rsa.requiresPresignedDesc){ fprintf(stderr,"[EXHEADER ERROR] This AccessDesc preset needs to be signed, the current keyset is incapable of doing so. Please configure RSF file with the appropriate signature data.\n"); return CANNOT_SIGN_ACCESSDESC; } // Setting data in Exheader // Dependency List - memcpy(exhdrset->ExHdr->DependencyList,DepList,0x180); + memcpy(exhdrset->exHdr->dependencyList,DepList,0x180); // ARM11 Local Capabilities exhdr_ARM11SystemLocalCapabilities *arm11local = (exhdr_ARM11SystemLocalCapabilities*)(AccessDescData); // Backing Up Non Preset Details u8 ProgramID[8]; - memcpy(ProgramID,exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,8); + memcpy(ProgramID,exhdrset->exHdr->arm11SystemLocalCapabilities.programId,8); exhdr_StorageInfo StorageInfoBackup; - memcpy(&StorageInfoBackup,&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,sizeof(exhdr_StorageInfo)); + memcpy(&StorageInfoBackup,&exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo,sizeof(exhdr_StorageInfo)); // Setting Preset Data - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities,arm11local,sizeof(exhdr_ARM11SystemLocalCapabilities)); + memcpy(&exhdrset->exHdr->arm11SystemLocalCapabilities,arm11local,sizeof(exhdr_ARM11SystemLocalCapabilities)); // Restoring Non Preset Data - memcpy(exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,ProgramID,8); - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,&StorageInfoBackup,sizeof(exhdr_StorageInfo)); + memcpy(exhdrset->exHdr->arm11SystemLocalCapabilities.programId,ProgramID,8); + memcpy(&exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo,&StorageInfoBackup,sizeof(exhdr_StorageInfo)); // Adjusting flags to prevent errors - u8 *byte6 = &exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)-1; + u8 *byte6 = &exhdrset->exHdr->arm11SystemLocalCapabilities.flags[6]; + u8 SystemMode = (*byte6>>4)&0xF; + u8 AffinityMask = (*byte6>>2)&0x3; + u8 IdealProcessor = ((*byte6>>0)&0x3)-1; *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[7] = 0x30; + exhdrset->exHdr->arm11SystemLocalCapabilities.flags[7] = 0x30; // ARM11 Kernel Capabilities exhdr_ARM11KernelCapabilities *arm11kernel = (exhdr_ARM11KernelCapabilities*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)); - memcpy(&exhdrset->ExHdr->ARM11KernelCapabilities,arm11kernel,(sizeof(exhdr_ARM11KernelCapabilities))); + memcpy(&exhdrset->exHdr->arm11KernelCapabilities,arm11kernel,(sizeof(exhdr_ARM11KernelCapabilities))); // ARM9 Access Control exhdr_ARM9AccessControlInfo *arm9 = (exhdr_ARM9AccessControlInfo*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)+sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->ARM9AccessControlInfo,arm9,(sizeof(exhdr_ARM9AccessControlInfo))); + memcpy(&exhdrset->exHdr->arm9AccessControlInfo,arm9,(sizeof(exhdr_ARM9AccessControlInfo))); // Setting AccessDesc Area // Signing normally if possible - if(!ncchset->keys->rsa.RequiresPresignedDesc) + if(!ncchset->keys->rsa.requiresPresignedDesc) return accessdesc_SignWithKey(exhdrset,ncchset); // Otherwise set static data & ncch hdr sig info - memcpy(ncchset->CxiRsaKey.PubK,CXI_Pubk,0x100); - memcpy(ncchset->CxiRsaKey.PrivK,CXI_Privk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.signature,AccessDescSig,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,CXI_Pubk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,AccessDescData,0x200); + memcpy(exhdrset->keys->rsa.cxiHdrPub,CXI_Pubk,0x100); + memcpy(exhdrset->keys->rsa.cxiHdrPvt,CXI_Privk,0x100); + memcpy(&exhdrset->exHdr->accessDescriptor.signature,AccessDescSig,0x100); + memcpy(&exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,CXI_Pubk,0x100); + memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,AccessDescData,0x200); return 0; } +void accessdesc_GetPresetData(u8 **AccessDescData, u8 **DepList, ncch_settings *ncchset) +{ + if(ncchset->keys->accessDescSign.presetType == app){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 1: + *AccessDescData = (u8*)app_1_acex_data; + *DepList = (u8*)sdk1_dep_list; + break; + case 2: + *AccessDescData = (u8*)app_2_acex_data; + *DepList = (u8*)sdk2_dep_list; + break; + case 4: + case 5: + *AccessDescData = (u8*)app_4_acex_data; + *DepList = (u8*)sdk4_dep_list; + break; + case 7: + *AccessDescData = (u8*)app_7_acex_data; + *DepList = (u8*)sdk7_dep_list; + break; + + } + } + else if(ncchset->keys->accessDescSign.presetType == ec_app){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 4: + case 5: + *AccessDescData = (u8*)ecapp_4_acex_data; + *DepList = (u8*)sdk4_dep_list; + break; + } + } + else if(ncchset->keys->accessDescSign.presetType == dlp){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 1: + *AccessDescData = (u8*)dlp_1_acex_data; + *DepList = (u8*)sdk1_dep_list; + break; + case 2: + *AccessDescData = (u8*)dlp_2_acex_data; + *DepList = (u8*)sdk2_dep_list; + break; + case 4: + case 5: + *AccessDescData = (u8*)dlp_4_acex_data; + *DepList = (u8*)sdk4_dep_list; + break; + } + } + else if(ncchset->keys->accessDescSign.presetType == demo){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 4: + case 5: + *AccessDescData = (u8*)demo_4_acex_data; + *DepList = (u8*)sdk4_dep_list; + break; + } + } +} + +#ifndef PUBLIC_BUILD +void accessdesc_GetPresetSigData(u8 **AccessDescSig, u8 **CXI_Pubk, u8 **CXI_Privk, ncch_settings *ncchset) +{ + if(ncchset->keys->accessDescSign.presetType == app){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 1: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)app_1_dev_acexsig; + *CXI_Pubk = (u8*)app_1_dev_hdrpub; + *CXI_Privk = (u8*)app_1_dev_hdrpvt; + } + break; + case 2: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)app_2_dev_acexsig; + *CXI_Pubk = (u8*)app_2_dev_hdrpub; + *CXI_Privk = (u8*)app_2_dev_hdrpvt; + } + break; + case 4: + case 5: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)app_4_dev_acexsig; + *CXI_Pubk = (u8*)app_4_dev_hdrpub; + *CXI_Privk = (u8*)app_4_dev_hdrpvt; + } + else if(ncchset->keys->keyset == pki_PRODUCTION){ + *AccessDescSig = (u8*)app_4_prod_acexsig; + *CXI_Pubk = (u8*)app_4_prod_hdrpub; + *CXI_Privk = NULL; + } + break; + case 7: + if(ncchset->keys->keyset == pki_PRODUCTION){ + *AccessDescSig = (u8*)app_7_prod_acexsig; + *CXI_Pubk = (u8*)app_7_prod_hdrpub; + *CXI_Privk = NULL; + } + break; + + } + } + else if(ncchset->keys->accessDescSign.presetType == ec_app){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 4: + case 5: + if(ncchset->keys->keyset == pki_PRODUCTION){ + *AccessDescSig = (u8*)ecapp_4_prod_acexsig; + *CXI_Pubk = (u8*)ecapp_4_prod_hdrpub; + *CXI_Privk = NULL; + } + break; + } + } + else if(ncchset->keys->accessDescSign.presetType == dlp){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 1: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)dlp_1_dev_acexsig; + *CXI_Pubk = (u8*)dlp_1_dev_hdrpub; + *CXI_Privk = (u8*)dlp_1_dev_hdrpvt; + } + break; + case 2: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)dlp_2_dev_acexsig; + *CXI_Pubk = (u8*)dlp_2_dev_hdrpub; + *CXI_Privk = (u8*)dlp_2_dev_hdrpvt; + } + break; + case 4: + case 5: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)dlp_4_dev_acexsig; + *CXI_Pubk = (u8*)dlp_4_dev_hdrpub; + *CXI_Privk = (u8*)dlp_4_dev_hdrpvt; + } + break; + } + } + else if(ncchset->keys->accessDescSign.presetType == demo){ + switch(ncchset->keys->accessDescSign.targetFirmware){ + case 4: + case 5: + if(ncchset->keys->keyset == pki_DEVELOPMENT){ + *AccessDescSig = (u8*)demo_4_dev_acexsig; + *CXI_Pubk = (u8*)demo_4_dev_hdrpub; + *CXI_Privk = (u8*)demo_4_dev_hdrpvt; + } + break; + } + } +} +#endif + +/* Generic Exheader Errors */ +void ErrorParamNotFound(char *string) +{ + fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: \"%s\"\n",string); +} + /* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr) +void exhdr_Print_ServiceAccessControl(extended_hdr *hdr) { printf("[+] Service Access Control\n"); for(int i = 0; i < 32; i ++){ - char *SVC_Handle = (char*)hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]; + char *SVC_Handle = (char*)hdr->arm11SystemLocalCapabilities.serviceAccessControl[i]; if(SVC_Handle[0] == 0) break; - printf("%.8s\n",hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]); + printf("%.8s\n",hdr->arm11SystemLocalCapabilities.serviceAccessControl[i]); } } /* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr) +u8* GetAccessDescSig_frm_exhdr(extended_hdr *hdr) { if(!hdr) return NULL; - return hdr->AccessDescriptor.signature ; + return hdr->accessDescriptor.signature ; } -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr) +u8* GetNcchHdrPubKey_frm_exhdr(extended_hdr *hdr) { if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; + return hdr->accessDescriptor.ncchRsaPubKey; } -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr) +u8* GetAccessDesc_frm_exhdr(extended_hdr *hdr) { if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; + return hdr->accessDescriptor.ncchRsaPubKey; } -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr) +u16 GetRemasterVersion_frm_exhdr(extended_hdr *hdr) { - return u8_to_u16(hdr->CodeSetInfo.Flags.remasterVersion,LE); + return u8_to_u16(hdr->codeSetInfo.flags.remasterVersion,LE); } -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr) +u64 GetSaveDataSize_frm_exhdr(extended_hdr *hdr) { - return u8_to_u64(hdr->SystemInfo.SaveDataSize,LE); + return u8_to_u64(hdr->systemInfo.savedataSize,LE); } -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr) +int GetCoreVersion_frm_exhdr(u8 *Dest, extended_hdr *hdr) { - return (int) memcpy(Dest,hdr->ARM11SystemLocalCapabilities.Flags,4); + return (int) memcpy(Dest,hdr->arm11SystemLocalCapabilities.flags,4); } -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr) +int GetDependencyList_frm_exhdr(u8 *Dest, extended_hdr *hdr) { if(!Dest) return -1; - for(int i = 0; i < 0x30; i++){ - memcpy(Dest,hdr->DependencyList,0x30*8); - } + memcpy(Dest,hdr->dependencyList,0x30*8); + return 0; } /* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset) +int GetSaveDataSizeFromString(u64 *out, char *string) +{ + u64 SaveDataSize = strtoull(string,NULL,10); + if(strstr(string,"K")){ + char *str = strstr(string,"K"); + if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ + SaveDataSize *= KB; + } + } + else if(strstr(string,"M")){ + char *str = strstr(string,"M"); + if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ + SaveDataSize *= MB; + } + } + else if(strstr(string,"G")){ + char *str = strstr(string,"G"); + if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ + SaveDataSize *= GB; + } + } + else{ + fprintf(stderr,"[ERROR] Invalid save data size format.\n"); + return EXHDR_BAD_YAML_OPT; + } + if((SaveDataSize & 65536) != 0){ + fprintf(stderr,"[ERROR] Save data size must be aligned to 64K.\n"); + return EXHDR_BAD_YAML_OPT; + } + *out = SaveDataSize; + return 0; +} + +int GetSaveDataSize_rsf(u64 *SaveDataSize, user_settings *usrset) { - if(usrset->yaml_set.Rom.SaveDataSize){ - *SaveDataSize = strtoull(usrset->yaml_set.Rom.SaveDataSize,NULL,10); - if(strstr(usrset->yaml_set.Rom.SaveDataSize,"K")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"K"); + if(usrset->common.rsfSet.Rom.SaveDataSize){ + *SaveDataSize = strtoull(usrset->common.rsfSet.Rom.SaveDataSize,NULL,10); + if(strstr(usrset->common.rsfSet.Rom.SaveDataSize,"K")){ + char *str = strstr(usrset->common.rsfSet.Rom.SaveDataSize,"K"); if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ *SaveDataSize = *SaveDataSize*KB; } } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"M")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"M"); + else if(strstr(usrset->common.rsfSet.Rom.SaveDataSize,"M")){ + char *str = strstr(usrset->common.rsfSet.Rom.SaveDataSize,"M"); if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ *SaveDataSize = *SaveDataSize*MB; } } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"G")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"G"); + else if(strstr(usrset->common.rsfSet.Rom.SaveDataSize,"G")){ + char *str = strstr(usrset->common.rsfSet.Rom.SaveDataSize,"G"); if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ *SaveDataSize = *SaveDataSize*GB; } @@ -1510,9 +1624,9 @@ int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset) return 0; } -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset) +int GetRemasterVersion_rsf(u16 *RemasterVersion, user_settings *usrset) { - char *Str = usrset->yaml_set.SystemControlInfo.RemasterVersion; + char *Str = usrset->common.rsfSet.SystemControlInfo.RemasterVersion; if(!Str){ *RemasterVersion = 0; return 0; diff --git a/exheader.h b/exheader.h index d606995..e16fe99 100644 --- a/exheader.h +++ b/exheader.h @@ -10,23 +10,23 @@ typedef enum typedef enum { - ExeFsCodeCompress = 1, + Compress = 1, RetailSDAppFlag = 2, -} SystemInfoFlags_Flagbitmask; +} system_info_flags; typedef enum { memtype_APPLICATION = 1, memtype_SYSTEM = 2, memtype_BASE = 3 -} MemoryTypeName; +} memory_type; typedef enum { processtype_DEFAULT = -1, processtype_SYSTEM = 0, processtype_APPLICATION = 1 -} ProcessTypeName; +} process_type; typedef enum { @@ -34,65 +34,65 @@ typedef enum resrc_limit_SYS_APPLET, resrc_limit_LIB_APPLET, resrc_limit_OTHER -} ResourceLimitCategoryName; +} resource_limit_category; typedef enum { - othcap_PERMIT_DEBUG, - othcap_FORCE_DEBUG, - othcap_CAN_USE_NON_ALPHABET_AND_NUMBER, - othcap_CAN_WRITE_SHARED_PAGE, - othcap_CAN_USE_PRIVILEGE_PRIORITY, - othcap_PERMIT_MAIN_FUNCTION_ARGUMENT, - othcap_CAN_SHARE_DEVICE_MEMORY, - othcap_RUNNABLE_ON_SLEEP, - othcap_SPECIAL_MEMORY_ARRANGE = 12, -} OtherCapabilities_Flagbitmask; + othcap_PERMIT_DEBUG = (1 << 0), + othcap_FORCE_DEBUG = (1 << 1), + othcap_CAN_USE_NON_ALPHABET_AND_NUMBER = (1 << 2), + othcap_CAN_WRITE_SHARED_PAGE = (1 << 3), + othcap_CAN_USE_PRIVILEGE_PRIORITY = (1 << 4), + othcap_PERMIT_MAIN_FUNCTION_ARGUMENT = (1 << 5), + othcap_CAN_SHARE_DEVICE_MEMORY = (1 << 6), + othcap_RUNNABLE_ON_SLEEP = (1 << 7), + othcap_SPECIAL_MEMORY_ARRANGE = (1 << 12), +} other_capabilities_flags; typedef enum { - fsaccess_CATEGORY_SYSTEM_APPLICATION, - fsaccess_CATEGORY_HARDWARE_CHECK, - fsaccess_CATEGORY_FILE_SYSTEM_TOOL, - fsaccess_DEBUG, - fsaccess_TWL_CARD_BACKUP, - fsaccess_TWL_NAND_DATA, - fsaccess_BOSS, - fsaccess_DIRECT_SDMC, - fsaccess_CORE, - fsaccess_CTR_NAND_RO, - fsaccess_CTR_NAND_RW, - fsaccess_CTR_NAND_RO_WRITE, - fsaccess_CATEGORY_SYSTEM_SETTINGS, - fsaccess_CARD_BOARD, - fsaccess_EXPORT_IMPORT_IVS, - fsaccess_DIRECT_SDMC_WRITE, - fsaccess_SWITCH_CLEANUP, - fsaccess_SAVE_DATA_MOVE, - fsaccess_SHOP, - fsaccess_SHELL, - fsaccess_CATEGORY_HOME_MENU -} FileSystemAccess; + fsaccess_CATEGORY_SYSTEM_APPLICATION = (1 << 0), // 0x00000001 + fsaccess_CATEGORY_HARDWARE_CHECK = (1 << 1), // 0x00000002 + fsaccess_CATEGORY_FILE_SYSTEM_TOOL = (1 << 2), // 0x00000004 + fsaccess_DEBUG = (1 << 3), // 0x00000008 + fsaccess_TWL_CARD_BACKUP = (1 << 4), // 0x00000010 + fsaccess_TWL_NAND_DATA = (1 << 5), // 0x00000020 + fsaccess_BOSS = (1 << 6), // 0x00000040 + fsaccess_DIRECT_SDMC = (1 << 7), // 0x00000080 + fsaccess_CORE = (1 << 8), // 0x00000100 + fsaccess_CTR_NAND_RO = (1 << 9), // 0x00000200 + fsaccess_CTR_NAND_RW = (1 << 10), // 0x00000400 + fsaccess_CTR_NAND_RO_WRITE = (1 << 11), // 0x00000800 + fsaccess_CATEGORY_SYSTEM_SETTINGS = (1 << 12), // 0x00001000 + fsaccess_CARD_BOARD = (1 << 13), // 0x00002000 + fsaccess_EXPORT_IMPORT_IVS = (1 << 14), // 0x00004000 + fsaccess_DIRECT_SDMC_WRITE = (1 << 15), // 0x00008000 + fsaccess_SWITCH_CLEANUP = (1 << 16), // 0x00010000 + fsaccess_SAVE_DATA_MOVE = (1 << 17), // 0x00020000 + fsaccess_SHOP = (1 << 18), // 0x00040000 + fsaccess_SHELL = (1 << 19), // 0x00080000 + fsaccess_CATEGORY_HOME_MENU = (1 << 20), // 0x00100000 +} file_system_access; typedef enum { - attribute_NOT_USE_ROMFS, - attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL -} AttributeName; + attribute_NOT_USE_ROMFS = (1 << 0), + attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL = (1 << 1), +} attribute_name; typedef enum { - arm9cap_FS_MOUNT_NAND, - arm9cap_FS_MOUNT_NAND_RO_WRITE, - arm9cap_FS_MOUNT_TWLN, - arm9cap_FS_MOUNT_WNAND, - arm9cap_FS_MOUNT_CARD_SPI, - arm9cap_USE_SDIF3, - arm9cap_CREATE_SEED, - arm9cap_USE_CARD_SPI, - arm9cap_SD_APPLICATION, - arm9cap_USE_DIRECT_SDMC -} Arm9Capability; + arm9cap_FS_MOUNT_NAND = (1 << 0), + arm9cap_FS_MOUNT_NAND_RO_WRITE = (1 << 1), + arm9cap_FS_MOUNT_TWLN = (1 << 2), + arm9cap_FS_MOUNT_WNAND = (1 << 3), + arm9cap_FS_MOUNT_CARD_SPI = (1 << 4), + arm9cap_USE_SDIF3 = (1 << 5), + arm9cap_CREATE_SEED = (1 << 6), + arm9cap_USE_CARD_SPI = (1 << 7), + arm9cap_SD_APPLICATION = (1 << 8), + arm9cap_USE_DIRECT_SDMC = (1 << 9), +} arm9_capability; typedef struct { @@ -103,48 +103,48 @@ typedef struct typedef struct { - u8 Address[4]; // le u32 - u8 NumMaxPages[4]; // le u32 - u8 CodeSize[4]; // le u32 + u8 address[4]; // le u32 + u8 numMaxPages[4]; // le u32 + u8 codeSize[4]; // le u32 } exhdr_CodeSegmentInfo; typedef struct { - u8 Name[8]; - exhdr_SystemInfoFlags Flags; - exhdr_CodeSegmentInfo TextSectionInfo; - u8 StackSize[4]; // le u32 - exhdr_CodeSegmentInfo ReadOnlySectionInfo; - u8 Reserved[4]; - exhdr_CodeSegmentInfo DataSectionInfo; - u8 BssSize[4]; // le u32 + u8 name[8]; + exhdr_SystemInfoFlags flags; + exhdr_CodeSegmentInfo textSectionInfo; + u8 stackSize[4]; // le u32 + exhdr_CodeSegmentInfo readOnlySectionInfo; + u8 padding0[4]; + exhdr_CodeSegmentInfo dataSectionInfo; + u8 bssSize[4]; // le u32 } exhdr_CodeSetInfo; typedef struct { - u8 SaveDataSize[8]; - u8 JumpId[8]; - u8 Reserved[0x30]; + u8 savedataSize[8]; + u8 jumpId[8]; + u8 padding0[0x30]; } exhdr_SystemInfo; typedef struct { - u8 ExtSaveDataId[8]; - u8 SystemSaveDataId[8]; - u8 StorageAccessableUniqueIds[8]; - u8 AccessInfo[7]; - u8 OtherAttributes; + u8 extSavedataId[8]; + u8 systemSavedataId[8]; + u8 storageAccessableUniqueIds[8]; + u8 accessInfo[7]; + u8 otherAttributes; } exhdr_StorageInfo; typedef struct { - u8 ProgramId[8]; - u8 Flags[8]; - u8 ResourceLimitDescriptor[16][2]; - exhdr_StorageInfo StorageInfo; - u8 ServiceAccessControl[32][8]; // Those char[8] svc handles - u8 Reserved1[0x1f]; - u8 ResourceLimitCategory; + u8 programId[8]; + u8 flags[8]; + u8 resourceLimitDescriptor[16][2]; + exhdr_StorageInfo storageInfo; + u8 serviceAccessControl[32][8]; // Those char[8] svc handles + u8 padding0[0x1f]; + u8 resourceLimitCategory; } exhdr_ARM11SystemLocalCapabilities; typedef struct @@ -179,55 +179,56 @@ typedef struct { // systemcontrol info { // coreinfo { - exhdr_CodeSetInfo CodeSetInfo; - u8 DependencyList[0x30][8]; + exhdr_CodeSetInfo codeSetInfo; + u8 dependencyList[0x30][8]; // } - exhdr_SystemInfo SystemInfo; + exhdr_SystemInfo systemInfo; // } // accesscontrolinfo { - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; + exhdr_ARM11SystemLocalCapabilities arm11SystemLocalCapabilities; + exhdr_ARM11KernelCapabilities arm11KernelCapabilities; + exhdr_ARM9AccessControlInfo arm9AccessControlInfo; // } struct { u8 signature[0x100]; - u8 ncchpubkeymodulus[0x100]; - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; - } AccessDescriptor; -} ExtendedHeader_Struct; + u8 ncchRsaPubKey[0x100]; + exhdr_ARM11SystemLocalCapabilities arm11SystemLocalCapabilities; + exhdr_ARM11KernelCapabilities arm11KernelCapabilities; + exhdr_ARM9AccessControlInfo arm9AccessControlInfo; + } accessDescriptor; +} extended_hdr; typedef struct { keys_struct *keys; - rsf_settings *yaml; - bool UseAccessDescPreset; + rsf_settings *rsf; + bool useAccessDescPreset; /* Output */ - ExtendedHeader_Struct *ExHdr; // is the exheader output buffer ptr(in ncchset) cast as exheader struct ptr; + extended_hdr *exHdr; // is the exheader output buffer ptr(in ncchset) cast as exheader struct ptr; } exheader_settings; #endif /* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys); -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys); +int SignAccessDesc(extended_hdr *ExHdr, keys_struct *keys); +int CheckaccessDescSignature(extended_hdr *ExHdr, keys_struct *keys); /* ExHeader Build Functions */ int BuildExHeader(ncch_settings *ncchset); /* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr); +void exhdr_Print_ServiceAccessControl(extended_hdr *hdr); /* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr); -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr); -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr); -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr); -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr); +u8* GetAccessDescSig_frm_exhdr(extended_hdr *hdr); +u8* GetNcchHdrPubKey_frm_exhdr(extended_hdr *hdr); +u8* GetAccessDesc_frm_exhdr(extended_hdr *hdr); +u16 GetRemasterVersion_frm_exhdr(extended_hdr *hdr); +u64 GetSaveDataSize_frm_exhdr(extended_hdr *hdr); +int GetDependencyList_frm_exhdr(u8 *Dest,extended_hdr *hdr); +int GetCoreVersion_frm_exhdr(u8 *Dest, extended_hdr *hdr); /* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset); -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset); \ No newline at end of file +int GetSaveDataSize_rsf(u64 *SaveDataSize, user_settings *usrset); +int GetSaveDataSizeFromString(u64 *out, char *string); +int GetRemasterVersion_rsf(u16 *RemasterVersion, user_settings *usrset); diff --git a/keys_common.h b/keys_common.h deleted file mode 100644 index 2a83f1e..0000000 --- a/keys_common.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _KEYS_COMMON_H_ -#define _KEYS_COMMON_H_ - -// AES KEYS -static const unsigned char zeros_fixed_aesKey[16] = //zeros_fixed_aesKey -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// RSA KEYS -static const unsigned char Dummy_rsa_privExp[256] = //Dummy_rsa_privExp -{ - 0xE3, 0xC6, 0x76, 0x57, 0x2E, 0xCB, 0xA5, 0xE6, - 0x0C, 0x01, 0xBD, 0x5C, 0x32, 0x2D, 0x90, 0xE0, - 0xFF, 0x9A, 0x80, 0xE8, 0x66, 0x8D, 0x84, 0xDC, - 0xF7, 0x75, 0x5F, 0x3F, 0x98, 0x7C, 0x97, 0x40, - 0x20, 0x21, 0xB7, 0x24, 0xC0, 0x61, 0x2D, 0x83, - 0xB0, 0x91, 0x8E, 0xE3, 0xC2, 0xD0, 0x2C, 0xA1, - 0x2C, 0x99, 0x4F, 0x48, 0xF7, 0x4E, 0x13, 0xD3, - 0x01, 0x71, 0x25, 0x9B, 0x3C, 0x75, 0x7C, 0xC4, - 0xE5, 0x89, 0x7E, 0xDA, 0xF9, 0x99, 0x5C, 0x83, - 0xE4, 0xDD, 0x36, 0x62, 0x5B, 0x0E, 0x12, 0x91, - 0xD6, 0x39, 0x45, 0x69, 0x62, 0x20, 0xCA, 0xF4, - 0xBA, 0x6B, 0x28, 0x1A, 0x7C, 0xBF, 0xB9, 0x97, - 0x37, 0x46, 0xC2, 0x7A, 0xCF, 0x10, 0x68, 0xC2, - 0xC9, 0xF1, 0x48, 0xDA, 0x8A, 0x2F, 0x4C, 0xBC, - 0x3B, 0x1C, 0xB8, 0x8F, 0x04, 0x7F, 0xFD, 0x9D, - 0xE2, 0x0A, 0xD2, 0x09, 0x39, 0xC7, 0xD9, 0x81, - 0x59, 0x17, 0x73, 0xB2, 0xEC, 0xEB, 0x36, 0x67, - 0xA5, 0xA8, 0xD5, 0x71, 0xD9, 0x38, 0x6A, 0xD1, - 0x28, 0xB9, 0x46, 0x85, 0x3A, 0x81, 0x85, 0x4E, - 0x55, 0xA7, 0x74, 0x79, 0xBB, 0xC5, 0x97, 0xF7, - 0xEF, 0xE0, 0x81, 0x20, 0xE0, 0xEA, 0x45, 0x8F, - 0xED, 0x70, 0x8E, 0xD6, 0xFF, 0x49, 0xCF, 0x7F, - 0xF2, 0xFF, 0x22, 0x20, 0x3F, 0xE9, 0x92, 0x99, - 0xDE, 0x81, 0xD6, 0x27, 0xF7, 0xB8, 0x3A, 0x1D, - 0x4F, 0xA2, 0x50, 0xFB, 0xA5, 0xE7, 0x98, 0x08, - 0xB5, 0x2B, 0xA2, 0x94, 0xA9, 0x17, 0x1A, 0xA8, - 0x34, 0xF6, 0x5E, 0x24, 0x2D, 0x40, 0x2F, 0xCB, - 0x3C, 0xB0, 0xF8, 0x7E, 0x84, 0xB4, 0x87, 0x82, - 0x19, 0xAF, 0x87, 0xB6, 0xFA, 0xA9, 0x67, 0x27, - 0x07, 0x28, 0xBA, 0x2E, 0xA5, 0x8E, 0xDD, 0xE5, - 0xD4, 0xFD, 0x06, 0x09, 0xDF, 0xBD, 0x87, 0x95, - 0x95, 0x25, 0x05, 0x5E, 0xB2, 0x00, 0x18, 0x41 -}; - -static const unsigned char Dummy_rsa_pubMod[256] = //Dummy_rsa_pubMod -{ - 0xE6, 0x64, 0x06, 0x6C, 0x49, 0x6B, 0xEC, 0xEE, - 0x59, 0xAE, 0x11, 0x92, 0xF1, 0x03, 0x43, 0x87, - 0x8E, 0xEB, 0x4D, 0x70, 0xA9, 0x71, 0xB4, 0x6D, - 0x25, 0x19, 0x02, 0x4A, 0x9E, 0x4D, 0xA3, 0x10, - 0xFD, 0xB2, 0x27, 0x56, 0xA3, 0xFB, 0xDD, 0xE5, - 0xE4, 0x4E, 0xE0, 0x62, 0x8F, 0xC3, 0x2E, 0xEE, - 0x8F, 0x9D, 0x4D, 0x6E, 0x00, 0xDB, 0x88, 0x49, - 0xA2, 0xFC, 0x30, 0xFE, 0x94, 0xF3, 0x06, 0x92, - 0x75, 0x61, 0x11, 0x1D, 0x24, 0x07, 0xE9, 0x12, - 0xB6, 0xB1, 0x57, 0xF5, 0xDC, 0x01, 0xF7, 0x54, - 0xBF, 0xC3, 0xAC, 0x8C, 0x73, 0x2C, 0x73, 0x17, - 0x8E, 0xBF, 0x2F, 0x68, 0x3C, 0x61, 0x75, 0x32, - 0x15, 0x39, 0x93, 0xDD, 0xBA, 0x12, 0x42, 0xD3, - 0x25, 0x85, 0xFA, 0xA6, 0x4B, 0xAF, 0x81, 0x4B, - 0xCA, 0xD2, 0x9C, 0xF1, 0x3D, 0x37, 0xAE, 0xB9, - 0xFD, 0x77, 0x59, 0x78, 0xB9, 0x32, 0x95, 0x19, - 0xD1, 0x47, 0xE1, 0xC6, 0xE1, 0x16, 0x13, 0x5D, - 0xCC, 0x99, 0x31, 0x63, 0xAD, 0xBB, 0xA5, 0x4F, - 0xE4, 0x41, 0x67, 0xFD, 0x7F, 0x1E, 0xA8, 0x9A, - 0x35, 0x65, 0xEB, 0xC4, 0x4D, 0xD4, 0xC4, 0x29, - 0x0F, 0x40, 0x95, 0xFD, 0x8A, 0x30, 0x67, 0x79, - 0xFB, 0xD4, 0x76, 0x6F, 0xD1, 0xDE, 0x8C, 0x72, - 0x32, 0x05, 0x97, 0x5A, 0x26, 0x0D, 0x37, 0xCA, - 0x12, 0x2C, 0xDC, 0x14, 0x3F, 0xD3, 0x59, 0x00, - 0x66, 0xD2, 0x8E, 0xF5, 0x6E, 0x22, 0x08, 0x63, - 0x59, 0xB5, 0x3F, 0xBB, 0x3A, 0x4D, 0xD4, 0xD1, - 0xC1, 0x21, 0xA7, 0x4D, 0x02, 0x96, 0x08, 0xF5, - 0x2B, 0x11, 0xE5, 0x85, 0xD2, 0x6E, 0x91, 0xD6, - 0x8F, 0x77, 0x72, 0xEF, 0x37, 0xE3, 0x79, 0x19, - 0xA9, 0xEE, 0x58, 0x5D, 0x52, 0x9B, 0x2D, 0x47, - 0x7D, 0x27, 0xB8, 0xC3, 0x76, 0xCA, 0xDA, 0xC2, - 0xF4, 0xFC, 0xF4, 0x53, 0x7C, 0xD8, 0x43, 0x87 -}; -#endif \ No newline at end of file diff --git a/keyset.c b/keyset.c index 6414026..f50a267 100644 --- a/keyset.c +++ b/keyset.c @@ -1,21 +1,22 @@ #include "lib.h" // KeyData -#include "keys_common.h" -#include "keys_retail.h" +#include "tpki.h" // Test PKI #ifndef PUBLIC_BUILD -#include "keys_debug.h" +#include "ppki.h" // Production PKI +#include "dpki.h" // Development PKI #endif // Private Prototypes int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource); -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey); -void InitCommonKeySlots(keys_struct *keys); +int SetunFixedKey(keys_struct *keys, u8 *unFixedKey); +void InitcommonKeySlots(keys_struct *keys); + +FILE* keyset_OpenFile(char *dir, char *name, bool FileRequired); int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); +int Set_CCI_CFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); int SetCXI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); @@ -28,111 +29,407 @@ int SetTmdCert(keys_struct *keys, u8 *Cert); void InitKeys(keys_struct *keys) { memset(keys,0,sizeof(keys_struct)); - InitCommonKeySlots(keys); + InitcommonKeySlots(keys); + keys->rsa.cxiHdrPub = malloc(RSA_2048_KEY_SIZE); + keys->rsa.cxiHdrPvt = malloc(RSA_2048_KEY_SIZE); + keys->aes.supportUnFixedKeys = false; + keys->aes.unFixedKey0 = malloc(16); + keys->aes.unFixedKey1 = malloc(16); } -void SetKeys(keys_struct *keys) +void PrintBadKeySize(char *path, u32 size) +{ + fprintf(stderr,"[KEYSET ERROR] %s is has invalid size (0x%x)\n",path,size); +} + +int SetKeys(keys_struct *keys) { - if(keys->keyset == keyset_RETAIL){ + if(keys->keyset == pki_TEST){ // Ergo False Sign /* AES Keys */ // CIA - //SetCommonKey(keys,(u8*)zeros_fixed_aesKey,1); - SetCurrentCommonKey(keys,1); + //SetcommonKey(keys,(u8*)zeros_aesKey,1); + if(keys->aes.currentCommonKey > 0xff) + SetcurrentCommonKey(keys,0); // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); + keys->aes.normalKey = (u8*)zeros_aesKey; /* RSA Keys */ - keys->rsa.FalseSign = true; + keys->rsa.isFalseSign = true; // CIA - SetTIK_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); + SetTIK_RsaKey(keys,(u8*)tpki_rsa_privExp,(u8*)tpki_rsa_pubMod); + SetTMD_RsaKey(keys,(u8*)tpki_rsa_privExp,(u8*)tpki_rsa_pubMod); + // CCI/CFA + Set_CCI_CFA_RsaKey(keys,(u8*)tpki_rsa_privExp,(u8*)tpki_rsa_pubMod); // CXI - SetAccessDesc_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); + SetAccessDesc_RsaKey(keys,(u8*)tpki_rsa_privExp,(u8*)tpki_rsa_pubMod); /* Certs */ - SetCaCert(keys,(u8*)ca3_dpki_cert); - SetTikCert(keys,(u8*)xsC_dpki_cert); - SetTmdCert(keys,(u8*)cpB_dpki_cert); + SetCaCert(keys,(u8*)ca3_tpki_cert); + SetTikCert(keys,(u8*)xsC_tpki_cert); + SetTmdCert(keys,(u8*)cpB_tpki_cert); + } + else if(keys->keyset == pki_CUSTOM){ + int keydir_pathlen = strlen(keys->keydir); + char *path = NULL; +#ifdef _WIN32 + char slash = '\\'; +#else + char slash = '/'; +#endif + if(keys->keydir[keydir_pathlen-1] != slash){ + path = malloc(sizeof(char)*(keydir_pathlen+1)); + memset(path,0,sizeof(char)*(keydir_pathlen+1)); + sprintf(path,"%s%c",keys->keydir,slash); + } + else{ + path = malloc(sizeof(char)*(keydir_pathlen)); + memset(path,0,sizeof(char)*(keydir_pathlen)); + sprintf(path,"%s",keys->keydir); + } + + FILE *fp = NULL; + + // NCCH + keys->aes.normalKey = (u8*)zeros_aesKey; + fp = keyset_OpenFile(path,"systemfixed.aesKey",false); + if(fp){ + keys->aes.systemFixedKey = malloc(16); + fread(keys->aes.systemFixedKey,16,1,fp); + fclose(fp); + } + + // commonKeys + char common_key_name[30]; + for(int i = 0; i < 256; i++){ + memset(common_key_name,0,sizeof(char)*30); + sprintf(common_key_name,"common_etd_%d.aesKey",i); + fp = keyset_OpenFile(path,common_key_name,false); + if(fp){ + keys->aes.commonKey[i] = malloc(16); + fread(keys->aes.commonKey[i],16,1,fp); + if(keys->aes.currentCommonKey > 0xff) + SetcurrentCommonKey(keys,i); + fclose(fp); + } + } + + // Certs + fp = keyset_OpenFile(path,"ca_cpki.cert",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + keys->certs.caCert = malloc(size); + fread(keys->certs.caCert,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"xs_cpki.cert",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + keys->certs.xsCert = malloc(size); + fread(keys->certs.xsCert,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"cp_cpki.cert",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + keys->certs.cpCert = malloc(size); + fread(keys->certs.cpCert,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + // RSA Keys + fp = keyset_OpenFile(path,"cp_cpki.rsaPubKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("cp_cpki.rsaPubKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.cpPub = malloc(size); + fread(keys->rsa.cpPub,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"cp_cpki.rsaPvtKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("cp_cpki.rsaPvtKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.cpPvt = malloc(size); + fread(keys->rsa.cpPvt,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"xs_cpki.rsaPubKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("xs_cpki.rsaPubKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.xsPub = malloc(size); + fread(keys->rsa.xsPub,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"xs_cpki.rsaPvtKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("xs_cpki.rsaPvtKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.xsPvt = malloc(size); + fread(keys->rsa.xsPvt,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"ncsd_cfa.rsaPubKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("ncsd_cfa.rsaPubKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.cciCfaPub = malloc(size); + fread(keys->rsa.cciCfaPub,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"ncsd_cfa.rsaPvtKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("ncsd_cfa.rsaPvtKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.cciCfaPvt = malloc(size); + fread(keys->rsa.cciCfaPvt,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"acex.rsaPubKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("acex.rsaPubKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.acexPub = malloc(size); + fread(keys->rsa.acexPub,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + + fp = keyset_OpenFile(path,"acex.rsaPvtKey",true); + if(fp){ + u32 size = GetFileSize_u32(fp); + if(size != RSA_2048_KEY_SIZE){ + PrintBadKeySize("acex.rsaPvtKey",size); + return FAILED_TO_IMPORT_FILE; + } + keys->rsa.acexPvt = malloc(size); + fread(keys->rsa.acexPvt,size,1,fp); + fclose(fp); + } + else + return FAILED_TO_IMPORT_FILE; + +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Set Keys, free path now\n"); +#endif + + free(path); +#ifdef DEBUG + fprintf(stdout,"[DEBUG] freed path\n"); +#endif } #ifndef PUBLIC_BUILD - else if(keys->keyset == keyset_DEBUG){ + else if(keys->keyset == pki_DEVELOPMENT){ /* AES Keys */ // CIA - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev0,0); - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev1,1); - SetCurrentCommonKey(keys,0); + for(int i = 0; i < 2; i++){ + SetcommonKey(keys,(u8*)ctr_common_etd_key_dpki[i],i); + } + if(keys->aes.currentCommonKey > 0xff) + SetcurrentCommonKey(keys,0); // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); + keys->aes.normalKey = (u8*)ctr_fixed_ncch_key_dpki[0]; + SetsystemFixedKey(keys,(u8*)ctr_fixed_ncch_key_dpki[1]); + keys->aes.supportUnFixedKeys = true; + keys->aes.ncchKeyX0 = (u8*)ctr_unfixed_ncch_keyX_dpki[0]; + keys->aes.ncchKeyX1 = (u8*)ctr_unfixed_ncch_keyX_dpki[1]; /* RSA Keys */ // CIA - SetTIK_RsaKey(keys,(u8*)xs9_dpki_rsa_privExp,(u8*)xs9_dpki_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)cpA_dpki_rsa_privExp,(u8*)cpA_dpki_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); + SetTIK_RsaKey(keys,(u8*)xs9_dpki_rsa_priv,(u8*)xs9_dpki_rsa_pub); + SetTMD_RsaKey(keys,(u8*)cpA_dpki_rsa_priv,(u8*)cpA_dpki_rsa_pub); + // CCI/CFA + Set_CCI_CFA_RsaKey(keys,(u8*)dev_ncsd_cfa_priv,(u8*)dev_ncsd_cfa_pub); // CXI - SetAccessDesc_RsaKey(keys,(u8*)AccessDesc_privExp,(u8*)AccessDesc_pubMod); + SetAccessDesc_RsaKey(keys,(u8*)dev_acex_priv,(u8*)dev_acex_pub); /* Certs */ SetCaCert(keys,(u8*)ca4_dpki_cert); SetTikCert(keys,(u8*)xs9_dpki_cert); SetTmdCert(keys,(u8*)cpA_dpki_cert); } + else if(keys->keyset == pki_PRODUCTION){ + /* AES Keys */ + // CIA + for(int i = 0; i < 6; i++){ + keys->aes.commonKey[i] = AesKeyScrambler((u8*)ctr_common_etd_keyX_ppki,(u8*)ctr_common_etd_keyY_ppki[i]); + } + SetcurrentCommonKey(keys,1); + + // NCCH + keys->aes.normalKey = (u8*)zeros_aesKey; + /* + keys->aes.supportUnFixedKeys = true; + keys->aes.ncchKeyX0 = (u8*)ctr_unfixed_ncch_keyX_ppki[0]; + keys->aes.ncchKeyX1 = (u8*)ctr_unfixed_ncch_keyX_ppki[1]; + */ + + /* RSA Keys */ + // CIA + SetTIK_RsaKey(keys,(u8*)xsC_ppki_rsa_priv,(u8*)xsC_ppki_rsa_pub); + SetTMD_RsaKey(keys,(u8*)cpB_ppki_rsa_priv,(u8*)cpB_ppki_rsa_pub); + // CCI/CFA + Set_CCI_CFA_RsaKey(keys,(u8*)prod_ncsd_cfa_priv,(u8*)prod_ncsd_cfa_pub); + // CXI + SetAccessDesc_RsaKey(keys,(u8*)prod_acex_priv,(u8*)prod_acex_pub); + + /* Certs */ + SetCaCert(keys,(u8*)ca3_ppki_cert); + SetTikCert(keys,(u8*)xsC_ppki_cert); + SetTmdCert(keys,(u8*)cpB_ppki_cert); + } + + +#endif +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Checking if access desc\n"); #endif // Checking if AccessDesc can be signed u8 *tmp = malloc(0x100); memset(tmp,0,0x100); - if(memcmp(tmp,keys->rsa.AccessDesc_Priv,0x100) == 0) - keys->rsa.RequiresPresignedDesc = true; + if(memcmp(tmp,keys->rsa.acexPvt,0x100) == 0) + keys->rsa.requiresPresignedDesc = true; else - keys->rsa.RequiresPresignedDesc = false; + keys->rsa.requiresPresignedDesc = false; free(tmp); - return; + + if(keys->dumpkeys) + { + printf("[+] Keys\n"); + + printf(" > eTicket Common Keys\n"); + for(int i = 0; i < 256; i++) + { + if(keys->aes.commonKey[i]) + { + printf(" [0x%02x] ",i); + memdump(stdout,"",keys->aes.commonKey[i],16); + } + } + printf(" > Fixed NCCH Keys\n"); + memdump(stdout," [Normal] ",keys->aes.normalKey,16); + if(keys->aes.systemFixedKey) + memdump(stdout," [System] ",keys->aes.systemFixedKey,16); + printf(" > TIK RSA Keys\n"); + memdump(stdout," [PUB] ",keys->rsa.xsPub,0x100); + memdump(stdout," [PVT] ",keys->rsa.xsPvt,0x100); + printf(" > TMD RSA Keys\n"); + memdump(stdout," [PUB] ",keys->rsa.cpPub,0x100); + memdump(stdout," [PVT] ",keys->rsa.cpPvt,0x100); + printf(" > AcexDesc RSA Keys\n"); + memdump(stdout," [PUB] ",keys->rsa.acexPub,0x100); + memdump(stdout," [PVT] ",keys->rsa.acexPvt,0x100); + printf(" > NcsdCfa RSA Keys\n"); + memdump(stdout," [PUB] ",keys->rsa.cciCfaPub,0x100); + memdump(stdout," [PVT] ",keys->rsa.cciCfaPvt,0x100); + } + +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Done setting keys\n"); +#endif + return 0; +} + +FILE* keyset_OpenFile(char *dir, char *name, bool FileRequired) +{ + int file_path_len = sizeof(char)*(strlen(dir)+strlen(name)+1); + char *file_path = malloc(file_path_len); + memset(file_path,0,file_path_len); + + sprintf(file_path,"%s%s",dir,name); + + FILE *fp = fopen(file_path,"rb"); + + if(!fp && FileRequired) + fprintf(stderr,"[KEYSET ERROR] Failed to open: %s\n",file_path); + + free(file_path); + return fp; } void FreeKeys(keys_struct *keys) { // AES - if(keys->aes.CommonKey){ + if(keys->aes.commonKey){ for(int i = 0; i < 256; i++){ - free(keys->aes.CommonKey[i]); + free(keys->aes.commonKey[i]); } } - free(keys->aes.CommonKey); - free(keys->aes.SystemFixedKey); - free(keys->aes.UnFixedKey); + free(keys->aes.commonKey); + free(keys->aes.systemFixedKey); + free(keys->aes.unFixedKey0); + free(keys->aes.unFixedKey1); // RSA - free(keys->rsa.TIK_Priv); - free(keys->rsa.TIK_Pub); - free(keys->rsa.TMD_Priv); - free(keys->rsa.TMD_Pub); + free(keys->rsa.xsPvt); + free(keys->rsa.xsPub); + free(keys->rsa.cpPvt); + free(keys->rsa.cpPub); - free(keys->rsa.CFA_Priv); - free(keys->rsa.CFA_Pub); + free(keys->rsa.cciCfaPvt); + free(keys->rsa.cciCfaPub); - free(keys->rsa.CCI_Priv); - free(keys->rsa.CCI_Pub); - - free(keys->rsa.AccessDesc_Priv); - free(keys->rsa.AccessDesc_Pub); + free(keys->rsa.acexPvt); + free(keys->rsa.acexPub); + free(keys->rsa.cxiHdrPub); + free(keys->rsa.cxiHdrPvt); // Certs - free(keys->certs.ca_cert); - free(keys->certs.tik_cert); - free(keys->certs.tmd_cert); + free(keys->certs.caCert); + free(keys->certs.xsCert); + free(keys->certs.cpCert); memset(keys,0,sizeof(keys_struct)); } @@ -150,82 +447,70 @@ int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource) return 0; } -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index) +int SetcommonKey(keys_struct *keys, u8 *commonKey, u8 Index) { if(!keys) return -1; - return CopyData(&keys->aes.CommonKey[Index],CommonKey,16); + return CopyData(&keys->aes.commonKey[Index],commonKey,16); } -void InitCommonKeySlots(keys_struct *keys) +void InitcommonKeySlots(keys_struct *keys) { - if(!keys->aes.CommonKey){ - keys->aes.CommonKey = malloc(sizeof(u8*)*256); - memset(keys->aes.CommonKey,0,sizeof(u8*)*256); + if(!keys->aes.commonKey){ + keys->aes.commonKey = malloc(sizeof(u8*)*256); + memset(keys->aes.commonKey,0,sizeof(u8*)*256); } } -int SetCurrentCommonKey(keys_struct *keys, u8 Index) +int SetcurrentCommonKey(keys_struct *keys, u8 Index) { if(!keys) return -1; - keys->aes.CurrentCommonKey = Index; + keys->aes.currentCommonKey = Index; return 0; } -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey) +int SetsystemFixedKey(keys_struct *keys, u8 *systemFixedKey) { if(!keys) return -1; - return CopyData(&keys->aes.SystemFixedKey,SystemFixedKey,16); -} - -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey) -{ - if(!keys) return -1; - return CopyData(&keys->aes.UnFixedKey,UnFixedKey,16); + return CopyData(&keys->aes.systemFixedKey,systemFixedKey,16); } int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) { if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TIK_Priv,PrivateExp,&keys->rsa.TIK_Pub,PublicMod); + return SetRsaKeySet(&keys->rsa.xsPvt,PrivateExp,&keys->rsa.xsPub,PublicMod); } int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) { if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TMD_Priv,PrivateExp,&keys->rsa.TMD_Pub,PublicMod); + return SetRsaKeySet(&keys->rsa.cpPvt,PrivateExp,&keys->rsa.cpPub,PublicMod); } -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) +int Set_CCI_CFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) { if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CFA_Priv,PrivateExp,&keys->rsa.CFA_Pub,PublicMod); -} - -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CCI_Priv,PrivateExp,&keys->rsa.CCI_Pub,PublicMod); + return SetRsaKeySet(&keys->rsa.cciCfaPvt,PrivateExp,&keys->rsa.cciCfaPub,PublicMod); } int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) { if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.AccessDesc_Priv,PrivateExp,&keys->rsa.AccessDesc_Pub,PublicMod); + return SetRsaKeySet(&keys->rsa.acexPvt,PrivateExp,&keys->rsa.acexPub,PublicMod); } int SetCaCert(keys_struct *keys, u8 *Cert) { if(!keys) return -1; - return CopyData(&keys->certs.ca_cert,Cert,0x400); + return CopyData(&keys->certs.caCert,Cert,0x400); } int SetTikCert(keys_struct *keys, u8 *Cert) { if(!keys) return -1; - return CopyData(&keys->certs.tik_cert,Cert,0x300); + return CopyData(&keys->certs.xsCert,Cert,0x300); } int SetTmdCert(keys_struct *keys, u8 *Cert) { if(!keys) return -1; - return CopyData(&keys->certs.tmd_cert,Cert,0x400); + return CopyData(&keys->certs.cpCert,Cert,0x400); } \ No newline at end of file diff --git a/keyset.h b/keyset.h index 1197679..6c6eff5 100644 --- a/keyset.h +++ b/keyset.h @@ -3,14 +3,25 @@ typedef enum { - keyset_DEBUG, - keyset_RETAIL, -} keysets; + RSA_1024_KEY_SIZE = 0x80, + RSA_2048_KEY_SIZE = 0x100, + RSA_4096_KEY_SIZE = 0x200, +} rsa_keysize; + +typedef enum +{ + pki_TEST, + pki_BETA, + pki_DEVELOPMENT, + pki_PRODUCTION, + pki_CUSTOM, +} pki_keyset; typedef enum { not_preset, app, + ec_app, dlp, demo, } fixed_accessdesc_type; @@ -19,55 +30,61 @@ typedef enum typedef struct { - keysets keyset; + char *keydir; + pki_keyset keyset; + + bool dumpkeys; struct { - fixed_accessdesc_type PresetType; - u32 TargetFirmware; - } AccessDescSign; + fixed_accessdesc_type presetType; + u32 targetFirmware; + } accessDescSign; struct { // CIA - u8 **CommonKey; - u8 CurrentCommonKey; + u8 **commonKey; + u16 currentCommonKey; // NCCH Keys - u8 *NormalKey; - u8 *SystemFixedKey; - u8 *UnFixedKey; + u8 *normalKey; + u8 *systemFixedKey; + + bool supportUnFixedKeys; + u8 *ncchKeyX0; + u8 *ncchKeyX1; + u8 *unFixedKey0; + u8 *unFixedKey1; } aes; struct { - bool FalseSign; + bool isFalseSign; // CIA RSA - u8 *TMD_Priv; - u8 *TMD_Pub; - u8 *TIK_Priv; - u8 *TIK_Pub; + u8 *cpPvt; //cpPvt + u8 *cpPub; + u8 *xsPvt; + u8 *xsPub; - // CFA - u8 *CFA_Priv; - u8 *CFA_Pub; - - // CCI - u8 *CCI_Priv; - u8 *CCI_Pub; + // CCI/CFA + u8 *cciCfaPvt; + u8 *cciCfaPub; // CXI - bool RequiresPresignedDesc; - u8 *AccessDesc_Priv; - u8 *AccessDesc_Pub; + bool requiresPresignedDesc; + u8 *acexPvt; + u8 *acexPub; + u8 *cxiHdrPub; + u8 *cxiHdrPvt; } rsa; struct { // CIA - u8 *ca_cert; - u8 *tik_cert; - u8 *tmd_cert; + u8 *caCert; + u8 *xsCert; + u8 *cpCert; } certs; } keys_struct; @@ -75,9 +92,9 @@ typedef struct // Public Prototypes void InitKeys(keys_struct *keys); -void SetKeys(keys_struct *keys); +int SetKeys(keys_struct *keys); void FreeKeys(keys_struct *keys); -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index); -int SetCurrentCommonKey(keys_struct *keys, u8 Index); -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey); +int SetcommonKey(keys_struct *keys, u8 *commonKey, u8 Index); +int SetcurrentCommonKey(keys_struct *keys, u8 Index); +int SetsystemFixedKey(keys_struct *keys, u8 *systemFixedKey); diff --git a/makerom.c b/makerom.c index e1b1cdb..6b85a8c 100644 --- a/makerom.c +++ b/makerom.c @@ -29,46 +29,30 @@ int main(int argc, char *argv[]) if(result < 0) goto finish; // Setup Content 0 - if(!usrset->IsBuildingNCCH0){ // Import Content 0 - if(usrset->Content0IsNcch){ -#ifdef DEBUG - printf("[DEBUG] Import NCCH0\n"); -#endif - FILE *ncch0 = fopen(usrset->ContentPath[0],"rb"); - if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->ContentPath[0]); goto finish;} + if(!usrset->ncch.buildNcch0){ // Import Content + if(usrset->common.workingFileType == infile_ncch){ + FILE *ncch0 = fopen(usrset->common.contentPath[0],"rb"); + if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->common.contentPath[0]); goto finish;} fclose(ncch0); - usrset->Content0.size = GetFileSize_u64(usrset->ContentPath[0]); - usrset->Content0.buffer = malloc(usrset->Content0.size); - ncch0 = fopen(usrset->ContentPath[0],"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,ncch0); + usrset->common.workingFile.size = GetFileSize_u64(usrset->common.contentPath[0]); + usrset->common.workingFile.buffer = malloc(usrset->common.workingFile.size); + ncch0 = fopen(usrset->common.contentPath[0],"rb"); + ReadFile_64(usrset->common.workingFile.buffer, usrset->common.workingFile.size,0,ncch0); fclose(ncch0); } - else if(usrset->Content0IsSrl){ -#ifdef DEBUG - printf("[DEBUG] Import SRL\n"); -#endif - FILE *srl = fopen(usrset->SrlPath,"rb"); - if(!srl) {fprintf(stderr,"[MAKEROM ERROR] Failed to open SRL: %s\n",usrset->SrlPath); goto finish;} - fclose(srl); - u64 size = GetFileSize_u64(usrset->SrlPath); - usrset->Content0.size = align_value(size,0x10); - usrset->Content0.buffer = malloc(usrset->Content0.size); - srl = fopen(usrset->SrlPath,"rb"); - ReadFile_64(usrset->Content0.buffer,size,0,srl); - fclose(srl); - } - else if(usrset->ConvertCci){ -#ifdef DEBUG - printf("[DEBUG] Import CCI\n"); -#endif - FILE *cci = fopen(usrset->CciPath,"rb"); - if(!cci) {fprintf(stderr,"[MAKEROM ERROR] Failed to open CCI: %s\n",usrset->CciPath); goto finish;} - fclose(cci); - usrset->Content0.size = GetFileSize_u64(usrset->CciPath); - usrset->Content0.buffer = malloc(usrset->Content0.size); - cci = fopen(usrset->CciPath,"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,cci); - fclose(cci); + else if(usrset->common.workingFileType == infile_srl || usrset->common.workingFileType == infile_ncsd){ + FILE *fp = fopen(usrset->common.workingFilePath,"rb"); + if(!fp) { + fprintf(stderr,"[MAKEROM ERROR] Failed to open %s: %s\n",usrset->common.workingFileType == infile_srl? "SRL":"CCI",usrset->common.workingFilePath); + goto finish; + } + fclose(fp); + u64 size = GetFileSize_u64(usrset->common.workingFilePath); + usrset->common.workingFile.size = align_value(size,0x10); + usrset->common.workingFile.buffer = malloc(usrset->common.workingFile.size); + fp = fopen(usrset->common.workingFilePath,"rb"); + ReadFile_64(usrset->common.workingFile.buffer,size,0,fp); + fclose(fp); } } else{// Build Content 0 @@ -83,7 +67,7 @@ int main(int argc, char *argv[]) } } // Make CCI - if(usrset->out_format == CCI){ + if(usrset->common.outFormat == CCI){ #ifdef DEBUG printf("[DEBUG] Building CCI\n"); #endif @@ -91,7 +75,7 @@ int main(int argc, char *argv[]) if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CCI\n"); goto finish; } } // Make CIA - else if(usrset->out_format == CIA){ + else if(usrset->common.outFormat == CIA){ #ifdef DEBUG printf("[DEBUG] Building CIA\n"); #endif @@ -99,18 +83,18 @@ int main(int argc, char *argv[]) if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CIA\n"); goto finish; } } // No Container Raw CXI/CFA - else if(usrset->out_format == CXI || usrset->out_format == CFA){ + else if(usrset->common.outFormat == CXI || usrset->common.outFormat == CFA){ #ifdef DEBUG printf("[DEBUG] Outputting NCCH, because No Container\n"); #endif - FILE *ncch_out = fopen(usrset->outfile,"wb"); + FILE *ncch_out = fopen(usrset->common.outFileName,"wb"); if(!ncch_out) { - fprintf(stderr,"[ERROR] Failed to create '%s'\n",usrset->outfile); - fprintf(stderr,"[RESULT] Failed to build '%s'\n",usrset->out_format == CXI? "CXI" : "CFA"); + fprintf(stderr,"[ERROR] Failed to create '%s'\n",usrset->common.outFileName); + fprintf(stderr,"[RESULT] Failed to build '%s'\n",usrset->common.outFormat == CXI? "CXI" : "CFA"); result = FAILED_TO_CREATE_OUTFILE; goto finish; } - WriteBuffer(usrset->Content0.buffer,usrset->Content0.size,0,ncch_out); + WriteBuffer(usrset->common.workingFile.buffer,usrset->common.workingFile.size,0,ncch_out); fclose(ncch_out); } diff --git a/ncch.c b/ncch.c index 409577a..d5caeb1 100644 --- a/ncch.c +++ b/ncch.c @@ -11,7 +11,7 @@ // Private Prototypes int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK); +int SignCXI(u8 *Signature, u8 *CXI_HDR, keys_struct *keys); int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK); void init_NCCHSettings(ncch_settings *set); @@ -22,8 +22,8 @@ int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset); int ImportNonCodeExeFsSections(ncch_settings *ncchset); int ImportLogo(ncch_settings *ncchset); -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr); -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr); +int SetCommonHeaderBasicData(ncch_settings *ncchset, ncch_hdr *hdr); +int SetCommonHeaderSectionData(ncch_settings *ncchset, ncch_hdr *hdr); bool IsValidProductCode(char *ProductCode, bool FreeProductCode); int BuildCommonHeader(ncch_settings *ncchset); @@ -34,22 +34,22 @@ int WriteNCCHSectionsToBuffer(ncch_settings *ncchset); int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) { - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,keys->rsa.CFA_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); + return ctr_sig(CFA_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cciCfaPub,keys->rsa.cciCfaPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) { - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); + return ctr_sig(CFA_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cciCfaPub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); } -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK) +int SignCXI(u8 *Signature, u8 *CXI_HDR, keys_struct *keys) { - return ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,PrivK,RSA_2048_SHA256,CTR_RSA_SIGN); + return ctr_sig(CXI_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cxiHdrPub,keys->rsa.cxiHdrPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) { - int result = ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); + int result = ctr_sig(CXI_HDR,sizeof(ncch_hdr),Signature,PubK,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); return result; } @@ -58,22 +58,22 @@ int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) int build_NCCH(user_settings *usrset) { int result; -#ifdef DEBUG - printf("[DEBUG] Init Settings\n"); +#ifdef DEBUG + printf("[DEBUG] Init Settings\n"); #endif // Init Settings ncch_settings *ncchset = malloc(sizeof(ncch_settings)); if(!ncchset) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} init_NCCHSettings(ncchset); -#ifdef DEBUG - printf("[DEBUG] Get Settings\n"); +#ifdef DEBUG + printf("[DEBUG] Get Settings\n"); #endif // Get Settings result = get_NCCHSettings(ncchset,usrset); if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); +#ifdef DEBUG + printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); #endif // Build ExeFs Code Section result = BuildExeFsCode(ncchset); @@ -81,54 +81,54 @@ int build_NCCH(user_settings *usrset) #ifdef ELF_DEBUG FILE *code = fopen("code.bin","wb"); - fwrite(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,1,code); + fwrite(ncchset->exefsSections.code.buffer,ncchset->exefsSections.code.size,1,code); fclose(code); u8 hash[0x20]; - ctr_sha(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,hash,CTR_SHA_256); - printf("BSS Size: 0x%x\n",ncchset->CodeDetails.BSS_Size); - printf("Code Size: 0x%x\n",ncchset->ExeFs_Sections.Code.size); + ctr_sha(ncchset->exefsSections.code.buffer,ncchset->exefsSections.code.size,hash,CTR_SHA_256); + printf("BSS Size: 0x%x\n",ncchset->codeDetails.bssSize); + printf("Code Size: 0x%x\n",ncchset->exefsSections.code.size); memdump(stdout,"Code Hash: ",hash,0x20); #endif -#ifdef DEBUG - printf("[DEBUG] Build Exheader\n"); +#ifdef DEBUG + printf("[DEBUG] Build Exheader\n"); #endif // Build ExHeader result = BuildExHeader(ncchset); if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Exefs\n"); +#ifdef DEBUG + printf("[DEBUG] Exefs\n"); #endif // Build ExeFs/RomFs result = BuildExeFs(ncchset); if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build Romfs\n"); +#ifdef DEBUG + printf("[DEBUG] Build Romfs\n"); #endif result = BuildRomFs(ncchset); if(result) goto finish; // Final Steps -#ifdef DEBUG - printf("[DEBUG] Build common header\n"); +#ifdef DEBUG + printf("[DEBUG] Build common header\n"); #endif result = BuildCommonHeader(ncchset); if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Encrypt Sections\n"); +#ifdef DEBUG + printf("[DEBUG] Encrypt Sections\n"); #endif result = EncryptNCCHSections(ncchset); if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Write Sections\n"); +#ifdef DEBUG + printf("[DEBUG] Write Sections\n"); #endif result = WriteNCCHSectionsToBuffer(ncchset); if(result) goto finish; finish: -#ifdef DEBUG - printf("[DEBUG] Finish Building\n"); +#ifdef DEBUG + printf("[DEBUG] Finish Building\n"); #endif if(result) fprintf(stderr,"[NCCH ERROR] NCCH Build Process Failed\n"); free_NCCHSettings(ncchset); @@ -142,28 +142,25 @@ void init_NCCHSettings(ncch_settings *set) void free_NCCHSettings(ncch_settings *set) { - if(set->CxiRsaKey.PrivK) free(set->CxiRsaKey.PrivK); - if(set->CxiRsaKey.PubK) free(set->CxiRsaKey.PubK); + if(set->componentFilePtrs.elf) fclose(set->componentFilePtrs.elf); + if(set->componentFilePtrs.banner) fclose(set->componentFilePtrs.banner); + if(set->componentFilePtrs.icon) fclose(set->componentFilePtrs.icon); + if(set->componentFilePtrs.logo) fclose(set->componentFilePtrs.logo); + if(set->componentFilePtrs.code) fclose(set->componentFilePtrs.code); + if(set->componentFilePtrs.exhdr) fclose(set->componentFilePtrs.exhdr); + if(set->componentFilePtrs.romfs) fclose(set->componentFilePtrs.romfs); + if(set->componentFilePtrs.plainregion) fclose(set->componentFilePtrs.plainregion); - if(set->ComponentFilePtrs.elf) fclose(set->ComponentFilePtrs.elf); - if(set->ComponentFilePtrs.banner) fclose(set->ComponentFilePtrs.banner); - if(set->ComponentFilePtrs.icon) fclose(set->ComponentFilePtrs.icon); - if(set->ComponentFilePtrs.logo) fclose(set->ComponentFilePtrs.logo); - if(set->ComponentFilePtrs.code) fclose(set->ComponentFilePtrs.code); - if(set->ComponentFilePtrs.exheader) fclose(set->ComponentFilePtrs.exheader); - if(set->ComponentFilePtrs.romfs) fclose(set->ComponentFilePtrs.romfs); - if(set->ComponentFilePtrs.plainregion) fclose(set->ComponentFilePtrs.plainregion); + if(set->exefsSections.code.size) free(set->exefsSections.code.buffer); + if(set->exefsSections.banner.size) free(set->exefsSections.banner.buffer); + if(set->exefsSections.icon.size) free(set->exefsSections.icon.buffer); - if(set->ExeFs_Sections.Code.size) free(set->ExeFs_Sections.Code.buffer); - if(set->ExeFs_Sections.Banner.size) free(set->ExeFs_Sections.Banner.buffer); - if(set->ExeFs_Sections.Icon.size) free(set->ExeFs_Sections.Icon.buffer); - - if(set->Sections.CommonHeader.size) free(set->Sections.CommonHeader.buffer); - if(set->Sections.ExHeader.size) free(set->Sections.ExHeader.buffer); - if(set->Sections.Logo.size) free(set->Sections.Logo.buffer); - if(set->Sections.PlainRegion.size) free(set->Sections.PlainRegion.buffer); - if(set->Sections.ExeFs.size) free(set->Sections.ExeFs.buffer); - if(set->Sections.RomFs.size) free(set->Sections.RomFs.buffer); + if(set->sections.ncchHdr.size) free(set->sections.ncchHdr.buffer); + if(set->sections.exhdr.size) free(set->sections.exhdr.buffer); + if(set->sections.logo.size) free(set->sections.logo.buffer); + if(set->sections.plainRegion.size) free(set->sections.plainRegion.buffer); + if(set->sections.exeFs.size) free(set->sections.exeFs.buffer); + if(set->sections.romFs.size) free(set->sections.romFs.buffer); memset(set,0,sizeof(ncch_settings)); @@ -173,9 +170,9 @@ void free_NCCHSettings(ncch_settings *set) int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset) { int result = 0; - ncchset->out = &usrset->Content0; - ncchset->yaml_set = &usrset->yaml_set; - ncchset->keys = &usrset->keys; + ncchset->out = &usrset->common.workingFile; + ncchset->rsfSet = &usrset->common.rsfSet; + ncchset->keys = &usrset->common.keys; result = SetBasicOptions(ncchset,usrset); if(result) return result; @@ -195,105 +192,101 @@ int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset) int result = 0; /* Options */ - ncchset->Options.MediaSize = 0x200; + ncchset->options.mediaSize = 0x200; - ncchset->Options.IncludeExeFsLogo = usrset->include_exefs_logo; + ncchset->options.IncludeExeFsLogo = usrset->ncch.includeExefsLogo; - if(usrset->yaml_set.Option.EnableCompress != -1) ncchset->Options.CompressCode = usrset->yaml_set.Option.EnableCompress; - else ncchset->Options.CompressCode = true; + if(usrset->common.rsfSet.Option.EnableCompress != -1) ncchset->options.CompressCode = usrset->common.rsfSet.Option.EnableCompress; + else ncchset->options.CompressCode = true; - if(usrset->yaml_set.Option.UseOnSD != -1) ncchset->Options.UseOnSD = usrset->yaml_set.Option.UseOnSD; - else ncchset->Options.UseOnSD = false; - usrset->yaml_set.Option.UseOnSD = ncchset->Options.UseOnSD; + if(usrset->common.rsfSet.Option.UseOnSD != -1) ncchset->options.UseOnSD = usrset->common.rsfSet.Option.UseOnSD; + else ncchset->options.UseOnSD = false; + usrset->common.rsfSet.Option.UseOnSD = ncchset->options.UseOnSD; - if(usrset->yaml_set.Option.EnableCrypt != -1) ncchset->Options.Encrypt = usrset->yaml_set.Option.EnableCrypt; - else ncchset->Options.Encrypt = true; + if(usrset->common.rsfSet.Option.EnableCrypt != -1) ncchset->options.Encrypt = usrset->common.rsfSet.Option.EnableCrypt; + else ncchset->options.Encrypt = true; - if(usrset->yaml_set.Option.FreeProductCode != -1) ncchset->Options.FreeProductCode = usrset->yaml_set.Option.FreeProductCode; - else ncchset->Options.FreeProductCode = false; + if(usrset->common.rsfSet.Option.FreeProductCode != -1) ncchset->options.FreeProductCode = usrset->common.rsfSet.Option.FreeProductCode; + else ncchset->options.FreeProductCode = false; - ncchset->Options.IsCfa = (usrset->build_ncch_type == CFA); + ncchset->options.IsCfa = (usrset->ncch.ncchType == CFA); - ncchset->Options.IsBuildingCodeSection = (usrset->elf_path != NULL); + ncchset->options.IsBuildingCodeSection = (usrset->ncch.elfPath != NULL); - ncchset->Options.UseRomFS = ((ncchset->yaml_set->Rom.HostRoot && strlen(ncchset->yaml_set->Rom.HostRoot) > 0) || usrset->romfs_path); + ncchset->options.UseRomFS = ((ncchset->rsfSet->Rom.HostRoot && strlen(ncchset->rsfSet->Rom.HostRoot) > 0) || usrset->ncch.romfsPath); - if(ncchset->Options.IsCfa && !ncchset->Options.UseRomFS){ + if(ncchset->options.IsCfa && !ncchset->options.UseRomFS){ fprintf(stderr,"[NCCH ERROR] 'Rom/HostRoot' must be set\n"); return NCCH_BAD_YAML_SET; } - ncchset->CxiRsaKey.PrivK = malloc(0x100); - ncchset->CxiRsaKey.PubK = malloc(0x100); - return result; } int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset) { - if(usrset->romfs_path){ - ncchset->ComponentFilePtrs.romfs_size = GetFileSize_u64(usrset->romfs_path); - ncchset->ComponentFilePtrs.romfs = fopen(usrset->romfs_path,"rb"); - if(!ncchset->ComponentFilePtrs.romfs){ - fprintf(stderr,"[NCCH ERROR] Failed to open RomFs file '%s'\n",usrset->romfs_path); + if(usrset->ncch.romfsPath){ + ncchset->componentFilePtrs.romfsSize = GetFileSize_u64(usrset->ncch.romfsPath); + ncchset->componentFilePtrs.romfs = fopen(usrset->ncch.romfsPath,"rb"); + if(!ncchset->componentFilePtrs.romfs){ + fprintf(stderr,"[NCCH ERROR] Failed to open RomFs file '%s'\n",usrset->ncch.romfsPath); return FAILED_TO_IMPORT_FILE; } } - if(ncchset->Options.IsCfa) return 0; - if(usrset->elf_path){ - ncchset->ComponentFilePtrs.elf_size = GetFileSize_u64(usrset->elf_path); - ncchset->ComponentFilePtrs.elf = fopen(usrset->elf_path,"rb"); - if(!ncchset->ComponentFilePtrs.elf){ - fprintf(stderr,"[NCCH ERROR] Failed to open elf file '%s'\n",usrset->elf_path); + if(usrset->ncch.elfPath){ + ncchset->componentFilePtrs.elfSize = GetFileSize_u64(usrset->ncch.elfPath); + ncchset->componentFilePtrs.elf = fopen(usrset->ncch.elfPath,"rb"); + if(!ncchset->componentFilePtrs.elf){ + fprintf(stderr,"[NCCH ERROR] Failed to open elf file '%s'\n",usrset->ncch.elfPath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->banner_path){ - ncchset->ComponentFilePtrs.banner_size = GetFileSize_u64(usrset->banner_path); - ncchset->ComponentFilePtrs.banner = fopen(usrset->banner_path,"rb"); - if(!ncchset->ComponentFilePtrs.banner){ - fprintf(stderr,"[NCCH ERROR] Failed to open banner file '%s'\n",usrset->banner_path); + if(usrset->ncch.bannerPath){ + ncchset->componentFilePtrs.bannerSize = GetFileSize_u64(usrset->ncch.bannerPath); + ncchset->componentFilePtrs.banner = fopen(usrset->ncch.bannerPath,"rb"); + if(!ncchset->componentFilePtrs.banner){ + fprintf(stderr,"[NCCH ERROR] Failed to open banner file '%s'\n",usrset->ncch.bannerPath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->icon_path){ - ncchset->ComponentFilePtrs.icon_size = GetFileSize_u64(usrset->icon_path); - ncchset->ComponentFilePtrs.icon = fopen(usrset->icon_path,"rb"); - if(!ncchset->ComponentFilePtrs.icon){ - fprintf(stderr,"[NCCH ERROR] Failed to open icon file '%s'\n",usrset->icon_path); + if(usrset->ncch.iconPath){ + ncchset->componentFilePtrs.iconSize = GetFileSize_u64(usrset->ncch.iconPath); + ncchset->componentFilePtrs.icon = fopen(usrset->ncch.iconPath,"rb"); + if(!ncchset->componentFilePtrs.icon){ + fprintf(stderr,"[NCCH ERROR] Failed to open icon file '%s'\n",usrset->ncch.iconPath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->logo_path){ - ncchset->ComponentFilePtrs.logo_size = GetFileSize_u64(usrset->logo_path); - ncchset->ComponentFilePtrs.logo = fopen(usrset->logo_path,"rb"); - if(!ncchset->ComponentFilePtrs.logo){ - fprintf(stderr,"[NCCH ERROR] Failed to open logo file '%s'\n",usrset->logo_path); + if(usrset->ncch.logoPath){ + ncchset->componentFilePtrs.logoSize = GetFileSize_u64(usrset->ncch.logoPath); + ncchset->componentFilePtrs.logo = fopen(usrset->ncch.logoPath,"rb"); + if(!ncchset->componentFilePtrs.logo){ + fprintf(stderr,"[NCCH ERROR] Failed to open logo file '%s'\n",usrset->ncch.logoPath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->exefs_code_path){ - ncchset->ComponentFilePtrs.code_size = GetFileSize_u64(usrset->exefs_code_path); - ncchset->ComponentFilePtrs.code = fopen(usrset->exefs_code_path,"rb"); - if(!ncchset->ComponentFilePtrs.code){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExeFs Code file '%s'\n",usrset->exefs_code_path); + if(usrset->ncch.codePath){ + ncchset->componentFilePtrs.codeSize = GetFileSize_u64(usrset->ncch.codePath); + ncchset->componentFilePtrs.code = fopen(usrset->ncch.codePath,"rb"); + if(!ncchset->componentFilePtrs.code){ + fprintf(stderr,"[NCCH ERROR] Failed to open ExeFs Code file '%s'\n",usrset->ncch.codePath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->exheader_path){ - ncchset->ComponentFilePtrs.exheader_size = GetFileSize_u64(usrset->exheader_path); - ncchset->ComponentFilePtrs.exheader = fopen(usrset->exheader_path,"rb"); - if(!ncchset->ComponentFilePtrs.exheader){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExHeader file '%s'\n",usrset->exheader_path); + if(usrset->ncch.exheaderPath){ + ncchset->componentFilePtrs.exhdrSize = GetFileSize_u64(usrset->ncch.exheaderPath); + ncchset->componentFilePtrs.exhdr = fopen(usrset->ncch.exheaderPath,"rb"); + if(!ncchset->componentFilePtrs.exhdr){ + fprintf(stderr,"[NCCH ERROR] Failed to open ExHeader file '%s'\n",usrset->ncch.exheaderPath); return FAILED_TO_IMPORT_FILE; } } - if(usrset->plain_region_path){ - ncchset->ComponentFilePtrs.plainregion_size = GetFileSize_u64(usrset->plain_region_path); - ncchset->ComponentFilePtrs.plainregion = fopen(usrset->plain_region_path,"rb"); - if(!ncchset->ComponentFilePtrs.plainregion){ - fprintf(stderr,"[NCCH ERROR] Failed to open PlainRegion file '%s'\n",usrset->plain_region_path); + if(usrset->ncch.plainRegionPath){ + ncchset->componentFilePtrs.plainregionSize = GetFileSize_u64(usrset->ncch.plainRegionPath); + ncchset->componentFilePtrs.plainregion = fopen(usrset->ncch.plainRegionPath,"rb"); + if(!ncchset->componentFilePtrs.plainregion){ + fprintf(stderr,"[NCCH ERROR] Failed to open PlainRegion file '%s'\n",usrset->ncch.plainRegionPath); return FAILED_TO_IMPORT_FILE; } } @@ -302,63 +295,86 @@ int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset) int ImportNonCodeExeFsSections(ncch_settings *ncchset) { - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.banner){ - ncchset->ExeFs_Sections.Banner.size = ncchset->ComponentFilePtrs.banner_size; - ncchset->ExeFs_Sections.Banner.buffer = malloc(ncchset->ExeFs_Sections.Banner.size); - if(!ncchset->ExeFs_Sections.Banner.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size,0,ncchset->ComponentFilePtrs.banner); + if(ncchset->componentFilePtrs.banner){ + ncchset->exefsSections.banner.size = ncchset->componentFilePtrs.bannerSize; + ncchset->exefsSections.banner.buffer = malloc(ncchset->exefsSections.banner.size); + if(!ncchset->exefsSections.banner.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + ReadFile_64(ncchset->exefsSections.banner.buffer,ncchset->exefsSections.banner.size,0,ncchset->componentFilePtrs.banner); } - if(ncchset->ComponentFilePtrs.icon){ - ncchset->ExeFs_Sections.Icon.size = ncchset->ComponentFilePtrs.icon_size; - ncchset->ExeFs_Sections.Icon.buffer = malloc(ncchset->ExeFs_Sections.Icon.size); - if(!ncchset->ExeFs_Sections.Icon.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size,0,ncchset->ComponentFilePtrs.icon); + if(ncchset->componentFilePtrs.icon){ + ncchset->exefsSections.icon.size = ncchset->componentFilePtrs.iconSize; + ncchset->exefsSections.icon.buffer = malloc(ncchset->exefsSections.icon.size); + if(!ncchset->exefsSections.icon.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + ReadFile_64(ncchset->exefsSections.icon.buffer,ncchset->exefsSections.icon.size,0,ncchset->componentFilePtrs.icon); } return 0; } int ImportLogo(ncch_settings *ncchset) { - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.logo){ - ncchset->Sections.Logo.size = ncchset->ComponentFilePtrs.logo_size; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,0,ncchset->ComponentFilePtrs.logo); + if(ncchset->options.IsCfa) return 0; + if(ncchset->componentFilePtrs.logo){ + ncchset->sections.logo.size = ncchset->componentFilePtrs.logoSize; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + ReadFile_64(ncchset->sections.logo.buffer,ncchset->sections.logo.size,0,ncchset->componentFilePtrs.logo); } - else if(ncchset->yaml_set->BasicInfo.Logo){ - if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"nintendo") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LZ,0x2000); + else if(ncchset->rsfSet->BasicInfo.Logo){ + if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"nintendo") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memcpy(ncchset->sections.logo.buffer,Nintendo_LZ,0x2000); } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"licensed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LicensedBy_LZ,0x2000); + else if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"licensed") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memcpy(ncchset->sections.logo.buffer,Nintendo_LicensedBy_LZ,0x2000); } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"distributed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_DistributedBy_LZ,0x2000); + else if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"distributed") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memcpy(ncchset->sections.logo.buffer,Nintendo_DistributedBy_LZ,0x2000); } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"ique") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_with_ISBN_LZ,0x2000); + else if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"ique") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memcpy(ncchset->sections.logo.buffer,iQue_with_ISBN_LZ,0x2000); } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"iqueforsystem") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_without_ISBN_LZ,0x2000); + else if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"iqueforsystem") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) { + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return MEM_ERROR; + } + memcpy(ncchset->sections.logo.buffer,iQue_without_ISBN_LZ,0x2000); } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"none") != 0){ + else if(strcasecmp(ncchset->rsfSet->BasicInfo.Logo,"none") != 0){ fprintf(stderr,"[NCCH ERROR] Invalid logo name\n"); return NCCH_BAD_YAML_SET; } @@ -366,70 +382,62 @@ int ImportLogo(ncch_settings *ncchset) return 0; } -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr) +int SetCommonHeaderBasicData(ncch_settings *ncchset, ncch_hdr *hdr) { - /* NCCH Format Version */ - u16_to_u8(hdr->version,0x2,LE); + /* NCCH Format titleVersion */ + u16_to_u8(hdr->formatVersion,0x2,LE); /* Setting ProgramId/TitleId */ u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,ncchset->yaml_set,false); + int result = GetProgramID(&ProgramId,ncchset->rsfSet,false); if(result) return result; - u64_to_u8(hdr->program_id,ProgramId,LE); - u64_to_u8(hdr->title_id,ProgramId,LE); + u64_to_u8(hdr->programId,ProgramId,LE); + u64_to_u8(hdr->titleId,ProgramId,LE); /* Get Product Code and Maker Code */ - if(ncchset->yaml_set->BasicInfo.ProductCode){ - if(!IsValidProductCode((char*)ncchset->yaml_set->BasicInfo.ProductCode,ncchset->Options.FreeProductCode)){ + if(ncchset->rsfSet->BasicInfo.ProductCode){ + if(!IsValidProductCode((char*)ncchset->rsfSet->BasicInfo.ProductCode,ncchset->options.FreeProductCode)){ fprintf(stderr,"[NCCH ERROR] Invalid Product Code\n"); return NCCH_BAD_YAML_SET; } - memcpy(hdr->product_code,ncchset->yaml_set->BasicInfo.ProductCode,strlen((char*)ncchset->yaml_set->BasicInfo.ProductCode)); + memcpy(hdr->productCode,ncchset->rsfSet->BasicInfo.ProductCode,strlen((char*)ncchset->rsfSet->BasicInfo.ProductCode)); } - else memcpy(hdr->product_code,"CTR-P-CTAP",10); + else memcpy(hdr->productCode,"CTR-P-CTAP",10); - if(ncchset->yaml_set->BasicInfo.CompanyCode){ - if(strlen((char*)ncchset->yaml_set->BasicInfo.CompanyCode) != 2){ + if(ncchset->rsfSet->BasicInfo.CompanyCode){ + if(strlen((char*)ncchset->rsfSet->BasicInfo.CompanyCode) != 2){ fprintf(stderr,"[NCCH ERROR] Company code length must be 2\n"); return NCCH_BAD_YAML_SET; } - memcpy(hdr->maker_code,ncchset->yaml_set->BasicInfo.CompanyCode,2); + memcpy(hdr->makerCode,ncchset->rsfSet->BasicInfo.CompanyCode,2); } - else memcpy(hdr->maker_code,"00",2); + else memcpy(hdr->makerCode,"00",2); /* Set ContentUnitSize */ - hdr->flags[ContentUnitSize] = 0; + hdr->flags[ContentUnitSize] = 0; // 0x200 /* Setting ContentPlatform */ - if(ncchset->yaml_set->TitleInfo.Platform){ - if(strcasecmp(ncchset->yaml_set->TitleInfo.Platform,"ctr") == 0) hdr->flags[ContentPlatform] = 1; - else{ - fprintf(stderr,"[NCCH ERROR] Invalid Platform: %s\n",ncchset->yaml_set->TitleInfo.Platform); - return NCCH_BAD_YAML_SET; - } - } - else - hdr->flags[ContentPlatform] = 1; // CTR + hdr->flags[ContentPlatform] = 1; // CTR /* Setting OtherFlag */ hdr->flags[OtherFlag] = FixedCryptoKey; - if(!ncchset->Options.Encrypt) hdr->flags[OtherFlag] |= NoCrypto; - if(!ncchset->Sections.RomFs.size) hdr->flags[OtherFlag] |= NoMountRomFs; + if(!ncchset->options.Encrypt) hdr->flags[OtherFlag] |= NoCrypto; + if(!ncchset->sections.romFs.size) hdr->flags[OtherFlag] |= NoMountRomFs; /* Setting ContentType */ hdr->flags[ContentType] = 0; - if(ncchset->Sections.RomFs.size) hdr->flags[ContentType] |= RomFS; - if(ncchset->Sections.ExeFs.size) hdr->flags[ContentType] |= ExeFS; - if(ncchset->yaml_set->BasicInfo.ContentType){ - if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Application") == 0) hdr->flags[ContentType] |= 0; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"SystemUpdate") == 0) hdr->flags[ContentType] |= SystemUpdate; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Manual") == 0) hdr->flags[ContentType] |= Manual; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Child") == 0) hdr->flags[ContentType] |= Child; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Trial") == 0) hdr->flags[ContentType] |= Trial; + if(ncchset->sections.romFs.size || ncchset->options.IsCfa) hdr->flags[ContentType] |= content_Data; + if(!ncchset->options.IsCfa) hdr->flags[ContentType] |= content_Executable; + if(ncchset->rsfSet->BasicInfo.ContentType){ + if(strcmp(ncchset->rsfSet->BasicInfo.ContentType,"Application") == 0) hdr->flags[ContentType] |= 0; + else if(strcmp(ncchset->rsfSet->BasicInfo.ContentType,"SystemUpdate") == 0) hdr->flags[ContentType] |= content_SystemUpdate; + else if(strcmp(ncchset->rsfSet->BasicInfo.ContentType,"Manual") == 0) hdr->flags[ContentType] |= content_Manual; + else if(strcmp(ncchset->rsfSet->BasicInfo.ContentType,"Child") == 0) hdr->flags[ContentType] |= content_Child; + else if(strcmp(ncchset->rsfSet->BasicInfo.ContentType,"Trial") == 0) hdr->flags[ContentType] |= content_Trial; else{ - fprintf(stderr,"[NCCH ERROR] Invalid ContentType '%s'\n",ncchset->yaml_set->BasicInfo.ContentType); + fprintf(stderr,"[NCCH ERROR] Invalid ContentType '%s'\n",ncchset->rsfSet->BasicInfo.ContentType); return NCCH_BAD_YAML_SET; } } @@ -437,32 +445,36 @@ int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr) return 0; } -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr) +int SetCommonHeaderSectionData(ncch_settings *ncchset, ncch_hdr *hdr) { /* Set Sizes/Hashes to Hdr */ - u32 ExHeaderSize = (u32) ncchset->Sections.ExHeader.size - 0x400; - u32 LogoSize = (u32) (ncchset->Sections.Logo.size/ncchset->Options.MediaSize); - u32 PlainRegionSize = (u32) (ncchset->Sections.PlainRegion.size/ncchset->Options.MediaSize); - u32 ExeFsSize = (u32) (ncchset->Sections.ExeFs.size/ncchset->Options.MediaSize); - u32 ExeFsHashSize = (u32) ExeFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - u32 RomFsSize = (u32) (ncchset->Sections.RomFs.size/ncchset->Options.MediaSize); - u32 RomFsHashSize = (u32) RomFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - u32_to_u8(hdr->extended_header_size,ExHeaderSize,LE); - if(ExHeaderSize) ctr_sha(ncchset->Sections.ExHeader.buffer,ExHeaderSize,hdr->extended_header_sha_256_hash,CTR_SHA_256); + u32 ExHeaderSize,LogoSize,PlainRegionSize,ExeFsSize,ExeFsHashSize,RomFsSize,RomFsHashSize; + + ExHeaderSize = ncchset->sections.exhdr.size ? ((u32) ncchset->sections.exhdr.size - 0x400) : 0; + LogoSize = ncchset->sections.logo.size ? ((u32) (ncchset->sections.logo.size/ncchset->options.mediaSize)) : 0; + PlainRegionSize = ncchset->sections.plainRegion.size ? ((u32) (ncchset->sections.plainRegion.size/ncchset->options.mediaSize)) : 0; + ExeFsSize = ncchset->sections.exeFs.size ? ((u32) (ncchset->sections.exeFs.size/ncchset->options.mediaSize)) : 0; + ExeFsHashSize = (u32) ExeFsSize? ncchset->options.mediaSize/ncchset->options.mediaSize : 0; + RomFsSize = ncchset->sections.romFs.size ? ((u32) (ncchset->sections.romFs.size/ncchset->options.mediaSize)) : 0; + RomFsHashSize = (u32) RomFsSize? ncchset->options.mediaSize/ncchset->options.mediaSize : 0; + - u32_to_u8(hdr->logo_region_size,LogoSize,LE); - if(LogoSize) ctr_sha(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,hdr->logo_sha_256_hash,CTR_SHA_256); + u32_to_u8(hdr->exhdrSize,ExHeaderSize,LE); + if(ExHeaderSize) ctr_sha(ncchset->sections.exhdr.buffer,ExHeaderSize,hdr->exhdrHash,CTR_SHA_256); - u32_to_u8(hdr->plain_region_size,PlainRegionSize,LE); + u32_to_u8(hdr->logoSize,LogoSize,LE); + if(LogoSize) ctr_sha(ncchset->sections.logo.buffer,ncchset->sections.logo.size,hdr->logoHash,CTR_SHA_256); - u32_to_u8(hdr->exefs_size,ExeFsSize,LE); - u32_to_u8(hdr->exefs_hash_size,ExeFsHashSize,LE); - if(ExeFsSize) ctr_sha(ncchset->Sections.ExeFs.buffer,ncchset->Options.MediaSize,hdr->exefs_sha_256_hash,CTR_SHA_256); + u32_to_u8(hdr->plainRegionSize,PlainRegionSize,LE); - u32_to_u8(hdr->romfs_size,RomFsSize,LE); - u32_to_u8(hdr->romfs_hash_size,RomFsHashSize,LE); - if(RomFsSize) ctr_sha(ncchset->Sections.RomFs.buffer,ncchset->Options.MediaSize,hdr->romfs_sha_256_hash,CTR_SHA_256); + u32_to_u8(hdr->exefsSize,ExeFsSize,LE); + u32_to_u8(hdr->exefsHashSize,ExeFsHashSize,LE); + if(ExeFsSize) ctr_sha(ncchset->sections.exeFs.buffer,ncchset->options.mediaSize,hdr->exefsHash,CTR_SHA_256); + + u32_to_u8(hdr->romfsSize,RomFsSize,LE); + u32_to_u8(hdr->romfsHashSize,RomFsHashSize,LE); + if(RomFsSize) ctr_sha(ncchset->sections.romFs.buffer,ncchset->options.mediaSize,hdr->romfsHash,CTR_SHA_256); /* Get Section Offsets */ @@ -471,32 +483,32 @@ int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr) size += 4; if (LogoSize){ - u32_to_u8(hdr->logo_region_offset,size,LE); - ncchset->Sections.LogoOffset = size*ncchset->Options.MediaSize; + u32_to_u8(hdr->logoOffset,size,LE); + ncchset->sections.logoOffset = size*ncchset->options.mediaSize; size += LogoSize; } if(PlainRegionSize){ - u32_to_u8(hdr->plain_region_offset,size,LE); - ncchset->Sections.PlainRegionOffset = size*ncchset->Options.MediaSize; + u32_to_u8(hdr->plainRegionOffset,size,LE); + ncchset->sections.plainRegionOffset = size*ncchset->options.mediaSize; size += PlainRegionSize; } if (ExeFsSize){ - u32_to_u8(hdr->exefs_offset,size,LE); - ncchset->Sections.ExeFsOffset = size*ncchset->Options.MediaSize; + u32_to_u8(hdr->exefsOffset,size,LE); + ncchset->sections.exeFsOffset = size*ncchset->options.mediaSize; size += ExeFsSize; } if (RomFsSize){ - u32_to_u8(hdr->romfs_offset,size,LE); - ncchset->Sections.RomFsOffset = size*ncchset->Options.MediaSize; + u32_to_u8(hdr->romfsOffset,size,LE); + ncchset->sections.romFsOffset = size*ncchset->options.mediaSize; size += RomFsSize; } - u32_to_u8(hdr->content_size,size,LE); + u32_to_u8(hdr->ncchSize,size,LE); - ncchset->Sections.TotalContentSize = size * ncchset->Options.MediaSize; + ncchset->sections.totalNcchSize = size * ncchset->options.mediaSize; return 0; } @@ -524,14 +536,14 @@ int BuildCommonHeader(ncch_settings *ncchset) int result = 0; // Initialising Header - ncchset->Sections.CommonHeader.size = 0x100 + sizeof(NCCH_Header); - ncchset->Sections.CommonHeader.buffer = malloc(ncchset->Sections.CommonHeader.size); - if(!ncchset->Sections.CommonHeader.buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncchset->Sections.CommonHeader.buffer,0,ncchset->Sections.CommonHeader.size); + ncchset->sections.ncchHdr.size = 0x100 + sizeof(ncch_hdr); + ncchset->sections.ncchHdr.buffer = malloc(ncchset->sections.ncchHdr.size); + if(!ncchset->sections.ncchHdr.buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } + memset(ncchset->sections.ncchHdr.buffer,0,ncchset->sections.ncchHdr.size); // Creating Ptrs - u8 *sig = ncchset->Sections.CommonHeader.buffer; - NCCH_Header *hdr = (NCCH_Header*)(ncchset->Sections.CommonHeader.buffer+0x100); + u8 *sig = ncchset->sections.ncchHdr.buffer; + ncch_hdr *hdr = (ncch_hdr*)(ncchset->sections.ncchHdr.buffer+0x100); // Setting Data in Hdr memcpy(hdr->magic,"NCCH",4); @@ -545,10 +557,10 @@ int BuildCommonHeader(ncch_settings *ncchset) // Signing Hdr int sig_result = Good; - if(ncchset->Options.IsCfa) sig_result = SignCFA(sig,(u8*)hdr,ncchset->keys); - else sig_result = SignCXI(sig,(u8*)hdr,ncchset->CxiRsaKey.PubK,ncchset->CxiRsaKey.PrivK); + if(ncchset->options.IsCfa) sig_result = SignCFA(sig,(u8*)hdr,ncchset->keys); + else sig_result = SignCXI(sig,(u8*)hdr,ncchset->keys); if(sig_result != Good){ - fprintf(stderr,"[NCCH ERROR] Failed to sign %s header\n",ncchset->Options.IsCfa ? "CFA" : "CXI"); + fprintf(stderr,"[NCCH ERROR] Failed to sign %s header\n",ncchset->options.IsCfa ? "CFA" : "CXI"); return sig_result; } @@ -557,25 +569,25 @@ int BuildCommonHeader(ncch_settings *ncchset) int EncryptNCCHSections(ncch_settings *ncchset) { - if(!ncchset->Options.Encrypt) return 0; + if(!ncchset->options.Encrypt) return 0; - /* Getting NCCH_STRUCT */ - NCCH_Header *hdr = GetNCCH_CommonHDR(NULL,NULL,ncchset->Sections.CommonHeader.buffer); - NCCH_STRUCT *ncch = malloc(sizeof(NCCH_STRUCT)); + /* Getting ncch_struct */ + ncch_hdr *hdr = GetNCCH_CommonHDR(NULL,NULL,ncchset->sections.ncchHdr.buffer); + ncch_struct *ncch = malloc(sizeof(ncch_struct)); if(!ncch) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncch,0,sizeof(NCCH_STRUCT)); + memset(ncch,0,sizeof(ncch_struct)); GetCXIStruct(ncch,hdr); u8 *ncch_key = GetNCCHKey(hdr,ncchset->keys); - if(ncchset->Sections.ExHeader.size) - CryptNCCHSection(ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size,0,ncch,ncch_key,ncch_ExHeader); + if(ncchset->sections.exhdr.size) + CryptNCCHSection(ncchset->sections.exhdr.buffer,ncchset->sections.exhdr.size,0,ncch,ncch_key,ncch_exhdr); - if(ncchset->Sections.ExeFs.size) - CryptNCCHSection(ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size,0,ncch,ncch_key,ncch_exefs); + if(ncchset->sections.exeFs.size) + CryptNCCHSection(ncchset->sections.exeFs.buffer,ncchset->sections.exeFs.size,0,ncch,ncch_key,ncch_exefs); - if(ncchset->Sections.RomFs.size) - CryptNCCHSection(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncch,ncch_key,ncch_romfs); + if(ncchset->sections.romFs.size) + CryptNCCHSection(ncchset->sections.romFs.buffer,ncchset->sections.romFs.size,0,ncch,ncch_key,ncch_romfs); return 0; } @@ -583,33 +595,33 @@ int EncryptNCCHSections(ncch_settings *ncchset) int WriteNCCHSectionsToBuffer(ncch_settings *ncchset) { /* Allocating Memory for NCCH, and clearing */ - ncchset->out->size = ncchset->Sections.TotalContentSize; + ncchset->out->size = ncchset->sections.totalNcchSize; ncchset->out->buffer = malloc(ncchset->out->size); if(!ncchset->out->buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} memset(ncchset->out->buffer,0,ncchset->out->size); /* Copy Header+Sig */ - memcpy(ncchset->out->buffer,ncchset->Sections.CommonHeader.buffer,ncchset->Sections.CommonHeader.size); + memcpy(ncchset->out->buffer,ncchset->sections.ncchHdr.buffer,ncchset->sections.ncchHdr.size); /* Copy Exheader+AccessDesc */ - if(ncchset->Sections.ExHeader.size) - memcpy(ncchset->out->buffer+0x200,ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size); + if(ncchset->sections.exhdr.size) + memcpy(ncchset->out->buffer+0x200,ncchset->sections.exhdr.buffer,ncchset->sections.exhdr.size); /* Copy Logo */ - if(ncchset->Sections.Logo.size) - memcpy(ncchset->out->buffer+ncchset->Sections.LogoOffset,ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); + if(ncchset->sections.logo.size) + memcpy(ncchset->out->buffer+ncchset->sections.logoOffset,ncchset->sections.logo.buffer,ncchset->sections.logo.size); /* Copy PlainRegion */ - if(ncchset->Sections.PlainRegion.size) - memcpy(ncchset->out->buffer+ncchset->Sections.PlainRegionOffset,ncchset->Sections.PlainRegion.buffer,ncchset->Sections.PlainRegion.size); + if(ncchset->sections.plainRegion.size) + memcpy(ncchset->out->buffer+ncchset->sections.plainRegionOffset,ncchset->sections.plainRegion.buffer,ncchset->sections.plainRegion.size); /* Copy ExeFs */ - if(ncchset->Sections.ExeFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.ExeFsOffset,ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size); + if(ncchset->sections.exeFs.size) + memcpy(ncchset->out->buffer+ncchset->sections.exeFsOffset,ncchset->sections.exeFs.buffer,ncchset->sections.exeFs.size); /* Copy RomFs */ - if(ncchset->Sections.RomFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.RomFsOffset,ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size); + if(ncchset->sections.romFs.size) + memcpy(ncchset->out->buffer+ncchset->sections.romFsOffset,ncchset->sections.romFs.buffer,ncchset->sections.romFs.size); return 0; } @@ -621,72 +633,45 @@ int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) // Setup u8 Hash[0x20]; u8 *hdr_sig = ncch; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); + ncch_hdr* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); + ncch_struct *ncch_ctx = malloc(sizeof(ncch_struct)); if(!ncch_ctx){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); + memset(ncch_ctx,0x0,sizeof(ncch_struct)); GetCXIStruct(ncch_ctx,hdr); if(IsCfa(hdr)){ - if(CheckCFASignature(hdr_sig,(u8*)hdr,keys) != Good && !keys->rsa.FalseSign){ + if(CheckCFASignature(hdr_sig,(u8*)hdr,keys) != Good && !keys->rsa.isFalseSign){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA Sigcheck Failed\n"); free(ncch_ctx); return NCCH_HDR_SIG_BAD; } - if(!ncch_ctx->romfs_size){ + if(!ncch_ctx->romfsSize){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); free(ncch_ctx); return NO_ROMFS_IN_CFA; } - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - int ret = GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); - free(ncch_ctx); - free(RomFs); - return CXI_CORRUPT; - } - else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - free(ncch_ctx); - free(RomFs); - return UNABLE_TO_LOAD_NCCH_KEY; - } - - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } } else{ // IsCxi // Checking for necessary sections - if(!ncch_ctx->exheader_size){ + if(!ncch_ctx->exhdrSize){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); free(ncch_ctx); return NO_EXHEADER_IN_CXI; } - if(!ncch_ctx->exefs_size){ + if(!ncch_ctx->exefsSize){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); free(ncch_ctx); return NO_EXEFS_IN_CXI; } // Get ExHeader - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); + extended_hdr *ExHeader = malloc(ncch_ctx->exhdrSize); if(!ExHeader){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); free(ncch_ctx); return MEM_ERROR; } - int ret = GetNCCHSection((u8*)ExHeader,ncch_ctx->exheader_size,0,ncch,ncch_ctx,keys,ncch_ExHeader); + int ret = GetNCCHSection((u8*)ExHeader,ncch_ctx->exhdrSize,0,ncch,ncch_ctx,keys,ncch_exhdr); if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); free(ncch_ctx); @@ -702,7 +687,7 @@ int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) // Checking Exheader Hash to see if decryption was sucessful ctr_sha(ExHeader,0x400,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->extended_header_sha_256_hash,0x20) != 0){ + if(memcmp(Hash,hdr->exhdrHash,0x20) != 0){ //memdump(stdout,"Expected Hash: ",hdr->extended_header_sha_256_hash,0x20); //memdump(stdout,"Actual Hash: ",Hash,0x20); //memdump(stdout,"Exheader: ",(u8*)ExHeader,0x400); @@ -718,67 +703,68 @@ int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) // Checking RSA Sigs u8 *hdr_pubk = GetNcchHdrPubKey_frm_exhdr(ExHeader); - if(CheckAccessDescSignature(ExHeader,keys) != 0 && !keys->rsa.FalseSign){ + if(CheckaccessDescSignature(ExHeader,keys) != 0 && !keys->rsa.isFalseSign){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] AccessDesc Sigcheck Failed\n"); free(ncch_ctx); free(ExHeader); return ACCESSDESC_SIG_BAD; } - if(CheckCXISignature(hdr_sig,(u8*)hdr,hdr_pubk) != 0 /* && !keys->rsa.FalseSign*/){ + if(CheckCXISignature(hdr_sig,(u8*)hdr,hdr_pubk) != 0 /* && !keys->rsa.isFalseSign*/){ // This should always be correct if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI Header Sigcheck Failed\n"); free(ncch_ctx); free(ExHeader); return NCCH_HDR_SIG_BAD; } free(ExHeader); - - // It is assumed by this point, everything is fine - - /* Checking ExeFs Hash */ - u8 *ExeFs = malloc(ncch_ctx->exefs_hash_src_size); + } + /* Checking ExeFs Hash, if present */ + if(ncch_ctx->exefsSize) + { + u8 *ExeFs = malloc(ncch_ctx->exefsHashDataSize); if(!ExeFs){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); free(ncch_ctx); return MEM_ERROR; } - GetNCCHSection(ExeFs,ncch_ctx->exefs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_exefs); - ctr_sha(ExeFs,ncch_ctx->exefs_hash_src_size,Hash,CTR_SHA_256); + GetNCCHSection(ExeFs,ncch_ctx->exefsHashDataSize,0,ncch,ncch_ctx,keys,ncch_exefs); + ctr_sha(ExeFs,ncch_ctx->exefsHashDataSize,Hash,CTR_SHA_256); free(ExeFs); - if(memcmp(Hash,hdr->exefs_sha_256_hash,0x20) != 0){ + if(memcmp(Hash,hdr->exefsHash,0x20) != 0){ if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] ExeFs Hashcheck Failed\n"); free(ncch_ctx); return ExeFs_Hashfail; } - - /* Checking RomFs hash, if present */ - if(ncch_ctx->romfs_size){ - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - } - - /* Checking the Logo Hash, if present */ - if(ncch_ctx->logo_size){ - u8 *logo = (ncch+ncch_ctx->logo_offset); - ctr_sha(logo,ncch_ctx->logo_size,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->logo_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Logo Hashcheck Failed\n"); - free(ncch_ctx); - return Logo_Hashfail; - } - } } + + /* Checking RomFs hash, if present */ + if(ncch_ctx->romfsSize){ + u8 *RomFs = malloc(ncch_ctx->romfsHashDataSize); + if(!RomFs){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + free(ncch_ctx); + return MEM_ERROR; + } + GetNCCHSection(RomFs,ncch_ctx->romfsHashDataSize,0,ncch,ncch_ctx,keys,ncch_romfs); + ctr_sha(RomFs,ncch_ctx->romfsHashDataSize,Hash,CTR_SHA_256); + free(RomFs); + if(memcmp(Hash,hdr->romfsHash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); + free(ncch_ctx); + return ExeFs_Hashfail; + } + } + + /* Checking the Logo Hash, if present */ + if(ncch_ctx->logoSize){ + u8 *logo = (ncch+ncch_ctx->logoOffset); + ctr_sha(logo,ncch_ctx->logoSize,Hash,CTR_SHA_256); + if(memcmp(Hash,hdr->logoHash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Logo Hashcheck Failed\n"); + free(ncch_ctx); + return Logo_Hashfail; + } + } + free(ncch_ctx); return 0; @@ -799,20 +785,20 @@ u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *ke return NULL; } - NCCH_Header *hdr = NULL; + ncch_hdr *hdr = NULL; hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - if(/*keys->rsa.RequiresPresignedDesc && */!IsCfa(hdr)){ + if(/*keys->rsa.requiresPresignedDesc && */!IsCfa(hdr)){ fprintf(stderr,"[NCCH ERROR] CXI's ID cannot be modified without the ability to resign the AccessDesc\n"); // Not yet yet, requires AccessDesc Privk, may implement anyway later free(ncch); return NULL; } - if((memcmp(TitleId,hdr->title_id,8) == 0) && (memcmp(ProgramId,hdr->program_id,8) == 0)) + if((memcmp(TitleId,hdr->titleId,8) == 0) && (memcmp(ProgramId,hdr->programId,8) == 0)) return ncch;// if no modification is required don't do anything - if(memcmp(TitleId,hdr->title_id,8) == 0){ // If TitleID Same, no crypto required, just resign. - memcpy(hdr->program_id,ProgramId,8); + if(memcmp(TitleId,hdr->titleId,8) == 0){ // If TitleID Same, no crypto required, just resign. + memcpy(hdr->programId,ProgramId,8); SignCFA(ncch,(u8*)hdr,keys); return ncch; } @@ -827,36 +813,36 @@ u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *ke } - NCCH_STRUCT ncch_struct; + ncch_struct ncch_struct; if(keytype != NoKey){ //Decrypting if necessary GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); + u8 *romfs = (ncch+ncch_struct.romfsOffset); key = GetNCCHKey(hdr,keys); if(key == NULL){ fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); free(ncch); return NULL; } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); + CryptNCCHSection(romfs,ncch_struct.romfsSize,0,&ncch_struct,key,ncch_romfs); } - memcpy(hdr->title_id,TitleId,8); - memcpy(hdr->program_id,ProgramId,8); + memcpy(hdr->titleId,TitleId,8); + memcpy(hdr->programId,ProgramId,8); //Checking New Fixed Key Type keytype = GetNCCHKeyType(hdr); if(keytype != NoKey){ // Re-encrypting if necessary GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); + u8 *romfs = (ncch+ncch_struct.romfsOffset); key = GetNCCHKey(hdr,keys); if(key == NULL){ fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); free(ncch); return NULL; } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); + CryptNCCHSection(romfs,ncch_struct.romfsSize,0,&ncch_struct,key,ncch_romfs); } SignCFA(ncch,(u8*)hdr,keys); @@ -865,16 +851,16 @@ u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *ke } -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) +ncch_hdr* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) { if(!fp && !buf) return NULL; if(fp){ if(!out) return NULL; ReadFile_64(out,0x100,0x100,fp); - return (NCCH_Header*)out; + return (ncch_hdr*)out; } else{ - return (NCCH_Header*)(buf+0x100); + return (ncch_hdr*)(buf+0x100); } } @@ -882,10 +868,10 @@ NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) bool IsNCCH(FILE *fp, u8 *buf) { if(!fp && !buf) return false; - NCCH_Header *ncchHDR = NULL; + ncch_hdr *ncchHDR = NULL; bool result; if(fp) { - ncchHDR = malloc(sizeof(NCCH_Header)); + ncchHDR = malloc(sizeof(ncch_hdr)); GetNCCH_CommonHDR(ncchHDR,fp,NULL); result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); free(ncchHDR); @@ -897,54 +883,60 @@ bool IsNCCH(FILE *fp, u8 *buf) return result; } -bool IsCfa(NCCH_Header* hdr) +bool IsCfa(ncch_hdr* hdr) { - return (((hdr->flags[ContentType] & RomFS) == RomFS) && ((hdr->flags[ContentType] & ExeFS) != ExeFS)); + return (((hdr->flags[ContentType] & content_Data) == content_Data) && ((hdr->flags[ContentType] & content_Executable) != content_Executable)); } -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr) +u32 GetNCCH_MediaUnitSize(ncch_hdr* hdr) { - u16 version = u8_to_u16(hdr->version,LE); + u16 titleVersion = u8_to_u16(hdr->formatVersion,LE); u32 ret = 0; - if (version == 1) + if (titleVersion == 1) ret = 1; - else if (version == 2 || version == 0) + else if (titleVersion == 2 || titleVersion == 0) ret = 1 << (hdr->flags[ContentUnitSize] + 9); return ret; //return 0x200*pow(2,hdr->flags[ContentUnitSize]); } -u32 GetNCCH_MediaSize(NCCH_Header* hdr) +u32 GetNCCH_MediaSize(ncch_hdr* hdr) { - return u8_to_u32(hdr->content_size,LE); + return u8_to_u32(hdr->ncchSize,LE); } -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr) +ncch_key_type GetNCCHKeyType(ncch_hdr* hdr) { // Non-Secure Key Options - if((hdr->flags[OtherFlag] & NoCrypto) == NoCrypto) return NoKey; + if((hdr->flags[OtherFlag] & NoCrypto) == NoCrypto) + return NoKey; if((hdr->flags[OtherFlag] & FixedCryptoKey) == FixedCryptoKey){ - if((hdr->program_id[4] & 0x10) == 0x10) return KeyIsSystemFixed; - else return KeyIsNormalFixed; + if((hdr->programId[4] & 0x10) == 0x10) + return KeyIsSystemFixed; + else + return KeyIsNormalFixed; } // Secure Key Options - if(hdr->flags[SecureCrypto2] == 1) return KeyIsUnFixed2; + if(hdr->flags[SecureCrypto2]) + return KeyIsUnFixed2; return KeyIsUnFixed; } -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys) +u8* GetNCCHKey(ncch_hdr* hdr, keys_struct *keys) { ncch_key_type keytype = GetNCCHKeyType(hdr); switch(keytype){ case NoKey: return NULL; - case KeyIsNormalFixed: return keys->aes.NormalKey; + case KeyIsNormalFixed: return keys->aes.normalKey; case KeyIsSystemFixed: - if(!keys->aes.SystemFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load SystemFixed Key\n"); - return keys->aes.SystemFixedKey; + if(!keys->aes.systemFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load SystemFixed Key\n"); + return keys->aes.systemFixedKey; case KeyIsUnFixed: - if(!keys->aes.UnFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); - return keys->aes.UnFixedKey; + fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); + return NULL; + //if(!keys->aes.unFixedKey0) fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); + //return keys->aes.unFixedKey0; case KeyIsUnFixed2: fprintf(stderr,"[NCCH WARNING] Crypto method (Secure2) not supported yet\n"); return NULL; @@ -952,14 +944,14 @@ u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys) return NULL; } -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section) +int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, ncch_struct *ncch_ctx, keys_struct *keys, ncch_section section) { if(!ncch) return MEM_ERROR; u8 *key = NULL; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); + ncch_hdr* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); ncch_key_type keytype = GetNCCHKeyType(hdr); - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ + if(keytype != NoKey && (section == ncch_exhdr || section == ncch_exefs || section == ncch_romfs)){ key = GetNCCHKey(hdr,keys); if(key == NULL){ //fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); @@ -970,25 +962,25 @@ int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRU u64 offset = 0; u64 size = 0; switch(section){ - case ncch_ExHeader: - offset = ncch_ctx->exheader_offset; - size = ncch_ctx->exheader_size; + case ncch_exhdr: + offset = ncch_ctx->exhdrOffset; + size = ncch_ctx->exhdrSize; break; case ncch_Logo: - offset = ncch_ctx->logo_offset; - size = ncch_ctx->logo_size; + offset = ncch_ctx->logoOffset; + size = ncch_ctx->logoSize; break; case ncch_PlainRegion: - offset = ncch_ctx->plain_region_offset; - size = ncch_ctx->plain_region_size; + offset = ncch_ctx->plainRegionOffset; + size = ncch_ctx->plainRegionSize; break; case ncch_exefs: - offset = ncch_ctx->exefs_offset; - size = ncch_ctx->exefs_size; + offset = ncch_ctx->exefsOffset; + size = ncch_ctx->exefsSize; break; case ncch_romfs: - offset = ncch_ctx->romfs_offset; - size = ncch_ctx->romfs_size; + offset = ncch_ctx->romfsOffset; + size = ncch_ctx->romfsSize; break; } if(!offset || !size) return NCCH_SECTION_NOT_EXIST; @@ -1002,42 +994,43 @@ int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRU memcpy(dest,section_pos,size); //printf("decrypting if needed\n"); - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ // Decrypt + if(keytype != NoKey && (section == ncch_exhdr || section == ncch_exefs || section == ncch_romfs)){ // Decrypt //memdump(stdout,"Key: ",key,16); CryptNCCHSection(dest,size,src_pos,ncch_ctx,key,section); //printf("no cigar\n"); } - + //printf("Got thing okay\n"); return 0; } -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header) +int GetCXIStruct(ncch_struct *ctx, ncch_hdr *header) { - memcpy(ctx->titleID,header->title_id,8); - memcpy(ctx->programID,header->program_id,8); + memcpy(ctx->titleId,header->titleId,8); + memcpy(ctx->programId,header->programId,8); u32 media_unit = GetNCCH_MediaUnitSize(header); - ctx->version = u8_to_u16(header->version,LE); + ctx->formatVersion = u8_to_u16(header->formatVersion,LE); if(!IsCfa(header)){ - ctx->exheader_offset = 0x200; - ctx->exheader_size = u8_to_u32(header->extended_header_size,LE) + 0x400; - ctx->logo_offset = (u64)(u8_to_u32(header->logo_region_offset,LE)*media_unit); - ctx->logo_size = (u64)(u8_to_u32(header->logo_region_size,LE)*media_unit); - ctx->plain_region_offset = (u64)(u8_to_u32(header->plain_region_offset,LE)*media_unit); - ctx->plain_region_size = (u64)(u8_to_u32(header->plain_region_size,LE)*media_unit); - ctx->exefs_offset = (u64)(u8_to_u32(header->exefs_offset,LE)*media_unit); - ctx->exefs_size = (u64)(u8_to_u32(header->exefs_size,LE)*media_unit); - ctx->exefs_hash_src_size = (u64)(u8_to_u32(header->exefs_hash_size,LE)*media_unit); + ctx->exhdrOffset = 0x200; + ctx->exhdrSize = u8_to_u32(header->exhdrSize,LE) + 0x400; + ctx->plainRegionOffset = (u64)(u8_to_u32(header->plainRegionOffset,LE)*media_unit); + ctx->plainRegionSize = (u64)(u8_to_u32(header->plainRegionSize,LE)*media_unit); } - ctx->romfs_offset = (u64) (u8_to_u32(header->romfs_offset,LE)*media_unit); - ctx->romfs_size = (u64) (u8_to_u32(header->romfs_size,LE)*media_unit); - ctx->romfs_hash_src_size = (u64)(u8_to_u32(header->romfs_hash_size,LE)*media_unit); + + ctx->logoOffset = (u64)(u8_to_u32(header->logoOffset,LE)*media_unit); + ctx->logoSize = (u64)(u8_to_u32(header->logoSize,LE)*media_unit); + ctx->exefsOffset = (u64)(u8_to_u32(header->exefsOffset,LE)*media_unit); + ctx->exefsSize = (u64)(u8_to_u32(header->exefsSize,LE)*media_unit); + ctx->exefsHashDataSize = (u64)(u8_to_u32(header->exefsHashSize,LE)*media_unit); + ctx->romfsOffset = (u64) (u8_to_u32(header->romfsOffset,LE)*media_unit); + ctx->romfsSize = (u64) (u8_to_u32(header->romfsSize,LE)*media_unit); + ctx->romfsHashDataSize = (u64)(u8_to_u32(header->romfsHashSize,LE)*media_unit); return 0; } -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type) +void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, ncch_struct *ctx, u8 key[16], u8 type) { if(type < 1 || type > 3) return; @@ -1049,36 +1042,36 @@ void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 ke if(src_pos > 0){ u32 carry = 0; carry = align_value(src_pos,0x10); - carry = carry/0x10; + carry /= 0x10; ctr_add_counter(&aes_ctx,carry); } ctr_crypt_counter(&aes_ctx, buffer, buffer, size); return; } -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type) +void ncch_get_counter(ncch_struct *ctx, u8 counter[16], u8 type) { - u8 *titleID = ctx->titleID; + u8 *titleId = ctx->titleId; u32 i; u32 x = 0; memset(counter, 0, 16); - if (ctx->version == 2 || ctx->version == 0) + if (ctx->formatVersion == 2 || ctx->formatVersion == 0) { for(i=0; i<8; i++) - counter[i] = titleID[7-i]; + counter[i] = titleId[7-i]; counter[8] = type; } - else if (ctx->version == 1) + else if (ctx->formatVersion == 1) { switch(type){ - case ncch_ExHeader : x = ctx->exheader_offset; break; - case ncch_exefs : x = ctx->exefs_offset; break; - case ncch_romfs : x = ctx->romfs_offset; break; + case ncch_exhdr : x = ctx->exhdrOffset; break; + case ncch_exefs : x = ctx->exefsOffset; break; + case ncch_romfs : x = ctx->romfsOffset; break; } for(i=0; i<8; i++) - counter[i] = titleID[i]; + counter[i] = titleId[i]; for(i=0; i<4; i++) counter[12+i] = x>>((3-i)*8); } diff --git a/ncch.h b/ncch.h index 69f4728..d5f761e 100644 --- a/ncch.h +++ b/ncch.h @@ -27,7 +27,7 @@ typedef enum typedef enum { - ncch_ExHeader = 1, + ncch_exhdr = 1, ncch_exefs, ncch_romfs, ncch_Logo, @@ -61,80 +61,75 @@ typedef enum typedef enum { - RomFS = 0x1, - ExeFS = 0x2, - SystemUpdate = 0x4, - Manual = 0x8, - Child = (0x4|0x8), - Trial = 0x10 + content_Data = 0x1, + content_Executable = 0x2, + content_SystemUpdate = 0x4, + content_Manual = 0x8, + content_Child = (0x4|0x8), + content_Trial = 0x10 } ncch_content_bitmask; typedef struct { - u16 version; - u32 exheader_offset; - u32 exheader_size; - u64 logo_offset; - u64 logo_size; - u64 plain_region_offset; - u64 plain_region_size; - u64 exefs_offset; - u64 exefs_size; - u64 exefs_hash_src_size; - u64 romfs_offset; - u64 romfs_size; - u64 romfs_hash_src_size; - u8 titleID[8]; - u8 programID[8]; -}NCCH_STRUCT; + u16 formatVersion; + u32 exhdrOffset; + u32 exhdrSize; + u64 logoOffset; + u64 logoSize; + u64 plainRegionOffset; + u64 plainRegionSize; + u64 exefsOffset; + u64 exefsSize; + u64 exefsHashDataSize; + u64 romfsOffset; + u64 romfsSize; + u64 romfsHashDataSize; + u8 titleId[8]; + u8 programId[8]; +} ncch_struct; typedef struct { u8 magic[4]; - u8 content_size[4]; - u8 title_id[8]; - u8 maker_code[2]; - u8 version[2]; - u8 reserved_0[4]; - u8 program_id[8]; - u8 reserved_1[0x10]; - u8 logo_sha_256_hash[0x20]; - u8 product_code[0x10]; - u8 extended_header_sha_256_hash[0x20]; - u8 extended_header_size[4]; - u8 reserved_2[4]; + u8 ncchSize[4]; + u8 titleId[8]; + u8 makerCode[2]; + u8 formatVersion[2]; + u8 padding0[4]; + u8 programId[8]; + u8 padding1[0x10]; + u8 logoHash[0x20]; // SHA-256 over the entire logo region + u8 productCode[0x10]; + u8 exhdrHash[0x20]; // SHA-256 over exhdrSize of the exhdr region + u8 exhdrSize[4]; + u8 padding2[4]; u8 flags[8]; - u8 plain_region_offset[4]; - u8 plain_region_size[4]; - u8 logo_region_offset[4]; - u8 logo_region_size[4]; - u8 exefs_offset[4]; - u8 exefs_size[4]; - u8 exefs_hash_size[4]; - u8 reserved_4[4]; - u8 romfs_offset[4]; - u8 romfs_size[4]; - u8 romfs_hash_size[4]; - u8 reserved_5[4]; - u8 exefs_sha_256_hash[0x20]; - u8 romfs_sha_256_hash[0x20]; -} NCCH_Header; + u8 plainRegionOffset[4]; + u8 plainRegionSize[4]; + u8 logoOffset[4]; + u8 logoSize[4]; + u8 exefsOffset[4]; + u8 exefsSize[4]; + u8 exefsHashSize[4]; + u8 padding4[4]; + u8 romfsOffset[4]; + u8 romfsSize[4]; + u8 romfsHashSize[4]; + u8 padding5[4]; + u8 exefsHash[0x20]; + u8 romfsHash[0x20]; +} ncch_hdr; typedef struct { keys_struct *keys; - rsf_settings *yaml_set; + rsf_settings *rsfSet; COMPONENT_STRUCT *out; - struct{ - u8 *PubK; - u8 *PrivK; - } CxiRsaKey; - struct { - u32 MediaSize; + u32 mediaSize; bool IncludeExeFsLogo; bool CompressCode; bool UseOnSD; @@ -143,70 +138,70 @@ typedef struct bool IsCfa; bool IsBuildingCodeSection; bool UseRomFS; - } Options; + } options; struct { FILE *elf; - u64 elf_size; + u64 elfSize; FILE *banner; - u64 banner_size; + u64 bannerSize; FILE *icon; - u64 icon_size; + u64 iconSize; FILE *logo; - u64 logo_size; + u64 logoSize; FILE *code; - u64 code_size; + u64 codeSize; - FILE *exheader; - u64 exheader_size; + FILE *exhdr; + u64 exhdrSize; FILE *romfs; - u64 romfs_size; + u64 romfsSize; FILE *plainregion; - u64 plainregion_size; - } ComponentFilePtrs; + u64 plainregionSize; + } componentFilePtrs; struct { - COMPONENT_STRUCT Code; - COMPONENT_STRUCT Banner; - COMPONENT_STRUCT Icon; - } ExeFs_Sections; + COMPONENT_STRUCT code; + COMPONENT_STRUCT banner; + COMPONENT_STRUCT icon; + } exefsSections; struct { - u32 TextAddress; - u32 TextSize; - u32 TextMaxPages; - u32 ROAddress; - u32 ROSize; - u32 ROMaxPages; - u32 DataAddress; - u32 DataSize; - u32 DataMaxPages; - u32 BSS_Size; - } CodeDetails; + u32 textAddress; + u32 textSize; + u32 textMaxPages; + u32 roAddress; + u32 roSize; + u32 roMaxPages; + u32 rwAddress; + u32 rwSize; + u32 rwMaxPages; + u32 bssSize; + } codeDetails; struct { - u64 TotalContentSize; - COMPONENT_STRUCT CommonHeader; - COMPONENT_STRUCT ExHeader; - u64 LogoOffset; - COMPONENT_STRUCT Logo; - u64 PlainRegionOffset; - COMPONENT_STRUCT PlainRegion; - u64 ExeFsOffset; - COMPONENT_STRUCT ExeFs; - u64 RomFsOffset; - COMPONENT_STRUCT RomFs; - } Sections; + u64 totalNcchSize; + COMPONENT_STRUCT ncchHdr; + COMPONENT_STRUCT exhdr; + u64 logoOffset; + COMPONENT_STRUCT logo; + u64 plainRegionOffset; + COMPONENT_STRUCT plainRegion; + u64 exeFsOffset; + COMPONENT_STRUCT exeFs; + u64 romFsOffset; + COMPONENT_STRUCT romFs; + } sections; } ncch_settings; @@ -221,16 +216,16 @@ int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput); u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys); -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf); +ncch_hdr* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf); bool IsNCCH(FILE *fp, u8 *buf); -bool IsCfa(NCCH_Header* hdr); -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr); -u32 GetNCCH_MediaSize(NCCH_Header* hdr); -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr); +bool IsCfa(ncch_hdr* hdr); +u32 GetNCCH_MediaUnitSize(ncch_hdr* hdr); +u32 GetNCCH_MediaSize(ncch_hdr* hdr); +ncch_key_type GetNCCHKeyType(ncch_hdr* hdr); -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section); -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys); +int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, ncch_struct *ncch_ctx, keys_struct *keys, ncch_section section); +u8* GetNCCHKey(ncch_hdr* hdr, keys_struct *keys); -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header); -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type); -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type); \ No newline at end of file +int GetCXIStruct(ncch_struct *ctx, ncch_hdr *header); +void ncch_get_counter(ncch_struct *ctx, u8 counter[16], u8 type); +void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, ncch_struct *ctx, u8 key[16], u8 type); \ No newline at end of file diff --git a/ncch_backup.c b/ncch_backup.c new file mode 100644 index 0000000..a9efac4 --- /dev/null +++ b/ncch_backup.c @@ -0,0 +1,1104 @@ +#include "lib.h" +#include "ncch.h" +#include "exheader.h" +#include "elf.h" +#include "exefs.h" +#include "romfs.h" +#include "titleid.h" + +#include "logo_data.h" // Contains Logos + +// Private Prototypes +int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); +int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); +int SignCXI(u8 *Signature, u8 *CXI_HDR, keys_struct *keys); +int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK); + +void init_NCCHSettings(ncch_settings *set); +void free_NCCHSettings(ncch_settings *set); +int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset); +int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset); +int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset); +int ImportNonCodeExeFsSections(ncch_settings *ncchset); +int ImportLogo(ncch_settings *ncchset); + +int SetCommonHeaderBasicData(ncch_settings *ncchset, ncch_hdr *hdr); +int SetCommonHeaderSectionData(ncch_settings *ncchset, ncch_hdr *hdr); +bool IsValidProductCode(char *ProductCode, bool FreeProductCode); + +int BuildCommonHeader(ncch_settings *ncchset); +int EncryptNCCHSections(ncch_settings *ncchset); +int WriteNCCHSectionsToBuffer(ncch_settings *ncchset); + +// Code + +int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) +{ + return ctr_sig(CFA_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cciCfaPub,keys->rsa.cciCfaPvt,RSA_2048_SHA256,CTR_RSA_SIGN); +} + +int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) +{ + return ctr_sig(CFA_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cciCfaPub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); +} + +int SignCXI(u8 *Signature, u8 *CXI_HDR, keys_struct *keys) +{ + return ctr_sig(CXI_HDR,sizeof(ncch_hdr),Signature,keys->rsa.cxiHdrPub,keys->rsa.cxiHdrPvt,RSA_2048_SHA256,CTR_RSA_SIGN); +} + +int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) +{ + int result = ctr_sig(CXI_HDR,sizeof(ncch_hdr),Signature,PubK,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); + return result; +} + +// NCCH Build Functions + +int build_NCCH(user_settings *usrset) +{ + int result; +#ifdef DEBUG + printf("[DEBUG] Init Settings\n"); +#endif + // Init Settings + ncch_settings *ncchset = malloc(sizeof(ncch_settings)); + if(!ncchset) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + init_NCCHSettings(ncchset); + +#ifdef DEBUG + printf("[DEBUG] Get Settings\n"); +#endif + // Get Settings + result = get_NCCHSettings(ncchset,usrset); + if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); +#endif + // Build ExeFs Code Section + result = BuildExeFsCode(ncchset); + if(result) goto finish; + +#ifdef ELF_DEBUG + FILE *code = fopen("code.bin","wb"); + fwrite(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,1,code); + fclose(code); + u8 hash[0x20]; + ctr_sha(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,hash,CTR_SHA_256); + printf("BSS Size: 0x%x\n",ncchset->CodeDetails.BSS_Size); + printf("Code Size: 0x%x\n",ncchset->ExeFs_Sections.Code.size); + memdump(stdout,"Code Hash: ",hash,0x20); +#endif + +#ifdef DEBUG + printf("[DEBUG] Build Exheader\n"); +#endif + // Build ExHeader + result = BuildExHeader(ncchset); + if(result) goto finish; + + +#ifdef DEBUG + printf("[DEBUG] Exefs\n"); +#endif + // Build ExeFs/RomFs + result = BuildExeFs(ncchset); + if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Build Romfs\n"); +#endif + result = BuildRomFs(ncchset); + if(result) goto finish; + + // Final Steps +#ifdef DEBUG + printf("[DEBUG] Build common header\n"); +#endif + result = BuildCommonHeader(ncchset); + if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Encrypt Sections\n"); +#endif + result = EncryptNCCHSections(ncchset); + if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Write Sections\n"); +#endif + result = WriteNCCHSectionsToBuffer(ncchset); + if(result) goto finish; +finish: +#ifdef DEBUG + printf("[DEBUG] Finish Building\n"); +#endif + if(result) fprintf(stderr,"[NCCH ERROR] NCCH Build Process Failed\n"); + free_NCCHSettings(ncchset); + return result; +} + +void init_NCCHSettings(ncch_settings *set) +{ + memset(set,0,sizeof(ncch_settings)); +} + +void free_NCCHSettings(ncch_settings *set) +{ + if(set->ComponentFilePtrs.elf) fclose(set->ComponentFilePtrs.elf); + if(set->ComponentFilePtrs.banner) fclose(set->ComponentFilePtrs.banner); + if(set->ComponentFilePtrs.icon) fclose(set->ComponentFilePtrs.icon); + if(set->ComponentFilePtrs.logo) fclose(set->ComponentFilePtrs.logo); + if(set->ComponentFilePtrs.code) fclose(set->ComponentFilePtrs.code); + if(set->ComponentFilePtrs.exheader) fclose(set->ComponentFilePtrs.exheader); + if(set->ComponentFilePtrs.romfs) fclose(set->ComponentFilePtrs.romfs); + if(set->ComponentFilePtrs.plainregion) fclose(set->ComponentFilePtrs.plainregion); + + if(set->ExeFs_Sections.Code.size) free(set->ExeFs_Sections.Code.buffer); + if(set->ExeFs_Sections.Banner.size) free(set->ExeFs_Sections.Banner.buffer); + if(set->ExeFs_Sections.Icon.size) free(set->ExeFs_Sections.Icon.buffer); + + if(set->Sections.CommonHeader.size) free(set->Sections.CommonHeader.buffer); + if(set->Sections.ExHeader.size) free(set->Sections.ExHeader.buffer); + if(set->Sections.Logo.size) free(set->Sections.Logo.buffer); + if(set->Sections.PlainRegion.size) free(set->Sections.PlainRegion.buffer); + if(set->Sections.ExeFs.size) free(set->Sections.ExeFs.buffer); + if(set->Sections.RomFs.size) free(set->Sections.RomFs.buffer); + + memset(set,0,sizeof(ncch_settings)); + + free(set); +} + +int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset) +{ + int result = 0; + ncchset->out = &usrset->Content0; + ncchset->yaml_set = &usrset->yaml_set; + ncchset->keys = &usrset->keys; + + result = SetBasicOptions(ncchset,usrset); + if(result) return result; + result = CreateInputFilePtrs(ncchset,usrset); + if(result) return result; + result = ImportNonCodeExeFsSections(ncchset); + if(result) return result; + result = ImportLogo(ncchset); + if(result) return result; + + + return 0; +} + +int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset) +{ + int result = 0; + + /* Options */ + ncchset->Options.MediaSize = 0x200; + + ncchset->Options.IncludeExeFsLogo = usrset->include_exefs_logo; + + if(usrset->yaml_set.Option.EnableCompress != -1) ncchset->Options.CompressCode = usrset->yaml_set.Option.EnableCompress; + else ncchset->Options.CompressCode = true; + + if(usrset->yaml_set.Option.UseOnSD != -1) ncchset->Options.UseOnSD = usrset->yaml_set.Option.UseOnSD; + else ncchset->Options.UseOnSD = false; + usrset->yaml_set.Option.UseOnSD = ncchset->Options.UseOnSD; + + if(usrset->yaml_set.Option.EnableCrypt != -1) ncchset->Options.Encrypt = usrset->yaml_set.Option.EnableCrypt; + else ncchset->Options.Encrypt = true; + + if(usrset->yaml_set.Option.FreeProductCode != -1) ncchset->Options.FreeProductCode = usrset->yaml_set.Option.FreeProductCode; + else ncchset->Options.FreeProductCode = false; + + ncchset->Options.IsCfa = (usrset->build_ncch_type == CFA); + + ncchset->Options.IsBuildingCodeSection = (usrset->elf_path != NULL); + + ncchset->Options.UseRomFS = ((ncchset->yaml_set->Rom.HostRoot && strlen(ncchset->yaml_set->Rom.HostRoot) > 0) || usrset->romfs_path); + + if(ncchset->Options.IsCfa && !ncchset->Options.UseRomFS){ + fprintf(stderr,"[NCCH ERROR] 'Rom/HostRoot' must be set\n"); + return NCCH_BAD_YAML_SET; + } + + return result; +} + +int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset) +{ + if(usrset->romfs_path){ + ncchset->ComponentFilePtrs.romfs_size = GetFileSize_u64(usrset->romfs_path); + ncchset->ComponentFilePtrs.romfs = fopen(usrset->romfs_path,"rb"); + if(!ncchset->ComponentFilePtrs.romfs){ + fprintf(stderr,"[NCCH ERROR] Failed to open RomFs file '%s'\n",usrset->romfs_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(ncchset->Options.IsCfa) return 0; + if(usrset->elf_path){ + ncchset->ComponentFilePtrs.elf_size = GetFileSize_u64(usrset->elf_path); + ncchset->ComponentFilePtrs.elf = fopen(usrset->elf_path,"rb"); + if(!ncchset->ComponentFilePtrs.elf){ + fprintf(stderr,"[NCCH ERROR] Failed to open elf file '%s'\n",usrset->elf_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(usrset->banner_path){ + ncchset->ComponentFilePtrs.banner_size = GetFileSize_u64(usrset->banner_path); + ncchset->ComponentFilePtrs.banner = fopen(usrset->banner_path,"rb"); + if(!ncchset->ComponentFilePtrs.banner){ + fprintf(stderr,"[NCCH ERROR] Failed to open banner file '%s'\n",usrset->banner_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(usrset->icon_path){ + ncchset->ComponentFilePtrs.icon_size = GetFileSize_u64(usrset->icon_path); + ncchset->ComponentFilePtrs.icon = fopen(usrset->icon_path,"rb"); + if(!ncchset->ComponentFilePtrs.icon){ + fprintf(stderr,"[NCCH ERROR] Failed to open icon file '%s'\n",usrset->icon_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(usrset->logo_path){ + ncchset->ComponentFilePtrs.logo_size = GetFileSize_u64(usrset->logo_path); + ncchset->ComponentFilePtrs.logo = fopen(usrset->logo_path,"rb"); + if(!ncchset->ComponentFilePtrs.logo){ + fprintf(stderr,"[NCCH ERROR] Failed to open logo file '%s'\n",usrset->logo_path); + return FAILED_TO_IMPORT_FILE; + } + } + + if(usrset->exefs_code_path){ + ncchset->ComponentFilePtrs.code_size = GetFileSize_u64(usrset->exefs_code_path); + ncchset->ComponentFilePtrs.code = fopen(usrset->exefs_code_path,"rb"); + if(!ncchset->ComponentFilePtrs.code){ + fprintf(stderr,"[NCCH ERROR] Failed to open ExeFs Code file '%s'\n",usrset->exefs_code_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(usrset->exheader_path){ + ncchset->ComponentFilePtrs.exheader_size = GetFileSize_u64(usrset->exheader_path); + ncchset->ComponentFilePtrs.exheader = fopen(usrset->exheader_path,"rb"); + if(!ncchset->ComponentFilePtrs.exheader){ + fprintf(stderr,"[NCCH ERROR] Failed to open ExHeader file '%s'\n",usrset->exheader_path); + return FAILED_TO_IMPORT_FILE; + } + } + if(usrset->plain_region_path){ + ncchset->ComponentFilePtrs.plainregion_size = GetFileSize_u64(usrset->plain_region_path); + ncchset->ComponentFilePtrs.plainregion = fopen(usrset->plain_region_path,"rb"); + if(!ncchset->ComponentFilePtrs.plainregion){ + fprintf(stderr,"[NCCH ERROR] Failed to open PlainRegion file '%s'\n",usrset->plain_region_path); + return FAILED_TO_IMPORT_FILE; + } + } + return 0; +} + +int ImportNonCodeExeFsSections(ncch_settings *ncchset) +{ + if(ncchset->Options.IsCfa) return 0; + if(ncchset->ComponentFilePtrs.banner){ + ncchset->ExeFs_Sections.Banner.size = ncchset->ComponentFilePtrs.banner_size; + ncchset->ExeFs_Sections.Banner.buffer = malloc(ncchset->ExeFs_Sections.Banner.size); + if(!ncchset->ExeFs_Sections.Banner.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size,0,ncchset->ComponentFilePtrs.banner); + } + if(ncchset->ComponentFilePtrs.icon){ + ncchset->ExeFs_Sections.Icon.size = ncchset->ComponentFilePtrs.icon_size; + ncchset->ExeFs_Sections.Icon.buffer = malloc(ncchset->ExeFs_Sections.Icon.size); + if(!ncchset->ExeFs_Sections.Icon.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size,0,ncchset->ComponentFilePtrs.icon); + } + return 0; +} + +int ImportLogo(ncch_settings *ncchset) +{ + if(ncchset->Options.IsCfa) return 0; + if(ncchset->ComponentFilePtrs.logo){ + ncchset->sections.logo.size = ncchset->ComponentFilePtrs.logo_size; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->sections.logo.buffer,ncchset->sections.logo.size,0,ncchset->ComponentFilePtrs.logo); + } + else if(ncchset->yaml_set->BasicInfo.Logo){ + if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"nintendo") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memcpy(ncchset->sections.logo.buffer,Nintendo_LZ,0x2000); + } + else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"licensed") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memcpy(ncchset->sections.logo.buffer,Nintendo_LicensedBy_LZ,0x2000); + } + else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"distributed") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memcpy(ncchset->sections.logo.buffer,Nintendo_DistributedBy_LZ,0x2000); + } + else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"ique") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memcpy(ncchset->sections.logo.buffer,iQue_with_ISBN_LZ,0x2000); + } + else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"iqueforsystem") == 0){ + ncchset->sections.logo.size = 0x2000; + ncchset->sections.logo.buffer = malloc(ncchset->sections.logo.size); + if(!ncchset->sections.logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memcpy(ncchset->sections.logo.buffer,iQue_without_ISBN_LZ,0x2000); + } + else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"none") != 0){ + fprintf(stderr,"[NCCH ERROR] Invalid logo name\n"); + return NCCH_BAD_YAML_SET; + } + } + return 0; +} + +int SetCommonHeaderBasicData(ncch_settings *ncchset, ncch_hdr *hdr) +{ + /* NCCH Format titleVersion */ + u16_to_u8(hdr->titleVersion,0x2,LE); + + /* Setting ProgramId/TitleId */ + u64 ProgramId = 0; + int result = GetProgramID(&ProgramId,ncchset->yaml_set,false); + if(result) return result; + + u64_to_u8(hdr->program_id,ProgramId,LE); + u64_to_u8(hdr->title_id,ProgramId,LE); + + /* Get Product Code and Maker Code */ + if(ncchset->yaml_set->BasicInfo.ProductCode){ + if(!IsValidProductCode((char*)ncchset->yaml_set->BasicInfo.ProductCode,ncchset->Options.FreeProductCode)){ + fprintf(stderr,"[NCCH ERROR] Invalid Product Code\n"); + return NCCH_BAD_YAML_SET; + } + memcpy(hdr->product_code,ncchset->yaml_set->BasicInfo.ProductCode,strlen((char*)ncchset->yaml_set->BasicInfo.ProductCode)); + } + else memcpy(hdr->product_code,"CTR-P-CTAP",10); + + if(ncchset->yaml_set->BasicInfo.CompanyCode){ + if(strlen((char*)ncchset->yaml_set->BasicInfo.CompanyCode) != 2){ + fprintf(stderr,"[NCCH ERROR] Company code length must be 2\n"); + return NCCH_BAD_YAML_SET; + } + memcpy(hdr->maker_code,ncchset->yaml_set->BasicInfo.CompanyCode,2); + } + else memcpy(hdr->maker_code,"00",2); + + /* Set ContentUnitSize */ + hdr->flags[ContentUnitSize] = 0; + + /* Setting ContentPlatform */ + if(ncchset->yaml_set->TitleInfo.Platform){ + if(strcasecmp(ncchset->yaml_set->TitleInfo.Platform,"ctr") == 0) hdr->flags[ContentPlatform] = 1; + else{ + fprintf(stderr,"[NCCH ERROR] Invalid Platform: %s\n",ncchset->yaml_set->TitleInfo.Platform); + return NCCH_BAD_YAML_SET; + } + } + else + hdr->flags[ContentPlatform] = 1; // CTR + + /* Setting OtherFlag */ + hdr->flags[OtherFlag] = FixedCryptoKey; + if(!ncchset->Options.Encrypt) hdr->flags[OtherFlag] |= NoCrypto; + if(!ncchset->sections.romFs.size) hdr->flags[OtherFlag] |= NoMountRomFs; + + + /* Setting ContentType */ + hdr->flags[ContentType] = 0; + if(ncchset->sections.romFs.size) hdr->flags[ContentType] |= RomFS; + if(ncchset->sections.exeFs.size) hdr->flags[ContentType] |= ExeFS; + if(ncchset->yaml_set->BasicInfo.ContentType){ + if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Application") == 0) hdr->flags[ContentType] |= 0; + else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"SystemUpdate") == 0) hdr->flags[ContentType] |= SystemUpdate; + else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Manual") == 0) hdr->flags[ContentType] |= Manual; + else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Child") == 0) hdr->flags[ContentType] |= Child; + else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Trial") == 0) hdr->flags[ContentType] |= Trial; + else{ + fprintf(stderr,"[NCCH ERROR] Invalid ContentType '%s'\n",ncchset->yaml_set->BasicInfo.ContentType); + return NCCH_BAD_YAML_SET; + } + } + + return 0; +} + +int SetCommonHeaderSectionData(ncch_settings *ncchset, ncch_hdr *hdr) +{ + /* Set Sizes/Hashes to Hdr */ + + u32 ExHeaderSize,LogoSize,PlainRegionSize,ExeFsSize,ExeFsHashSize,RomFsSize,RomFsHashSize; + + if(ncchset->Options.IsCfa) + { + if(ncchset->sections.exhdr.size) + { + free(ncchset->sections.exhdr.buffer); + } + ncchset->sections.exhdr.size = 0; + if(ncchset->sections.logo.size) + { + free(ncchset->sections.logo.buffer); + } + ncchset->sections.logo.size = 0; + if(ncchset->sections.exeFs.size) + { + free(ncchset->sections.exeFs.buffer); + } + ncchset->sections.exeFs.size = 0; + } + + ExHeaderSize = ncchset->sections.exhdr.size ? ((u32) ncchset->sections.exhdr.size - 0x400) : 0; + LogoSize = ncchset->sections.logo.size ? ((u32) (ncchset->sections.logo.size/ncchset->Options.MediaSize)) : 0; + PlainRegionSize = ncchset->sections.plainRegion.size ? ((u32) (ncchset->sections.plainRegion.size/ncchset->Options.MediaSize)) : 0; + ExeFsSize = ncchset->sections.exeFs.size ? ((u32) (ncchset->sections.exeFs.size/ncchset->Options.MediaSize)) : 0; + ExeFsHashSize = (u32) ExeFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; + RomFsSize = ncchset->sections.romFs.size ? ((u32) (ncchset->sections.romFs.size/ncchset->Options.MediaSize)) : 0; + RomFsHashSize = (u32) RomFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; + + + u32_to_u8(hdr->extended_header_size,ExHeaderSize,LE); + if(ExHeaderSize) ctr_sha(ncchset->sections.exhdr.buffer,ExHeaderSize,hdr->extended_header_sha_256_hash,CTR_SHA_256); + + u32_to_u8(hdr->logo_region_size,LogoSize,LE); + if(LogoSize) ctr_sha(ncchset->sections.logo.buffer,ncchset->sections.logo.size,hdr->logo_sha_256_hash,CTR_SHA_256); + + u32_to_u8(hdr->plain_region_size,PlainRegionSize,LE); + + u32_to_u8(hdr->exefs_size,ExeFsSize,LE); + u32_to_u8(hdr->exefs_hash_size,ExeFsHashSize,LE); + if(ExeFsSize) ctr_sha(ncchset->sections.exeFs.buffer,ncchset->Options.MediaSize,hdr->exefs_sha_256_hash,CTR_SHA_256); + + u32_to_u8(hdr->romfs_size,RomFsSize,LE); + u32_to_u8(hdr->romfs_hash_size,RomFsHashSize,LE); + if(RomFsSize) ctr_sha(ncchset->sections.romFs.buffer,ncchset->Options.MediaSize,hdr->romfs_sha_256_hash,CTR_SHA_256); + + + /* Get Section Offsets */ + u32 size = 1; + if (ExHeaderSize) + size += 4; + + if (LogoSize){ + u32_to_u8(hdr->logo_region_offset,size,LE); + ncchset->sections.logoOffset = size*ncchset->Options.MediaSize; + size += LogoSize; + } + + if(PlainRegionSize){ + u32_to_u8(hdr->plain_region_offset,size,LE); + ncchset->sections.plainRegionOffset = size*ncchset->Options.MediaSize; + size += PlainRegionSize; + } + + if (ExeFsSize){ + u32_to_u8(hdr->exefs_offset,size,LE); + ncchset->sections.exeFsOffset = size*ncchset->Options.MediaSize; + size += ExeFsSize; + } + + if (RomFsSize){ + u32_to_u8(hdr->romfs_offset,size,LE); + ncchset->sections.romFsOffset = size*ncchset->Options.MediaSize; + size += RomFsSize; + } + + u32_to_u8(hdr->content_size,size,LE); + + ncchset->Sections.TotalContentSize = size * ncchset->Options.MediaSize; + + return 0; +} + +bool IsValidProductCode(char *ProductCode, bool FreeProductCode) +{ + if(strlen(ProductCode) > 16) return false; + + if(FreeProductCode) + return true; + + if(strlen(ProductCode) < 10) return false; + if(strncmp(ProductCode,"CTR-",4) != 0) return false; + if(ProductCode[5] != '-') return false; + if(!isdigit(ProductCode[4]) && !isupper(ProductCode[4])) return false; + for(int i = 6; i < 10; i++){ + if(!isdigit(ProductCode[i]) && !isupper(ProductCode[i])) return false; + } + + return true; +} + +int BuildCommonHeader(ncch_settings *ncchset) +{ + int result = 0; + + // Initialising Header + ncchset->sections.ncchHdr.size = 0x100 + sizeof(ncch_hdr); + ncchset->sections.ncchHdr.buffer = malloc(ncchset->sections.ncchHdr.size); + if(!ncchset->sections.ncchHdr.buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } + memset(ncchset->sections.ncchHdr.buffer,0,ncchset->sections.ncchHdr.size); + + // Creating Ptrs + u8 *sig = ncchset->sections.ncchHdr.buffer; + ncch_hdr *hdr = (ncch_hdr*)(ncchset->sections.ncchHdr.buffer+0x100); + + // Setting Data in Hdr + memcpy(hdr->magic,"NCCH",4); + + result = SetCommonHeaderBasicData(ncchset,hdr); + if(result) return result; + + result = SetCommonHeaderSectionData(ncchset,hdr); + if(result) return result; + + + // Signing Hdr + int sig_result = Good; + if(ncchset->Options.IsCfa) sig_result = SignCFA(sig,(u8*)hdr,ncchset->keys); + else sig_result = SignCXI(sig,(u8*)hdr,ncchset->keys); + if(sig_result != Good){ + fprintf(stderr,"[NCCH ERROR] Failed to sign %s header\n",ncchset->Options.IsCfa ? "CFA" : "CXI"); + return sig_result; + } + + return 0; +} + +int EncryptNCCHSections(ncch_settings *ncchset) +{ + if(!ncchset->Options.Encrypt) return 0; + + /* Getting ncch_struct */ + ncch_hdr *hdr = GetNCCH_CommonHDR(NULL,NULL,ncchset->sections.ncchHdr.buffer); + ncch_struct *ncch = malloc(sizeof(ncch_struct)); + if(!ncch) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memset(ncch,0,sizeof(ncch_struct)); + GetCXIStruct(ncch,hdr); + + u8 *ncch_key = GetNCCHKey(hdr,ncchset->keys); + + if(ncchset->sections.exhdr.size) + CryptNCCHSection(ncchset->sections.exhdr.buffer,ncchset->sections.exhdr.size,0,ncch,ncch_key,ncch_ExHeader); + + if(ncchset->sections.exeFs.size) + CryptNCCHSection(ncchset->sections.exeFs.buffer,ncchset->sections.exeFs.size,0,ncch,ncch_key,ncch_exefs); + + if(ncchset->sections.romFs.size) + CryptNCCHSection(ncchset->sections.romFs.buffer,ncchset->sections.romFs.size,0,ncch,ncch_key,ncch_romfs); + + return 0; +} + +int WriteNCCHSectionsToBuffer(ncch_settings *ncchset) +{ + /* Allocating Memory for NCCH, and clearing */ + ncchset->out->size = ncchset->Sections.TotalContentSize; + ncchset->out->buffer = malloc(ncchset->out->size); + if(!ncchset->out->buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} + memset(ncchset->out->buffer,0,ncchset->out->size); + + /* Copy Header+Sig */ + memcpy(ncchset->out->buffer,ncchset->sections.ncchHdr.buffer,ncchset->sections.ncchHdr.size); + + /* Copy Exheader+AccessDesc */ + if(ncchset->sections.exhdr.size) + memcpy(ncchset->out->buffer+0x200,ncchset->sections.exhdr.buffer,ncchset->sections.exhdr.size); + + /* Copy Logo */ + if(ncchset->sections.logo.size) + memcpy(ncchset->out->buffer+ncchset->sections.logoOffset,ncchset->sections.logo.buffer,ncchset->sections.logo.size); + + /* Copy PlainRegion */ + if(ncchset->sections.plainRegion.size) + memcpy(ncchset->out->buffer+ncchset->sections.plainRegionOffset,ncchset->sections.plainRegion.buffer,ncchset->sections.plainRegion.size); + + /* Copy ExeFs */ + if(ncchset->sections.exeFs.size) + memcpy(ncchset->out->buffer+ncchset->sections.exeFsOffset,ncchset->sections.exeFs.buffer,ncchset->sections.exeFs.size); + + /* Copy RomFs */ + if(ncchset->sections.romFs.size) + memcpy(ncchset->out->buffer+ncchset->sections.romFsOffset,ncchset->sections.romFs.buffer,ncchset->sections.romFs.size); + + return 0; +} + +// NCCH Read Functions + +int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) +{ + // Setup + u8 Hash[0x20]; + u8 *hdr_sig = ncch; + ncch_hdr* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); + + ncch_struct *ncch_ctx = malloc(sizeof(ncch_struct)); + if(!ncch_ctx){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } + memset(ncch_ctx,0x0,sizeof(ncch_struct)); + GetCXIStruct(ncch_ctx,hdr); + + if(IsCfa(hdr)){ + if(CheckCFASignature(hdr_sig,(u8*)hdr,keys) != Good && !keys->rsa.isFalseSign){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA Sigcheck Failed\n"); + free(ncch_ctx); + return NCCH_HDR_SIG_BAD; + } + if(!ncch_ctx->romfs_size){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); + free(ncch_ctx); + return NO_ROMFS_IN_CFA; + } + u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); + if(!RomFs){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + free(ncch_ctx); + return MEM_ERROR; + } + int ret = GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); + if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); + free(ncch_ctx); + free(RomFs); + return CXI_CORRUPT; + } + else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); + free(ncch_ctx); + free(RomFs); + return UNABLE_TO_LOAD_NCCH_KEY; + } + + ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); + free(RomFs); + if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); + free(ncch_ctx); + return ExeFs_Hashfail; + } + } + else{ // IsCxi + // Checking for necessary sections + if(!ncch_ctx->exheader_size){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); + free(ncch_ctx); + return NO_EXHEADER_IN_CXI; + } + if(!ncch_ctx->exefs_size){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); + free(ncch_ctx); + return NO_EXEFS_IN_CXI; + } + // Get ExHeader + ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); + if(!ExHeader){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + free(ncch_ctx); + return MEM_ERROR; + } + int ret = GetNCCHSection((u8*)ExHeader,ncch_ctx->exheader_size,0,ncch,ncch_ctx,keys,ncch_ExHeader); + if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); + free(ncch_ctx); + free(ExHeader); + return CXI_CORRUPT; + } + else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); + free(ncch_ctx); + free(ExHeader); + return UNABLE_TO_LOAD_NCCH_KEY; + } + + // Checking Exheader Hash to see if decryption was sucessful + ctr_sha(ExHeader,0x400,Hash,CTR_SHA_256); + if(memcmp(Hash,hdr->extended_header_sha_256_hash,0x20) != 0){ + //memdump(stdout,"Expected Hash: ",hdr->extended_header_sha_256_hash,0x20); + //memdump(stdout,"Actual Hash: ",Hash,0x20); + //memdump(stdout,"Exheader: ",(u8*)ExHeader,0x400); + if(!SuppressOutput) { + fprintf(stderr,"[NCCH ERROR] ExHeader Hashcheck Failed\n"); + fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); + } + free(ncch_ctx); + free(ExHeader); + return ExHeader_Hashfail; + } + + // Checking RSA Sigs + u8 *hdr_pubk = GetNcchHdrPubKey_frm_exhdr(ExHeader); + + if(CheckaccessDescSignature(ExHeader,keys) != 0 && !keys->rsa.isFalseSign){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] AccessDesc Sigcheck Failed\n"); + free(ncch_ctx); + free(ExHeader); + return ACCESSDESC_SIG_BAD; + } + if(CheckCXISignature(hdr_sig,(u8*)hdr,hdr_pubk) != 0 /* && !keys->rsa.isFalseSign*/){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI Header Sigcheck Failed\n"); + free(ncch_ctx); + free(ExHeader); + return NCCH_HDR_SIG_BAD; + } + free(ExHeader); + + // It is assumed by this point, everything is fine + + /* Checking ExeFs Hash */ + u8 *ExeFs = malloc(ncch_ctx->exefs_hash_src_size); + if(!ExeFs){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + free(ncch_ctx); + return MEM_ERROR; + } + GetNCCHSection(ExeFs,ncch_ctx->exefs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_exefs); + ctr_sha(ExeFs,ncch_ctx->exefs_hash_src_size,Hash,CTR_SHA_256); + free(ExeFs); + if(memcmp(Hash,hdr->exefs_sha_256_hash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] ExeFs Hashcheck Failed\n"); + free(ncch_ctx); + return ExeFs_Hashfail; + } + + /* Checking RomFs hash, if present */ + if(ncch_ctx->romfs_size){ + u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); + if(!RomFs){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + free(ncch_ctx); + return MEM_ERROR; + } + GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); + ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); + free(RomFs); + if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); + free(ncch_ctx); + return ExeFs_Hashfail; + } + } + + /* Checking the Logo Hash, if present */ + if(ncch_ctx->logo_size){ + u8 *logo = (ncch+ncch_ctx->logo_offset); + ctr_sha(logo,ncch_ctx->logo_size,Hash,CTR_SHA_256); + if(memcmp(Hash,hdr->logo_sha_256_hash,0x20) != 0){ + if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Logo Hashcheck Failed\n"); + free(ncch_ctx); + return Logo_Hashfail; + } + } + } + + free(ncch_ctx); + return 0; +} + + +u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys) +{ + u8 *ncch = malloc(size); + if(!ncch){ + fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); + return NULL; + } + ReadFile_64(ncch,size,0,fp); // Importing + + if(!IsNCCH(NULL,ncch)){ + free(ncch); + return NULL; + } + + ncch_hdr *hdr = NULL; + hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); + + if(/*keys->rsa.requiresPresignedDesc && */!IsCfa(hdr)){ + fprintf(stderr,"[NCCH ERROR] CXI's ID cannot be modified without the ability to resign the AccessDesc\n"); // Not yet yet, requires AccessDesc Privk, may implement anyway later + free(ncch); + return NULL; + } + + if((memcmp(TitleId,hdr->title_id,8) == 0) && (memcmp(ProgramId,hdr->program_id,8) == 0)) + return ncch;// if no modification is required don't do anything + + if(memcmp(TitleId,hdr->title_id,8) == 0){ // If TitleID Same, no crypto required, just resign. + memcpy(hdr->program_id,ProgramId,8); + SignCFA(ncch,(u8*)hdr,keys); + return ncch; + } + + ncch_key_type keytype = GetNCCHKeyType(hdr); + u8 *key = NULL; + + if(keytype == KeyIsUnFixed || keytype == KeyIsUnFixed2){ + fprintf(stderr,"[NCCH ERROR] Unknown aes key\n"); + free(ncch); + return NULL; + } + + + ncch_struct ncch_struct; + if(keytype != NoKey){ //Decrypting if necessary + GetCXIStruct(&ncch_struct,hdr); + u8 *romfs = (ncch+ncch_struct.romfs_offset); + key = GetNCCHKey(hdr,keys); + if(key == NULL){ + fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); + free(ncch); + return NULL; + } + CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); + } + + + memcpy(hdr->title_id,TitleId,8); + memcpy(hdr->program_id,ProgramId,8); + + //Checking New Fixed Key Type + keytype = GetNCCHKeyType(hdr); + + if(keytype != NoKey){ // Re-encrypting if necessary + GetCXIStruct(&ncch_struct,hdr); + u8 *romfs = (ncch+ncch_struct.romfs_offset); + key = GetNCCHKey(hdr,keys); + if(key == NULL){ + fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); + free(ncch); + return NULL; + } + CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); + } + + SignCFA(ncch,(u8*)hdr,keys); + + return ncch; +} + + +ncch_hdr* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) +{ + if(!fp && !buf) return NULL; + if(fp){ + if(!out) return NULL; + ReadFile_64(out,0x100,0x100,fp); + return (ncch_hdr*)out; + } + else{ + return (ncch_hdr*)(buf+0x100); + } +} + + +bool IsNCCH(FILE *fp, u8 *buf) +{ + if(!fp && !buf) return false; + ncch_hdr *ncchHDR = NULL; + bool result; + if(fp) { + ncchHDR = malloc(sizeof(ncch_hdr)); + GetNCCH_CommonHDR(ncchHDR,fp,NULL); + result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); + free(ncchHDR); + } + else { + ncchHDR = GetNCCH_CommonHDR(ncchHDR,NULL,buf); + result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); + } + return result; +} + +bool IsCfa(ncch_hdr* hdr) +{ + return (((hdr->flags[ContentType] & RomFS) == RomFS) && ((hdr->flags[ContentType] & ExeFS) != ExeFS)); +} + +u32 GetNCCH_MediaUnitSize(ncch_hdr* hdr) +{ + u16 titleVersion = u8_to_u16(hdr->titleVersion,LE); + u32 ret = 0; + if (titleVersion == 1) + ret = 1; + else if (titleVersion == 2 || titleVersion == 0) + ret = 1 << (hdr->flags[ContentUnitSize] + 9); + return ret; + //return 0x200*pow(2,hdr->flags[ContentUnitSize]); +} + +u32 GetNCCH_MediaSize(ncch_hdr* hdr) +{ + return u8_to_u32(hdr->content_size,LE); +} + +ncch_key_type GetNCCHKeyType(ncch_hdr* hdr) +{ + // Non-Secure Key Options + if((hdr->flags[OtherFlag] & NoCrypto) == NoCrypto) return NoKey; + if((hdr->flags[OtherFlag] & FixedCryptoKey) == FixedCryptoKey){ + if((hdr->program_id[4] & 0x10) == 0x10) return KeyIsSystemFixed; + else return KeyIsNormalFixed; + } + + // Secure Key Options + if(hdr->flags[SecureCrypto2] == 1) return KeyIsUnFixed2; + return KeyIsUnFixed; +} + +u8* GetNCCHKey(ncch_hdr* hdr, keys_struct *keys) +{ + ncch_key_type keytype = GetNCCHKeyType(hdr); + switch(keytype){ + case NoKey: return NULL; + case KeyIsNormalFixed: return keys->aes.normalKey; + case KeyIsSystemFixed: + if(!keys->aes.systemFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load SystemFixed Key\n"); + return keys->aes.systemFixedKey; + case KeyIsUnFixed: + if(!keys->aes.unFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); + return keys->aes.unFixedKey; + case KeyIsUnFixed2: + fprintf(stderr,"[NCCH WARNING] Crypto method (Secure2) not supported yet\n"); + return NULL; + } + return NULL; +} + +int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, ncch_struct *ncch_ctx, keys_struct *keys, ncch_section section) +{ + if(!ncch) return MEM_ERROR; + u8 *key = NULL; + ncch_hdr* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); + ncch_key_type keytype = GetNCCHKeyType(hdr); + + if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ + key = GetNCCHKey(hdr,keys); + if(key == NULL){ + //fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); + return UNABLE_TO_LOAD_NCCH_KEY; + } + } + //printf("detecting section type\n"); + u64 offset = 0; + u64 size = 0; + switch(section){ + case ncch_ExHeader: + offset = ncch_ctx->exheader_offset; + size = ncch_ctx->exheader_size; + break; + case ncch_Logo: + offset = ncch_ctx->logo_offset; + size = ncch_ctx->logo_size; + break; + case ncch_PlainRegion: + offset = ncch_ctx->plain_region_offset; + size = ncch_ctx->plain_region_size; + break; + case ncch_exefs: + offset = ncch_ctx->exefs_offset; + size = ncch_ctx->exefs_size; + break; + case ncch_romfs: + offset = ncch_ctx->romfs_offset; + size = ncch_ctx->romfs_size; + break; + } + if(!offset || !size) return NCCH_SECTION_NOT_EXIST; + + if(src_pos > size) return DATA_POS_DNE; + + size = min_u64(size-src_pos,dest_max_size); + + //printf("Copying data\n"); + u8 *section_pos = (ncch + offset + src_pos); + memcpy(dest,section_pos,size); + + //printf("decrypting if needed\n"); + if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ // Decrypt + //memdump(stdout,"Key: ",key,16); + CryptNCCHSection(dest,size,src_pos,ncch_ctx,key,section); + //printf("no cigar\n"); + } + + return 0; +} + +int GetCXIStruct(ncch_struct *ctx, ncch_hdr *header) +{ + memcpy(ctx->titleID,header->title_id,8); + memcpy(ctx->programID,header->program_id,8); + + + u32 media_unit = GetNCCH_MediaUnitSize(header); + + ctx->titleVersion = u8_to_u16(header->titleVersion,LE); + if(!IsCfa(header)){ + ctx->exheader_offset = 0x200; + ctx->exheader_size = u8_to_u32(header->extended_header_size,LE) + 0x400; + ctx->logo_offset = (u64)(u8_to_u32(header->logo_region_offset,LE)*media_unit); + ctx->logo_size = (u64)(u8_to_u32(header->logo_region_size,LE)*media_unit); + ctx->plain_region_offset = (u64)(u8_to_u32(header->plain_region_offset,LE)*media_unit); + ctx->plain_region_size = (u64)(u8_to_u32(header->plain_region_size,LE)*media_unit); + ctx->exefs_offset = (u64)(u8_to_u32(header->exefs_offset,LE)*media_unit); + ctx->exefs_size = (u64)(u8_to_u32(header->exefs_size,LE)*media_unit); + ctx->exefs_hash_src_size = (u64)(u8_to_u32(header->exefs_hash_size,LE)*media_unit); + } + ctx->romfs_offset = (u64) (u8_to_u32(header->romfs_offset,LE)*media_unit); + ctx->romfs_size = (u64) (u8_to_u32(header->romfs_size,LE)*media_unit); + ctx->romfs_hash_src_size = (u64)(u8_to_u32(header->romfs_hash_size,LE)*media_unit); + return 0; +} + +void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, ncch_struct *ctx, u8 key[16], u8 type) +{ + if(type < 1 || type > 3) + return; + u8 counter[0x10]; + ncch_get_counter(ctx,counter,type); + ctr_aes_context aes_ctx; + memset(&aes_ctx,0x0,sizeof(ctr_aes_context)); + ctr_init_counter(&aes_ctx, key, counter); + if(src_pos > 0){ + u32 carry = 0; + carry = align_value(src_pos,0x10); + carry = carry/0x10; + ctr_add_counter(&aes_ctx,carry); + } + ctr_crypt_counter(&aes_ctx, buffer, buffer, size); + return; +} + +void ncch_get_counter(ncch_struct *ctx, u8 counter[16], u8 type) +{ + u8 *titleID = ctx->titleID; + u32 i; + u32 x = 0; + + memset(counter, 0, 16); + + if (ctx->titleVersion == 2 || ctx->titleVersion == 0) + { + for(i=0; i<8; i++) + counter[i] = titleID[7-i]; + counter[8] = type; + } + else if (ctx->titleVersion == 1) + { + switch(type){ + case ncch_ExHeader : x = ctx->exheader_offset; break; + case ncch_exefs : x = ctx->exefs_offset; break; + case ncch_romfs : x = ctx->romfs_offset; break; + } + for(i=0; i<8; i++) + counter[i] = titleID[i]; + for(i=0; i<4; i++) + counter[12+i] = x>>((3-i)*8); + } + + //memdump(stdout,"CTR: ",counter,16); +} \ No newline at end of file diff --git a/ncsd.c b/ncsd.c index aa23987..479e44d 100644 --- a/ncsd.c +++ b/ncsd.c @@ -52,25 +52,28 @@ int build_CCI(user_settings *usrset) if(result) goto finish; // Create Output File - cciset->out = fopen(usrset->outfile,"wb"); + cciset->out = fopen(usrset->common.outFileName,"wb"); if(!cciset->out){ - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); + fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->common.outFileName); result = FAILED_TO_CREATE_OUTFILE; goto finish; } // Generate NCSD Header and Additional Header result = BuildNCSDHeader(cciset,usrset); - if(result) goto finish; + if(result) + goto finish; BuildCardInfoHeader(cciset,usrset); // Write to File WriteCCI_HDR_ToFile(cciset); result = WriteCCI_Content_ToFile(cciset,usrset); - if(result) goto finish; + if(result) + goto finish; // Fill out file if necessary - if(cciset->MediaFootPadding) WriteCCI_DummyBytes(cciset); + if(cciset->fillOutCci) + WriteCCI_DummyBytes(cciset); // Close output file finish: @@ -82,12 +85,12 @@ finish: int SignCCI(u8 *Signature, u8 *NCSD_HDR) { - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,ctx.keys->rsa.CCI_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); + return ctr_sig(NCSD_HDR,sizeof(cci_hdr),Signature,ctx.keys->rsa.cciCfaPub,ctx.keys->rsa.cciCfaPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } int CheckCCISignature(u8 *Signature, u8 *NCSD_HDR) { - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); + return ctr_sig(NCSD_HDR,sizeof(cci_hdr),Signature,ctx.keys->rsa.cciCfaPub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); } void init_CCISettings(cci_settings *set) @@ -98,7 +101,7 @@ void init_CCISettings(cci_settings *set) int get_CCISettings(cci_settings *cciset, user_settings *usrset) { - ctx.keys = &usrset->keys; + ctx.keys = &usrset->common.keys; int result = 0; /* Importing Data from Content */ @@ -114,7 +117,7 @@ int get_CCISettings(cci_settings *cciset, user_settings *usrset) /* Getting Data from YAML */ - result = GetNCSDFlags(cciset,&usrset->yaml_set); + result = GetNCSDFlags(cciset,&usrset->common.rsfSet); if(result) return result; result = GetMediaSize(cciset,usrset); @@ -147,16 +150,16 @@ void free_CCISettings(cci_settings *set) int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset) { - memcpy((u8*)ctx.commonHDR.magic,"NCSD",4); - u32_to_u8((u8*)ctx.commonHDR.media_size,(cciset->MediaSize/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.title_id,cciset->MediaID,8); + memcpy((u8*)ctx.cciHdr.magic,"NCSD",4); + u32_to_u8((u8*)ctx.cciHdr.mediaSize,(cciset->mediaSize/cciset->mediaUnit),LE); + memcpy((u8*)ctx.cciHdr.titleId,cciset->mediaId,8); for(int i = 0; i < 8; i++){ - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].offset,(cciset->ContentOffset[i]/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].size,(cciset->ContentSize[i]/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.partition_id_table[i],cciset->ContentTitleID[i],8); + u32_to_u8((u8*)ctx.cciHdr.offset_sizeTable[i].offset,(cciset->contentOffset[i]/cciset->mediaUnit),LE); + u32_to_u8((u8*)ctx.cciHdr.offset_sizeTable[i].size,(cciset->contentSize[i]/cciset->mediaUnit),LE); + memcpy((u8*)ctx.cciHdr.partitionIdTable[i],cciset->contentTitleId[i],8); } - memcpy((u8*)ctx.commonHDR.partition_flags,cciset->NCSD_Flags,8); - if(SignCCI(ctx.Signature,(u8*)&ctx.commonHDR) != Good){ + memcpy((u8*)ctx.cciHdr.partitionFlags,cciset->flags,8); + if(SignCCI(ctx.signature,(u8*)&ctx.cciHdr) != Good){ fprintf(stderr,"[CCI ERROR] Failed to sign CCI\n"); return CCI_SIG_FAIL; } @@ -165,44 +168,43 @@ int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset) int BuildCardInfoHeader(cci_settings *cciset, user_settings *usrset) { - u32_to_u8((u8*)ctx.CardInfoHDR.writable_address,(cciset->WritableAddress/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.CardInfoHDR.card_info_bitmask,cciset->CardInfoBitmask,BE); - u32_to_u8((u8*)ctx.CardInfoHDR.media_size_used,cciset->TotalContentSize,LE); - memcpy((u8*)ctx.CardInfoHDR.ncch_0_title_id,cciset->ContentTitleID[0],8); - memcpy((u8*)ctx.CardInfoHDR.initial_data,cciset->InitialData,0x30); - if(!(usrset->OmitImportedNcchHdr && !usrset->IsBuildingNCCH0)) - memcpy((u8*)ctx.CardInfoHDR.ncch_0_header,cciset->NCCH_HDR,0x100); - memcpy((u8*)ctx.DevCardInfoHDR.TitleKey,cciset->TitleKey,0x10); + u32_to_u8((u8*)ctx.cardinfo.writable_address,(cciset->writableAddress/cciset->mediaUnit),LE); + u32_to_u8((u8*)ctx.cardinfo.card_info_bitmask,cciset->cardInfoBitmask,BE); + u32_to_u8((u8*)ctx.cardinfo.media_size_used,cciset->cciTotalSize,LE); + memcpy((u8*)ctx.cardinfo.ncch_0_title_id,cciset->contentTitleId[0],8); + memcpy((u8*)ctx.cardinfo.initial_data,cciset->initialData,0x30); + memcpy((u8*)ctx.cardinfo.ncch_0_header,cciset->ncchHdr,0x100); + memcpy((u8*)ctx.devcardinfo.TitleKey,cciset->titleKey,0x10); return 0; } int WriteCCI_HDR_ToFile(cci_settings *cciset) { - WriteBuffer(ctx.Signature,0x100,0,cciset->out); - WriteBuffer((u8*)&ctx.commonHDR,sizeof(NCSD_Header),0x100,cciset->out); - WriteBuffer((u8*)&ctx.CardInfoHDR,sizeof(CardInfo_Header),0x200,cciset->out); - WriteBuffer((u8*)&ctx.DevCardInfoHDR,sizeof(Dev_CardInfo_Header),0x1200,cciset->out); + WriteBuffer(ctx.signature,0x100,0,cciset->out); + WriteBuffer((u8*)&ctx.cciHdr,sizeof(cci_hdr),0x100,cciset->out); + WriteBuffer((u8*)&ctx.cardinfo,sizeof(cardinfo_hdr),0x200,cciset->out); + WriteBuffer((u8*)&ctx.devcardinfo,sizeof(devcardinfo_hdr),0x1200,cciset->out); return 0; } int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset) { // Write Content 0 - WriteBuffer(cciset->ncch0,cciset->ContentSize[0],cciset->ContentOffset[0],cciset->out); - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; + WriteBuffer(cciset->ncch0,cciset->contentSize[0],cciset->contentOffset[0],cciset->out); + free(usrset->common.workingFile.buffer); + usrset->common.workingFile.buffer = NULL; + usrset->common.workingFile.size = 0; // Add additional contents, recreating them with their new TitleID for(int i = 1; i < 8; i++){ if(cciset->content[i]){ - u8 *ContentBuff = RetargetNCCH(cciset->content[i],cciset->ContentSize[i],cciset->ContentTitleID[i],cciset->MediaID,ctx.keys); - if(!ContentBuff){ + u8 *ncch = RetargetNCCH(cciset->content[i],cciset->contentSize[i],cciset->contentTitleId[i],cciset->mediaId,ctx.keys); + if(!ncch){ fprintf(stderr,"[CCI ERROR] Could not import content %d to CCI\n",i); return FAILED_TO_IMPORT_FILE; } - WriteBuffer(ContentBuff,cciset->ContentSize[i],cciset->ContentOffset[i],cciset->out); - free(ContentBuff); + WriteBuffer(ncch,cciset->contentSize[i],cciset->contentOffset[i],cciset->out); + free(ncch); } } return 0; @@ -211,18 +213,18 @@ int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset) int WriteCCI_DummyBytes(cci_settings *cciset) { // Seeking end of CCI Data - fseek_64(cciset->out,cciset->TotalContentSize,SEEK_SET); + fseek_64(cciset->out,cciset->cciTotalSize,SEEK_SET); // Determining Size of Dummy Bytes - u64 len = cciset->MediaSize - cciset->TotalContentSize; + u64 len = cciset->mediaSize - cciset->cciTotalSize; // Creating Buffer of Dummy Bytes - u8 dummy_bytes[cciset->MediaUnitSize]; - memset(&dummy_bytes,0xff,cciset->MediaUnitSize); + u8 *dummy_bytes = malloc(cciset->mediaUnit); + memset(dummy_bytes,0xff,cciset->mediaUnit); // Writing Dummy Bytes to file - for(u64 i = 0; i < len; i += cciset->MediaUnitSize){ - fwrite(&dummy_bytes,cciset->MediaUnitSize,1,cciset->out); + for(u64 i = 0; i < len; i += cciset->mediaUnit){ + fwrite(&dummy_bytes,cciset->mediaUnit,1,cciset->out); } return 0; @@ -238,37 +240,37 @@ int GetContentFP(cci_settings *cciset, user_settings *usrset) memset(cciset->content,0,sizeof(FILE*)*8); for(int i = 1; i < 8; i++){ - if(usrset->ContentPath[i]){ - cciset->content[i] = fopen(usrset->ContentPath[i],"rb"); + if(usrset->common.contentPath[i]){ + cciset->content[i] = fopen(usrset->common.contentPath[i],"rb"); if(!cciset->content[i]){ // Checking if file could be opened - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); + fprintf(stderr,"[CCI ERROR] Failed to open '%s'\n",usrset->common.contentPath[i]); return FAILED_TO_OPEN_FILE; } if(!IsNCCH(cciset->content[i],NULL)){ // Checking if NCCH - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); + fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->common.contentPath[i]); return NCSD_INVALID_NCCH0; } // Getting NCCH Header - NCCH_Header *hdr = malloc(sizeof(NCCH_Header));; + ncch_hdr *hdr = malloc(sizeof(ncch_hdr)); GetNCCH_CommonHDR(hdr,cciset->content[i],NULL); - if(GetNCCH_MediaUnitSize(hdr) != cciset->MediaUnitSize){ // Checking if Media Unit Size matches CCI - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); + if(GetNCCH_MediaUnitSize(hdr) != cciset->mediaUnit){ // Checking if Media Unit Size matches CCI + fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->common.contentPath[i]); return NCSD_INVALID_NCCH0; } - memcpy(&cciset->ContentTitleID[i],cciset->MediaID,8); // Set TitleID + memcpy(&cciset->contentTitleId[i],cciset->mediaId,8); // Set TitleID // Modify TitleID Accordingly - u16 tmp = u8_to_u16(&hdr->title_id[6],LE); + u16 tmp = u8_to_u16(&hdr->titleId[6],LE); tmp |= (i+4); - u16_to_u8(&cciset->ContentTitleID[i][6],tmp,LE); + u16_to_u8(&cciset->contentTitleId[i][6],tmp,LE); - cciset->ContentSize[i] = GetNCCH_MediaSize(hdr)*cciset->MediaUnitSize; - cciset->ContentOffset[i] = cciset->TotalContentSize; + cciset->contentSize[i] = GetNCCH_MediaSize(hdr)*cciset->mediaUnit; + cciset->contentOffset[i] = cciset->cciTotalSize; - cciset->TotalContentSize += cciset->ContentSize[i]; + cciset->cciTotalSize += cciset->contentSize[i]; free(hdr); } @@ -278,10 +280,10 @@ int GetContentFP(cci_settings *cciset, user_settings *usrset) int CheckContent0(cci_settings *cciset, user_settings *usrset) { - if(!usrset->Content0.size) + if(!usrset->common.workingFile.buffer) return NCSD_NO_NCCH0; - cciset->ncch0 = usrset->Content0.buffer; - cciset->ncch0_FileLen = usrset->Content0.size; + cciset->ncch0 = usrset->common.workingFile.buffer; + cciset->ncch0_FileLen = usrset->common.workingFile.size; if(!IsNCCH(NULL,cciset->ncch0)) return NCSD_INVALID_NCCH0; @@ -291,15 +293,15 @@ int CheckContent0(cci_settings *cciset, user_settings *usrset) int GetDataFromContent0(cci_settings *cciset, user_settings *usrset) { - cciset->TotalContentSize = 0x4000; + cciset->cciTotalSize = 0x4000; - NCCH_Header *hdr; + ncch_hdr *hdr; hdr = GetNCCH_CommonHDR(NULL,NULL,cciset->ncch0); - cciset->NCCH_HDR = hdr; + cciset->ncchHdr = hdr; - u16 ncch_format_ver = u8_to_u16(hdr->version,LE); + u16 ncch_format_ver = u8_to_u16(hdr->formatVersion,LE); if(ncch_format_ver != 0 && ncch_format_ver != 2){ fprintf(stderr,"[CCI ERROR] NCCH type %d Not Supported\n",ncch_format_ver); return FAILED_TO_IMPORT_FILE; @@ -308,52 +310,52 @@ int GetDataFromContent0(cci_settings *cciset, user_settings *usrset) //memdump(stdout,"ncch0 head: ",(cciset->ncch0+0x100),0x100); //memdump(stdout,"ncch0 head: ",(u8*)(hdr),0x100); - memcpy(cciset->MediaID,hdr->title_id,8); - memcpy(&cciset->ContentTitleID[0],hdr->title_id,8); - if(usrset->GenSDKCardInfoHeader){ - memcpy(cciset->InitialData,Stock_InitialData,0x30); - memcpy(cciset->TitleKey,Stock_TitleKey,0x10); + memcpy(cciset->mediaId,hdr->titleId,8); + memcpy(&cciset->contentTitleId[0],hdr->titleId,8); + if(usrset->cci.useSDKStockData){ + memcpy(cciset->initialData,stock_initial_data,0x30); + memcpy(cciset->titleKey,stock_title_key,0x10); } else{ u8 Hash[0x40]; ctr_sha(cciset->ncch0,0x80,Hash,CTR_SHA_256); ctr_sha((cciset->ncch0+0x80),0x80,(Hash+0x20),CTR_SHA_256); - memcpy(cciset->InitialData,Hash,0x2C); - //memcpy(cciset->TitleKey,(Hash+0x30),0x10); // Might Remove + memcpy(cciset->initialData,Hash,0x2C); + //memcpy(cciset->titleKey,(Hash+0x30),0x10); // Might Remove } - cciset->NCSD_Flags[MediaUnitSize] = hdr->flags[ContentUnitSize]; - cciset->MediaUnitSize = GetNCCH_MediaUnitSize(hdr); + cciset->flags[MediaUnitSize] = hdr->flags[ContentUnitSize]; + cciset->mediaUnit = GetNCCH_MediaUnitSize(hdr); - cciset->ContentSize[0] = (u64)(GetNCCH_MediaSize(hdr) * cciset->MediaUnitSize); - cciset->ContentOffset[0] = cciset->TotalContentSize; + cciset->contentSize[0] = (u64)(GetNCCH_MediaSize(hdr) * cciset->mediaUnit); + cciset->contentOffset[0] = cciset->cciTotalSize; - cciset->TotalContentSize += cciset->ContentSize[0]; + cciset->cciTotalSize += cciset->contentSize[0]; return 0; } int GetMediaSize(cci_settings *cciset, user_settings *usrset) { - char *MediaSizeStr = usrset->yaml_set.BasicInfo.MediaSize; - if(!MediaSizeStr) cciset->MediaSize = (u64)GB*2; + char *MediaSizeStr = usrset->common.rsfSet.BasicInfo.MediaSize; + if(!MediaSizeStr) cciset->mediaSize = (u64)GB*2; else{ - if(strcasecmp(MediaSizeStr,"128MB") == 0) cciset->MediaSize = (u64)MB*128; - else if(strcasecmp(MediaSizeStr,"256MB") == 0) cciset->MediaSize = (u64)MB*256; - else if(strcasecmp(MediaSizeStr,"512MB") == 0) cciset->MediaSize = (u64)MB*512; - else if(strcasecmp(MediaSizeStr,"1GB") == 0) cciset->MediaSize = (u64)GB*1; - else if(strcasecmp(MediaSizeStr,"2GB") == 0) cciset->MediaSize = (u64)GB*2; - else if(strcasecmp(MediaSizeStr,"4GB") == 0) cciset->MediaSize = (u64)GB*4; - else if(strcasecmp(MediaSizeStr,"8GB") == 0) cciset->MediaSize = (u64)GB*8; - else if(strcasecmp(MediaSizeStr,"16GB") == 0) cciset->MediaSize = (u64)GB*16; - else if(strcasecmp(MediaSizeStr,"32GB") == 0) cciset->MediaSize = (u64)GB*32; + if(strcasecmp(MediaSizeStr,"128MB") == 0) cciset->mediaSize = (u64)MB*128; + else if(strcasecmp(MediaSizeStr,"256MB") == 0) cciset->mediaSize = (u64)MB*256; + else if(strcasecmp(MediaSizeStr,"512MB") == 0) cciset->mediaSize = (u64)MB*512; + else if(strcasecmp(MediaSizeStr,"1GB") == 0) cciset->mediaSize = (u64)GB*1; + else if(strcasecmp(MediaSizeStr,"2GB") == 0) cciset->mediaSize = (u64)GB*2; + else if(strcasecmp(MediaSizeStr,"4GB") == 0) cciset->mediaSize = (u64)GB*4; + else if(strcasecmp(MediaSizeStr,"8GB") == 0) cciset->mediaSize = (u64)GB*8; + else if(strcasecmp(MediaSizeStr,"16GB") == 0) cciset->mediaSize = (u64)GB*16; + else if(strcasecmp(MediaSizeStr,"32GB") == 0) cciset->mediaSize = (u64)GB*32; else { fprintf(stderr,"[CCI ERROR] Invalid MediaSize: %s\n",MediaSizeStr); return INVALID_YAML_OPT; } } - if(usrset->yaml_set.BasicInfo.MediaFootPadding != -1) cciset->MediaFootPadding = usrset->yaml_set.BasicInfo.MediaFootPadding; + if(usrset->common.rsfSet.BasicInfo.MediaFootPadding != -1) cciset->fillOutCci = usrset->common.rsfSet.BasicInfo.MediaFootPadding; return 0; } @@ -388,24 +390,24 @@ u64 GetUnusedSize(u64 MediaSize, u8 CardType) int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) { /* BackupWriteWaitTime */ - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = 0; - if(yaml->CardInfo.BackupWriteWaitTime){ - u32 WaitTime = strtoul(yaml->CardInfo.BackupWriteWaitTime,NULL,0); - if(WaitTime > 255){ - fprintf(stderr,"[CCI ERROR] Invalid Card BackupWriteWaitTime (%d) : must 0-255\n",WaitTime); - return EXHDR_BAD_YAML_OPT; - } - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = (u8)WaitTime; + cciset->flags[FW6x_BackupWriteWaitTime] = 0; + if(yaml->CardInfo.BackupWriteWaitTime){ + u32 WaitTime = strtoul(yaml->CardInfo.BackupWriteWaitTime,NULL,0); + if(WaitTime > 255){ + fprintf(stderr,"[CCI ERROR] Invalid Card BackupWriteWaitTime (%d) : must 0-255\n",WaitTime); + return EXHDR_BAD_YAML_OPT; + } + cciset->flags[FW6x_BackupWriteWaitTime] = (u8)WaitTime; } /* FW6x SaveCrypto */ - cciset->NCSD_Flags[FW6x_SaveCryptoFlag] = 1; + cciset->flags[FW6x_SaveCryptoFlag] = 1; /* MediaType */ - if(!yaml->CardInfo.MediaType) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; + if(!yaml->CardInfo.MediaType) cciset->flags[MediaTypeIndex] = CARD1; else{ - if(strcasecmp(yaml->CardInfo.MediaType,"Card1") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; - else if(strcasecmp(yaml->CardInfo.MediaType,"Card2") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD2; + if(strcasecmp(yaml->CardInfo.MediaType,"Card1") == 0) cciset->flags[MediaTypeIndex] = CARD1; + else if(strcasecmp(yaml->CardInfo.MediaType,"Card2") == 0) cciset->flags[MediaTypeIndex] = CARD2; else { fprintf(stderr,"[CCI ERROR] Invalid MediaType: %s\n",yaml->CardInfo.MediaType); return INVALID_YAML_OPT; @@ -413,11 +415,11 @@ int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) } /* Platform */ - cciset->NCSD_Flags[MediaPlatformIndex] = CTR; + cciset->flags[MediaPlatformIndex] = CTR; /* - if(!yaml->TitleInfo.Platform) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; + if(!yaml->TitleInfo.Platform) cciset->flags[MediaPlatformIndex] = CTR; else{ - if(strcasecmp(yaml->TitleInfo.Platform,"ctr") == 0) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; + if(strcasecmp(yaml->TitleInfo.Platform,"ctr") == 0) cciset->flags[MediaPlatformIndex] = CTR; else { fprintf(stderr,"[CCI ERROR] Invalid Platform: %s\n",yaml->TitleInfo.Platform); return INVALID_YAML_OPT; @@ -426,17 +428,17 @@ int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) */ /* CardDevice */ - if(!yaml->CardInfo.CardDevice) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; + if(!yaml->CardInfo.CardDevice) cciset->flags[CardDeviceFlag] = CARD_DEVICE_NONE; else{ if(strcmp(yaml->CardInfo.CardDevice,"NorFlash") == 0) { - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NOR_FLASH; - if(cciset->NCSD_Flags[MediaTypeIndex] == CARD2){ + cciset->flags[CardDeviceFlag] = CARD_DEVICE_NOR_FLASH; + if(cciset->flags[MediaTypeIndex] == CARD2){ fprintf(stderr,"[CCI WARNING] 'CardDevice: NorFlash' is invalid on Card2\n"); - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; + cciset->flags[CardDeviceFlag] = CARD_DEVICE_NONE; } } - else if(strcmp(yaml->CardInfo.CardDevice,"None") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - else if(strcmp(yaml->CardInfo.CardDevice,"BT") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_BT; + else if(strcmp(yaml->CardInfo.CardDevice,"None") == 0) cciset->flags[CardDeviceFlag] = CARD_DEVICE_NONE; + else if(strcmp(yaml->CardInfo.CardDevice,"BT") == 0) cciset->flags[CardDeviceFlag] = CARD_DEVICE_BT; else { fprintf(stderr,"[CCI ERROR] Invalid CardDevice: %s\n",yaml->CardInfo.CardDevice); return INVALID_YAML_OPT; @@ -447,53 +449,53 @@ int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) int GetWriteableAddress(cci_settings *cciset, user_settings *usrset) { - int result = GetSaveDataSize_yaml(&cciset->SaveDataSize,usrset); + int result = GetSaveDataSize_rsf(&cciset->savedataSize,usrset); if(result) return result; - char *WriteableAddressStr = usrset->yaml_set.CardInfo.WritableAddress;; + char *WriteableAddressStr = usrset->common.rsfSet.CardInfo.WritableAddress;; - cciset->WritableAddress = -1; - if(cciset->NCSD_Flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media + cciset->writableAddress = -1; + if(cciset->flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media if(WriteableAddressStr){ if(strncmp(WriteableAddressStr,"0x",2) != 0){ fprintf(stderr,"[CCI ERROR] WritableAddress requires a Hexadecimal value\n"); return INVALID_YAML_OPT; } - cciset->WritableAddress = strtoul((WriteableAddressStr+2),NULL,16); + cciset->writableAddress = strtoul((WriteableAddressStr+2),NULL,16); } - if(cciset->WritableAddress == -1){ // If not set manually or is max size - if ((cciset->MediaSize / 2) < cciset->SaveDataSize){ // If SaveData size is greater than half the MediaSize - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); + if(cciset->writableAddress == -1){ // If not set manually or is max size + if ((cciset->mediaSize / 2) < cciset->savedataSize){ // If SaveData size is greater than half the MediaSize + u64 SavedataSize = cciset->savedataSize / KB; + fprintf(stderr,"[CCI ERROR] Too large SavedataSize %luK\n",SavedataSize); return SAVE_DATA_TOO_LARGE; } - if (cciset->SaveDataSize > (u64)(2047*MB)){ // Limit set by Nintendo - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); + if (cciset->savedataSize > (u64)(2047*MB)){ // Limit set by Nintendo + u64 SavedataSize = cciset->savedataSize / KB; + fprintf(stderr,"[CCI ERROR] Too large SavedataSize %luK\n",SavedataSize); return SAVE_DATA_TOO_LARGE; } - u64 UnusedSize = GetUnusedSize(cciset->MediaSize,cciset->NCSD_Flags[MediaTypeIndex]); // Need to look into this - cciset->WritableAddress = cciset->MediaSize - UnusedSize - cciset->SaveDataSize; + u64 UnusedSize = GetUnusedSize(cciset->mediaSize,cciset->flags[MediaTypeIndex]); // Need to look into this + cciset->writableAddress = cciset->mediaSize - UnusedSize - cciset->savedataSize; } return 0; } int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset) { - char *str = usrset->yaml_set.CardInfo.CardType; - if(!str) cciset->CardInfoBitmask |= 0; + char *str = usrset->common.rsfSet.CardInfo.CardType; + if(!str) cciset->cardInfoBitmask |= 0; else{ - if(strcasecmp(str,"s1") == 0) cciset->CardInfoBitmask |= 0; - else if(strcasecmp(str,"s2") == 0) cciset->CardInfoBitmask |= 0x20; + if(strcasecmp(str,"s1") == 0) cciset->cardInfoBitmask |= 0; + else if(strcasecmp(str,"s2") == 0) cciset->cardInfoBitmask |= 0x20; else { fprintf(stderr,"[CCI ERROR] Invalid CardType: %s\n",str); return INVALID_YAML_OPT; } } - str = usrset->yaml_set.CardInfo.CryptoType; - if(!str) cciset->CardInfoBitmask |= (3*0x40); + str = usrset->common.rsfSet.CardInfo.CryptoType; + if(!str) cciset->cardInfoBitmask |= (3*0x40); else{ int Value = strtol(str,NULL,10); if(Value < 0 || Value > 3) { @@ -503,7 +505,7 @@ int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset) if(Value != 3){ fprintf(stderr,"[CCI WARNING] Card crypto type = '%d'\n",Value); } - cciset->CardInfoBitmask |= (Value*0x40); + cciset->cardInfoBitmask |= (Value*0x40); } return 0; @@ -511,9 +513,9 @@ int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset) int CheckMediaSize(cci_settings *cciset) { - if(cciset->TotalContentSize > cciset->MediaSize){ + if(cciset->cciTotalSize > cciset->mediaSize){ char *MediaSizeStr = NULL; - switch(cciset->MediaSize){ + switch(cciset->mediaSize){ case (u64)128*MB: MediaSizeStr = " '128MB'"; break; case (u64)256*MB: MediaSizeStr = " '256MB'"; break; case (u64)512*MB: MediaSizeStr = " '512MB'"; break; @@ -533,11 +535,11 @@ int CheckMediaSize(cci_settings *cciset) bool IsCci(u8 *ncsd) { - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); + cci_hdr *hdr = (cci_hdr*)(ncsd+0x100); if(!hdr) return false; if(memcmp(hdr->magic,"NCSD",4)!=0) return false; - if(hdr->partition_flags[MediaPlatformIndex] != CTR) return false; - if(hdr->partition_flags[MediaTypeIndex] != CARD1 && hdr->partition_flags[MediaTypeIndex] != CARD2) return false; + if(hdr->partitionFlags[MediaPlatformIndex] != CTR) return false; + if(hdr->partitionFlags[MediaTypeIndex] != CARD1 && hdr->partitionFlags[MediaTypeIndex] != CARD2) return false; return true; } @@ -549,16 +551,16 @@ u8* GetPartition(u8 *ncsd, u8 index) u64 GetPartitionOffset(u8 *ncsd, u8 index) { - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 offset = u8_to_u64(hdr->offsetsize_table[index].offset,LE); + cci_hdr *hdr = (cci_hdr*)(ncsd+0x100); + u32 media_size = 0x200*pow(2,hdr->partitionFlags[MediaUnitSize]); + u32 offset = u8_to_u64(hdr->offset_sizeTable[index].offset,LE); return offset*media_size; } u64 GetPartitionSize(u8 *ncsd, u8 index) { - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 size = u8_to_u64(hdr->offsetsize_table[index].size,LE); + cci_hdr *hdr = (cci_hdr*)(ncsd+0x100); + u32 media_size = 0x200*pow(2,hdr->partitionFlags[MediaUnitSize]); + u32 size = u8_to_u64(hdr->offset_sizeTable[index].size,LE); return size*media_size; } diff --git a/ncsd.h b/ncsd.h index cb96145..9f089f5 100644 --- a/ncsd.h +++ b/ncsd.h @@ -53,18 +53,32 @@ typedef struct typedef struct { u8 magic[4]; - u8 media_size[4]; - u8 title_id[8]; - u8 partitions_fs_type[8]; - u8 partitions_crypto_type[8]; - partition_offsetsize offsetsize_table[8]; - u8 exheader_hash[0x20]; - u8 additional_header_size[0x4]; - u8 sector_zero_offset[0x4]; - u8 partition_flags[8]; - u8 partition_id_table[8][8]; - u8 reserved[0x30]; -} NCSD_Header; + u8 mediaSize[4]; + u8 titleId[8]; + u8 partitionsFsType[8]; + u8 partitionsCryptoType[8]; + partition_offsetsize offset_sizeTable[8]; + u8 exhdrHash[0x20]; + u8 additionalHdrSize[0x4]; + u8 sectorZeroOffset[0x4]; + u8 partitionFlags[8]; + u8 partitionIdTable[8][8]; + u8 padding[0x30]; +} ncsd_hdr; + +typedef struct +{ + u8 magic[4]; + u8 mediaSize[4]; + u8 titleId[8]; + u8 partitionsFsType[8]; + u8 partitionsCryptoType[8]; + partition_offsetsize offset_sizeTable[8]; + u8 padding0[0x28]; + u8 partitionFlags[8]; + u8 partitionIdTable[8][8]; + u8 padding1[0x30]; +} cci_hdr; typedef struct { @@ -75,7 +89,7 @@ typedef struct u8 media_size_used[8]; u8 reserved_1[0x18]; u8 cver_title_id[8]; - u8 cver_title_version[2]; + u8 cver_title_titleVersion[2]; u8 reserved_2[0xcd6]; // u8 ncch_0_title_id[8]; @@ -83,53 +97,53 @@ typedef struct u8 initial_data[0x30]; u8 reserved_4[0xc0]; u8 ncch_0_header[0x100]; -} CardInfo_Header; +} cardinfo_hdr; typedef struct { u8 CardDeviceReserved1[0x200]; u8 TitleKey[0x10]; u8 CardDeviceReserved2[0xf0]; -} Dev_CardInfo_Header; +} devcardinfo_hdr; typedef struct { - u8 Signature[0x100]; - NCSD_Header commonHDR; - CardInfo_Header CardInfoHDR; - Dev_CardInfo_Header DevCardInfoHDR; - u8 *ContentImportBuffer; + u8 signature[0x100]; + cci_hdr cciHdr; + cardinfo_hdr cardinfo; + devcardinfo_hdr devcardinfo; + u8 *ncchImportBuffer; keys_struct *keys; } InternalCCI_Context; typedef struct { - u64 MediaSize; - u8 MediaID[8]; - u8 NCSD_Flags[8]; - u64 SaveDataSize; - u64 WritableAddress; - u32 CardInfoBitmask; + u64 mediaSize; + u8 mediaId[8]; + u8 flags[8]; + u64 savedataSize; + u64 writableAddress; + u32 cardInfoBitmask; - u8 InitialData[0x30]; - NCCH_Header *NCCH_HDR; - u8 TitleKey[0x10]; + u8 initialData[0x30]; + ncch_hdr *ncchHdr; + u8 titleKey[0x10]; u8 *ncch0; u64 ncch0_FileLen; FILE **content; - u64 ContentSize[CCI_MAX_CONTENT]; - u64 ContentOffset[CCI_MAX_CONTENT]; - u8 ContentTitleID[CCI_MAX_CONTENT][8]; - u64 TotalContentSize; + u64 contentSize[CCI_MAX_CONTENT]; + u64 contentOffset[CCI_MAX_CONTENT]; + u8 contentTitleId[CCI_MAX_CONTENT][8]; + u64 cciTotalSize; - bool MediaFootPadding; - u32 MediaUnitSize; + bool fillOutCci; + u32 mediaUnit; FILE *out; } cci_settings; -static const u8 Stock_InitialData[0x30] = +static const u8 stock_initial_data[0x30] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -141,7 +155,7 @@ static const u8 Stock_InitialData[0x30] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const u8 Stock_TitleKey[0x10] = +static const u8 stock_title_key[0x10] = { 0x6E, 0xC7, 0x5F, 0xB2, 0xE2, 0xB4, 0x87, 0x46, 0x1E, 0xDD, 0xCB, 0xB8, diff --git a/keys_retail.h b/ppki.h similarity index 66% rename from keys_retail.h rename to ppki.h index 1b67784..de1ea8f 100644 --- a/keys_retail.h +++ b/ppki.h @@ -1,46 +1,35 @@ -#ifndef _KEYS_RETAIL_H_ -#define _KEYS_RETAIL_H_ +#ifndef _PPKI_H_ +#define _PPKI_H_ + +#ifdef PKI_LEGACY +#include "ppki_legacy.h" +#endif -#ifndef PUBLIC_BUILD // AES KEYS -static const unsigned char common_key_prod_keyY0[16] = +static const unsigned char ctr_unfixed_ncch_keyX_ppki[2][16] = // Dummy { - 0xD0, 0x7B, 0x33, 0x7F, 0x9C, 0xA4, 0x38, 0x59, - 0x32, 0xA2, 0xE2, 0x57, 0x23, 0x23, 0x2E, 0xB9 + {0x81, 0x50, 0xA9, 0x78, 0x53, 0x3B, 0xA5, 0xE9, 0xA5, 0x0A, 0x23, 0x16, 0xB9, 0x3A, 0xED, 0x5A} , // Normal + {0xB4, 0xD1, 0xCF, 0x58, 0x49, 0xCE, 0x8A, 0x2D, 0x71, 0x58, 0xF6, 0x66, 0x77, 0x5D, 0x16, 0x3D} , // 7.X new Crypto }; -static const unsigned char common_key_prod_keyY1[16] = +static const unsigned char ctr_common_etd_keyX_ppki[16] = // Dummy { - 0x0C, 0x76, 0x72, 0x30, 0xF0, 0x99, 0x8F, 0x1C, - 0x46, 0x82, 0x82, 0x02, 0xFA, 0xAC, 0xBE, 0x4C + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const unsigned char common_key_prod_keyY2[16] = +static const unsigned char ctr_common_etd_keyY_ppki[6][16] = { - 0xC4, 0x75, 0xCB, 0x3A, 0xB8, 0xC7, 0x88, 0xBB, - 0x57, 0x5E, 0x12, 0xA1, 0x09, 0x07, 0xB8, 0xA4 -}; - -static const unsigned char common_key_prod_keyY3[16] = -{ - 0xE4, 0x86, 0xEE, 0xE3, 0xD0, 0xC0, 0x9C, 0x90, - 0x2F, 0x66, 0x86, 0xD4, 0xC0, 0x6F, 0x64, 0x9F -}; - -static const unsigned char common_key_prod_keyY4[16] = -{ - 0xED, 0x31, 0xBA, 0x9C, 0x04, 0xB0, 0x67, 0x50, - 0x6C, 0x44, 0x97, 0xA3, 0x5B, 0x78, 0x04, 0xFC -}; - -static const unsigned char common_key_prod_keyY5[16] = -{ - 0x5E, 0x66, 0x99, 0x8A, 0xB4, 0xE8, 0x93, 0x16, - 0x06, 0x85, 0x0F, 0xD7, 0xA1, 0x6D, 0xD7, 0x55 + {0xD0, 0x7B, 0x33, 0x7F, 0x9C, 0xA4, 0x38, 0x59, 0x32, 0xA2, 0xE2, 0x57, 0x23, 0x23, 0x2E, 0xB9} , // 0 - eShop Titles + {0x0C, 0x76, 0x72, 0x30, 0xF0, 0x99, 0x8F, 0x1C, 0x46, 0x82, 0x82, 0x02, 0xFA, 0xAC, 0xBE, 0x4C} , // 1 - System Titles + {0xC4, 0x75, 0xCB, 0x3A, 0xB8, 0xC7, 0x88, 0xBB, 0x57, 0x5E, 0x12, 0xA1, 0x09, 0x07, 0xB8, 0xA4} , // 2 + {0xE4, 0x86, 0xEE, 0xE3, 0xD0, 0xC0, 0x9C, 0x90, 0x2F, 0x66, 0x86, 0xD4, 0xC0, 0x6F, 0x64, 0x9F} , // 3 + {0xED, 0x31, 0xBA, 0x9C, 0x04, 0xB0, 0x67, 0x50, 0x6C, 0x44, 0x97, 0xA3, 0x5B, 0x78, 0x04, 0xFC} , // 4 + {0x5E, 0x66, 0x99, 0x8A, 0xB4, 0xE8, 0x93, 0x16, 0x06, 0x85, 0x0F, 0xD7, 0xA1, 0x6D, 0xD7, 0x55} , // 5 }; // RSA KEYS -static const unsigned char retail_cert_root_rsa_pubk[0x200] = +static const unsigned char root_ppki_rsa_pub[0x200] = { 0xF8, 0x24, 0x6C, 0x58, 0xBA, 0xE7, 0x50, 0x03, 0x01, 0xFB, 0xB7, 0xC2, 0xEB, 0xE0, 0x01, 0x05, @@ -108,7 +97,151 @@ static const unsigned char retail_cert_root_rsa_pubk[0x200] = 0xCF, 0xC4, 0x4E, 0x1F, 0x91, 0xCB, 0xD4, 0x95 }; -static const unsigned char RetailAccessDesc_pubMod[0x100] = +static const unsigned char cpB_ppki_rsa_priv[256] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char cpB_ppki_rsa_pub[256] = +{ + 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, + 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, + 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, + 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, + 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, + 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, + 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, + 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, + 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, + 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, + 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, + 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, + 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, + 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, + 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, + 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, + 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, + 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, + 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, + 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, + 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, + 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, + 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, + 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, + 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, + 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, + 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, + 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, + 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, + 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, + 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, + 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B +}; + +static const unsigned char xsC_ppki_rsa_priv[256] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char xsC_ppki_rsa_pub[256] = +{ + 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, + 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, + 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, + 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, + 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, + 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, + 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, + 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, + 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, + 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, + 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, + 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, + 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, + 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, + 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, + 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, + 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, + 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, + 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, + 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, + 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, + 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, + 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, + 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, + 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, + 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, + 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, + 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, + 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, + 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, + 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, + 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25 +}; + +static const unsigned char prod_acex_pub[0x100] = { 0xB1, 0xE3, 0xE3, 0x5F, 0x01, 0x39, 0x80, 0xD1, 0x56, 0x78, 0x9D, 0xB7, 0x06, 0xF7, 0x1D, 0xBF, @@ -144,7 +277,43 @@ static const unsigned char RetailAccessDesc_pubMod[0x100] = 0x47, 0x1A, 0x63, 0x44, 0x19, 0xB3, 0x8E, 0xA5 }; -static const unsigned char RetailNcsdCfa_pubMod[0x100] = +static const unsigned char prod_acex_priv[256] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char prod_ncsd_cfa_pub[0x100] = { 0xFB, 0xDE, 0xB8, 0x2B, 0x40, 0x93, 0x0F, 0xF6, 0xB1, 0x9A, 0x08, 0x06, 0x1B, 0x86, 0xFE, 0xD0, @@ -180,7 +349,43 @@ static const unsigned char RetailNcsdCfa_pubMod[0x100] = 0x29, 0xAB, 0x69, 0x69, 0xC8, 0x28, 0xEE, 0x5D }; -static const unsigned char retail_firm_pubk[0x100] = +static const unsigned char prod_ncsd_cfa_priv[256] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char prod_firm_pub[0x100] = { 0xDE, 0xCF, 0xB6, 0xFC, 0x3D, 0x33, 0xE9, 0x55, 0xFD, 0xAC, 0x90, 0xE8, 0x88, 0x17, 0xB0, 0x03, @@ -215,10 +420,9 @@ static const unsigned char retail_firm_pubk[0x100] = 0xB2, 0xCC, 0x36, 0x87, 0x30, 0x85, 0xE8, 0xA1, 0x04, 0x5B, 0xE0, 0x17, 0x9B, 0xD0, 0xEC, 0x9B }; -#endif //Certificates -static const unsigned char ca3_dpki_cert[0x400] = +static const unsigned char ca3_ppki_cert[0x400] = { 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, @@ -350,7 +554,7 @@ static const unsigned char ca3_dpki_cert[0x400] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const unsigned char xsC_dpki_cert[0x300] = +static const unsigned char xsC_ppki_cert[0x300] = { 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, @@ -450,7 +654,7 @@ static const unsigned char xsC_dpki_cert[0x300] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const unsigned char cpB_dpki_cert[0x300] = +static const unsigned char cpB_ppki_cert[0x300] = { 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, diff --git a/ppki_legacy.h b/ppki_legacy.h new file mode 100644 index 0000000..e0eea7e --- /dev/null +++ b/ppki_legacy.h @@ -0,0 +1,20 @@ +#ifndef _PPKI_LEGACY_H_ +#define _PPKI_LEGACY_H_ + +// AES Keys +static const unsigned char rvl_common_etd_key_ppki[2][16] = +{ + {0xEB, 0xE4, 0x2A, 0x22, 0x5E, 0x85, 0x93, 0xE4, 0x48, 0xD9, 0xC5, 0x45, 0x73, 0x81, 0xAA, 0xF7} , // 0 - Normal + {0x63, 0xB8, 0x2B, 0xB4, 0xF4, 0x61, 0x4E, 0x2E, 0x13, 0xF2, 0xFE, 0xFB, 0xBA, 0x4C, 0x9B, 0x7E} , // 1 - Korean +}; + +static const unsigned char twl_common_etd_key_ppki[1][16] = +{ + {0xAF, 0x1B, 0xF5, 0x16, 0xA8, 0x07, 0xD2, 0x1A, 0xEA, 0x45, 0x98, 0x4F, 0x04, 0x74, 0x28, 0x61} , // 0 - Normal +}; + +// RSA Keys + +// Certificates + +#endif \ No newline at end of file diff --git a/romfs.c b/romfs.c index 7a0adcd..4081a05 100644 --- a/romfs.c +++ b/romfs.c @@ -11,9 +11,9 @@ int BuildRomFs(ncch_settings *ncchset) int result = 0; // If Not Using RomFS Return - if(!ncchset->Options.UseRomFS) return result; + if(!ncchset->options.UseRomFS) return result; - if(ncchset->ComponentFilePtrs.romfs){ // The user has specified a pre-built RomFs Binary + if(ncchset->componentFilePtrs.romfs){ // The user has specified a pre-built RomFs Binary result = ImportRomFsBinaryFromFile(ncchset); return result; } @@ -25,11 +25,11 @@ int BuildRomFs(ncch_settings *ncchset) int ImportRomFsBinaryFromFile(ncch_settings *ncchset) { - ncchset->Sections.RomFs.size = ncchset->ComponentFilePtrs.romfs_size; - ncchset->Sections.RomFs.buffer = malloc(ncchset->Sections.RomFs.size); - if(!ncchset->Sections.RomFs.buffer) {fprintf(stderr,"[ROMFS ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncchset->ComponentFilePtrs.romfs); - if(memcmp(ncchset->Sections.RomFs.buffer,"IVFC",4) != 0){ + ncchset->sections.romFs.size = ncchset->componentFilePtrs.romfsSize; + ncchset->sections.romFs.buffer = malloc(ncchset->sections.romFs.size); + if(!ncchset->sections.romFs.buffer) {fprintf(stderr,"[ROMFS ERROR] MEM ERROR\n"); return MEM_ERROR;} + ReadFile_64(ncchset->sections.romFs.buffer,ncchset->sections.romFs.size,0,ncchset->componentFilePtrs.romfs); + if(memcmp(ncchset->sections.romFs.buffer,"IVFC",4) != 0){ fprintf(stderr,"[ROMFS ERROR] Invalid RomFS Binary.\n"); return INVALID_ROMFS_FILE; } diff --git a/srl.h b/srl.h index e4d1661..0037441 100644 --- a/srl.h +++ b/srl.h @@ -1,6 +1,6 @@ -#ifndef _SRL_H_ -#define _SRL_H_ - +#ifndef _SRL_H_ +#define _SRL_H_ + typedef struct { u8 game_title[0xC]; @@ -91,6 +91,6 @@ typedef struct u8 reserved_6[0xA4C]; u8 reserved_7[0x180]; u8 signature[0x80]; -} SRL_Header; - +} SRL_Header; + #endif \ No newline at end of file diff --git a/tik.c b/tik.c index da05d53..44f71f6 100644 --- a/tik.c +++ b/tik.c @@ -4,20 +4,21 @@ // Private Prototypes int SetupTicketBuffer(COMPONENT_STRUCT *tik); -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset); -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys); -void SetContentIndexData(u8 *dest); +int SetupTicketHeader(tik_hdr *hdr, cia_settings *ciaset); +int SignTicketHeader(tik_hdr *hdr, tik_signature *sig, keys_struct *keys); +void SetLimits(tik_hdr *hdr, cia_settings *ciaset); +void SetContentIndexData(tik_hdr *hdr, cia_settings *ciaset); int BuildTicket(cia_settings *ciaset) { int result = 0; - result = SetupTicketBuffer(&ciaset->CIA_Sections.Ticket); + result = SetupTicketBuffer(&ciaset->ciaSections.tik); if(result) return result; // Setting Ticket Struct Ptrs - TicketSignatureStruct *sig = (TicketSignatureStruct*)ciaset->CIA_Sections.Ticket.buffer; - TicketStruct *hdr = (TicketStruct*)(ciaset->CIA_Sections.Ticket.buffer+sizeof(TicketSignatureStruct)); + tik_signature *sig = (tik_signature*)ciaset->ciaSections.tik.buffer; + tik_hdr *hdr = (tik_hdr*)(ciaset->ciaSections.tik.buffer+sizeof(tik_signature)); result = SetupTicketHeader(hdr,ciaset); if(result) return result; @@ -27,37 +28,41 @@ int BuildTicket(cia_settings *ciaset) int SetupTicketBuffer(COMPONENT_STRUCT *tik) { - tik->size = sizeof(TicketSignatureStruct) + sizeof(TicketStruct); + tik->size = sizeof(tik_signature) + sizeof(tik_hdr); tik->buffer = malloc(tik->size); if(!tik->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } memset(tik->buffer,0,tik->size); return 0; } -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset) +int SetupTicketHeader(tik_hdr *hdr, cia_settings *ciaset) { - memset(hdr,0,sizeof(TicketStruct)); + memset(hdr,0,sizeof(tik_hdr)); - memcpy(hdr->Issuer,ciaset->tik.TicketIssuer,0x40); - hdr->TicketFormatVersion = ciaset->tik.ticket_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - if(ciaset->content.EncryptContents) - CryptTitleKey(hdr->EncryptedTitleKey, ciaset->tik.TitleKey,ciaset->TitleID,ciaset->keys,ENC); - memcpy(hdr->TicketID,ciaset->tik.TicketID,8); - memcpy(hdr->DeviceID,ciaset->tik.DeviceID,8); - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TicketVersion,ciaset->tik.TicketVersion,2); - hdr->CommonKeyID = ciaset->keys->aes.CurrentCommonKey; - SetContentIndexData(hdr->StaticData); + memcpy(hdr->issuer,ciaset->tik.issuer,0x40); + hdr->formatVersion = ciaset->tik.formatVersion; + hdr->caCrlVersion = ciaset->cert.caCrlVersion; + hdr->signerCrlVersion = ciaset->cert.signerCrlVersion; + if(ciaset->content.encryptCia) + CryptTitleKey(hdr->encryptedTitleKey, ciaset->common.titleKey,ciaset->common.titleId,ciaset->keys,ENC); + memcpy(hdr->ticketId,ciaset->tik.ticketId,8); + memcpy(hdr->deviceId,ciaset->tik.deviceId,8); + memcpy(hdr->titleId,ciaset->common.titleId,8); + u16_to_u8(hdr->ticketVersion,ciaset->tik.version,BE); + hdr->licenceType = ciaset->tik.licenceType; + hdr->keyId = ciaset->keys->aes.currentCommonKey; + memcpy(hdr->eshopAccId,ciaset->tik.eshopAccId,4); + hdr->audit = ciaset->tik.audit; + SetLimits(hdr,ciaset); + SetContentIndexData(hdr,ciaset); return 0; } -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys) +int SignTicketHeader(tik_hdr *hdr, tik_signature *sig, keys_struct *keys) { - memset(sig,0,sizeof(TicketSignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TicketStruct),sig->data,keys->rsa.TIK_Pub,keys->rsa.TIK_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); + memset(sig,0,sizeof(tik_signature)); + u32_to_u8(sig->sigType,RSA_2048_SHA256,BE); + return ctr_sig((u8*)hdr,sizeof(tik_hdr),sig->data,keys->rsa.xsPub,keys->rsa.xsPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode) @@ -72,7 +77,7 @@ int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *ke memset(&ctx,0x0,sizeof(ctr_aes_context)); //Crypting TitleKey - ctr_init_aes_cbc(&ctx,keys->aes.CommonKey[keys->aes.CurrentCommonKey],iv,mode); + ctr_init_aes_cbc(&ctx,keys->aes.commonKey[keys->aes.currentCommonKey],iv,mode); if(mode == ENC) ctr_aes_cbc(&ctx,DecTitleKey,EncTitleKey,0x10,ENC); else ctr_aes_cbc(&ctx,EncTitleKey,DecTitleKey,0x10,DEC); @@ -80,7 +85,13 @@ int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *ke return 0; } -void SetContentIndexData(u8 *dest) +void SetLimits(tik_hdr *hdr, cia_settings *ciaset) { - memcpy(dest,normal_static_ticket_data,0x30); + memset(hdr->limits,0,0x40); +} + +void SetContentIndexData(tik_hdr *hdr, cia_settings *ciaset) +{ + memset(hdr->contentIndex,0,0xAC); + memcpy(hdr->contentIndex,default_contentIndex,0x30); } diff --git a/tik.h b/tik.h index 694faac..d6c04b2 100644 --- a/tik.h +++ b/tik.h @@ -1,7 +1,7 @@ #ifndef _TIK_H_ #define _TIK_H_ -static const unsigned char normal_static_ticket_data[0x30] = +static const unsigned char default_contentIndex[0x30] = { 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, @@ -11,17 +11,6 @@ static const unsigned char normal_static_ticket_data[0x30] = 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }; -/* -static const unsigned char system_static_ticket_data[0x30] = -{ - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 -}; -*/ typedef enum { lic_Permanent = 0, @@ -31,7 +20,7 @@ typedef enum lic_Subscription = 4, lic_Service = 5, lic_Mask = 15 -} ticket_license_type; +} tik_license_type; typedef enum { @@ -40,38 +29,40 @@ typedef enum right_Content = 3, right_ContentConsumption = 4, right_AccessTitle = 5 -} ticket_item_rights; +} tik_item_rights; typedef struct { - u8 sig_type[4]; + u8 sigType[4]; u8 data[0x100]; u8 padding[0x3C]; -} TicketSignatureStruct; +} tik_signature; typedef struct { - u8 Issuer[0x40]; - u8 ECDH[0x3c]; - u8 TicketFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 EncryptedTitleKey[0x10]; - u8 unknown_0; - u8 TicketID[8]; - u8 DeviceID[4]; - u8 TitleID[8]; - u8 unknown_1[2]; - u8 TicketVersion[2]; - u8 unused_0[8]; - u8 unused_1; - u8 CommonKeyID; - u8 unused_2[0x2F]; - u8 unknown_2; - u8 unused_3[0x82]; - u8 StaticData[0x30]; - u8 unused_4[0x7C]; -} TicketStruct; + u8 issuer[0x40]; + u8 eccPubKey[0x3c]; + u8 formatVersion; + u8 caCrlVersion; + u8 signerCrlVersion; + u8 encryptedTitleKey[0x10]; + u8 padding0; + u8 ticketId[8]; + u8 deviceId[4]; + u8 titleId[8]; + u8 padding1[2]; + u8 ticketVersion[2]; + u8 padding2[8]; + u8 licenceType; + u8 keyId; + u8 padding3[0x2A]; + u8 eshopAccId[4]; + u8 padding4; + u8 audit; + u8 padding5[0x42]; + u8 limits[0x40]; + u8 contentIndex[0xAC]; +} tik_hdr; #endif diff --git a/titleid.c b/titleid.c index dba5c67..0ddf419 100644 --- a/titleid.c +++ b/titleid.c @@ -16,7 +16,7 @@ u64 ConvertTwlIdToCtrId(u64 pgid) int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader) { if(yaml->TitleInfo.Category && yaml->TitleInfo.CategoryFlags){ - fprintf(stderr,"[ERROR] Can not set Cateory and CategoryFlags at the same time.\n"); + fprintf(stderr,"[ERROR] Can not set \"Cateory\" and \"CategoryFlags\" at the same time.\n"); return PID_BAD_YAML_SET; } u16 Type = 0x0004; @@ -37,7 +37,7 @@ int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader) // Getting UniqueId if(yaml->TitleInfo.UniqueId) UniqueId = SetPIDUniqueId(yaml->TitleInfo.UniqueId); else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); + fprintf(stderr,"[ERROR] ParameterNotFound: \"TitleInfo/UniqueId\"\n"); return PID_BAD_YAML_SET; } @@ -63,7 +63,7 @@ int GetUniqueID(u32 *dest, rsf_settings *yaml) { if(yaml->TitleInfo.UniqueId) *dest = 0xffffff & SetPIDUniqueId(yaml->TitleInfo.UniqueId); else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); + fprintf(stderr,"[ERROR] ParameterNotFound: \"TitleInfo/UniqueId\"\n"); return PID_BAD_YAML_SET; } return 0; @@ -85,7 +85,7 @@ u32 SetPIDCategoryFromName(char *Category) else if(strcmp(Category,"Patch") == 0) return PROGRAM_ID_CATEGORY_PATCH; else if(strcmp(Category,"AutoUpdateContents") == 0) return PROGRAM_ID_CATEGORY_AUTO_UPDATE_CONTENT; else { - fprintf(stderr,"[ERROR] Invalid Category: %s\n",Category); + fprintf(stderr,"[ERROR] Invalid Category: \"%s\"\n",Category); return PID_INVALID_CATEGORY; } } @@ -120,7 +120,7 @@ u32 SetPIDCategoryFromFlags(char **CategoryFlags, u32 FlagNum) Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID,"CanSkipConvertJumpId"); else { - fprintf(stderr,"[ERROR] Invalid CategoryFlag: %s\n",CategoryFlags[i]); + fprintf(stderr,"[ERROR] Invalid CategoryFlag: \"%s\"\n",CategoryFlags[i]); return PID_INVALID_CATEGORY; } @@ -133,7 +133,7 @@ u32 SetPIDCategoryFromFlag(u32 Category, u32 Flag, char *FlagName) { if(!Flag) return Category; if((Category & Flag) == Flag){ - fprintf(stderr,"[ERROR] Failed to set '%s' for category. CategoryFlag was already set.\n",FlagName); + fprintf(stderr,"[ERROR] Failed to set \"%s\" for category. CategoryFlag was already set.\n",FlagName); return PID_INVALID_CATEGORY; } return Category |= Flag; @@ -150,13 +150,13 @@ u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) if(yaml_set->TitleInfo.DemoIndex){ u16 DemoIndex = strtol(yaml_set->TitleInfo.DemoIndex,NULL,10); if(DemoIndex > 255 || DemoIndex == 0){ - fprintf(stderr,"[ERROR] Invalid demo index '%d'\n",DemoIndex); + fprintf(stderr,"[ERROR] Invalid demo index \"%d\"\n",DemoIndex); return PID_INVALID_VARIATION; } return DemoIndex; } else{ - fprintf(stderr,"[ERROR] ParameterNotFound: 'TitleInfo/DemoIndex'\n"); + fprintf(stderr,"[ERROR] ParameterNotFound: \"TitleInfo/DemoIndex\"\n"); return PID_INVALID_VARIATION; } } @@ -165,7 +165,7 @@ u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) if(yaml_set->TitleInfo.ChildIndex){ u16 ChildIndex = strtol(yaml_set->TitleInfo.ChildIndex,NULL,10); if(ChildIndex > 255){ - fprintf(stderr,"[ERROR] Invalid child index '%d'\n",ChildIndex); + fprintf(stderr,"[ERROR] Invalid child index \"%d\"\n",ChildIndex); return PID_INVALID_VARIATION; } return ChildIndex; @@ -177,7 +177,7 @@ u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) if(yaml_set->TitleInfo.Variation){ // Might Rename to DataTitleIndex u16 DataTitleIndex = strtol(yaml_set->TitleInfo.Variation,NULL,10); if(DataTitleIndex > 255){ - fprintf(stderr,"[ERROR] Invalid variation '%d'\n",DataTitleIndex); + fprintf(stderr,"[ERROR] Invalid variation \"%d\"\n",DataTitleIndex); return PID_INVALID_VARIATION; } return DataTitleIndex; @@ -189,7 +189,7 @@ u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) if(yaml_set->TitleInfo.ContentsIndex){ u16 ContentsIndex = strtol(yaml_set->TitleInfo.ContentsIndex,NULL,10); if(ContentsIndex > 255){ - fprintf(stderr,"[ERROR] Invalid content index '%d'\n",ContentsIndex); + fprintf(stderr,"[ERROR] Invalid content index \"%d\"\n",ContentsIndex); return PID_INVALID_VARIATION; } return ContentsIndex; @@ -201,7 +201,7 @@ u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) if(yaml_set->TitleInfo.Version){ u16 Version = strtol(yaml_set->TitleInfo.Version,NULL,10); if(Version > 255){ - fprintf(stderr,"[ERROR] Invalid version '%d'\n",Version); + fprintf(stderr,"[ERROR] Invalid Version \"%d\"\n",Version); return PID_INVALID_VARIATION; } return Version; diff --git a/tmd.c b/tmd.c index 2dadf12..3d8a8c8 100644 --- a/tmd.c +++ b/tmd.c @@ -4,31 +4,31 @@ // Private Prototypes int SetupTMDBuffer(COMPONENT_STRUCT *tik); -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset); -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys); -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount); +int SetupTMDHeader(tmd_hdr *hdr, tmd_content_info_record *info_record, cia_settings *ciaset); +int SignTMDHeader(tmd_hdr *hdr, tmd_signature *sig, keys_struct *keys); +int SetupTMDInfoRecord(tmd_content_info_record *info_record, u8 *content_record, u16 ContentCount); int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset); u32 PredictTMDSize(u16 ContentCount) { - return sizeof(TMD_SignatureStruct) + sizeof(TMD_Struct) + sizeof(TMD_CONTENT_INFO_RECORD)*64 + sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount; + return sizeof(tmd_signature) + sizeof(tmd_hdr) + sizeof(tmd_content_info_record)*64 + sizeof(tmd_content_chunk)*ContentCount; } int BuildTMD(cia_settings *ciaset) { int result = 0; - result = SetupTMDBuffer(&ciaset->CIA_Sections.TitleMetaData); + result = SetupTMDBuffer(&ciaset->ciaSections.tmd); if(result) return result; // Setting TMD Struct Ptrs - TMD_SignatureStruct *sig = (TMD_SignatureStruct*)ciaset->CIA_Sections.TitleMetaData.buffer; - TMD_Struct *hdr = (TMD_Struct*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)); - TMD_CONTENT_INFO_RECORD *info_record = (TMD_CONTENT_INFO_RECORD*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)); - u8 *content_record = (u8*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)+sizeof(TMD_CONTENT_INFO_RECORD)*64); + tmd_signature *sig = (tmd_signature*)ciaset->ciaSections.tmd.buffer; + tmd_hdr *hdr = (tmd_hdr*)(ciaset->ciaSections.tmd.buffer+sizeof(tmd_signature)); + tmd_content_info_record *info_record = (tmd_content_info_record*)(ciaset->ciaSections.tmd.buffer+sizeof(tmd_signature)+sizeof(tmd_hdr)); + u8 *content_record = (u8*)(ciaset->ciaSections.tmd.buffer+sizeof(tmd_signature)+sizeof(tmd_hdr)+sizeof(tmd_content_info_record)*64); SetupTMDContentRecord(content_record,ciaset); - SetupTMDInfoRecord(info_record,content_record,ciaset->content.ContentCount); + SetupTMDInfoRecord(info_record,content_record,ciaset->content.contentCount); result = SetupTMDHeader(hdr,info_record,ciaset); if(result) return result; result = SignTMDHeader(hdr,sig,ciaset->keys); @@ -37,56 +37,58 @@ int BuildTMD(cia_settings *ciaset) int SetupTMDBuffer(COMPONENT_STRUCT *tmd) { - tmd->buffer = malloc(tmd->size); // already set before + tmd->buffer = malloc(tmd->size); // tmd->size is already set before if(!tmd->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } memset(tmd->buffer,0,tmd->size); return 0; } -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset) +int SetupTMDHeader(tmd_hdr *hdr, tmd_content_info_record *info_record, cia_settings *ciaset) { - memset(hdr,0,sizeof(TMD_Struct)); + memset(hdr,0,sizeof(tmd_hdr)); - memcpy(hdr->Issuer,ciaset->tmd.TMDIssuer,0x40); - hdr->TMDFormatVersion = ciaset->tmd.tmd_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TitleType,ciaset->Title_type,4); - memcpy(hdr->SaveDataSize,ciaset->tmd.SaveDataSize,4); - memcpy(hdr->PrivSaveDataSize,ciaset->tmd.PrivSaveDataSize,4); - hdr->TWL_Flag = ciaset->tmd.twl_flag; - memcpy(hdr->TitleVersion,ciaset->tmd.TitleVersion,2); - u16_to_u8(hdr->ContentCount,ciaset->content.ContentCount,BE); - ctr_sha(info_record,sizeof(TMD_CONTENT_INFO_RECORD)*64,hdr->sha_256_hash,CTR_SHA_256); + memcpy(hdr->issuer,ciaset->tmd.issuer,0x40); + hdr->formatVersion = ciaset->tmd.formatVersion; + hdr->caCrlVersion = ciaset->cert.caCrlVersion; + hdr->signerCrlVersion = ciaset->cert.signerCrlVersion; + //u8 dummy[8] = {0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00}; + //memcpy(hdr->TitleID,dummy,8); + memcpy(hdr->titleID,ciaset->common.titleId,8); + memcpy(hdr->titleType,ciaset->tmd.titleType,4); + memcpy(hdr->savedataSize,ciaset->tmd.savedataSize,4); + memcpy(hdr->privSavedataSize,ciaset->tmd.privSavedataSize,4); + hdr->twlFlag = ciaset->tmd.twlFlag; + u16_to_u8(hdr->titleVersion,ciaset->tmd.version,BE); + u16_to_u8(hdr->contentCount,ciaset->content.contentCount,BE); + ctr_sha(info_record,sizeof(tmd_content_info_record)*64,hdr->infoRecordHash,CTR_SHA_256); return 0; } -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys) +int SignTMDHeader(tmd_hdr *hdr, tmd_signature *sig, keys_struct *keys) { - memset(sig,0,sizeof(TMD_SignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TMD_Struct),sig->data,keys->rsa.TMD_Pub,keys->rsa.TMD_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); + memset(sig,0,sizeof(tmd_signature)); + u32_to_u8(sig->sigType,RSA_2048_SHA256,BE); + return ctr_sig((u8*)hdr,sizeof(tmd_hdr),sig->data,keys->rsa.cpPub,keys->rsa.cpPvt,RSA_2048_SHA256,CTR_RSA_SIGN); } -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount) +int SetupTMDInfoRecord(tmd_content_info_record *info_record, u8 *content_record, u16 ContentCount) { - memset(info_record,0x0,sizeof(TMD_CONTENT_INFO_RECORD)*0x40); - u16_to_u8(info_record->content_index_offset,0x0,BE); - u16_to_u8(info_record->content_command_count,ContentCount,BE); - ctr_sha(content_record,sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount,info_record->sha_256_hash,CTR_SHA_256); + memset(info_record,0x0,sizeof(tmd_content_info_record)*0x40); + u16_to_u8(info_record->contentIndexOffset,0x0,BE); + u16_to_u8(info_record->contentCommandCount,ContentCount,BE); + ctr_sha(content_record,sizeof(tmd_content_chunk)*ContentCount,info_record->contentChunkHash,CTR_SHA_256); return 0; } int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset) { - for(int i = 0; i < ciaset->content.ContentCount; i++){ - TMD_CONTENT_CHUNK_STRUCT *ptr = (TMD_CONTENT_CHUNK_STRUCT*)(content_record+sizeof(TMD_CONTENT_CHUNK_STRUCT)*i); - u32_to_u8(ptr->content_id,ciaset->content.ContentId[i],BE); - u16_to_u8(ptr->content_index,ciaset->content.ContentIndex[i],BE); - u16_to_u8(ptr->content_type,ciaset->content.ContentType[i],BE); - u64_to_u8(ptr->content_size,ciaset->content.ContentSize[i],BE); - memcpy(ptr->sha_256_hash,ciaset->content.ContentHash[i],0x20); + for(int i = 0; i < ciaset->content.contentCount; i++){ + tmd_content_chunk *ptr = (tmd_content_chunk*)(content_record+sizeof(tmd_content_chunk)*i); + u32_to_u8(ptr->contentID,ciaset->content.contentId[i],BE); + u16_to_u8(ptr->contentIndex,ciaset->content.contentIndex[i],BE); + u16_to_u8(ptr->contentFlags,ciaset->content.contentFlags[i],BE); + u64_to_u8(ptr->contentSize,ciaset->content.contentSize[i],BE); + memcpy(ptr->contentHash,ciaset->content.contentHash[i],0x20); } return 0; } \ No newline at end of file diff --git a/tmd.h b/tmd.h index 4394c68..ac3cd91 100644 --- a/tmd.h +++ b/tmd.h @@ -5,61 +5,61 @@ typedef enum { TYPE_CTR = 0x40, TYPE_DATA = 0x8 -} title_type; +} tmd_title_type; typedef enum { - Encrypted = 0x0001, - Optional = 0x4000, - Shared = 0x8000 -} content_types; + content_Encrypted = 0x0001, + content_Optional = 0x4000, + content_Shared = 0x8000 +} tmd_content_types; typedef struct { - u8 content_id[4]; - u8 content_index[2]; - u8 content_type[2]; - u8 content_size[8]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_CHUNK_STRUCT; + u8 contentID[4]; + u8 contentIndex[2]; + u8 contentFlags[2]; + u8 contentSize[8]; + u8 contentHash[0x20]; // SHA 256 +} tmd_content_chunk; typedef struct { - u8 content_index_offset[2]; - u8 content_command_count[2]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_INFO_RECORD; + u8 contentIndexOffset[2]; + u8 contentCommandCount[2]; + u8 contentChunkHash[0x20]; // SHA 256 +} tmd_content_info_record; typedef struct { - u8 sig_type[4]; + u8 sigType[4]; u8 data[0x100]; u8 padding[0x3C]; -} TMD_SignatureStruct; +} tmd_signature; typedef struct { - u8 Issuer[0x40]; - u8 TMDFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 padding_1; - u8 SystemVersion[8]; - u8 TitleID[8]; - u8 TitleType[4]; - u8 GroupID[2]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; // Zero for CXI Content0 - u8 Reserved_0[4]; - u8 TWL_Flag; // Zero for CXI Content0 - u8 Reserved_1[0x31]; - u8 AccessRights[4]; - u8 TitleVersion[2]; - u8 ContentCount[2]; - u8 BootContent[2]; - u8 Padding[2]; - u8 sha_256_hash[0x20]; -} TMD_Struct; + u8 issuer[0x40]; + u8 formatVersion; + u8 caCrlVersion; + u8 signerCrlVersion; + u8 padding0; + u8 systemVersion[8]; + u8 titleID[8]; + u8 titleType[4]; + u8 groupID[2]; + u8 savedataSize[4]; + u8 privSavedataSize[4]; // Zero for CXI Content0 + u8 padding1[4]; + u8 twlFlag; // Zero for CXI Content0 + u8 padding2[0x31]; + u8 accessRights[4]; + u8 titleVersion[2]; + u8 contentCount[2]; + u8 bootContent[2]; + u8 padding3[2]; + u8 infoRecordHash[0x20]; // SHA-256 +} tmd_hdr; #endif diff --git a/tpki.h b/tpki.h new file mode 100644 index 0000000..081078a --- /dev/null +++ b/tpki.h @@ -0,0 +1,417 @@ +#ifndef _TPKI_H_ +#define _TPKI_H_ + +// AES KEYS +static const unsigned char zeros_aesKey[16] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// RSA KEYS +static const unsigned char tpki_rsa_privExp[256] = +{ + 0xE3, 0xC6, 0x76, 0x57, 0x2E, 0xCB, 0xA5, 0xE6, + 0x0C, 0x01, 0xBD, 0x5C, 0x32, 0x2D, 0x90, 0xE0, + 0xFF, 0x9A, 0x80, 0xE8, 0x66, 0x8D, 0x84, 0xDC, + 0xF7, 0x75, 0x5F, 0x3F, 0x98, 0x7C, 0x97, 0x40, + 0x20, 0x21, 0xB7, 0x24, 0xC0, 0x61, 0x2D, 0x83, + 0xB0, 0x91, 0x8E, 0xE3, 0xC2, 0xD0, 0x2C, 0xA1, + 0x2C, 0x99, 0x4F, 0x48, 0xF7, 0x4E, 0x13, 0xD3, + 0x01, 0x71, 0x25, 0x9B, 0x3C, 0x75, 0x7C, 0xC4, + 0xE5, 0x89, 0x7E, 0xDA, 0xF9, 0x99, 0x5C, 0x83, + 0xE4, 0xDD, 0x36, 0x62, 0x5B, 0x0E, 0x12, 0x91, + 0xD6, 0x39, 0x45, 0x69, 0x62, 0x20, 0xCA, 0xF4, + 0xBA, 0x6B, 0x28, 0x1A, 0x7C, 0xBF, 0xB9, 0x97, + 0x37, 0x46, 0xC2, 0x7A, 0xCF, 0x10, 0x68, 0xC2, + 0xC9, 0xF1, 0x48, 0xDA, 0x8A, 0x2F, 0x4C, 0xBC, + 0x3B, 0x1C, 0xB8, 0x8F, 0x04, 0x7F, 0xFD, 0x9D, + 0xE2, 0x0A, 0xD2, 0x09, 0x39, 0xC7, 0xD9, 0x81, + 0x59, 0x17, 0x73, 0xB2, 0xEC, 0xEB, 0x36, 0x67, + 0xA5, 0xA8, 0xD5, 0x71, 0xD9, 0x38, 0x6A, 0xD1, + 0x28, 0xB9, 0x46, 0x85, 0x3A, 0x81, 0x85, 0x4E, + 0x55, 0xA7, 0x74, 0x79, 0xBB, 0xC5, 0x97, 0xF7, + 0xEF, 0xE0, 0x81, 0x20, 0xE0, 0xEA, 0x45, 0x8F, + 0xED, 0x70, 0x8E, 0xD6, 0xFF, 0x49, 0xCF, 0x7F, + 0xF2, 0xFF, 0x22, 0x20, 0x3F, 0xE9, 0x92, 0x99, + 0xDE, 0x81, 0xD6, 0x27, 0xF7, 0xB8, 0x3A, 0x1D, + 0x4F, 0xA2, 0x50, 0xFB, 0xA5, 0xE7, 0x98, 0x08, + 0xB5, 0x2B, 0xA2, 0x94, 0xA9, 0x17, 0x1A, 0xA8, + 0x34, 0xF6, 0x5E, 0x24, 0x2D, 0x40, 0x2F, 0xCB, + 0x3C, 0xB0, 0xF8, 0x7E, 0x84, 0xB4, 0x87, 0x82, + 0x19, 0xAF, 0x87, 0xB6, 0xFA, 0xA9, 0x67, 0x27, + 0x07, 0x28, 0xBA, 0x2E, 0xA5, 0x8E, 0xDD, 0xE5, + 0xD4, 0xFD, 0x06, 0x09, 0xDF, 0xBD, 0x87, 0x95, + 0x95, 0x25, 0x05, 0x5E, 0xB2, 0x00, 0x18, 0x41 +}; + +static const unsigned char tpki_rsa_pubMod[256] = +{ + 0xE6, 0x64, 0x06, 0x6C, 0x49, 0x6B, 0xEC, 0xEE, + 0x59, 0xAE, 0x11, 0x92, 0xF1, 0x03, 0x43, 0x87, + 0x8E, 0xEB, 0x4D, 0x70, 0xA9, 0x71, 0xB4, 0x6D, + 0x25, 0x19, 0x02, 0x4A, 0x9E, 0x4D, 0xA3, 0x10, + 0xFD, 0xB2, 0x27, 0x56, 0xA3, 0xFB, 0xDD, 0xE5, + 0xE4, 0x4E, 0xE0, 0x62, 0x8F, 0xC3, 0x2E, 0xEE, + 0x8F, 0x9D, 0x4D, 0x6E, 0x00, 0xDB, 0x88, 0x49, + 0xA2, 0xFC, 0x30, 0xFE, 0x94, 0xF3, 0x06, 0x92, + 0x75, 0x61, 0x11, 0x1D, 0x24, 0x07, 0xE9, 0x12, + 0xB6, 0xB1, 0x57, 0xF5, 0xDC, 0x01, 0xF7, 0x54, + 0xBF, 0xC3, 0xAC, 0x8C, 0x73, 0x2C, 0x73, 0x17, + 0x8E, 0xBF, 0x2F, 0x68, 0x3C, 0x61, 0x75, 0x32, + 0x15, 0x39, 0x93, 0xDD, 0xBA, 0x12, 0x42, 0xD3, + 0x25, 0x85, 0xFA, 0xA6, 0x4B, 0xAF, 0x81, 0x4B, + 0xCA, 0xD2, 0x9C, 0xF1, 0x3D, 0x37, 0xAE, 0xB9, + 0xFD, 0x77, 0x59, 0x78, 0xB9, 0x32, 0x95, 0x19, + 0xD1, 0x47, 0xE1, 0xC6, 0xE1, 0x16, 0x13, 0x5D, + 0xCC, 0x99, 0x31, 0x63, 0xAD, 0xBB, 0xA5, 0x4F, + 0xE4, 0x41, 0x67, 0xFD, 0x7F, 0x1E, 0xA8, 0x9A, + 0x35, 0x65, 0xEB, 0xC4, 0x4D, 0xD4, 0xC4, 0x29, + 0x0F, 0x40, 0x95, 0xFD, 0x8A, 0x30, 0x67, 0x79, + 0xFB, 0xD4, 0x76, 0x6F, 0xD1, 0xDE, 0x8C, 0x72, + 0x32, 0x05, 0x97, 0x5A, 0x26, 0x0D, 0x37, 0xCA, + 0x12, 0x2C, 0xDC, 0x14, 0x3F, 0xD3, 0x59, 0x00, + 0x66, 0xD2, 0x8E, 0xF5, 0x6E, 0x22, 0x08, 0x63, + 0x59, 0xB5, 0x3F, 0xBB, 0x3A, 0x4D, 0xD4, 0xD1, + 0xC1, 0x21, 0xA7, 0x4D, 0x02, 0x96, 0x08, 0xF5, + 0x2B, 0x11, 0xE5, 0x85, 0xD2, 0x6E, 0x91, 0xD6, + 0x8F, 0x77, 0x72, 0xEF, 0x37, 0xE3, 0x79, 0x19, + 0xA9, 0xEE, 0x58, 0x5D, 0x52, 0x9B, 0x2D, 0x47, + 0x7D, 0x27, 0xB8, 0xC3, 0x76, 0xCA, 0xDA, 0xC2, + 0xF4, 0xFC, 0xF4, 0x53, 0x7C, 0xD8, 0x43, 0x87 +}; + +//Certificates +static const unsigned char ca3_tpki_cert[0x400] = +{ + 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, + 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, + 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, + 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, + 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, + 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, + 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, + 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, + 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, + 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, + 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, + 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, + 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, + 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, + 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, + 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, + 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, + 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, + 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, + 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, + 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, + 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, + 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, + 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, + 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, + 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, + 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, + 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, + 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, + 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, + 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, + 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, + 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, + 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, + 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, + 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, + 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, + 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, + 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, + 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, + 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, + 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, + 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, + 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, + 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, + 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, + 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, + 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, + 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, + 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, + 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, + 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, + 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, + 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, + 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, + 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, + 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, + 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, + 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, + 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, + 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, + 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, + 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, + 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, + 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, + 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, + 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, + 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, + 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, + 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, + 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, + 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, + 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, + 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, + 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, + 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, + 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, + 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, + 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, + 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, + 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, + 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, + 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, + 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, + 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, + 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, + 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, + 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, + 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, + 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, + 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, + 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, + 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, + 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, + 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, + 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, + 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char xsC_tpki_cert[0x300] = +{ + 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, + 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, + 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, + 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, + 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, + 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, + 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, + 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, + 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, + 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, + 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, + 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, + 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, + 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, + 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, + 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, + 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, + 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, + 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, + 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, + 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, + 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, + 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, + 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, + 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, + 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, + 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, + 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, + 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, + 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, + 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, + 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, + 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, + 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, + 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, + 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, + 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, + 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, + 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, + 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, + 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, + 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, + 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, + 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, + 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, + 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, + 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, + 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, + 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, + 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, + 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, + 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, + 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, + 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, + 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, + 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, + 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, + 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, + 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, + 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, + 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, + 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, + 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, + 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, + 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char cpB_tpki_cert[0x300] = +{ + 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, + 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, + 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, + 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, + 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, + 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, + 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, + 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, + 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, + 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, + 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, + 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, + 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, + 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, + 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, + 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, + 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, + 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, + 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, + 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, + 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, + 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, + 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, + 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, + 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, + 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, + 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, + 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, + 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, + 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, + 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, + 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, + 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, + 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, + 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, + 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, + 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, + 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, + 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, + 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, + 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, + 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, + 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, + 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, + 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, + 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, + 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, + 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, + 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, + 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, + 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, + 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, + 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, + 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, + 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, + 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, + 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, + 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, + 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, + 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, + 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, + 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, + 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, + 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, + 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif \ No newline at end of file diff --git a/usersettings.c b/usersettings.c index 1123ade..65bfaa1 100644 --- a/usersettings.c +++ b/usersettings.c @@ -29,20 +29,23 @@ int ParseArgs(int argc, char *argv[], user_settings *usr_settings) } // Allocating Memory for Content Path Ptrs - usr_settings->ContentPath = malloc(CIA_MAX_CONTENT*sizeof(char*)); - if(usr_settings->ContentPath == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); + usr_settings->common.contentPath = malloc(CIA_MAX_CONTENT*sizeof(char*)); + if(usr_settings->common.contentPath == NULL){ + fprintf(stderr,"[SETTING ERROR] Not Enough Memory\n"); return USR_MEM_ERROR; } - memset(usr_settings->ContentPath,0,CIA_MAX_CONTENT*sizeof(char*)); + memset(usr_settings->common.contentPath,0,CIA_MAX_CONTENT*sizeof(char*)); // Initialise Keys - InitKeys(&usr_settings->keys); + InitKeys(&usr_settings->common.keys); // Setting Defaults SetDefaults(usr_settings); // Parsing Arguments +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Parsing Args\n"); +#endif int set_result; int i = 1; while(i < argc){ @@ -55,26 +58,36 @@ int ParseArgs(int argc, char *argv[], user_settings *usr_settings) } // Checking arguments +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Checking Args\n"); +#endif set_result = CheckArgumentCombination(usr_settings); if(set_result) return set_result; // Setting Keys - SetKeys(&usr_settings->keys); +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Setting Keys\n"); +#endif + set_result = SetKeys(&usr_settings->common.keys); + if(set_result) return set_result; - if(!usr_settings->outfile){ +#ifdef DEBUG + fprintf(stdout,"[DEBUG] Generating output path name if required\n"); +#endif + + if(!usr_settings->common.outFileName){ char *source_path = NULL; - if(usr_settings->IsBuildingNCCH0) source_path = usr_settings->rsf_path; - else if(usr_settings->ConvertCci) source_path = usr_settings->CciPath; - else if(usr_settings->Content0IsSrl) source_path = usr_settings->SrlPath; - else source_path = usr_settings->ContentPath[0]; + if(usr_settings->ncch.buildNcch0) source_path = usr_settings->common.rsfPath; + else if(usr_settings->common.workingFileType == infile_ncsd || usr_settings->common.workingFileType == infile_srl) source_path = usr_settings->common.workingFilePath; + else source_path = usr_settings->common.contentPath[0]; u16 outfile_len = strlen(source_path) + 3; - usr_settings->outfile = malloc(outfile_len); - if(!usr_settings->outfile){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); + usr_settings->common.outFileName = malloc(outfile_len); + if(!usr_settings->common.outFileName){ + fprintf(stderr,"[SETTING ERROR] Not Enough Memory\n"); return USR_MEM_ERROR; } - usr_settings->outfile_mallocd = true; - append_filextention(usr_settings->outfile,outfile_len,source_path,(char*)&output_extention[usr_settings->out_format-1]); + usr_settings->common.outFileName_mallocd = true; + append_filextention(usr_settings->common.outFileName,outfile_len,source_path,(char*)&output_extention[usr_settings->common.outFormat-1]); } return 0; } @@ -82,36 +95,34 @@ int ParseArgs(int argc, char *argv[], user_settings *usr_settings) void SetDefaults(user_settings *set) { // Target Info - set->keys.keyset = keyset_RETAIL; + set->common.keys.keyset = pki_TEST; // Build NCCH Info - set->IsBuildingNCCH0 = true; - set->include_exefs_logo = false; - set->out_format = CXI; - set->build_ncch_type = format_not_set; + set->ncch.buildNcch0 = true; + set->ncch.includeExefsLogo = false; + set->common.outFormat = CXI; + set->ncch.ncchType = format_not_set; // Yaml Settings - set->yaml_set.Option.EnableCompress = true; - set->yaml_set.Option.EnableCrypt = true; - set->yaml_set.Option.UseOnSD = false; - set->yaml_set.Option.FreeProductCode = false; + set->common.rsfSet.Option.EnableCompress = true; + set->common.rsfSet.Option.EnableCrypt = true; + set->common.rsfSet.Option.UseOnSD = false; + set->common.rsfSet.Option.FreeProductCode = false; - // Content0 Info - set->Content0IsNcch = true; - set->ConvertCci = false; - set->Content0IsSrl = false; - - set->Version[0] = 0xffff; + // Working File Info + set->common.workingFileType = infile_ncch; // CCI Info - set->GenSDKCardInfoHeader = false; - set->OmitImportedNcchHdr = false; + set->cci.useSDKStockData = false; // CIA Info - set->EncryptContents = true; - set->RandomTitleKey = false; + set->cia.useDataTitleVer = false; + set->cia.titleVersion[0] = 0xffff; // invalid for detection + set->cia.encryptCia = true; + set->cia.randomTitleKey = false; + set->common.keys.aes.currentCommonKey = 0x100; // invalid for detection for(int i = 0; i < CIA_MAX_CONTENT; i++){ - set->ContentID[i] = 0x100000000; + set->cia.contentId[i] = 0x100000000; } } @@ -122,44 +133,28 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) if(!IsLastArg){ if(argv[i+1][0] != '-') HasParam = true; } - if(strcmp(argv[i],"-elf") == 0){ - if(!HasParam){ - PrintNeedsParam("-elf"); - return USR_ARG_REQ_PARAM; - } - set->elf_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-rsf") == 0){ + // Global Settings + if(strcmp(argv[i],"-rsf") == 0){ if(!HasParam){ PrintNeedsParam("-rsf"); return USR_ARG_REQ_PARAM; } - set->rsf_path = argv[i+1]; + set->common.rsfPath = argv[i+1]; return 2; } - else if(strcmp(argv[i],"-icon") == 0){ + else if(strcmp(argv[i],"-f") == 0){ if(!HasParam){ - PrintNeedsParam("-icon"); + PrintNeedsParam("-f"); return USR_ARG_REQ_PARAM; } - set->icon_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-banner") == 0){ - if(!HasParam){ - PrintNeedsParam("-banner"); - return USR_ARG_REQ_PARAM; - } - set->banner_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-logo") == 0){ - if(!HasParam){ - PrintNeedsParam("-logo"); - return USR_ARG_REQ_PARAM; - } - set->logo_path = argv[i+1]; + if(strcasecmp(argv[i+1],"cxi") == 0 || strcasecmp(argv[i+1],"exec") == 0 ) set->common.outFormat = CXI; + else if(strcasecmp(argv[i+1],"cfa") == 0 || strcasecmp(argv[i+1],"data") == 0 ) set->common.outFormat = CFA; + else if(strcasecmp(argv[i+1],"cci") == 0 || strcasecmp(argv[i+1],"card") == 0 ) set->common.outFormat = CCI; + else if(strcasecmp(argv[i+1],"cia") == 0) set->common.outFormat = CIA; + else { + fprintf(stderr,"[-] Invalid output format '%s'\n",argv[i+1]); + return USR_BAD_ARG; + } return 2; } else if(strcmp(argv[i],"-o") == 0){ @@ -167,183 +162,115 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) PrintNeedsParam("-o"); return USR_ARG_REQ_PARAM; } - set->outfile = argv[i+1]; - set->outfile_mallocd = false; - return 2; - } - else if(strcmp(argv[i],"-exheader") == 0){ - if(!HasParam){ - PrintNeedsParam("-exheader"); - return USR_ARG_REQ_PARAM; - } - set->exheader_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-code") == 0){ - if(!HasParam){ - PrintNeedsParam("-code"); - return USR_ARG_REQ_PARAM; - } - set->exefs_code_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-romfs") == 0){ - if(!HasParam){ - PrintNeedsParam("-romfs"); - return USR_ARG_REQ_PARAM; - } - set->romfs_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-plain-region") == 0){ - if(!HasParam){ - PrintNeedsParam("-plain-region"); - return USR_ARG_REQ_PARAM; - } - set->plain_region_path = argv[i+1]; + set->common.outFileName = argv[i+1]; + set->common.outFileName_mallocd = false; return 2; } + // Key Options else if(strcmp(argv[i],"-target") == 0){ if(!HasParam){ PrintNeedsParam("-target"); return USR_ARG_REQ_PARAM; } - if(strcasecmp(argv[i+1],"debug") == 0 || strcasecmp(argv[i+1],"dev") == 0) - set->keys.keyset = keyset_DEBUG; - else if(strcasecmp(argv[i+1],"retail") == 0 || strcasecmp(argv[i+1],"prod") == 0) - set->keys.keyset = keyset_RETAIL; + if(strcasecmp(argv[i+1],"test") == 0 || strcasecmp(argv[i+1],"t") == 0) + set->common.keys.keyset = pki_TEST; + else if(strcasecmp(argv[i+1],"custom") == 0 || strcasecmp(argv[i+1],"c") == 0) + set->common.keys.keyset = pki_CUSTOM; + +#ifndef PUBLIC_BUILD + else if(strcasecmp(argv[i+1],"debug") == 0 || strcasecmp(argv[i+1],"development") == 0 || strcasecmp(argv[i+1],"d") == 0) + set->common.keys.keyset = pki_DEVELOPMENT; + else if(strcasecmp(argv[i+1],"retail") == 0 || strcasecmp(argv[i+1],"production") == 0 || strcasecmp(argv[i+1],"p") == 0) + set->common.keys.keyset = pki_PRODUCTION; + /* + else if(strcasecmp(argv[i+1],"beta") == 0 || strcasecmp(argv[i+1],"b") == 0) + set->common.keys.keyset = pki_BETA; + */ +#endif else{ fprintf(stderr,"[SETTING ERROR] Unrecognised target '%s'\n",argv[i+1]); return USR_BAD_ARG; } return 2; } - else if(strcmp(argv[i],"-cci") == 0){ + else if(strcmp(argv[i],"-keydir") == 0){ if(!HasParam){ - PrintNeedsParam("-cci"); + PrintNeedsParam("-keydir"); return USR_ARG_REQ_PARAM; } - set->ConvertCci = true; - set->Content0IsSrl = false; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->CciPath = argv[i+1]; + set->common.keys.keydir = argv[i+1]; return 2; } - else if(strcmp(argv[i],"-srl") == 0){ + else if(strcmp(argv[i],"-ckeyID") == 0){ if(!HasParam){ - PrintNeedsParam("-srl"); + PrintNeedsParam("-ckeyID"); return USR_ARG_REQ_PARAM; } - set->ConvertCci = false; - set->Content0IsSrl = true; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->SrlPath = argv[i+1]; + set->common.keys.aes.currentCommonKey = strtol(argv[i+1],NULL,0); + if(set->common.keys.aes.currentCommonKey > 0xff) + { + fprintf(stderr,"[SETTING ERROR] Invalid Common Key ID: 0x%x\n",set->common.keys.aes.currentCommonKey); + return USR_BAD_ARG; + } return 2; + } + else if(strcmp(argv[i],"-showkeys") == 0){ + if(HasParam){ + PrintNoNeedParam("-showkeys"); + return USR_BAD_ARG; + } + set->common.keys.dumpkeys = true; + return 1; + } - } - else if(strcmp(argv[i],"-devcardcci") == 0){ - if(HasParam){ - PrintNoNeedParam("-devcardcci"); - return USR_BAD_ARG; - } - set->GenSDKCardInfoHeader = true; - return 1; - } - else if(strcmp(argv[i],"-omitncchhdr") == 0){ - if(HasParam){ - PrintNoNeedParam("-omitncchhdr"); - return USR_BAD_ARG; - } - set->OmitImportedNcchHdr = true; - return 1; - } - else if(strcmp(argv[i],"-cfa") == 0){ - if(HasParam){ - PrintNoNeedParam("-cfa"); - return USR_ARG_REQ_PARAM; - } - set->build_ncch_type = CFA; - - return 1; - } - else if(strcmp(argv[i],"-f") == 0){ + // Ncch Options + else if(strcmp(argv[i],"-elf") == 0){ if(!HasParam){ - PrintNeedsParam("-f"); + PrintNeedsParam("-elf"); return USR_ARG_REQ_PARAM; } - if(strcasecmp(argv[i+1],"cxi") == 0 || strcasecmp(argv[i+1],"exec") == 0 ) set->out_format = CXI; - else if(strcasecmp(argv[i+1],"cfa") == 0 || strcasecmp(argv[i+1],"data") == 0 ) set->out_format = CFA; - else if(strcasecmp(argv[i+1],"cci") == 0 || strcasecmp(argv[i+1],"card") == 0 ) set->out_format = CCI; - else if(strcasecmp(argv[i+1],"cia") == 0) set->out_format = CIA; - else { - fprintf(stderr,"[-] Invalid output format '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } + set->ncch.elfPath = argv[i+1]; return 2; } - else if(strcmp(argv[i],"-sysfixedkey") == 0){ + + else if(strcmp(argv[i],"-icon") == 0){ if(!HasParam){ - PrintNeedsParam("-sysfixedkey"); + PrintNeedsParam("-icon"); return USR_ARG_REQ_PARAM; } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid SystemFixedKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - SetSystemFixedKey(&set->keys,key); - free(key); + set->ncch.iconPath = argv[i+1]; return 2; } - else if(strcmp(argv[i],"-commonkey") == 0){ + else if(strcmp(argv[i],"-banner") == 0){ if(!HasParam){ - PrintNeedsParam("-commonkey"); + PrintNeedsParam("-banner"); return USR_ARG_REQ_PARAM; } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid CommonKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - - if(i+2 < argc){ - u8 id = strtol(argv[i+2],NULL,10); - SetCommonKey(&set->keys,key,id); - SetCurrentCommonKey(&set->keys,id); - } - else SetCommonKey(&set->keys,key,0); - SetCurrentCommonKey(&set->keys,0); - free(key); + set->ncch.bannerPath = argv[i+1]; return 2; } - else if(strcmp(argv[i],"-accessdesc") == 0){ + else if(strcmp(argv[i],"-logo") == 0){ if(!HasParam){ - PrintNeedsParam("-accessdesc"); + PrintNeedsParam("-logo"); + return USR_ARG_REQ_PARAM; + } + set->ncch.logoPath = argv[i+1]; + return 2; + } + else if(strcmp(argv[i],"-desc") == 0){ + if(!HasParam){ + PrintNeedsParam("-desc"); return USR_ARG_REQ_PARAM; } char *tmp = argv[i+1]; char *tmp2 = strstr(tmp,":"); if(!tmp2){ fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); + fprintf(stderr," -desc :\n"); } if(strlen(tmp2) < 2){ fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); + fprintf(stderr," -desc :\n"); } u32 app_type_len = (u32)(tmp2-tmp); @@ -351,9 +278,10 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) memset(app_type,0,app_type_len+1); memcpy(app_type,tmp,app_type_len); - if(strcasecmp(app_type,"App") == 0 || strcasecmp(app_type,"SDApp") == 0) set->keys.AccessDescSign.PresetType = app; - else if(strcasecmp(app_type,"Demo") == 0) set->keys.AccessDescSign.PresetType = demo; - else if(strcasecmp(app_type,"DlpChild") == 0 || strcasecmp(app_type,"Dlp") == 0) set->keys.AccessDescSign.PresetType = dlp; + if(strcasecmp(app_type,"App") == 0 || strcasecmp(app_type,"SDApp") == 0) set->common.keys.accessDescSign.presetType = app; + else if(strcasecmp(app_type,"ECApp") == 0) set->common.keys.accessDescSign.presetType = ec_app; + else if(strcasecmp(app_type,"Demo") == 0) set->common.keys.accessDescSign.presetType = demo; + else if(strcasecmp(app_type,"DlpChild") == 0 || strcasecmp(app_type,"Dlp") == 0) set->common.keys.accessDescSign.presetType = dlp; else{ fprintf(stderr,"[SETTING ERROR] Accessdesc AppType preset '%s' not valid, please manually configure RSF\n",app_type); return USR_BAD_ARG; @@ -361,41 +289,116 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) char *target_firmware = (tmp2+1); - set->keys.AccessDescSign.TargetFirmware = strtoul(target_firmware,NULL,10); + set->common.keys.accessDescSign.targetFirmware = strtoul(target_firmware,NULL,10); return 2; } - else if(strcmp(argv[i],"-exefslogo") == 0){ if(HasParam){ PrintNoNeedParam("-exefslogo"); return USR_BAD_ARG; } - set->include_exefs_logo = true; + set->ncch.includeExefsLogo = true; return 1; } - else if(strcmp(argv[i],"-rand") == 0){ + else if(strcmp(argv[i],"-data") == 0){ if(HasParam){ - PrintNoNeedParam("-rand"); + PrintNoNeedParam("-data"); + return USR_ARG_REQ_PARAM; + } + set->ncch.ncchType = CFA; + return 1; + } + + // Ncch Rebuild Options + else if(strcmp(argv[i],"-code") == 0){ + if(!HasParam){ + PrintNeedsParam("-code"); + return USR_ARG_REQ_PARAM; + } + set->ncch.codePath = argv[i+1]; + return 2; + } + else if(strcmp(argv[i],"-exheader") == 0){ + if(!HasParam){ + PrintNeedsParam("-exheader"); + return USR_ARG_REQ_PARAM; + } + set->ncch.exheaderPath = argv[i+1]; + return 2; + } + else if(strcmp(argv[i],"-plain-region") == 0){ + if(!HasParam){ + PrintNeedsParam("-plain-region"); + return USR_ARG_REQ_PARAM; + } + set->ncch.plainRegionPath = argv[i+1]; + return 2; + } + else if(strcmp(argv[i],"-romfs") == 0){ + if(!HasParam){ + PrintNeedsParam("-romfs"); + return USR_ARG_REQ_PARAM; + } + set->ncch.romfsPath = argv[i+1]; + return 2; + } + // Cci Options +#ifndef PUBLIC_BUILD + else if(strcmp(argv[i],"-devcardcci") == 0){ + if(HasParam){ + PrintNoNeedParam("-devcardcci"); return USR_BAD_ARG; } - set->RandomTitleKey = true; + set->cci.useSDKStockData = true; return 1; } - else if(strcmp(argv[i],"-nocryptcia") == 0){ +#endif + // Cia Options +#ifndef PUBLIC_BUILD + else if(strcmp(argv[i],"-cci") == 0){ + if(!HasParam){ + PrintNeedsParam("-cci"); + return USR_ARG_REQ_PARAM; + } + set->ncch.buildNcch0 = false; + set->common.workingFileType = infile_ncsd; + set->common.workingFilePath = argv[i+1]; + set->common.outFormat = CIA; + return 2; + } + else if(strcmp(argv[i],"-srl") == 0){ + if(!HasParam){ + PrintNeedsParam("-srl"); + return USR_ARG_REQ_PARAM; + } + set->ncch.buildNcch0 = false; + set->common.workingFileType = infile_srl; + set->common.workingFilePath = argv[i+1]; + set->common.outFormat = CIA; + return 2; + + } + else if(strcmp(argv[i],"-dlc") == 0){ if(HasParam){ - PrintNoNeedParam("-nocryptcia"); + PrintNoNeedParam("-dlc"); return USR_BAD_ARG; } - set->EncryptContents = false; + set->cia.DlcContent = true; return 1; } +#endif else if(strcmp(argv[i],"-major") == 0){ if(!HasParam){ PrintNeedsParam("-major"); return USR_ARG_REQ_PARAM; } + set->cia.useNormTitleVer = true; u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[0] = tmp > 63 ? 63 : tmp; + if(tmp > 63){ + fprintf(stderr,"[SETTING ERROR] Major version: '%d' is too large, max: '63'\n",tmp); + return USR_BAD_ARG; + } + set->cia.titleVersion[0] = tmp; return 2; } else if(strcmp(argv[i],"-minor") == 0){ @@ -403,8 +406,13 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) PrintNeedsParam("-minor"); return USR_ARG_REQ_PARAM; } + set->cia.useNormTitleVer = true; u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[1] = tmp > 63 ? 63 : tmp; + if(tmp > 63){ + fprintf(stderr,"[SETTING ERROR] Minor version: '%d' is too large, max: '63'\n",tmp); + return USR_BAD_ARG; + } + set->cia.titleVersion[1] = tmp; return 2; } else if(strcmp(argv[i],"-micro") == 0){ @@ -413,10 +421,54 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) return USR_ARG_REQ_PARAM; } u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[2] = tmp > 15 ? 15 : tmp; + if(tmp > 15){ + fprintf(stderr,"[SETTING ERROR] Micro version: '%d' is too large, max: '15'\n",tmp); + return USR_BAD_ARG; + } + set->cia.titleVersion[2] = tmp; return 2; } - + else if(strcmp(argv[i],"-dver") == 0){ + if(!HasParam){ + PrintNeedsParam("-dver"); + return USR_ARG_REQ_PARAM; + } + set->cia.useDataTitleVer = true; + u32 tmp = strtoul(argv[i+1],NULL,10); + if(tmp > 4095){ + fprintf(stderr,"[SETTING ERROR] Data version: '%d' is too large, max: '4095'\n",tmp); + return USR_BAD_ARG; + } + set->cia.titleVersion[0] = (tmp >> 6) & 63; + set->cia.titleVersion[1] = tmp & 63; + return 2; + } + else if(strcmp(argv[i],"-savesize") == 0){ + if(!HasParam){ + PrintNeedsParam("-savesize"); + return USR_ARG_REQ_PARAM; + } + set->cia.overideSaveDataSize = argv[i+1]; + return 2; + } + else if(strcmp(argv[i],"-rand") == 0){ + if(HasParam){ + PrintNoNeedParam("-rand"); + return USR_BAD_ARG; + } + set->cia.randomTitleKey = true; + return 1; + } + else if(strcmp(argv[i],"-nocryptcia") == 0){ + if(HasParam){ + PrintNoNeedParam("-nocryptcia"); + return USR_BAD_ARG; + } + set->cia.encryptCia = false; + return 1; + } + + // Other Setting else if(strcmp(argv[i],"-content") == 0){ if(!HasParam){ PrintNeedsParam("-content"); @@ -439,38 +491,90 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) } /* Getting Content Index */ - u16 content_index = strtol((char*)(pos+1),NULL,10); + u16 content_index = strtol((char*)(pos+1),NULL,0); /* Storing Content Filepath */ u32 path_len = (u32)(pos-argv[i+1])+1; - if(content_index == 0) set->IsBuildingNCCH0 = false; - if(set->ContentPath[content_index] != NULL){ + if(content_index == 0) set->ncch.buildNcch0 = false; + if(set->common.contentPath[content_index] != NULL){ fprintf(stderr,"[SETTING ERROR] Content %d is already specified\n",content_index); return USR_BAD_ARG; } - set->ContentPath[content_index] = malloc(path_len); - if(set->ContentPath[content_index] == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); + set->common.contentPath[content_index] = malloc(path_len); + if(set->common.contentPath[content_index] == NULL){ + fprintf(stderr,"[SETTING ERROR] Not enough memory\n"); return USR_MEM_ERROR; } - memset(set->ContentPath[content_index],0,path_len); - strncpy(set->ContentPath[content_index],argv[i+1],path_len-1); + memset(set->common.contentPath[content_index],0,path_len); + strncpy(set->common.contentPath[content_index],argv[i+1],path_len-1); /* Get ContentID for CIA gen */ char *pos2 = strstr(pos+1,":"); if(pos2) { - set->ContentID[content_index] = strtoul((pos2+1),NULL,16); + set->cia.contentId[content_index] = strtoul((pos2+1),NULL,0); } /* Return Next Arg Pos*/ return 2; } - /* + else if(strncmp(argv[i],"-D",2) == 0){ - fprintf(stderr,"[WARNING] -DNAME=VALUE not implemented yet\n"); + if(HasParam){ + PrintNoNeedParam("-DNAME=VALUE"); + return USR_BAD_ARG; + } + if(set->dname.m_items == 0){ + set->dname.m_items = 10; + set->dname.u_items = 0; + set->dname.items = malloc(sizeof(dname_item)*set->dname.m_items); + if(!set->dname.items){ + fprintf(stderr,"[SETTING ERROR] Not enough memory\n"); + return MEM_ERROR; + } + memset(set->dname.items,0,sizeof(dname_item)*set->dname.m_items); + } + else if(set->dname.m_items == set->dname.u_items){ + set->dname.m_items *= 2; + dname_item *tmp = malloc(sizeof(dname_item)*set->dname.m_items); + if(!tmp){ + fprintf(stderr,"[SETTING ERROR] Not enough memory\n"); + return MEM_ERROR; + } + memset(tmp,0,sizeof(dname_item)*set->dname.m_items); + memcpy(tmp,set->dname.items,sizeof(dname_item)*set->dname.u_items); + free(set->dname.items); + set->dname.items = tmp; + } + + char *name_pos = (char*)(argv[i]+2); + u32 name_len = 0; + char *val_pos = strstr(name_pos,"="); + u32 val_len = 0; + if(!val_pos){ + fprintf(stderr,"[SETTING ERROR] Format: '%s' is invalid\n",argv[i]); + return USR_BAD_ARG; + } + if(strlen(val_pos) < 2){ + fprintf(stderr,"[SETTING ERROR] Format: '%s' is invalid\n",argv[i]); + return USR_BAD_ARG; + } + val_pos = (val_pos + 1); + name_len = (val_pos - 2 - name_pos); + set->dname.items[set->dname.u_items].name = malloc(name_len+1); + memset(set->dname.items[set->dname.u_items].name,0,name_len+1); + memcpy(set->dname.items[set->dname.u_items].name,name_pos,name_len); + + val_len = strlen(val_pos); + set->dname.items[set->dname.u_items].value = malloc(val_len+1); + memset(set->dname.items[set->dname.u_items].value,0,val_len+1); + memcpy(set->dname.items[set->dname.u_items].value,val_pos,val_len); + + set->dname.u_items++; + + return 1; } - */ + // If not a valid argument fprintf(stderr,"[SETTING ERROR] Unrecognised argument '%s'\n",argv[i]); @@ -480,73 +584,78 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) int CheckArgumentCombination(user_settings *set) { for(int i = 0; i < CIA_MAX_CONTENT; i++){ - if( i > CCI_MAX_CONTENT-1 && set->ContentPath[i] && set->out_format == CCI){ - fprintf(stderr,"[SETTING ERROR] Content indexes > 7 are invalid for CCI\n"); + if( i > CCI_MAX_CONTENT-1 && set->common.contentPath[i] && set->common.outFormat == CCI){ + fprintf(stderr,"[SETTING ERROR] Content indexes > %d are invalid for CCI\n",CCI_MAX_CONTENT-1); return USR_BAD_ARG; } - if(set->ContentPath[i] && (set->out_format == CXI || set->out_format == CFA)){ + if(set->common.contentPath[i] && (set->common.outFormat == CXI || set->common.outFormat == CFA)){ fprintf(stderr,"[SETTING ERROR] You cannot specify content while outputting CXI/CFA files\n"); return USR_BAD_ARG; } } - if((set->out_format == CXI || set->out_format == CFA) && set->build_ncch_type > 0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-f cxi|cfa' and '-ncch cxi|cfa' are invalid\n"); + if((set->common.outFormat == CXI || set->common.outFormat == CFA) && set->ncch.ncchType != format_not_set){ + fprintf(stderr,"[SETTING ERROR] Arguments \"-f cxi|cfa\" and \"-ncch cxi|cfa\" are invalid\n"); return USR_BAD_ARG; } - if(set->build_ncch_type > 0 && !set->IsBuildingNCCH0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-content %s:0' and '-ncch cxi|cfa' cannot be used together\n",set->ContentPath[0]); + if(set->ncch.ncchType != format_not_set && !set->ncch.buildNcch0){ + fprintf(stderr,"[SETTING ERROR] Arguments \"-content %s:0\" and \"-data\" cannot be used together\n",set->common.contentPath[0]); return USR_BAD_ARG; } - if(set->elf_path && set->exefs_code_path){ - fprintf(stderr,"[SETTING ERROR] Arguments '-elf' and '-code' cannot be used together\n"); + if(set->cia.useDataTitleVer && set->cia.useNormTitleVer){ + fprintf(stderr,"[SETTING ERROR] Arguments \"-dver\" and \"-major\"/\"-minor\" cannot be used together\n"); + return USR_BAD_ARG; + } + + if(set->ncch.elfPath && set->ncch.codePath){ + fprintf(stderr,"[SETTING ERROR] Arguments \"-elf\" and \"-code\" cannot be used together\n"); return USR_BAD_ARG; } // Setting set->build_ncch_type if it isn't already set - if(set->IsBuildingNCCH0 && set->build_ncch_type == 0){ - if(set->out_format == CCI || set->out_format == CIA) set->build_ncch_type = CXI; - else set->build_ncch_type = set->out_format; + if(set->ncch.buildNcch0 && set->ncch.ncchType == format_not_set){ + if(set->common.outFormat == CCI || set->common.outFormat == CIA) set->ncch.ncchType = CXI; + else set->ncch.ncchType = set->common.outFormat; } - bool buildCXI = (set->out_format == CXI || set->build_ncch_type == CXI) && set->IsBuildingNCCH0; - bool buildCFA = (set->out_format == CFA || set->build_ncch_type == CFA) && set->IsBuildingNCCH0; + bool buildCXI = set->ncch.ncchType == CXI; + bool buildCFA = set->ncch.ncchType == CFA; // Detecting Required Arguments - if(buildCXI && !set->elf_path && !set->exefs_code_path){ + if(buildCXI && !set->ncch.elfPath && !set->ncch.codePath){ PrintNeedsArgument("-elf"); return USR_BAD_ARG; } - if((buildCXI || buildCFA) && !set->rsf_path){ + if((buildCXI || buildCFA) && !set->common.rsfPath){ PrintNeedsArgument("-rsf"); return USR_BAD_ARG; } - if(buildCXI && !set->exheader_path && set->exefs_code_path){ + if(buildCXI && set->ncch.codePath && !set->ncch.exheaderPath){ PrintNeedsArgument("-exheader"); return USR_BAD_ARG; } // Reporting bad arguments - if(!buildCXI && set->elf_path){ + if(!buildCXI && set->ncch.elfPath){ PrintArgumentInvalid("-elf"); return USR_BAD_ARG; } - if(!buildCXI && set->exefs_code_path){ + if(!buildCXI && set->ncch.codePath){ PrintArgumentInvalid("-code"); return USR_BAD_ARG; } - if(!buildCXI && set->exheader_path){ + if(!buildCXI && set->ncch.exheaderPath){ PrintArgumentInvalid("-exheader"); return USR_BAD_ARG; } - if(!buildCXI && set->plain_region_path){ + if(!buildCXI && set->ncch.plainRegionPath){ PrintArgumentInvalid("-plain-region"); return USR_BAD_ARG; } - if(!buildCXI && set->include_exefs_logo){ + if(!set->ncch.buildNcch0 && set->ncch.includeExefsLogo){ PrintArgumentInvalid("-exefslogo"); return USR_BAD_ARG; } - if(!set->IsBuildingNCCH0 && set->romfs_path){ + if(!set->ncch.buildNcch0 && set->ncch.romfsPath){ PrintArgumentInvalid("-romfs"); return USR_BAD_ARG; } @@ -746,24 +855,31 @@ void free_RsfSettings(rsf_settings *set) void free_UserSettings(user_settings *usr_settings) { // Free Content Paths - if(usr_settings->ContentPath){ - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - free(usr_settings->ContentPath[i]); - } - free(usr_settings->ContentPath); + if(usr_settings->common.contentPath){ + for(int i = 0; i < CIA_MAX_CONTENT; i++) + free(usr_settings->common.contentPath[i]); + free(usr_settings->common.contentPath); } + // free -DNAME=VALUE + for(u32 i = 0; i < usr_settings->dname.u_items; i++){ + free(usr_settings->dname.items[i].name); + free(usr_settings->dname.items[i].value); + } + free(usr_settings->dname.items); + // Free Spec File Setting - free_RsfSettings(&usr_settings->yaml_set); - + free_RsfSettings(&usr_settings->common.rsfSet); + // Free Key Data - FreeKeys(&usr_settings->keys); + FreeKeys(&usr_settings->common.keys); - // Free Content0 - free(usr_settings->Content0.buffer); + // Free Working File + free(usr_settings->common.workingFile.buffer); // Free outfile path, if malloc'd - if(usr_settings->outfile_mallocd) free(usr_settings->outfile); + if(usr_settings->common.outFileName_mallocd) + free(usr_settings->common.outFileName); // Clear settings init_UserSettings(usr_settings); @@ -774,22 +890,22 @@ void free_UserSettings(user_settings *usr_settings) void PrintNeedsArgument(char *arg) { - fprintf(stderr,"[SETTING ERROR] Argument '%s' is required\n",arg); + fprintf(stderr,"[SETTING ERROR] Argument \"%s\" is required\n",arg); } void PrintArgumentInvalid(char *arg) { - fprintf(stderr,"[SETTING ERROR] Argument '%s' is invalid\n",arg); + fprintf(stderr,"[SETTING ERROR] Argument \"%s\" is invalid\n",arg); } void PrintNeedsParam(char *arg) { - fprintf(stderr,"[SETTING ERROR] '%s' requires a parameter\n",arg); + fprintf(stderr,"[SETTING ERROR] \"%s\" requires a parameter\n",arg); } void PrintNoNeedParam(char *arg) { - fprintf(stderr,"[SETTING ERROR] '%s' does not take a parameter\n",arg); + fprintf(stderr,"[SETTING ERROR] \"%s\" does not take a parameter\n",arg); } void DisplayHelp(char *app_name) @@ -803,25 +919,34 @@ void DisplayHelp(char *app_name) printf("Option Parameter Explanation\n"); printf("GLOBAL OPTIONS:\n"); printf(" -help Display this text\n"); - printf(" -rsf RSF File\n"); + printf(" -rsf RSF File\n"); printf(" -f Output Format (cxi|cfa|cci|cia)\n"); - printf(" -o Output File\n"); + printf(" -o Output File\n"); //printf(" -v Verbose\n"); - //printf(" -DNAME=VALUE Substitute values in Spec files\n"); + printf(" -DNAME=VALUE Substitute values in Spec files\n"); printf("KEY OPTIONS:\n"); - printf(" -sysfixedkey <32 hex chars> Specify SystemFixed Key\n"); - printf(" -commonkey <32 hex chars> Specify commonkey and index\n"); -#ifndef PUBLIC_BUILD - printf(" -target Debug or Retail(Default)\n"); +#ifdef PUBLIC_BUILD + printf(" -target Target for crypto, defaults to 't'\n"); + printf(" 't' Test(false) Keys & prod Certs\n"); + printf(" 'c' User provides Keys & Certs\n"); +#else + printf(" -target Target for crypto, defaults to 't'\n"); + printf(" 't' Test(false) Keys & prod Certs\n"); + printf(" 'd' Development Keys & Certs\n"); + printf(" 'p' Production Keys & Certs\n"); + printf(" 'c' User provides Keys & Certs\n"); #endif + printf(" -keydir Key Directory (for use with \"-target c\")\n"); + printf(" -ckeyID Override the automatic commonKey selection\n"); + printf(" -showkeys Display the loaded keychain\n"); printf("NCCH OPTIONS:\n"); - printf(" -elf ELF File\n"); - printf(" -icon Icon File\n"); - printf(" -banner Banner File\n"); - printf(" -logo Logo File (Overrides \"BasicInfo/Logo\" in RSF)\n"); - printf(" -accessdesc : Specify AccessDesc Preset\n"); + printf(" -elf ELF File\n"); + printf(" -icon Icon File\n"); + printf(" -banner Banner File\n"); + printf(" -logo Logo File (Overrides \"BasicInfo/Logo\" in RSF)\n"); + printf(" -desc : Specify Access Descriptor Preset\n"); printf(" -exefslogo Include Logo in ExeFs (Required for usage on <5.X Systems)\n"); - printf(" -cfa Specify if building a Data Archive when \"-f cia\"\n"); + printf(" -data Specify if building a Data Archive when \"-f cia\"\n"); printf("NCCH REBUILD OPTIONS:\n"); printf(" -code Specify ExeFs code File\n"); printf(" -exheader ExHeader Template File\n"); @@ -830,18 +955,20 @@ void DisplayHelp(char *app_name) printf("CCI OPTIONS:\n"); #ifndef PUBLIC_BUILD printf(" -devcardcci Use SDK CardInfo Method\n"); - printf(" -omitncchhdr Omit NCCH Hdr for imported NCCH0\n"); #endif printf(" -content : Specify content files\n"); printf("CIA OPTIONS:\n"); #ifndef PUBLIC_BUILD printf(" -cci Convert CCI to CIA\n"); printf(" -srl Use TWL SRL as Content0\n"); + printf(" -dlc Create DLC CIA\n"); #endif printf(" -content :: Specify content files\n"); - printf(" -major Specify Title Version Major\n"); - printf(" -minor Specify Title Version Minor\n"); - printf(" -micro Specify Title Version Micro\n"); + printf(" -major Specify Major Version\n"); + printf(" -minor Specify Minor Version\n"); + printf(" -micro Specify Micro Version\n"); + printf(" -dver Specify Data Title Version\n"); + printf(" -savesize Savedata size\n"); printf(" -rand Use a random title key\n"); printf(" -nocryptcia Don't encrypt CIA contents\n"); } diff --git a/usersettings.h b/usersettings.h index 609a1dd..63e15c7 100644 --- a/usersettings.h +++ b/usersettings.h @@ -15,6 +15,14 @@ typedef enum USR_MEM_ERROR = -6, } user_settings_errors; +typedef enum +{ + infile_none, + infile_ncch, + infile_ncsd, + infile_srl, +} infile_type; + typedef enum { format_not_set, @@ -24,8 +32,23 @@ typedef enum CIA } output_format; +typedef struct +{ + char *name; + char *value; +} dname_item; + + +typedef struct +{ + dname_item *items; + u32 m_items; + u32 u_items; +} dname_struct; + static const char output_extention[4][5] = {".cxi",".cfa",".cci",".cia"}; +/* This does not follow style, so the rsf string names match the variables where they're stored */ typedef struct { struct{ @@ -206,52 +229,63 @@ typedef struct typedef struct { - // General Settings - char *rsf_path; - bool outfile_mallocd; - char *outfile; - output_format out_format; + struct{ + char *rsfPath; + bool outFileName_mallocd; + char *outFileName; + output_format outFormat; - // Content0 - bool ConvertCci; - char *CciPath; - bool Content0IsSrl; - char *SrlPath; - - bool Content0IsNcch; - COMPONENT_STRUCT Content0; - char **ContentPath; - u64 ContentID[CIA_MAX_CONTENT]; // For CIA - - // Ncch0 Build - bool IsBuildingNCCH0; - output_format build_ncch_type; - char *elf_path; - char *icon_path; - char *banner_path; - char *logo_path; - - bool include_exefs_logo; + // Keys + keys_struct keys; - char *exefs_code_path; - char *exheader_path; - char *plain_region_path; - char *romfs_path; - - // CCI Settings - bool GenSDKCardInfoHeader; - bool OmitImportedNcchHdr; + // RSF Imported Settings + rsf_settings rsfSet; - // CIA Settings - bool RandomTitleKey; - bool EncryptContents; - u16 Version[3]; + // Content Details + char **contentPath; - // Keys - keys_struct keys; + char *workingFilePath; + infile_type workingFileType; // Could Be ncch/ncsd/srl. This is mainly used for CIA gen + COMPONENT_STRUCT workingFile; + } common; + + dname_struct dname; // For RSF value subsitution + + struct{ + bool buildNcch0; + output_format ncchType; + char *elfPath; + char *iconPath; + char *bannerPath; + char *logoPath; // override logo specs in RSF + + bool includeExefsLogo; // for <5.x compatibility + + // ncch rebuild settings + char *codePath; // uncompressed exefs .code + char *exheaderPath; // for .code details + char *plainRegionPath; // prebuilt Plain Region + char *romfsPath; // Prebuild _cleartext_ romfs binary + } ncch; // Ncch0 Build + + struct{ + bool useSDKStockData; // incase we want to use the SDK stock data, for whatever reason. + } cci; // CCI Settings + + struct{ + char *overideSaveDataSize; + bool randomTitleKey; + bool encryptCia; + bool DlcContent; + + bool useNormTitleVer; + bool useDataTitleVer; + u16 titleVersion[3]; + + u64 contentId[CIA_MAX_CONTENT]; // For CIA + } cia; // CIA Settings + - // RSF/DESC Imported Settings - rsf_settings yaml_set; } user_settings; #endif diff --git a/utils.c b/utils.c index 6c78ea2..de274d8 100644 --- a/utils.c +++ b/utils.c @@ -228,7 +228,7 @@ char *getcwdir(char *buffer,int maxlen) #endif } -//Data Size conversion +//Data Size contitleVersion u16 u8_to_u16(u8 *value, u8 endianness) { u16 new_value; diff --git a/utils.h b/utils.h index 8034327..1d33f78 100644 --- a/utils.h +++ b/utils.h @@ -34,7 +34,7 @@ int TruncateFile_u64(char *filename, u64 filelen); int fseek_64(FILE *fp, u64 file_pos, int whence); int makedir(const char* dir); char *getcwdir(char *buffer,int maxlen); -//Data Size conversion +//Data Size contitleVersion u16 u8_to_u16(u8 *value, u8 endianness); u32 u8_to_u32(u8 *value, u8 endianness); u64 u8_to_u64(u8 *value, u8 endianness); diff --git a/yaml_ctr.c b/yaml_ctr.c index b230dc2..bea96d5 100644 --- a/yaml_ctr.c +++ b/yaml_ctr.c @@ -3,7 +3,7 @@ // Private Prototypes void InitYamlContext(ctr_yaml_context *ctx); -int ParseSpecFile(rsf_settings *set, char *path); +int ParseSpecFile(rsf_settings *set, char *path, dname_struct *dname); void CheckEvent(ctr_yaml_context *ctx); void BadYamlFormatting(void); @@ -11,21 +11,21 @@ void BadYamlFormatting(void); // Code int GetYamlSettings(user_settings *set) { - memset(&set->yaml_set,0,sizeof(rsf_settings)); + memset(&set->common.rsfSet,0,sizeof(rsf_settings)); int ret = 0; - if(set->rsf_path) { - FILE *tmp = fopen(set->rsf_path,"rb"); - if(!tmp) { - fprintf(stderr,"[YAML ERROR] Failed to open %s\n",set->rsf_path); + if(set->common.rsfPath) { + FILE *rsf = fopen(set->common.rsfPath,"rb"); + if(!rsf) { + fprintf(stderr,"[YAML ERROR] Failed to open %s\n",set->common.rsfPath); return FAILED_TO_OPEN_FILE; } - fclose(tmp); - ret = ParseSpecFile(&set->yaml_set,set->rsf_path); + fclose(rsf); + ret = ParseSpecFile(&set->common.rsfSet,set->common.rsfPath, &set->dname); } return ret; } -int ParseSpecFile(rsf_settings *set, char *path) +int ParseSpecFile(rsf_settings *set, char *path, dname_struct *dname) { ctr_yaml_context *ctx = malloc(sizeof(ctr_yaml_context)); InitYamlContext(ctx); @@ -40,6 +40,7 @@ int ParseSpecFile(rsf_settings *set, char *path) yaml_parser_set_input_file(&ctx->parser, input); + ctx->dname = dname; ctx->IsSequence = false; ctx->IsKey = true; ctx->prev_event = 0; @@ -100,21 +101,32 @@ void InitYamlContext(ctr_yaml_context *ctx) char *GetYamlString(ctr_yaml_context *ctx) { - /* - if(EventIsScalar(ctx)){ - if(!GetYamlStringSize(ctx) && !ctx->event.data.scalar.value) - return ctx->event.data.scalar.value; - } + //return (char*)ctx->event.data.scalar.value; - return NULL; - */ - return (char*)ctx->event.data.scalar.value; + if(!ctx->event.data.scalar.value) + return NULL; + + // Intercept values set from -DNAME=VALUE + char *start = strstr((char*)ctx->event.data.scalar.value,"$("); + char *end = strstr((char*)ctx->event.data.scalar.value,")"); + if(!start || !end) + return (char*)ctx->event.data.scalar.value; + + char *name = (start + 2); + u32 name_len = (end - 1 - name); + + for(u32 i = 0; i < ctx->dname->u_items; i++){ + if(strncmp(ctx->dname->items[i].name,name,name_len) == 0) + return ctx->dname->items[i].value; + } + + return ""; } u32 GetYamlStringSize(ctr_yaml_context *ctx) { - return ctx->event.data.scalar.length; + return strlen(GetYamlString(ctx)); // can't read size from yaml, as string may have been intercepted } void GetEvent(ctr_yaml_context *ctx) diff --git a/yaml_ctr.h b/yaml_ctr.h index 7f1cfaa..5f4d452 100644 --- a/yaml_ctr.h +++ b/yaml_ctr.h @@ -19,6 +19,7 @@ typedef struct int error; // Important Details + dname_struct *dname; bool IsSequence; bool IsKey; yaml_event_type_t prev_event;