TSS
The TSS file is the universal source of trust for PlayStation Home.
It is the first file fetched from the CDN at startup, and the one that defines the entire environment the client should connect to.
Domains
secure.$(env).homeps3.online.scee.com- The string
$(env)gets replaced at runtime by the Clients, based on the currently active environment. For example, this could becprod,cqa-a,cpreprod, etc…
- The string
Contents
- (Optional) Maintenance mode flag
- (Optional) Scene ID redirects
- SHA-1 of downloaded files to validate against.
- Only very specific files can be inserted here, as the game will ignore unexpected entries.
- DNS Overrides
- These allow the game to outright refuse to connect if any of the matching subnets are detected as the system’s DNS.
- Additionally, upon error the game would report to Sony the player using a specific blacklisted DNS.
- CDN URL and Base64-encoded AES key to decrypt the SHARC Archives.
- RabbitMQ connection
- SSFW connection
- …
Definitions
VERSION (Presumed to be required)
prepared_database (it’s assumed to load the HCDB upon download)
ScreenContentRoot
secure_lua_object_resources_root (Needed for objects that rely on 0000.xml)
datacapture (Commented out)
SHA1
SceneRedirect
AdminObjectId
DNSOverride
useregionalserviceids
maxserviceids
commerce
secure_commerce_points
XSD schema
Below is the XSD document for the TSS structure.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!-- Root element XML -->
<xs:element name="XML">
<xs:complexType>
<xs:sequence>
<xs:element ref="VERSION"/>
<xs:element ref="SHA1" maxOccurs="unbounded"/>
<xs:element ref="objects"/>
<xs:element ref="SecureContentRoot"/>
<xs:element ref="ScreenContentRoot"/>
<xs:element ref="secure_lua_object_resources_root"/>
<xs:element ref="profanityfilter"/>
<xs:element ref="SceneRedirect" maxOccurs="unbounded"/>
<xs:element ref="AdminObjectId"/>
<xs:element ref="DNSOverride" maxOccurs="unbounded"/>
<xs:element ref="useregionalserviceids"/>
<xs:element ref="maxserviceids"/>
<xs:element ref="commerce"/>
<xs:element ref="connection"/>
<xs:element ref="disablebar"/>
<xs:element ref="messageQueue"/>
<xs:element ref="ssfw"/>
<xs:element ref="global"/>
<xs:element ref="agerestrictions"/>
<xs:element ref="REGIONINFO"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- VERSION element -->
<xs:element name="VERSION" type="xs:string"/>
<!-- SHA1 element -->
<xs:element name="SHA1">
<xs:complexType>
<xs:attribute name="file" type="xs:string" use="required"/>
<xs:attribute name="digest" type="SHA1DigestType" use="required"/>
</xs:complexType>
</xs:element>
<!-- objects element -->
<xs:element name="objects">
<xs:complexType>
<xs:sequence>
<xs:element ref="prepared_database"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- prepared_database element -->
<xs:element name="prepared_database">
<xs:complexType/>
</xs:element>
<!-- URL elements -->
<xs:element name="SecureContentRoot" type="URLWithVariablesType"/>
<xs:element name="ScreenContentRoot" type="URLWithVariablesType"/>
<xs:element name="secure_lua_object_resources_root" type="URLWithVariablesType"/>
<!-- profanityfilter element -->
<xs:element name="profanityfilter">
<xs:complexType>
<xs:attribute name="apiKey" type="UUIDType" use="required"/>
<xs:attribute name="forceOffline" type="xs:boolean" use="required"/>
<xs:attribute name="privateKey" type="xs:string" use="required"/>
<xs:attribute name="updaterOverrideUrl" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<!-- SceneRedirect element -->
<xs:element name="SceneRedirect">
<xs:complexType>
<xs:attribute name="dest" type="xs:string" use="required"/>
<xs:attribute name="region" type="TerritoryType" use="required"/>
<xs:attribute name="src" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<!-- AdminObjectId element -->
<xs:element name="AdminObjectId" type="AdminObjectIdType"/>
<!-- DNSOverride element -->
<xs:element name="DNSOverride">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="IPRangeType">
<xs:attribute name="action" type="DNSActionType" use="required"/>
<xs:attribute name="report" type="OnOffType" use="required"/>
<xs:attribute name="clearcache" type="OnOffType" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- Simple elements -->
<xs:element name="useregionalserviceids">
<xs:complexType/>
</xs:element>
<xs:element name="maxserviceids" type="xs:positiveInteger"/>
<xs:element name="disablebar">
<xs:complexType/>
</xs:element>
<!-- commerce element -->
<xs:element name="commerce">
<xs:complexType>
<xs:sequence>
<xs:element ref="secure_commerce_points"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="secure_commerce_points">
<xs:complexType/>
</xs:element>
<!-- connection element -->
<xs:element name="connection">
<xs:complexType>
<xs:sequence>
<xs:element ref="contentserver"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="contentserver">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="key" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- messageQueue element -->
<xs:element name="messageQueue">
<xs:complexType>
<xs:sequence>
<xs:element ref="connect"/>
<xs:element ref="client" maxOccurs="unbounded"/>
<xs:element ref="subscribe"/>
<xs:element ref="post" maxOccurs="unbounded"/>
<xs:element ref="events"/>
<xs:element ref="content"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="connect">
<xs:complexType>
<xs:attribute name="address" type="xs:string" use="required"/>
<xs:attribute name="port" type="xs:positiveInteger" use="required"/>
<xs:attribute name="login" type="xs:string" use="required"/>
<xs:attribute name="password" type="xs:string" use="required"/>
<xs:attribute name="vhost" type="xs:string" use="required"/>
<xs:attribute name="isCritical" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="client" type="xs:string"/>
<xs:element name="subscribe" type="xs:string"/>
<xs:element name="post" type="xs:string"/>
<xs:element name="events">
<xs:complexType>
<xs:sequence>
<xs:element ref="enabled"/>
<xs:element ref="destination"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="enabled" type="xs:boolean"/>
<xs:element name="destination">
<xs:complexType>
<xs:sequence>
<xs:element ref="default"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="default" type="xs:string"/>
<xs:element name="content">
<xs:complexType>
<xs:sequence>
<xs:element ref="message"/>
<xs:element ref="score"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="message" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<!-- ssfw element (Server Services Framework) -->
<xs:element name="ssfw">
<xs:complexType>
<xs:sequence>
<xs:element ref="identity"/>
<xs:element ref="rewards"/>
<xs:element ref="clan"/>
<xs:element ref="savedata"/>
<xs:element ref="avatar"/>
<xs:element ref="layout"/>
<xs:element ref="trunks"/>
<xs:element ref="avatarlayout"/>
<xs:element ref="structured"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="identity">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="ttl" type="xs:positiveInteger" use="required"/>
<xs:attribute name="secret" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="rewards" type="xs:anyURI"/>
<xs:element name="clan" type="xs:anyURI"/>
<xs:element name="savedata" type="xs:anyURI"/>
<xs:element name="avatar" type="xs:anyURI"/>
<xs:element name="layout" type="xs:anyURI"/>
<xs:element name="trunks" type="xs:anyURI"/>
<xs:element name="avatarlayout" type="xs:anyURI"/>
<xs:element name="structured" type="xs:anyURI"/>
<!-- global element -->
<xs:element name="global">
<xs:complexType>
<xs:sequence>
<xs:element ref="mode" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="mode">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:nonNegativeInteger">
<xs:attribute name="SCEA" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="SCEJ" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="SCEE" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="SCEAsia" type="xs:nonNegativeInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- agerestrictions element -->
<xs:element name="agerestrictions">
<xs:complexType>
<xs:sequence>
<xs:element ref="age" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="age">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:nonNegativeInteger">
<xs:attribute name="region" type="RegionCodeType" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- REGIONINFO element -->
<xs:element name="REGIONINFO">
<xs:complexType>
<xs:sequence>
<xs:element ref="INSTANCE_TYPES"/>
<xs:element ref="REGION_TYPES"/>
<xs:element ref="REGION_MAP"/>
<xs:element ref="LOCALISATIONS"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="INSTANCE_TYPES">
<xs:complexType>
<xs:sequence>
<xs:element name="TYPE" type="InstanceTypeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="REGION_TYPES">
<xs:complexType>
<xs:sequence>
<xs:element name="TYPE" type="RegionTypeType" maxOccurs="32"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="REGION_MAP">
<xs:complexType>
<xs:sequence>
<xs:element ref="MAP" maxOccurs="64"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="MAP">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="LanguageRegionCodeType" use="required"/>
<xs:attribute name="loc" type="xs:nonNegativeInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="LOCALISATIONS">
<xs:complexType>
<xs:sequence>
<xs:element ref="REF" maxOccurs="32"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="REF">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="LanguageRegionCodeType">
<xs:attribute name="language" type="LanguageWildcardType" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- Custom types for specific patterns -->
<!-- SHA1 digest: exactly 40 uppercase hexadecimal characters -->
<xs:simpleType name="SHA1DigestType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9A-Fa-f]{40}"/>
</xs:restriction>
</xs:simpleType>
<!-- URL with variable substitution -->
<xs:simpleType name="URLWithVariablesType">
<xs:restriction base="xs:string">
<xs:pattern value="https?://.*"/>
</xs:restriction>
</xs:simpleType>
<!-- UUID pattern -->
<xs:simpleType name="UUIDType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"/>
</xs:restriction>
</xs:simpleType>
<!-- AdminObjectId pattern -->
<xs:simpleType name="AdminObjectIdType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9A-F]{8}-[0-9A-F]{8}-[0-9A-F]{8}-[0-9A-F]{8}"/>
</xs:restriction>
</xs:simpleType>
<!-- IP Range pattern (CIDR notation) -->
<xs:simpleType name="IPRangeType">
<xs:restriction base="xs:string">
<xs:pattern value="(\d{1,3}\.){3}\d{1,3}/\d{1,2}"/>
</xs:restriction>
</xs:simpleType>
<!-- DNS Action enumeration -->
<xs:simpleType name="DNSActionType">
<xs:restriction base="xs:string">
<xs:enumeration value="allow"/>
<xs:enumeration value="error"/>
</xs:restriction>
</xs:simpleType>
<!-- On/Off enumeration -->
<xs:simpleType name="OnOffType">
<xs:restriction base="xs:string">
<xs:enumeration value="on"/>
<xs:enumeration value="off"/>
</xs:restriction>
</xs:simpleType>
<!-- Territory enumeration -->
<xs:simpleType name="TerritoryType">
<xs:restriction base="xs:string">
<xs:enumeration value="SCEA"/>
<xs:enumeration value="SCEE"/>
<xs:enumeration value="SCEJ"/>
<xs:enumeration value="SCEAsia"/>
</xs:restriction>
</xs:simpleType>
<!-- Region code enumeration -->
<xs:simpleType name="RegionCodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="scea"/>
<xs:enumeration value="scee"/>
<xs:enumeration value="scej"/>
<xs:enumeration value="sceasia"/>
<xs:enumeration value="scek"/>
</xs:restriction>
</xs:simpleType>
<!-- Language-region code pattern -->
<xs:simpleType name="LanguageRegionCodeType">
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]{2}-[A-Z]{2}"/>
</xs:restriction>
</xs:simpleType>
<!-- Language wildcard pattern -->
<xs:simpleType name="LanguageWildcardType">
<xs:restriction base="xs:string">
<xs:pattern value="([a-z]{2}|\*)-([A-Z]{2}|\*)"/>
</xs:restriction>
</xs:simpleType>
<!-- Instance type for INSTANCE_TYPES -->
<xs:complexType name="InstanceTypeType">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<!-- Region type for REGION_TYPES -->
<xs:complexType name="RegionTypeType">
<xs:simpleContent>
<xs:extension base="LanguageRegionCodeType">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="territory" type="TerritoryType" use="required"/>
<xs:attribute name="instance" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>Last updated on