285 lines
8.7 KiB
C#
285 lines
8.7 KiB
C#
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using Avalonia.Interactivity;
|
|
using Avalonia.Remote.Protocol.Input;
|
|
using ChovySign_GUI.Popup.Global;
|
|
using ChovySign_GUI.Popup.Global.KeySelector;
|
|
using GameBuilder.Psp;
|
|
using Ionic.Zlib;
|
|
using Li.Utilities;
|
|
using LibChovy.Config;
|
|
using LibChovy.VersionKey;
|
|
using SixLabors.ImageSharp.PixelFormats;
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Linq;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Vita.ContentManager;
|
|
using Vita.PsvImgTools;
|
|
using static ChovySign_GUI.Popup.Global.MessageBox;
|
|
using static PspCrypto.SceNpDrm;
|
|
|
|
namespace ChovySign_GUI.Global
|
|
{
|
|
public partial class KeySelector : UserControl
|
|
{
|
|
|
|
private string licenseDataConfigKey
|
|
{
|
|
get
|
|
{
|
|
return "KEY_INDEX_" + keyIndex + "_LICENSE_DATA";
|
|
}
|
|
}
|
|
private string versionKeyConfigKey
|
|
{
|
|
get
|
|
{
|
|
return "KEY_INDEX_" + keyIndex + "_VERSION_KEY";
|
|
}
|
|
}
|
|
|
|
private bool lastValid;
|
|
private int keyIndex = 1;
|
|
private NpDrmRif? npRif;
|
|
private byte[]? versionKey;
|
|
|
|
public bool IsValid
|
|
{
|
|
get
|
|
{
|
|
try
|
|
{
|
|
if (vKey.Text is null) return false;
|
|
if (vKey.Text.Length != 32) return false;
|
|
|
|
if (zRif.Text is null) return false;
|
|
if (zRif.Text.Length <= 0) return false;
|
|
|
|
byte[] rif = new NpDrmRif(zRif.Text).Rif;
|
|
if (rif.Length <= 0) return false;
|
|
return (VersionKey is not null && Rif is not null);
|
|
}
|
|
catch { return false; };
|
|
}
|
|
}
|
|
|
|
public byte[]? VersionKey
|
|
{
|
|
get
|
|
{
|
|
return versionKey;
|
|
}
|
|
set
|
|
{
|
|
if (value is null) return;
|
|
|
|
versionKey = value;
|
|
ChovyConfig.CurrentConfig.SetBytes(versionKeyConfigKey, versionKey);
|
|
vKey.Text = BitConverter.ToString(versionKey).Replace("-", "");
|
|
|
|
OnVersionKeyChanged(new EventArgs());
|
|
}
|
|
}
|
|
public byte[]? Rif
|
|
{
|
|
get
|
|
{
|
|
if (npRif is null) return null;
|
|
return npRif.Rif;
|
|
}
|
|
set
|
|
{
|
|
if (value is null) return;
|
|
|
|
npRif = new NpDrmRif(value);
|
|
zRif.Text = npRif.ZRif;
|
|
ChovyConfig.CurrentConfig.SetBytes(licenseDataConfigKey, npRif.Rif);
|
|
|
|
OnRifChanged(new EventArgs());
|
|
}
|
|
}
|
|
private void reloadCfg()
|
|
{
|
|
byte[]? rifData = ChovyConfig.CurrentConfig.GetBytes(licenseDataConfigKey);
|
|
byte[]? vkeyData = ChovyConfig.CurrentConfig.GetBytes(versionKeyConfigKey);
|
|
|
|
if(vkeyData is not null)
|
|
{
|
|
vKey.Text = BitConverter.ToString(vkeyData).Replace("-", "");
|
|
versionKey = vkeyData;
|
|
}
|
|
|
|
if (rifData is not null)
|
|
{
|
|
npRif = new NpDrmRif(rifData);
|
|
zRif.Text = npRif.ZRif;
|
|
}
|
|
}
|
|
|
|
private async void getKeysClick(object sender, RoutedEventArgs e)
|
|
{
|
|
|
|
Button? btn = sender as Button;
|
|
if (btn is null) return;
|
|
|
|
btn.IsEnabled = false;
|
|
|
|
Window? currentWindow = this.VisualRoot as Window;
|
|
if (currentWindow is not Window) throw new Exception("could not find current window");
|
|
|
|
KeyObtainMethods keyObt = new KeyObtainMethods();
|
|
keyObt.KeyIndex = keyIndex;
|
|
VersionKeyMethod? method = await keyObt.ShowDialog<VersionKeyMethod>(currentWindow);
|
|
if (method is null) return;
|
|
|
|
NpDrmInfo? key = null;
|
|
NpDrmRif? rif = null;
|
|
|
|
switch (method)
|
|
{
|
|
case VersionKeyMethod.ACT_RIF_METHOD:
|
|
ActRifMethodGUI actRifMethodGUI = new ActRifMethodGUI();
|
|
NpDrmInfo[]? keys = await actRifMethodGUI.ShowDialog<NpDrmInfo[]>(currentWindow);
|
|
if (keys is null) break;
|
|
|
|
key = keys[keyIndex];
|
|
rif = actRifMethodGUI.Rif;
|
|
|
|
break;
|
|
case VersionKeyMethod.EBOOT_PBP_METHOD:
|
|
CmaBackupPicker ebootBackupSelector = new CmaBackupPicker();
|
|
ebootBackupSelector.BackupType = new string[] { "PGAME", "PSGAME" };
|
|
|
|
string? gameBackupFolder = await ebootBackupSelector.ShowDialog<string>(currentWindow);
|
|
string accountId = ebootBackupSelector.AccountId;
|
|
if (gameBackupFolder is null) break;
|
|
if (accountId == "") break;
|
|
|
|
key = CMAVersionKeyHelper.GetKeyFromGamePsvimg(gameBackupFolder, accountId, this.keyIndex);
|
|
rif = CMAVersionKeyHelper.GetRifFromLicensePsvimg(gameBackupFolder, accountId);
|
|
break;
|
|
case VersionKeyMethod.KEYS_TXT_METHOD:
|
|
CmaBackupPicker pspLicenseBackupSelector = new CmaBackupPicker();
|
|
pspLicenseBackupSelector.BackupType = new string[] { "PGAME", "PSGAME" };
|
|
pspLicenseBackupSelector.Filter = KeysTxtMethod.TitleIds;
|
|
|
|
gameBackupFolder = await pspLicenseBackupSelector.ShowDialog<string>(currentWindow);
|
|
accountId = pspLicenseBackupSelector.AccountId;
|
|
if (gameBackupFolder is null) break;
|
|
if (accountId == "") break;
|
|
|
|
rif = CMAVersionKeyHelper.GetRifFromLicensePsvimg(gameBackupFolder, accountId);
|
|
if (rif is null) break;
|
|
|
|
key = KeysTxtMethod.GetVersionKey(rif.ContentId, this.KeyIndex);
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (key is not null)
|
|
{
|
|
if (key.KeyIndex != this.keyIndex)
|
|
sceNpDrmTransformVersionKey(key.VersionKey, key.KeyIndex, this.keyIndex);
|
|
// its a revoolution~
|
|
|
|
VersionKey = key.VersionKey;
|
|
}
|
|
|
|
if (rif is not null)
|
|
Rif = rif.Rif;
|
|
|
|
btn.IsEnabled = true;
|
|
}
|
|
|
|
public int KeyIndex
|
|
{
|
|
get
|
|
{
|
|
return keyIndex;
|
|
}
|
|
set
|
|
{
|
|
keyIndex = value;
|
|
reloadCfg();
|
|
}
|
|
}
|
|
|
|
public event EventHandler<EventArgs>? VersionKeyChanged;
|
|
protected virtual void OnVersionKeyChanged(EventArgs e)
|
|
{
|
|
if (IsValid != lastValid) OnValidStateChanged(new EventArgs());
|
|
|
|
|
|
if (VersionKeyChanged is not null)
|
|
VersionKeyChanged(this, e);
|
|
}
|
|
public event EventHandler<EventArgs>? RifChanged;
|
|
protected virtual void OnRifChanged(EventArgs e)
|
|
{
|
|
if (IsValid != lastValid) OnValidStateChanged(new EventArgs());
|
|
|
|
if (RifChanged is not null)
|
|
RifChanged(this, e);
|
|
}
|
|
|
|
public event EventHandler<EventArgs>? ValidStateChanged;
|
|
protected virtual void OnValidStateChanged(EventArgs e)
|
|
{
|
|
lastValid = IsValid;
|
|
if (ValidStateChanged is not null)
|
|
ValidStateChanged(this, e);
|
|
}
|
|
public KeySelector()
|
|
{
|
|
InitializeComponent();
|
|
reloadCfg();
|
|
lastValid = IsValid;
|
|
|
|
zRif.TextChanged += onZrifChanged;
|
|
vKey.TextChanged += onVkeyChanged;
|
|
}
|
|
|
|
private void onVkeyChanged(object? sender, EventArgs e)
|
|
{
|
|
FilteredTextBox? txt = sender as FilteredTextBox;
|
|
if (txt is null) return;
|
|
|
|
if (lastValid != IsValid)
|
|
OnValidStateChanged(new EventArgs());
|
|
|
|
try
|
|
{
|
|
if (txt.Text is null) return;
|
|
if (txt.Text.Length != 32) return;
|
|
|
|
this.VersionKey = MathUtil.StringToByteArray(txt.Text);
|
|
}
|
|
catch { };
|
|
}
|
|
|
|
private void onZrifChanged(object? sender, EventArgs e)
|
|
{
|
|
FilteredTextBox? txt = sender as FilteredTextBox;
|
|
if (txt is null) return;
|
|
|
|
if (lastValid != IsValid)
|
|
OnValidStateChanged(new EventArgs());
|
|
|
|
try
|
|
{
|
|
byte[] rifBytes = new NpDrmRif(txt.Text).Rif;
|
|
if (rifBytes.Length != 0) this.Rif = rifBytes;
|
|
}
|
|
catch { };
|
|
|
|
}
|
|
}
|
|
}
|