Initial curated chimera source from a8ae5b1db07fb49926c94585e2718e5130330974
This commit is contained in:
commit
c737a37f71
531 files changed
+119270
No files matched your search
@@ -0,0 +1,122 @@
|
||||
'use strict';
|
||||
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
const test = require('node:test');
|
||||
const { assessPs5FpkgControlMetadata, validateParam } = require('../../src/services/ps5-fpkg-control-metadata-assessment');
|
||||
const { A8_DISTINCT_CONTROL } = require('../../src/services/ps5-native-pkg-builder-provider');
|
||||
|
||||
const TITLE_ID = A8_DISTINCT_CONTROL.titleId;
|
||||
const CONTENT_ID = A8_DISTINCT_CONTROL.contentId;
|
||||
|
||||
function metadata(overrides = {}) {
|
||||
return {
|
||||
applicationCategoryType: 0,
|
||||
applicationDrmType: 'free',
|
||||
contentBadgeType: 2,
|
||||
contentId: CONTENT_ID,
|
||||
contentVersion: '01.000.000',
|
||||
localizedParameters: { defaultLanguage: 'en-US', 'en-US': { titleName: 'Chimera metadata control' } },
|
||||
masterVersion: '01.00',
|
||||
requiredSystemSoftwareVersion: '0x0200000000000000',
|
||||
sdkVersion: '0x0200000000000000',
|
||||
titleId: TITLE_ID,
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
function fihFixture(t, param = metadata(), mutate = null) {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'chimera-control-metadata-'));
|
||||
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
|
||||
const raw = Buffer.from(JSON.stringify(param));
|
||||
const cntOffset = 0x100;
|
||||
const entryTableOffset = 0x520;
|
||||
const dataOffset = 0x600;
|
||||
const bytes = Buffer.alloc(cntOffset + dataOffset + raw.length);
|
||||
Buffer.from([0x7f, 0x46, 0x49, 0x48]).copy(bytes);
|
||||
bytes.writeBigUInt64LE(BigInt(cntOffset), 0x58);
|
||||
Buffer.from([0x7f, 0x43, 0x4e, 0x54]).copy(bytes, cntOffset);
|
||||
bytes.writeUInt32BE(1, cntOffset + 0x10);
|
||||
bytes.writeUInt32BE(entryTableOffset, cntOffset + 0x18);
|
||||
const entry = cntOffset + entryTableOffset;
|
||||
bytes.writeUInt32BE(0x2000, entry);
|
||||
bytes.writeUInt32BE(dataOffset, entry + 0x10);
|
||||
bytes.writeUInt32BE(raw.length, entry + 0x14);
|
||||
raw.copy(bytes, cntOffset + dataOffset);
|
||||
if (mutate) mutate(bytes, { cntOffset, entry });
|
||||
const filename = path.join(root, 'control.pkg');
|
||||
fs.writeFileSync(filename, bytes);
|
||||
return filename;
|
||||
}
|
||||
|
||||
test('canonical distinct-control metadata qualifies without console or launch inference', t => {
|
||||
const filename = fihFixture(t);
|
||||
const result = assessPs5FpkgControlMetadata({ sourcePath: filename, expected: { titleId: TITLE_ID, contentId: CONTENT_ID } });
|
||||
assert.equal(result.status, 'metadata_qualified');
|
||||
assert.equal(result.qualified, true);
|
||||
assert.deepEqual(result.issues, []);
|
||||
assert.equal(result.consoleContacted, false);
|
||||
assert.equal(result.consoleMutationPerformed, false);
|
||||
assert.equal(result.installedInferred, false);
|
||||
assert.equal(result.launchInferred, false);
|
||||
});
|
||||
|
||||
test('frozen CHIM00001 artifact is rejected for the actual two-component contentVersion', () => {
|
||||
const filename = path.resolve('assets/ps5-controls/a8/UP9000-CHIM00001_00-A8CONTROL0000001-A0100-V0100.pkg');
|
||||
const result = assessPs5FpkgControlMetadata({
|
||||
sourcePath: filename,
|
||||
expected: { titleId: 'CHIM00001', contentId: 'UP9000-CHIM00001_00-A8CONTROL0000001' },
|
||||
});
|
||||
assert.equal(result.status, 'metadata_rejected');
|
||||
assert.equal(result.qualified, false);
|
||||
assert.equal(result.metadata.contentVersion, '01.00');
|
||||
assert.deepEqual(result.issues.find(item => item.field === 'contentVersion'), {
|
||||
field: 'contentVersion', expected: 'MM.mmm.ppp', actual: '01.00',
|
||||
});
|
||||
});
|
||||
|
||||
test('frozen CHIM00002 canonical control passes the bounded launch-metadata contract', () => {
|
||||
const filename = path.resolve('assets', 'ps5-controls', 'a9', A8_DISTINCT_CONTROL.selectedArtifact.filename);
|
||||
const result = assessPs5FpkgControlMetadata({
|
||||
sourcePath: filename,
|
||||
expected: { titleId: A8_DISTINCT_CONTROL.titleId, contentId: A8_DISTINCT_CONTROL.contentId },
|
||||
});
|
||||
assert.equal(result.status, 'metadata_qualified');
|
||||
assert.equal(result.qualified, true);
|
||||
assert.equal(result.metadata.titleId, 'CHIM00002');
|
||||
assert.equal(result.metadata.contentVersion, '01.000.000');
|
||||
assert.equal(result.metadata.masterVersion, '01.00');
|
||||
assert.equal(result.metadata.applicationDrmType, 'free');
|
||||
assert.deepEqual(result.issues, []);
|
||||
assert.equal(result.consoleContacted, false);
|
||||
assert.equal(result.installedInferred, false);
|
||||
assert.equal(result.launchInferred, false);
|
||||
});
|
||||
|
||||
test('metadata qualification rejects identity, launch fields and incomplete localization independently', () => {
|
||||
const issues = validateParam(metadata({
|
||||
titleId: 'WRONG0001', contentId: 'wrong', masterVersion: '1', applicationCategoryType: 1,
|
||||
applicationDrmType: 'paid', contentBadgeType: 0, requiredSystemSoftwareVersion: '0x2', sdkVersion: null,
|
||||
localizedParameters: { defaultLanguage: 'en-US', 'en-US': {} },
|
||||
}), { titleId: TITLE_ID, contentId: CONTENT_ID });
|
||||
for (const field of [
|
||||
'titleId', 'contentId', 'masterVersion', 'applicationCategoryType', 'applicationDrmType',
|
||||
'contentBadgeType', 'requiredSystemSoftwareVersion', 'sdkVersion', 'localizedParameters',
|
||||
]) assert.ok(issues.some(item => item.field === field), `missing ${field} issue`);
|
||||
});
|
||||
|
||||
test('metadata reader fails closed on encrypted, duplicate and out-of-range param entries', t => {
|
||||
const encrypted = fihFixture(t, metadata(), (bytes, { entry }) => bytes.writeUInt32BE(0x80000000, entry + 0x08));
|
||||
assert.throws(() => assessPs5FpkgControlMetadata({ sourcePath: encrypted }), { code: 'PS5_FPKG_CONTROL_METADATA_PARAM_ENCRYPTED' });
|
||||
|
||||
const duplicate = fihFixture(t, metadata(), (bytes, { cntOffset, entry }) => {
|
||||
bytes.writeUInt32BE(2, cntOffset + 0x10);
|
||||
bytes.copy(bytes, entry + 0x20, entry, entry + 0x20);
|
||||
});
|
||||
assert.throws(() => assessPs5FpkgControlMetadata({ sourcePath: duplicate }), { code: 'PS5_FPKG_CONTROL_METADATA_PARAM_COUNT' });
|
||||
|
||||
const outOfRange = fihFixture(t, metadata(), (bytes, { entry }) => bytes.writeUInt32BE(0xffffffff, entry + 0x14));
|
||||
assert.throws(() => assessPs5FpkgControlMetadata({ sourcePath: outOfRange }), { code: 'PS5_FPKG_CONTROL_METADATA_PARAM_SIZE' });
|
||||
});
|
||||
Reference in new issue
Block a user