SecureStorage
This adapter stores the TV token, certificate pin, and pairing state in the
iPhone Keychain under an opaque television UUID. It is injected through
KeychainClient for deterministic tests and conforms to the frozen
TVAuthorizationStore protocol from TVTransport.
The candidate accessibility is kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly:
it is the narrowest device-only option that can support a phone-lock relay after
the first unlock. It is unavailable before the first unlock after reboot and has
not yet been validated on a signed iPhone. The stronger
WhenUnlockedThisDeviceOnly option remains available for a deployment that
does not require locked-phone relay.
Certificate trust is fail-closed. A self-signed certificate is accepted only
after an explicit user approval supplied to approveCertificate; the exact
SHA-256 leaf fingerprint is then pinned to that opaque TV ID. A changed
fingerprint returns requiresReapproval and is never silently accepted. The
stored source records that first-use fingerprinting came from an unauthenticated
connection, so it is not presented as proof of TV identity.
forgetTelevision removes the complete Keychain record. deleteToken revokes
pairing while preserving the trust pin; deleteTrust removes trust material.
Neither tokens nor trust records are sent to WatchConnectivity or cloud storage.