summaryrefslogtreecommitdiff
path: root/LibTSforge/Crypto/PhysStoreCrypto.cs
diff options
context:
space:
mode:
authorWither OrNot2025-02-13 14:49:35 +0000
committerWither OrNot2025-02-13 14:49:37 +0000
commit0d59561bee4cf7db10d53a8aa58952ae65e856b5 (patch)
treeb2ddb66c883dd2ef75426de4c080f3121f0a8658 /LibTSforge/Crypto/PhysStoreCrypto.cs
downloadTSforge-0d59561bee4cf7db10d53a8aa58952ae65e856b5.zip
Initial commit1.0.0
Co-authored-by: neko <[email protected]> Co-authored-by: Lyssa <[email protected]> Co-authored-by: abbodi1406 <[email protected]>
Diffstat (limited to 'LibTSforge/Crypto/PhysStoreCrypto.cs')
-rw-r--r--LibTSforge/Crypto/PhysStoreCrypto.cs71
1 files changed, 71 insertions, 0 deletions
diff --git a/LibTSforge/Crypto/PhysStoreCrypto.cs b/LibTSforge/Crypto/PhysStoreCrypto.cs
new file mode 100644
index 0000000..6d77897
--- /dev/null
+++ b/LibTSforge/Crypto/PhysStoreCrypto.cs
@@ -0,0 +1,71 @@
+namespace LibTSforge.Crypto
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Text;
+
+ public static class PhysStoreCrypto
+ {
+ public static byte[] DecryptPhysicalStore(byte[] data, bool production)
+ {
+ byte[] rsaKey = production ? Keys.PRODUCTION : Keys.TEST;
+ BinaryReader br = new BinaryReader(new MemoryStream(data));
+ br.BaseStream.Seek(0x10, SeekOrigin.Begin);
+ byte[] aesKeySig = br.ReadBytes(0x80);
+ byte[] encAesKey = br.ReadBytes(0x80);
+
+ if (CryptoUtils.RSAVerifySignature(rsaKey, encAesKey, aesKeySig))
+ {
+ byte[] aesKey = CryptoUtils.RSADecrypt(rsaKey, encAesKey);
+ byte[] decData = CryptoUtils.AESDecrypt(br.ReadBytes((int)br.BaseStream.Length - 0x110), aesKey);
+ byte[] hmacKey = decData.Take(0x10).ToArray();
+ byte[] hmacSig = decData.Skip(0x10).Take(0x14).ToArray();
+ byte[] psData = decData.Skip(0x28).ToArray();
+
+ if (!CryptoUtils.HMACVerify(hmacKey, psData, hmacSig))
+ {
+ Logger.WriteLine("Warning: Failed to verify HMAC. Physical store is either corrupt or in Vista format.");
+ }
+
+ return psData;
+ }
+
+ throw new Exception("Failed to decrypt physical store.");
+ }
+
+ public static byte[] EncryptPhysicalStore(byte[] data, bool production, PSVersion version)
+ {
+ Dictionary<PSVersion, int> versionTable = new Dictionary<PSVersion, int>
+ {
+ {PSVersion.Win7, 5},
+ {PSVersion.Win8, 1},
+ {PSVersion.WinBlue, 2},
+ {PSVersion.WinModern, 3}
+ };
+
+ byte[] rsaKey = production ? Keys.PRODUCTION : Keys.TEST;
+
+ byte[] aesKey = Encoding.UTF8.GetBytes("massgrave.dev :3");
+ byte[] hmacKey = CryptoUtils.GenerateRandomKey(0x10);
+
+ byte[] encAesKey = CryptoUtils.RSAEncrypt(rsaKey, aesKey);
+ byte[] aesKeySig = CryptoUtils.RSASign(rsaKey, encAesKey);
+ byte[] hmacSig = CryptoUtils.HMACSign(hmacKey, data);
+
+ byte[] decData = new byte[] { };
+ decData = decData.Concat(hmacKey).Concat(hmacSig).Concat(BitConverter.GetBytes(0)).Concat(data).ToArray();
+ byte[] encData = CryptoUtils.AESEncrypt(decData, aesKey);
+
+ BinaryWriter bw = new BinaryWriter(new MemoryStream());
+ bw.Write(versionTable[version]);
+ bw.Write(Encoding.UTF8.GetBytes("UNTRUSTSTORE"));
+ bw.Write(aesKeySig);
+ bw.Write(encAesKey);
+ bw.Write(encData);
+
+ return bw.GetBytes();
+ }
+ }
+}