diff --git a/README.md b/README.md
index 2ca320e..20dfe36 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,12 @@ Mod of showmiiwads-mod
This is a modification of [showmiiwads-mod](https://code.google.com/archive/p/showmiiwads-mod/) by orwel. The original was coded by [Leathl](https://code.google.com/archive/p/showmiiwads/).
## Changelog
+### v1.5.2
+* Backport my [libWiiSharp fixes](https://github.com/WiiDatabase/libWiiSharp/releases/tag/v0.31):
+ * Added vWii Common-Key: Decrypting and encrypting vWii titles is supported now (last one is untested)
+ * Added Korean Common-Key
+ * Add Korea to TMD region
+
### v1.5.1
Important fixes to the WAD building process from NAND dumps:
* Tickets are not faked with the "beer ticket" anymore
diff --git a/ShowMiiWads/ShowMiiWads.csproj b/ShowMiiWads/ShowMiiWads.csproj
index b6ca401..577113d 100644
--- a/ShowMiiWads/ShowMiiWads.csproj
+++ b/ShowMiiWads/ShowMiiWads.csproj
@@ -29,7 +29,7 @@
false
true
0
- 1.5.1.%2a
+ 1.5.2.%2a
false
true
true
@@ -43,6 +43,7 @@
prompt
4
AllRules.ruleset
+ AnyCPU
pdbonly
diff --git a/ShowMiiWads/ShowMiiWads_Main.cs b/ShowMiiWads/ShowMiiWads_Main.cs
index e117905..90e3606 100644
--- a/ShowMiiWads/ShowMiiWads_Main.cs
+++ b/ShowMiiWads/ShowMiiWads_Main.cs
@@ -40,7 +40,7 @@ namespace ShowMiiWads
public partial class ShowMiiWads_Main : Form
{
//Define global variables
- public const string version = "1.5.1";
+ public const string version = "1.5.2";
private string language = "English";
private string langfile = "";
private string oldlang = "";
diff --git a/ShowMiiWads/Wii.cs b/ShowMiiWads/Wii.cs
index 331174a..72586e3 100644
--- a/ShowMiiWads/Wii.cs
+++ b/ShowMiiWads/Wii.cs
@@ -1326,6 +1326,8 @@ public static byte[] GetTitleKey(byte[] wadtik)
byte[] encryptedkey = new byte[16];
byte[] iv = new byte[16];
+ byte[] ckey;
+ byte ckeyindex;
int tikpos = 0;
if (IsThisWad(wadtik) == true)
@@ -1345,13 +1347,27 @@ public static byte[] GetTitleKey(byte[] wadtik)
iv[j + 8] = 0x00;
}
+ ckeyindex = wadtik[tikpos + 0x1f1];
+
+ switch (ckeyindex)
+ {
+ default:
+ ckey = libWiiSharp.CommonKey.GetStandardKey();
+ break;
+ case 0x01:
+ ckey = libWiiSharp.CommonKey.GetKoreanKey();
+ break;
+ case 0x02:
+ ckey = libWiiSharp.CommonKey.GetvWiiKey();
+ break;
+ }
+
RijndaelManaged decrypt = new RijndaelManaged();
decrypt.Mode = CipherMode.CBC;
decrypt.Padding = PaddingMode.None;
decrypt.KeySize = 128;
decrypt.BlockSize = 128;
- //decrypt.Key = commonkey;
- decrypt.Key = libWiiSharp.CommonKey.GetStandardKey();
+ decrypt.Key = ckey;
decrypt.IV = iv;
ICryptoTransform cryptor = decrypt.CreateDecryptor();
diff --git a/libWiiSharp/CommonKey.cs b/libWiiSharp/CommonKey.cs
index 0e7cc32..5116630 100644
--- a/libWiiSharp/CommonKey.cs
+++ b/libWiiSharp/CommonKey.cs
@@ -21,6 +21,7 @@ public class CommonKey
{
private static string standardKey = "ebe42a225e8593e448d9c5457381aaf7";
private static string koreanKey = "63b82bb4f4614e2e13f2fefbba4c9b7e";
+ private static string vwiiKey = "30bfc76e7c19afbb23163330ced7c28d";
public static byte[] GetStandardKey()
{
@@ -31,5 +32,10 @@ public static byte[] GetKoreanKey()
{
return Shared.HexStringToByteArray(koreanKey);
}
+
+ public static byte[] GetvWiiKey()
+ {
+ return Shared.HexStringToByteArray(vwiiKey);
+ }
}
}
diff --git a/libWiiSharp/TMD.cs b/libWiiSharp/TMD.cs
index ff8d336..5824ae1 100644
--- a/libWiiSharp/TMD.cs
+++ b/libWiiSharp/TMD.cs
@@ -35,6 +35,7 @@ public enum Region : ushort
USA = 1,
Europe = 2,
Free = 3,
+ Korea = 4,
}
public class TMD : IDisposable
diff --git a/libWiiSharp/Ticket.cs b/libWiiSharp/Ticket.cs
index 17997c8..d61c423 100644
--- a/libWiiSharp/Ticket.cs
+++ b/libWiiSharp/Ticket.cs
@@ -25,6 +25,7 @@ public enum CommonKeyType : byte
{
Standard = 0x00,
Korean = 0x01,
+ vWii = 0x02,
}
public class Ticket : IDisposable
@@ -532,7 +533,19 @@ private void parseTicket(Stream ticketFile)
private void decryptTitleKey()
{
- byte[] ckey = (commonKeyIndex == 0x01) ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey();
+ byte[] ckey;
+ switch (commonKeyIndex)
+ {
+ default:
+ ckey = CommonKey.GetStandardKey();
+ break;
+ case 0x01:
+ ckey = CommonKey.GetKoreanKey();
+ break;
+ case 0x02:
+ ckey = CommonKey.GetvWiiKey();
+ break;
+ }
byte[] iv = BitConverter.GetBytes(Shared.Swap(titleId));
Array.Resize(ref iv, 16);
@@ -560,7 +573,19 @@ private void decryptTitleKey()
private void encryptTitleKey()
{
commonKeyIndex = newKeyIndex;
- byte[] ckey = (commonKeyIndex == 0x01) ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey();
+ byte[] ckey = CommonKey.GetStandardKey();
+ switch (commonKeyIndex)
+ {
+ default:
+ ckey = CommonKey.GetStandardKey();
+ break;
+ case 0x01:
+ ckey = CommonKey.GetKoreanKey();
+ break;
+ case 0x02:
+ ckey = CommonKey.GetvWiiKey();
+ break;
+ }
byte[] iv = BitConverter.GetBytes(Shared.Swap(titleId));
Array.Resize(ref iv, 16);