From 3f3418e8402be61825a14dbf5d1fc88b2b9f0d21 Mon Sep 17 00:00:00 2001 From: jakcron Date: Sat, 24 Oct 2015 13:50:05 +0800 Subject: [PATCH] [makerom] Updated NCSD spec, as per 3dbrew.org contributor research. --- makerom/cardinfo.c | 38 ++++++++++++++++++++++++++------------ makerom/cardinfo.h | 20 +++++++------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/makerom/cardinfo.c b/makerom/cardinfo.c index e9b80a4..4a278b7 100644 --- a/makerom/cardinfo.c +++ b/makerom/cardinfo.c @@ -7,8 +7,8 @@ void InitCardInfoHdr(cardinfo_hdr **cihdr, devcardinfo_hdr **dcihdr, cci_setting int SetWriteableAddress(cardinfo_hdr *hdr, cci_settings *set); int SetCardInfoBitmask(cardinfo_hdr *hdr, cci_settings *set); int SetCardInfoNotes(cardinfo_hdr *hdr, cci_settings *set); -void ImportNcch0Data(cardinfo_hdr *hdr, cci_settings *set); -void SetInitialData(cardinfo_hdr *hdr, cci_settings *set); +void SetNcchHeader(cardinfo_hdr *hdr, cci_settings *set); +void SetCardSeedData(cardinfo_hdr *hdr, cci_settings *set); void SetDevCardInfo(devcardinfo_hdr *hdr, cci_settings *set); @@ -25,8 +25,8 @@ int GenCardInfoHdr(cci_settings *set) return GEN_HDR_FAIL; if(SetCardInfoNotes(cihdr,set)) return GEN_HDR_FAIL; - ImportNcch0Data(cihdr,set); - SetInitialData(cihdr,set); + SetNcchHeader(cihdr,set); + SetCardSeedData(cihdr,set); if(dcihdr) SetDevCardInfo(dcihdr,set); @@ -49,6 +49,8 @@ void InitCardInfoHdr(cardinfo_hdr **cihdr, devcardinfo_hdr **dcihdr, cci_setting else *dcihdr = NULL; + //clrmem(set->headers.cardinfohdr.buffer, set->headers.cardinfohdr.size); + return; } @@ -174,7 +176,7 @@ int SetCardInfoNotes(cardinfo_hdr *hdr, cci_settings *set) return 0; } -void ImportNcch0Data(cardinfo_hdr *hdr, cci_settings *set) +void SetNcchHeader(cardinfo_hdr *hdr, cci_settings *set) { u8 *ncch; ncch_hdr *ncchHdr; @@ -182,19 +184,31 @@ void ImportNcch0Data(cardinfo_hdr *hdr, cci_settings *set) ncch = set->content.data + set->content.dOffset[0]; ncchHdr = (ncch_hdr*)ncch; - memcpy(hdr->ncch0TitleId,ncchHdr->titleId,8); memcpy(hdr->ncch0Hdr,GetNcchHdrData(ncchHdr),GetNcchHdrDataLen(ncchHdr)); return; } -void SetInitialData(cardinfo_hdr *hdr, cci_settings *set) +void SetCardSeedData(cardinfo_hdr *hdr, cci_settings *set) { - clrmem(hdr->initialData,0x30); - if(set->options.useExternalSdkCardInfo) - memcpy(hdr->initialData,(u8*)stock_initial_data,0x30); - else - rndset(hdr->initialData,0x2c); + u8 *ncch; + ncch_hdr *ncchHdr; + + ncch = set->content.data + set->content.dOffset[0]; + ncchHdr = (ncch_hdr*)ncch; + + if (set->options.useExternalSdkCardInfo) { + memcpy(hdr->cardSeedKeyY, ncchHdr->titleId, 8); + clrmem(hdr->encCardSeed, 0x10); + memcpy(hdr->cardSeedMac, stock_card_seed_mac, 0x10); + clrmem(hdr->cardSeedNonce, 0xC); + } + else { + memcpy(hdr->cardSeedKeyY, ncchHdr->titleId, 8); + rndset(hdr->encCardSeed, 0x10); + rndset(hdr->cardSeedMac, 0x10); + rndset(hdr->cardSeedNonce, 0xC); + } return; } diff --git a/makerom/cardinfo.h b/makerom/cardinfo.h index 271edac..1b36805 100644 --- a/makerom/cardinfo.h +++ b/makerom/cardinfo.h @@ -17,10 +17,11 @@ typedef struct u8 writableAddress[4]; u8 cardInfoBitmask[4]; cardinfo_notes notes; - u8 ncch0TitleId[8]; - u8 reserved0[8]; - u8 initialData[0x30]; - u8 reserved1[0xc0]; + u8 cardSeedKeyY[0x10]; + u8 encCardSeed[0x10]; + u8 cardSeedMac[0x10]; + u8 cardSeedNonce[0xc]; + u8 reserved1[0xc4]; u8 ncch0Hdr[0x100]; } cardinfo_hdr; @@ -31,16 +32,9 @@ typedef struct u8 cardDeviceReserved2[0xf0]; } devcardinfo_hdr; -static const u8 stock_initial_data[0x30] = +static const u8 stock_card_seed_mac[0x30] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xAD, 0x88, - 0xAC, 0x41, 0xA2, 0xB1, 0x5E, 0x8F, - 0x66, 0x9C, 0x97, 0xE5, 0xE1, 0x5E, - 0xA3, 0xEB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0xAD, 0x88, 0xAC, 0x41, 0xA2, 0xB1, 0x5E, 0x8F, 0x66, 0x9C, 0x97, 0xE5, 0xE1, 0x5E, 0xA3, 0xEB }; static const u8 stock_title_key[0x10] =