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

View File

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