Add support for new ent format

This commit is contained in:
Li 2024-01-24 09:23:02 +13:00
parent e0d10ff685
commit 9a8acbdd1d
2 changed files with 62 additions and 33 deletions

View File

@ -1,9 +1,11 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace McCrypt
{
@ -129,35 +131,23 @@ namespace McCrypt
contentList.Add(content);
}
private static void readReceipt(string receiptData)
private static void handleEntitlements(dynamic entitlements, byte[] userKey)
{
dynamic recData = Utils.JsonDecodeCloserToMinecraft(receiptData);
string userId = recData.Receipt.EntityId;
string deviceId = "";
if (recData.Receipt.ReceiptData != null)
deviceId = recData.Receipt.ReceiptData.DeviceId;
if (deviceId == "" || deviceId == null)
deviceId = lastDeviceId;
if (deviceId == "" || deviceId == null)
return;
lastDeviceId = deviceId;
byte[] userKey = deriveUserKey(userId, deviceId);
// Derive content keys
int totalEntitlements = recData.Receipt.Entitlements.Count;
int totalEntitlements = entitlements.Count;
for (int i = 0; i < totalEntitlements; i++)
{
try
{
string friendlyId = recData.Receipt.Entitlements[i].FriendlyId;
string contentKeyB64 = recData.Receipt.Entitlements[i].ContentKey;
string friendlyId = entitlements[i].FriendlyId;
if (friendlyId == null)
friendlyId = entitlements[i].PackId;
if (friendlyId == null) continue;
string contentKeyB64 = entitlements[i].ContentKey;
if (contentKeyB64 == null)
continue;
@ -169,7 +159,38 @@ namespace McCrypt
}
catch (Exception) { continue; }
}
}
private static void readInnerReceipt(dynamic recData)
{
string userId = recData.EntityId;
string deviceId = "";
if (recData.ReceiptData != null)
deviceId = recData.ReceiptData.DeviceId;
if (deviceId == "" || deviceId == null)
deviceId = lastDeviceId;
if (deviceId == "" || deviceId == null)
return;
lastDeviceId = deviceId;
byte[] userKey = deriveUserKey(userId, deviceId);
if (recData.Entitlements != null)
handleEntitlements(recData.Entitlements, userKey);
else
handleEntitlements(recData.EntitlementReceipts, userKey);
}
private static void readReceipt(string receiptData)
{
dynamic recData = Utils.JsonDecodeCloserToMinecraft(receiptData);
if (recData.Receipt != null)
readInnerReceipt(recData.Receipt);
else
readInnerReceipt(recData);
}
public static void ReadOptionsTxt(string optionsTxtPath)
@ -246,29 +267,36 @@ namespace McCrypt
}
catch (Exception) { return; }
string receiptB64 = entData.Receipt;
string receiptB64 = entData.GetValue("Receipt", StringComparison.InvariantCultureIgnoreCase);
if (receiptB64 == null)
return;
string receiptData = null;
if (receiptB64.Split('.').Length <= 1)
receiptData = Encoding.UTF8.GetString(Utils.ForceDecodeBase64(receiptB64));
else
receiptData = Encoding.UTF8.GetString(Utils.ForceDecodeBase64(receiptB64.Split('.')[1]));
if (receiptData == null)
return;
string receiptData = Encoding.UTF8.GetString(Utils.ForceDecodeBase64(receiptB64.Split('.')[1]));
readReceipt(receiptData);
int totalItems = entData.Items.Count;
for (int i = 0; i < totalItems; i++)
if(entData.Items != null)
{
string b64Data = entData.Items[i].Receipt;
int totalItems = entData.Items.Count;
for (int i = 0; i < totalItems; i++)
{
string b64Data = entData.Items[i].Receipt;
if (b64Data == null)
continue;
if (b64Data == null)
continue;
if (b64Data.Split('.').Length <= 1)
continue;
if (b64Data.Split('.').Length <= 1)
continue;
string recept = Encoding.UTF8.GetString(Utils.ForceDecodeBase64(b64Data.Split('.')[1]));
readReceipt(recept);
string recept = Encoding.UTF8.GetString(Utils.ForceDecodeBase64(b64Data.Split('.')[1]));
readReceipt(recept);
}
}
}
public static void ReadKeysDb(string keyFile)

View File

@ -1,4 +1,5 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Text;
@ -8,7 +9,7 @@ namespace McCrypt
internal class Utils
{
internal static object JsonDecodeCloserToMinecraft(string json)
internal static Object JsonDecodeCloserToMinecraft(string json)
{
for (int i = json.Length; i > 0; i--)
{