konogonka/src/main/java/konogonka/Controllers/XCI/XCIController.java

273 lines
12 KiB
Java

package konogonka.Controllers.XCI;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import konogonka.AppPreferences;
import konogonka.Controllers.TabController;
import konogonka.Tools.XCI.XCIProvider;
import konogonka.Workers.AnalyzerXCI;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import static konogonka.LoperConverter.byteArrToHexString;
public class XCIController implements TabController {
/* Header */
@FXML
private TextField rsa2048pkcs1TF,
secureAreaStartAddrTF,
pkgIdTF,
gcInfoIVTF,
Hfs0headerSHA256Lbl,
Hfs0initDataSHA256Lbl,
normAreaEndAddrTF;
@FXML
private Label headLbl,
bkupAreaStartAddrLbl,
titleKEKIndexLbl,
gcSizeLbl,
gcHdrVersLbl,
gcFlags,
vDataEndAddrLbl,
hfs0partOffLbl,
hfs0hdrSizeLbl,
secureModeFlagLbl,
titleKeyFlagLbl,
keyFlagLbl;
/* GC Info */
@FXML
private TextField fwModeTF,
cupVersionTF,
emptyPadding1TF,
updPartHashTF,
cupIDTF,
emptyPadding2TF;
@FXML
private Label fwVersionLbl,
accessCtrlFlagsLbl,
readWaitTime1Lbl,
readWaitTime2Lbl,
writeWaitTime1,
writeWaitTime2,
emptyPadding1Lbl,
emptyPadding2Lbl;
/* GC Cert */
@FXML
private TextField rsa2048PKCS1sigCertTF,
magicCertCertTF,
unknown1CertTF,
unknown2CertTF,
deviceIDCertTF,
unknown3CertTF,
encryptedDataCertTF;
@FXML
private Label kekIndexCertLbl,
magicCertCertOkLbl;
@FXML
private HFSBlockController
HFSBlockMainController,
HFSBlockUpdateController,
HFSBlockNormalController,
HFSBlockSecureController,
HFSBlockLogoController;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
HFSBlockMainController.setTitlePaneTypeName("main", "HFS0 (Primary): 0xF000");
HFSBlockUpdateController.setTitlePaneTypeName("update", "HFS0 update");
HFSBlockNormalController.setTitlePaneTypeName("normal", "HFS0 normal");
HFSBlockSecureController.setTitlePaneTypeName("secure", "HFS0 secure");
HFSBlockLogoController.setTitlePaneTypeName("logo", "HFS0 logo");
}
/**
* Start analyze XCI
* */
@Override
public void analyze(File selectedFile){
HFSBlockController.setSelectedFile(selectedFile);
AnalyzerXCI analyzerXCI = new AnalyzerXCI(selectedFile, AppPreferences.getInstance().getXciHeaderKey());
analyzerXCI.setOnSucceeded(e->{
populateFields(analyzerXCI.getValue());
});
Thread workThread = new Thread(analyzerXCI);
workThread.setDaemon(true);
workThread.start();
}
@Override
public void resetTab(){
HFSBlockController.setSelectedFile(null);
/* Header */
rsa2048pkcs1TF.setText("-");
headLbl.setText("-");
secureAreaStartAddrTF.setText("-");
bkupAreaStartAddrLbl.setText("-");
titleKEKIndexLbl.setText("-");
gcSizeLbl.setText("-");
gcHdrVersLbl.setText("-");
gcFlags.setText("-");
pkgIdTF.setText("-");
vDataEndAddrLbl.setText("-");
gcInfoIVTF.setText("-");
hfs0partOffLbl.setText("-");
hfs0hdrSizeLbl.setText("-");
Hfs0headerSHA256Lbl.setText("-");
Hfs0initDataSHA256Lbl.setText("-");
secureModeFlagLbl.setText("-");
titleKeyFlagLbl.setText("-");
keyFlagLbl.setText("-");
normAreaEndAddrTF.setText("-");
/* GC Info */
fwVersionLbl.setText("-");
accessCtrlFlagsLbl.setText("-");
readWaitTime1Lbl.setText("-");
readWaitTime2Lbl.setText("-");
writeWaitTime1.setText("-");
writeWaitTime2.setText("-");
fwModeTF.setText("-");
cupVersionTF.setText("-");
emptyPadding1TF.setText("-");
updPartHashTF.setText("-");
cupIDTF.setText("-");
emptyPadding2TF.setText("-");
emptyPadding1Lbl.setText("-");
emptyPadding2Lbl.setText("-");
/* Certificate */
rsa2048PKCS1sigCertTF.setText("-");
magicCertCertTF.setText("-");
magicCertCertOkLbl.setText("-");
unknown1CertTF.setText("-");
kekIndexCertLbl.setText("-");
unknown2CertTF.setText("-");
deviceIDCertTF.setText("-");
unknown3CertTF.setText("-");
encryptedDataCertTF.setText("-");
/* HFS0 */
HFSBlockMainController.resetTab();
HFSBlockUpdateController.resetTab();
HFSBlockNormalController.resetTab();
HFSBlockSecureController.resetTab();
HFSBlockLogoController.resetTab();
}
private void populateFields(XCIProvider xci){
if (xci != null){
/* Header */
rsa2048pkcs1TF.setText(byteArrToHexString(xci.getGCHeader().getRsa2048PKCS1sig()));
//RainbowHexDump.hexDumpUTF8(xci.getGCHeader().getRsa2048PKCS1sig());
headLbl.setText(Boolean.toString(xci.getGCHeader().isMagicHeadOk()));
//System.out.println(xci.getGCHeader().isMagicHeadOk());
secureAreaStartAddrTF.setText(byteArrToHexString(xci.getGCHeader().getSecureAreaStartAddr()));
//System.out.println(xci.getGCHeader().isSecureAreaStartAddrOk());
bkupAreaStartAddrLbl.setText(Boolean.toString(xci.getGCHeader().isBkupAreaStartAddrOk()));
//System.out.println(xci.getGCHeader().isBkupAreaStartAddrOk());
titleKEKIndexLbl.setText(String.format("%02x", xci.getGCHeader().getTitleKEKIndexBoth())+": "
+String.format("%02x", xci.getGCHeader().getTitleKEKIndex())+" "
+String.format("%02x", xci.getGCHeader().getKEKIndex())
);
//System.out.print(String.format("%02x", xci.getGCHeader().getTitleKEKIndexBoth())+" ");
//System.out.print(String.format("%02x", xci.getGCHeader().getTitleKEKIndex())+" ");
//System.out.println(String.format("%02x", xci.getGCHeader().getKEKIndex()));
switch (xci.getGCHeader().getGcSize()){
case (byte) 0xFA: // 1 GB
gcSizeLbl.setText("1 GB");
break;
case (byte) 0xF8: // 2 GB
gcSizeLbl.setText("2 GB");
break;
case (byte) 0xF0: // 4 GB
gcSizeLbl.setText("4 GB");
break;
case (byte) 0xE0: // 8 GB
gcSizeLbl.setText("8 GB");
break;
case (byte) 0xE1: // 16 GB
gcSizeLbl.setText("16 GB");
break;
case (byte) 0xE2: // 32 GB
gcSizeLbl.setText("32 GB");
break;
default:
gcSizeLbl.setText("? "+String.format("%02x", xci.getGCHeader().getGcSize()));
}
//System.out.println(String.format("%02x", xci.getGCHeader().getGcSize()));
gcHdrVersLbl.setText(String.format("%02x", xci.getGCHeader().getGcVersion()));
//System.out.println(String.format("%02x", xci.getGCHeader().getGcVersion()));
gcFlags.setText(String.format("%02x", xci.getGCHeader().getGcFlags()));
//System.out.println(String.format("%02x", xci.getGCHeader().getGcFlags()));
pkgIdTF.setText(byteArrToHexString(xci.getGCHeader().getPkgID()));
//RainbowHexDump.hexDumpUTF8(xci.getGCHeader().getPkgID());
vDataEndAddrLbl.setText(Long.toString(xci.getGCHeader().getValDataEndAddr()));
//System.out.println(xci.getGCHeader().getValDataEndAddr());
gcInfoIVTF.setText(byteArrToHexString(xci.getGCHeader().getGcInfoIV()));
//RainbowHexDump.hexDumpUTF8(xci.getGCHeader().getGcInfoIV());
hfs0partOffLbl.setText(Long.toString(xci.getGCHeader().getHfs0partOffset()));
//System.out.println(xci.getGCHeader().getHfs0partOffset());
hfs0hdrSizeLbl.setText(Long.toString(xci.getGCHeader().getHfs0headerSize()));
//System.out.println(xci.getGCHeader().getHfs0headerSize());
Hfs0headerSHA256Lbl.setText(byteArrToHexString(xci.getGCHeader().getHfs0headerSHA256()));
//RainbowHexDump.hexDumpUTF8(xci.getGCHeader().getHfs0headerSHA256());
Hfs0initDataSHA256Lbl.setText(byteArrToHexString(xci.getGCHeader().getHfs0initDataSHA256()));
//RainbowHexDump.hexDumpUTF8(xci.getGCHeader().getHfs0initDataSHA256() );
secureModeFlagLbl.setText(xci.getGCHeader().isSecureModeFlagOk()+" ("+xci.getGCHeader().getSecureModeFlag()+")");
//System.out.print(xci.getGCHeader().getSecureModeFlag());
//System.out.println(xci.getGCHeader().isSecureModeFlagOk());
titleKeyFlagLbl.setText(xci.getGCHeader().istitleKeyFlagOk()+" ("+xci.getGCHeader().getTitleKeyFlag()+")");
//System.out.print(xci.getGCHeader().getTitleKeyFlag());
//System.out.println(xci.getGCHeader().istitleKeyFlagOk());
keyFlagLbl.setText(xci.getGCHeader().iskeyFlagOk()+" ("+xci.getGCHeader().getKeyFlag()+")");
//System.out.print(xci.getGCHeader().getKeyFlag());
//System.out.println(xci.getGCHeader().iskeyFlagOk());
normAreaEndAddrTF.setText(byteArrToHexString(xci.getGCHeader().getNormAreaEndAddr()));
//System.out.println(xci.getGCHeader().isNormAreaEndAddrOk());
/* GC Info */
fwVersionLbl.setText(Long.toString(xci.getGCInfo().getFwVersion()));
String tempACF = byteArrToHexString(xci.getGCInfo().getAccessCtrlFlags());
if (tempACF.equals("1100a100"))
accessCtrlFlagsLbl.setText("25Mhz [0x1100a100]");
else if(tempACF.equals("1000a100"))
accessCtrlFlagsLbl.setText("50Mhz [0x1000a100]");
else
accessCtrlFlagsLbl.setText("??? ["+tempACF+"]");
readWaitTime1Lbl.setText(Long.toString(xci.getGCInfo().getReadWaitTime1()));
readWaitTime2Lbl.setText(Long.toString(xci.getGCInfo().getReadWaitTime2()));
writeWaitTime1.setText(Long.toString(xci.getGCInfo().getWriteWaitTime1()));
writeWaitTime2.setText(Long.toString(xci.getGCInfo().getWriteWaitTime2()));
fwModeTF.setText(byteArrToHexString(xci.getGCInfo().getFwMode()));
cupVersionTF.setText(byteArrToHexString(xci.getGCInfo().getCupVersion()));
emptyPadding1Lbl.setText(Boolean.toString(xci.getGCInfo().isEmptyPadding1()));
emptyPadding1TF.setText(byteArrToHexString(xci.getGCInfo().getEmptyPadding1()));
updPartHashTF.setText(byteArrToHexString(xci.getGCInfo().getUpdPartHash()));
cupIDTF.setText(byteArrToHexString(xci.getGCInfo().getCupID()));
emptyPadding2Lbl.setText(Boolean.toString(xci.getGCInfo().isEmptyPadding2()));
emptyPadding2TF.setText(byteArrToHexString(xci.getGCInfo().getEmptyPadding2()));
/* Certificate */
rsa2048PKCS1sigCertTF.setText(byteArrToHexString(xci.getGCCert().getRsa2048PKCS1sig()));
magicCertCertTF.setText(byteArrToHexString(xci.getGCCert().getMagicCert()));
magicCertCertOkLbl.setText(Boolean.toString(xci.getGCCert().isMagicCertOk()));
unknown1CertTF.setText(byteArrToHexString(xci.getGCCert().getUnknown1()));
kekIndexCertLbl.setText(String.format("%02x", xci.getGCCert().getKekIndex()));
unknown2CertTF.setText(byteArrToHexString(xci.getGCCert().getUnknown2()));
deviceIDCertTF.setText(byteArrToHexString(xci.getGCCert().getDeviceID()));
unknown3CertTF.setText(byteArrToHexString(xci.getGCCert().getUnknown3()));
encryptedDataCertTF.setText(byteArrToHexString(xci.getGCCert().getEncryptedData()));
/* HFS0 */
HFSBlockMainController.populateTab(xci.getHfs0ProviderMain());
HFSBlockUpdateController.populateTab(xci.getHfs0ProviderUpdate());
HFSBlockNormalController.populateTab(xci.getHfs0ProviderNormal());
HFSBlockSecureController.populateTab(xci.getHfs0ProviderSecure());
HFSBlockLogoController.populateTab(xci.getHfs0ProviderLogo());
}
}
}