"""Read-only signed header inventory, including FREE code-resource archives."""
import concurrent.futures
import json
import re
from collections import Counter
from pathlib import Path
root=Path(r'D:/SteamLibrary/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/Win64')
key=json.loads(Path('artifacts/ship-model-reference/local-asset-public-key.json').read_text())
n,e=int(key['n']),key['e']
pattern=re.compile(rb'galax|visualisation|visualization|map.?view|map.?colour|map.?color|colou?r.?map',re.I)
def scan(directory):
counts=Counter();found=[]
for path in directory.iterdir():
if not path.is_file():continue
with path.open('rb') as stream:header=stream.read(262)
counts[header[:4].decode('ascii','replace')]+=1
if header[:4] not in (b'FREA',b'FREE') or len(header)<262:continue
raw=pow(int.from_bytes(header[6:262],'big'),e,n).to_bytes(256,'big')
separator=raw.find(b'\0',2)
if separator<10:continue
metadata=raw[separator+37:]
if pattern.search(metadata):
found.append(dict(path=str(path),magic=header[:4].decode(),bytes=path.stat().st_size,
signedHeader=metadata.hex(),strings=[m.group().decode('ascii') for m in re.finditer(rb'[ -~]{4,}',metadata)]))
return counts,found
out=Path('artifacts/galaxy-query-research/palette-resources');out.mkdir(exist_ok=True)
counts=Counter();rows=[]
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool:
for observed,found in pool.map(scan,sorted(path for path in root.iterdir() if path.is_dir())):
counts.update(observed);rows.extend(found)
print(f'headers={sum(counts.values())} matches={len(rows)}',flush=True)
result=dict(scope='Original local resource signed headers only',magicCounts=dict(counts),resources=rows)
(out/'inventory.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(dict(magicCounts=dict(counts),matches=len(rows))))
"""Read-only signed header inventory, including FREE code-resource archives."""
import concurrent.futures
import json
import re
from collections import Counter
from pathlib import Path
root=Path(r'D:/SteamLibrary/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/Win64')
key=json.loads(Path('artifacts/ship-model-reference/local-asset-public-key.json').read_text())
n,e=int(key['n']),key['e']
pattern=re.compile(rb'galax|visualisation|visualization|map.?view|map.?colour|map.?color|colou?r.?map',re.I)
def scan(directory):
counts=Counter();found=[]
for path in directory.iterdir():
if not path.is_file():continue
with path.open('rb') as stream:header=stream.read(262)
counts[header[:4].decode('ascii','replace')]+=1
if header[:4] not in (b'FREA',b'FREE') or len(header)<262:continue
raw=pow(int.from_bytes(header[6:262],'big'),e,n).to_bytes(256,'big')
separator=raw.find(b'\0',2)
if separator<10:continue
metadata=raw[separator+37:]
if pattern.search(metadata):
found.append(dict(path=str(path),magic=header[:4].decode(),bytes=path.stat().st_size,
signedHeader=metadata.hex(),strings=[m.group().decode('ascii') for m in re.finditer(rb'[ -~]{4,}',metadata)]))
return counts,found
out=Path('artifacts/galaxy-query-research/palette-resources');out.mkdir(exist_ok=True)
counts=Counter();rows=[]
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool:
for observed,found in pool.map(scan,sorted(path for path in root.iterdir() if path.is_dir())):
counts.update(observed);rows.extend(found)
print(f'headers={sum(counts.values())} matches={len(rows)}',flush=True)
result=dict(scope='Original local resource signed headers only',magicCounts=dict(counts),resources=rows)
(out/'inventory.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(dict(magicCounts=dict(counts),matches=len(rows))))