@@ -75,12 +75,12 @@ FF7SaveInfo::FORMAT FF7Save::fileDataFormat(QFile &file)
7575 if (ps4binfile.size () == FF7SaveInfo::get ()->fileSize (FF7SaveInfo::FORMAT::PS4BIN) && (ps4binfile.peek (FF7SaveInfo::fileHeaderSize (FF7SaveInfo::FORMAT::PS4BIN)) == FF7SaveInfo::fileIdentifier (FF7SaveInfo::FORMAT::PS4BIN))) {
7676 auto ps4bin = ps4binfile.readAll ();
7777 m_ps4_iv = ps4bin.mid (0x10 , 0x10 );
78- m_ps4_key = ps4bin.mid (0x20 , 0x10 );
78+ m_ps4_key = ps4bin.mid (0x20 , 0x20 );
7979 QTextStream (stdout)
8080 << " [FF7Save::loadFile] PS4 BIN File Size: " << FF7SaveInfo::get ()->fileSize (FF7SaveInfo::FORMAT::PS4BIN) << " \n "
8181 << " [FF7Save::loadFile] PS4 BIN pfsSKKey IV: " << m_ps4_iv.toHex () << " \n "
8282 << " [FF7Save::loadFile] PS4 BIN pfsSKKey KEY: " << m_ps4_key.toHex () << " \n " ;
83- setFormat ( FF7SaveInfo::FORMAT::PS4) ;
83+ return FF7SaveInfo::FORMAT::PS4;
8484 }
8585 }
8686 }
@@ -114,13 +114,28 @@ bool FF7Save::loadFile(const QString &fileName)
114114 return false ;
115115
116116 setFormat (fileFormat);
117- /* ~~~~~~~~~~Start Load~~~~~~~~~~*/
118- setFileHeader (file.read (FF7SaveInfo::fileHeaderSize (fileFormat)));
119- for (int i = 0 ; i < FF7SaveInfo::slotCount (fileFormat); i++) {
120- setSlotHeader (i, file.read (FF7SaveInfo::slotHeaderSize (fileFormat)));
121- setSlotFF7Data (i, file.read (FF7SaveInfo::slotSize ()));
122- setSlotFooter (i, file.read (FF7SaveInfo::slotFooterSize (fileFormat)));
117+
118+
119+ if (fileFormat == FF7SaveInfo::FORMAT::PS4) {
120+ qDebug () << " Trying to Decrypt" ;
121+ QFile ofile (" outdata.dat" );
122+ ofile.open (QFile::WriteOnly);
123+ ofile.write (decryptPS4Save (file.readAll ()));
124+ for (int i = 0 ; i < FF7SaveInfo::slotCount (fileFormat); i++) {
125+ setSlotHeader (i, QByteArray ());
126+ setSlotFF7Data (i, decryptPS4Save (file.readAll ()));
127+ setSlotFooter (i, QByteArray ());
128+ }
129+ } else {
130+ /* ~~~~~~~~~~Start Load~~~~~~~~~~*/
131+ setFileHeader (file.read (FF7SaveInfo::fileHeaderSize (fileFormat)));
132+ for (int i = 0 ; i < FF7SaveInfo::slotCount (fileFormat); i++) {
133+ setSlotHeader (i, file.read (FF7SaveInfo::slotHeaderSize (fileFormat)));
134+ setSlotFF7Data (i, file.read (FF7SaveInfo::slotSize ()));
135+ setSlotFooter (i, file.read (FF7SaveInfo::slotFooterSize (fileFormat)));
136+ }
123137 }
138+
124139 /* ~~~~~~~End Load~~~~~~~~~~~~~~*/
125140 if (FF7SaveInfo::isTypePC (fileFormat)) {
126141 for (int i = 0 ; i < 15 ; i++) {
@@ -2776,6 +2791,16 @@ bool FF7Save::fixMetaData(QString fileName, QString UserID)
27762791 return 1 ;
27772792}
27782793
2794+ QByteArray FF7Save::decryptPS4Save (QByteArray in)
2795+ {
2796+ QByteArray buffer = in;
2797+ struct AES_ctx ctx;
2798+ AES_init_ctx_iv (&ctx, reinterpret_cast <uint8_t *>(m_ps4_key.data ()), reinterpret_cast <uint8_t *>(m_ps4_iv.data ()));
2799+ AES_CBC_decrypt_buffer (&ctx, reinterpret_cast <uint8_t *>(buffer.data ()), 256 );
2800+ qDebug () << " Decrypted Size" << buffer.size ();
2801+ return buffer;
2802+
2803+ }
27792804QByteArray FF7Save::generatePsSaveSignature (QByteArray data, QByteArray keySeed)
27802805{
27812806 FF7SaveInfo::FORMAT saveFormat = format ();
0 commit comments